MyBatis基础入门

109 阅读3分钟

MyBatis的前身的iBatis,本质是一种半自动的ORM框架,除了POJO与映射关系之外,还需要编写SQL语句。

什么是ORM呢?

对象-关系映射(Object-Relational Mapping,简称ORM),面向对象的开发方法是当今企业级应用开发环境中的主流开发方法,关系数据库是企业级应用环境中永久存放数据的主流数据存储系统。对象和关系数据是业务实体的两种表现形式,业务实体在内存中表现为对象,在数据库中表现为关系数据。内存中的对象之间存在关联和继承关系,而在数据库中,关系数据无法直接表达多对多关联和继承关系。因此,对象-关系映射(ORM)系统一般以中间件的形式存在,主要实现程序对象到关系数据库数据的映射。

摘自:https://blog.csdn.net/papima/java/article/details/78219000

简而言之,ORM就是将Java开发中的对象转成数据库中实体的中间件。

mybatis_b_1.png

为什么需要ORM

如果不采用这些中间件,就需要我们手动来完成转换过程,也就是每个程序员入门时都被“安排”过的JDBC。先来看一段正常的JDBC代码:

			// STEP 1: 导包,设置地址以及密码等常量
			...
			// STEP 2: 注册mysql的驱动
			Class.forName(JDBC_DRIVER);

			// STEP 3: 获得一个连接
			conn = DriverManager.getConnection(DB_URL, USER, PASS);

			// STEP 4: 创建一个查询
			String sql;
			sql = "SELECT * FROM t_user where userName= ? ";
			stmt = conn.prepareStatement(sql);
			stmt.setString(1,"test");

			// STEP 5: 执行sql语句
			ResultSet rs = stmt.executeQuery();

			// STEP 6: 从resultSet中获取数据并转化成bean(ORM框架要做的事情)
			while (rs.next()) {
				TUser user = new TUser();
				user.setId(rs.getInt("id"));
				user.setUserName(rs.getString("userName"));
				user.setRealName(rs.getString("realName"));
				user.setSex(rs.getByte("sex"));
				user.setMobile(rs.getString("mobile"));
				user.setEmail(rs.getString("email"));
				user.setNote(rs.getString("note"));
				users.add(user);
			}
			// STEP 7: 关闭连接
			rs.close();
			stmt.close();
			conn.close();
		} catch (SQLException se) {
			// Handle errors for JDBC
			se.printStackTrace();
		} catch (Exception e) {
			// Handle errors for Class.forName
			e.printStackTrace();
		} finally {
			// finally block used to close resources
			try {
				if (stmt != null)
					stmt.close();
			} catch (SQLException se2) {
			}// nothing we can do
			try {
				if (conn != null)
					conn.close();
			} catch (SQLException se) {
				se.printStackTrace();
			}
		}

仅仅是一个查询就需要七步,并且业务代码与技术代码耦合相当严重,自然会被MyBatis所取代。赶快来学起来,简化自己的开发吧!

MyBatis是JDBC的封装,使用上较为简洁,但实质还是在此。

MyBatis快速入门

1.在pom.xml中加入MyBatis的相关依赖

<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
<dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis</artifactId>
    <version>3.5.4</version>
</dependency>

2.添加MyBatis的相关配置文件

MyBatis有三种配置文件:

2.1 全局配置mybatis-config.xml,用来定义数据库连接以及加载mapper文件。以下是一些常用的配置

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>

    <!-- 引入一个配置文件,当前文件可以通过${}来拿取值 -->
	<properties resource="db.properties" />
	
 	<settings>
		<!-- 设置自动驼峰转换,可以将表中字段映射成驼峰的POJO-->
		<setting name="mapUnderscoreToCamelCase" value="true" />

		 <!-- 当启用时,有延迟加载属性的对象在被调用时将会完全加载任意属性。默认每种属性按需加载 -->
		<setting name="aggressiveLazyLoading" value="true" />
	</settings>

	<!-- 别名定义,在Mapper文件中体现 -->
	<typeAliases>
		<package name="com.enjoylearning.mybatis.entity" />
	</typeAliases>


	<!--配置environment环境 -->
	<environments default="development">
		<!-- 可配置多个,每个SqlSessionFactory对应一个环境 -->
		<environment id="development1">
			<!-- 事务配置 type= JDBC、MANAGED 
				1.JDBC:这个配置直接简单使用了JDBC的提交和回滚设置。
				2.MANAGED:这个配置几乎没做什么。它从来不提交或回滚一个连接。而它会让容器来管理事务的整个生命周期(比如Spring或JEE应用服务器的上下文)。 默认情况下它会关闭连接。然而一些容器并不希望这样,因此如果你需要从连接中停止它,将closeConnection属性设置为false -->
			<transactionManager type="JDBC" />
			<!-- <transactionManager type="MANAGED"> <property name="closeConnection" 
				value="false"/> </transactionManager> -->
            
			<!-- 数据源类型:type = UNPOOLED、POOLED、JNDI 
1.UNPOOLED:这个数据源的实现是每次被请求时简单打开和关闭连接。它有一点慢,这是对简单应用程序的一个很好的选择,因为它不需要及时的可用连接。 不同的数据库对这个的表现也是不一样的,所以对某些数据库来说配置数据源并不重要,这个配置也是闲置的 
2.POOLED:这是JDBC连接对象的数据源连接池的实现,用来避免创建新的连接实例时必要的初始连接和认证时间。 这是一种当前Web应用程序用来快速响应请求很流行的方法。 
3.JNDI:这个数据源的实现是为了使用如Spring或应用服务器这类的容器,容器可以集中或在外部配置数据源,然后放置一个JNDI上下文的引用 -->
			<dataSource type="UNPOOLED">
				<property name="driver" value="com.mysql.jdbc.Driver" />
				<property name="url" value="jdbc:mysql://localhost:3306/xhm" />
				<property name="username" value="root" />
				<property name="password" value="root" />
			</dataSource>
		</environment>

	
    <!-- 映射文件,mapper的配置文件 -->
	<mappers>
		<!--直接映射到相应的mapper文件 -->
		<mapper resource="sqlmapper/TUserMapper.xml" />
		<mapper resource="sqlmapper/TRoleMapper.xml" />
		<mapper resource="sqlmapper/TJobHistoryMapper.xml" />
		<mapper resource="sqlmapper/TPositionMapper.xml" />
		<mapper resource="sqlmapper/THealthReportFemaleMapper.xml" />
		<mapper resource="sqlmapper/THealthReportMaleMapper.xml" />
	</mappers>
</configuration>  

2.2 Mapper文件,具体的sql语句文件

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.enjoylearning.mybatis.mapper.TUserMapper">
  <!-- 开启二级缓存,默认关闭 -->
  <cache></cache>
  <!-- 此处的resultType是返回的实体类,因为配置了别名的缘故,不需要写全限定名。 -->
  <select id="selectByPrimaryKey" resultType="TUser" >
		select
		id, userName, realName, sex, mobile, email, note
		from t_user
		where id = #{id,jdbcType=INTEGER}
	</select>
	...
</mapper>

2.3 Mapper接口,与Mapper文件一一对应(通过namespace + id来指定),定义了对表的一系列操作,是日常操作的接口。

3.实现对数据库的访问

		//--------------------第一阶段---------------------------
		// 1.读取mybatis配置文件创SqlSessionFactory
		String resource = "mybatis-config.xml";
		InputStream inputStream = Resources.getResourceAsStream(resource);
		// 2.读取mybatis配置文件创SqlSessionFactory
		sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
		inputStream.close();
		//--------------------第二阶段---------------------------
		// 3.获取sqlSession	
		SqlSession sqlSession = sqlSessionFactory.openSession();
		// 4.获取对应mapper 每一次都是新的对象
		TUserMapper mapper = sqlSession.getMapper(TUserMapper.class);
		
		//--------------------第三阶段---------------------------
		// 5.执行查询语句并返回单条数据
		TUser user = mapper.selectByPrimaryKey(1);
		System.out.println(user);

MyBatis具体组件

通过上面的实例,可以看到MyBatis有这么几大组件:

SqlSessionFactoryBuilder:读取配置信息创建SqlSessionFactory,建造者模式,方法级别生命周期;

SqlSessionFactory:创建Sqlsession,工厂单例模式,存在于程序的整个生命周期;

SqlSession:代表一次数据库连接,一般通过调用Mapper访问数据库。但其实它也可以直接发送SQL执行,是一个外观模式;

SQL Mapper:由一个Java接口和XML文件组成,包含了要执行的SQL语句和结果集映射规则。