Mybatis的核心组件分为四个部分:
SqlSessionFactoryBuilder (构造器):它会根据配置或者代码来生成 SqISessionFactory,采用的是分步构建的 Builder 模式。
SqlSessionFactory (工厂接口):依靠它来生成 SqlSession,使用的是工厂模式。
SqlSession (会话): 一个既可以发送 SQL 执行返回结果,也可以获取 Mapper 的接 口。在现有的技术中, 一般我们会让其在业务逻辑代码中“消失”,而使用的是 MyBatis 提供的 SQLMapper 接口编程技术,它能提高代码的可读性和可维护性。
SQL Mapper (映射器): MyBatis 新设计存在的组件,它由一个 Java 接口和 XML 文件(或注解)构成,需要给出对应的 SQL 和映射规则。它负责发送SQL去执行, 并返回结果
SqlSessionFactoryBuilder (构造器)
从上面的图中可以看出,SqlSessionFactory是由SqlSessionFactoryBuilder(构造器)创建的。SqlSessionFactory是一个接口,在Mybatis中它存在两个实现类:SqlSessionManager和DefaultSqlSessionFactory。
每个基于 MyBatis 的应用都是以一个SqlSessionFactory的实例为中心的, 而SqlSessionFactory 唯一的作用就是生产 MyBatis 的核心接口对象 SqlSession,所以它的责任是唯一的。 我们往往会采用单例模式处理它。
在 MyBatis中,既可以通过读取配置的 XML 文件的形式生成 Sq!SessionFactory,也可以通过 Java 代码的形式去生成 SqlSessionFactory。强烈推荐采用 XML 的形式,因为代码的方式在需要修改的时候会比较麻烦。
使用 XML 构建 SqlSessionFactory
在项目成功导入Mybatis依赖包后,就可以创建mybatis配置文件了,新建给一个xml文件,命名为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>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mybatis"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource=""/>
</mappers>
</configuration>
<environment>元素的定义,这里描述的是数据库。它里面的<transactionManager> 元素是配置事务管理器,这里采用的是 MyBatis 的 JDBC 管理器方式。然后采用 <dataSource>元素配置数据库,其中属性 type=”POOLED”代表采用 MyBatis 内部提 供的连接池方式,最后定义一些关于 JDBC 的属性信息。
//使用XML构建SqlSessionFactory
SqlSessionFactory SqlSessionFactory = null;
String resource = "mybatis-config.xml";
InputStream inputStream;
try {
inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
System.out.println("使用XML构建的SqlSessionFactory"+SqlSessionFactory.hashCode());
SqlSession sqlSession=SqlSessionFactory.openSession();
StudentMapper studentMapper=sqlSession.getMapper(StudentMapper.class);
System.out.println(studentMapper.getStudent(1).toString());
} catch (IOException e) {
e.printStackTrace();
}
首先读取 mybatis-config.xml, 然后通过 Sq!SessionFacto可Builder 的 Builder 方法去创建 SqJSessionFactory。整个过程比较简单,而里面的步骤还是比较烦琐的,只是MyBatis 采用了Builder 模式为开发者隐藏了这些细节。这样一个 SqlSessionFactory 就被创建出来了。
使用代码创建 SqlSessionFactory
写到这里掉进了坑。。。
使用IDEA创建的mybatis通过mapper接口加载映射文件
//采用MyBatis的JDBC事务方式
// <transactionManager type="JDBC"/>
TransactionFactory transactionFactory=new JdbcTransactionFactory();
// <environments default="development">
Environment environment=new Environment("development",transactionFactory,dataSource);
//创建Configuration对象
Configuration configuration=new Configuration(environment);
//加入一个映射器
// <mappers>
// <mapper resource=""/>
// </mappers>
configuration.addMapper(StudentMapper.class);
//使用SqlSessionFactoryBuilder 构建 SqlSessionFactory
SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(configuration);
System.out.println(sqlSessionFactory);
//定义SqlSession
SqlSession sqlSession=null;
try {
//打开SqlSession会话
sqlSession = sqlSessionFactory.openSession();
StudentMapper studentMapper = sqlSession.getMapper(StudentMapper.class);
Student student = studentMapper.getStudent(1);
System.out.println(student.toString());
sqlSession.commit();//提交事务
}catch (Exception ex){
sqlSession.rollback();//回滚事务
}finally {
//确保资源被顺利关闭
if(sqlSession!=null) {
sqlSession.close();
}
}
使用代码来创建SqlSessionFactory,就不需要mybatis配置文件,但是还是需要mapper映射文件(其他也可以不用,通过注解的话)
SqlSession
在 MyBatis 中,SqlSession 是其核心接口 。在MyBatis中有两个实现类,DefaultSqlSession 和 SqlSessionManager。 DefaultSqlSession 是单线程使用的,而 SqlSessionManager 在多线程 环境下使用。 SqlSession 的作用类似于一个 JDBC 中的 Connection 对象,代表着一个连接资源的启用。
具体而言, 它的作用有 3 个:
- 获取 Mapper 接口
- 发送 SQL 给数据库
- 控制数据库事务。
//定义SqlSession
SqlSession sqlSession=null;
try {
//打开SqlSession会话
sqlSession = sqlSessionFactory.openSession();
StudentMapper studentMapper = sqlSession.getMapper(StudentMapper.class);
Student student = studentMapper.getStudent(1);
System.out.println(student.toString());
sqlSession.commit();//提交事务
}catch (Exception ex){
sqlSession.rollback();//回滚事务
}finally {
//确保资源被顺利关闭
if(sqlSession!=null) {
sqlSession.close();
}
}
这里使用 commit 方法提交事务,或者使用 rollback 方法回滚事务。因为它代表着一个 数据库的连接资源,使用后要及时关闭它,如果不关闭,那么数据库的连接资源就会很快被耗费光,整个系统就会陷入瘫痪状态,所以用 finally 语句保证其顺利关闭。
SQL Mapper (映射器)
映射器是 MyBatis 中最重要、最复杂的组件,它由一个接口和对应的XML文件(或注解〉组成。
它可以配置以下内容:
- 描述映射规则。
- 提供 SQL 语旬, 并可以配置 SQL 参数类型、返回类型、缓存刷新等信息。
- 配置缓存。
- 提供动态 SQL。
映射器的主要作用就是将 SQL 查询到的结果映射为一个POJO,或者将POJO的数据插入到数据库中,并定义一些关于缓存等的重要内容。
用 XML 实现映射器
用 XML 定义映射器分为两个部分: 接口和 XML。
先定义一个映射器接口
SqlSession 发送 SQL
selectOne 方法表示使用查询并且只返回一个对象,而参数则是一个 String 对象和一个 Object 对象。这里是一个 long 参数, long 参数是它的主键。
String 对象是由一个命名空间加上 SQL id 组合而成的,它完全定位了一条 SQL, 这样 MyBatis就会找到对应的 SQL。如果在 MyBatis 中只有一个 id 为 getStudent 的SQL, 那么也可以简写为 :
//使用SqlSession发送SQL
Student student=(Student)sqlSession.selectOne("getStudent",1L);
用 Mapper 接口发送 SQL(推荐方式)
//用 Mapper 接口发送 SQL
Student student = studentMapper.getStudent(1);
通过 SqlSession 的 getMapper 方法来获取一个 Mapper 接口 ,就可以调用它的方法了。 因为 XML 文件或者接口注解定义的 SQL 都可以通过“类的全限定名+方法名”查找,所 以 MyBatis 会启用对应的 SQL 进行运行,并返回结果。