一、Mybatis介绍与对比
1、定义
MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。
mybatis项目地址:
https://github.com/mybatis/mybatis-3
mybatis官方文档地址:
2、历史持久层的设计到延伸
3、为什么要使用MyBatis?
二、MyBatis开发运行流程
1、开发流程
(1)、建立一个maven项目,引入MyBatis相关的jar包
<!-- mybatis-jar -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.4</version>
</dependency>
<!-- mysql-jar -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.45</version>
</dependency>
(2)、建立mybatis配置文件[mybatis-config.xml]
<?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>
<!--
1、mybatis可以使用properties来引入外部的properties配置文件的内容
resource:引入类路径下的资源
url:引用网络路径或者磁盘路径下的资源
-->
<properties resource="db.properties"></properties>
<!--
2、settings包含很多的设置项
settings:用来设置每一个设置项
name:设置项名
value:设置项取值
-->
<!--开启驼峰模式-->
<settings>
<setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</dataSource>
</environment>
</environments>
<!--将我们写好的sql映射文件一定要注册到全局配置文件中-->
<mappers>
<mapper resource="mapper/OkrRoleMapper.xml"/>
</mappers>
</configuration>
(3)、建立POJO数据库表实体[OkrRole]
(4)、建立我们业务接口
public interface OkrRoleDao {
public OkrRole getOkrRoleById(Integer id);
}
(5)、在main/resources/mapper/下建立我们的mapper配置文件[OkrRoleMapper.xml ]
<?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.tan.OkrRoleDao">-->
<mapper namespace="com.tan.dao.OkrRoleDao">
<!--
namespace:名称空间,指定为接口的全类名
id:唯一标识
resultType:返回值类型
#{id}:从传递过来的参数中取出id值
-->
<select id="getOkrRoleById" resultType="com.tan.bo.OkrRole">
select * from okr_role where id = #{id}
</select>
</mapper>
xml文件标签的定义
namespace:名称空间,指定为接口的全类名。 id:唯一标识(接口的方法名称)。 resultType:返回值类型。 #{id}:从传递过来的参数中取出id值。
(6)、将配置的Mapper业务sql的xml配置文件注册到全局配置文件中[mybatis-config.xml]
<!--将我们写好的sql映射文件一定要注册到全局配置文件中-->
<mappers>
<mapper resource="mapper/OkrRoleMapper.xml"/>
</mappers>
(7)、运行流程的调用
@Test
public void test02() throws IOException{
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//2、获取SqlSession实例,能直接执行已经映射的sql语句
SqlSession sqlSession = sqlSessionFactory.openSession();
try {
//获取接口的实现类对象
//会为接口自动的创建一个代理对象,代理对象去执行增删改查的方法。
OkrRoleDao mapper = sqlSession.getMapper(OkrRoleDao.class);
OkrRole okrRoleById = mapper.getOkrRoleById(48);
System.out.println(okrRoleById);
} catch (Exception e) {
e.printStackTrace();
}finally {
sqlSession.close();
}
}
(8)、运行流程总结
运行步骤:
第一步:根据xml配置文件(全局配置文件),创建一个SqlSessionFactory对象(有数据源一些运行环境信息).
第二步:sql映射文件,配置了每一个sql,以及sql的封装规则等。
第三步:将sql映射文件保存在全局配置文件中。
第四步:执行代码的编写:
使用全局配置文件得到SqlSessionFactory。
使用SqlSession工厂,获取SqlSession对象,使用它来增删改查(一个SqlSession代表和数据库的一次会话,用完关 闭)。
获取接口的实现类对象,会为接口自动创建一个代理对象,代理对象去执行增删改查的方法。
SqlSession代表和数据库的一次会话,用完必须关闭。
SqlSession和connection一样,它都是非线程安全的,每次使用都应该去获取新的对象,不能设置全局变量,应该会产生资源竞争。
mapper接口没有实现类,但mybatis会为这个接口生成一个代理对象(接口与xml进行绑定)。
mybatis全局配置文件包含数据库连接池、事物管理器、系统运行环境等信息。
sql映射文件,保存了每一个sql语句的映射信息,将sql抽离出来。
运行原理:
mybatis面试题: