MyBatis框架两个核心对象:SqlSessionFactory和SqlSession
SqlSessionFactory:是单个数据库映射关系经过编译后的内存镜像,主要作用是创建SqlSession
SqlSessionFactory对象的实例通过SqlSessionFactoryBuilder对象来构建,而SqlSessionFactoryBuilder通过XML配置文件或一个预先定义好的Configuration实例构建出SqlSessionFactory的实例。通过XML配置文件构建出的SqlSessionFactory实例,其实现代码如下:
// 读取配置文件
InputStream inputStream = Resources.getResourceAsStream(“配置文件的位置”);
// 根据配置文件构建SqlSessionFactory
SqlSessionFactory sqlSessionFactory =
new SqlSessionFactoryBuilder().build(inputStream);
SqlSessionFactory对象一旦被创建,在整个应用执行期间都会存在。如果多次创建同一个数据库的SqlSessionFactory,那么此数据库的资源将很容易被耗尽。为了解决此问题,通常每个数据库都会只对应一个SqlSessionFactory,所有在构建SqlSessionFactory实例,通常使用单列模式
SqlSession:是应用程序与持久层之间执行交互操作的一个单线程对象,主要作用是执行持久化操作
SqlSession对象:包含了数据库中所有执行SQL操作的方法。底层封装了JDBC连接,可以直接使用实例来执行已映射的SQL语句
使用SqlSession对象注意事项:
(1)每一个线程都有自己的SqlSession实例,并且实例是不能被共享的
(2)SqlSession实例是线程的不安全,使用范围最好在一次请求或一个方法中,绝不能将其放在一个类的静态字段,实例字段或任何类型的管理范围(如Servlet的HttpSession)中使用
(3)使用完SqlSession对象之后,要及时地关闭它,通常可以将其放在finally块中关闭,代码如下所示:
SqlSession sqlSession = SqlSessionFactory.openSession();
try{
//此处执行持久化操作
}finally{
sqlSession.close();
}
SqlSession对象常用方法:
(1)
:查询方法,参数statement是在配置文件中定义的元素的id,使用该方法后,会返回执行SQL语句查询结果的一条泛型对象
(2)
:查询方法,参数statement是在配置文件中定义的元素的id,parameter是查询所需的参数。使用该方法后,会返回执行SQL语句查询结果的一条泛型对象
(3)
:查询方法,参数statement是在配置文件中定义的元素的id,使用该方法后,会返回执行SQL语句查询结果的泛型对象的集合
(4)
:查询方法,参数statement是在配置文件中定义的元素的id,parameter是查询所需的参数。使用该方法后,会返回执行SQL语句查询结果的泛型对象的集合
(5)
:查询方法,参数statement是在配置文件中定义的元素的id,parameter是查询所需的参数,rowBounds是用于分页的参数对象。使用该方法后,会返回执行SQL语句查询结果的泛型对象的集合
(6)void select(String statement,Object parameter,ResultHandler handler):查询方法,参数statement是在配置文件中定义的元素的id,parameter是查询所需的参数,ResultHandler对象用于处理查询返回的复杂结果集,通常用于多表查询
(7)int insert(String statement):插入方法。参数statement是在配置文件中定义的
元素的id,使用该方法后,会返回执行SQL语句所受影响的行数
(8)int insert(String statement,Object parameter):插入方法。参数statement是在配置文件中定义的
元素的id,parameter是插入所需的参数,使用该方法后,会返回执行SQL语句所受影响的行数
(9)int update(String statement):更新方法。参数statement是在配置文件中定义的
元素的id,使用该方法后,会返回执行SQL语句所受影响的行数
(10)int update(String statement,Object parameter):更新方法。参数statement是在配置文件中定义的
元素的id,parameter是更新所需的参数,使用该方法后,会返回执行SQL语句所受影响的行数
(11)int delete(String statement):删除方法。参数statement是在配置文件中定义的
元素的id,使用该方法后,会返回执行SQL语句所受影响的行数
(12)int delete(String statement):删除方法。参数statement是在配置文件中定义的
元素的id,parameter是删除所需的参数,使用该方法后,会返回执行SQL语句所受影响的行数
(13)void commit():提交事务的方法
(14)void rollback():回滚事务的方法
(15)void close():关闭SqlSession对象
(16)
该方法会返回Mapper接口的代理的对象,该对象关联了SqlSession对象,开发人员可以使用该对象直接调用方法操作数据库。参数type是Mapper的接口类型。MyBatis官方推荐通过Mapper对象访问MyBatis
(17)Connection getConnection():获取JDBC数据库连接对象的方法
MyBatis配置文件中的主要元素如下:
1.
元素:是一个配置属性的元素,用于将内部的配置外在化,即通过外部的配置来动态地替换内部定义的属性。 例如:数据库的连接等属性(通过典型的Java属性文件中的配置替换)
2.
元素:用于改变MyBatis运行时的行为。例如:开启二级缓存,开启延迟加载等
3.
元素:用于为配置文件中的Java类型设置一个简短的名字(设置别名)。别名的设置与XML配置相关,可以减少全限定类名的冗余
(1) 使用
元素配置别名的方法:
<!-- 定义别名 -->
<typeAliases>
<typeAlias alias="user" type="com.itheima.po.User"/>
</typeAliases>
(2) 当POJO类过多时,可以通过自动扫描包的形式自定义别名:
<!-- 使用自动扫描包来自定义别名 -->
<typeAliases>
<package name="com.itheima.po.User"/>
</typeAliases>
注意:1.如果省略alias属性,MyBatis会默认将类名首字母小写后的名称作为别名
2.上述方式的别名只适用于没有使用注解的情况,如果在程序中使用了注解,则别名为其注解的值
4.
元素:MyBatis在预处理语句(PreparedStatement)中设置一个参数或者从结果集(ResultSet)中取出一个值时,都会用其框架内部注册了的typeHandler(类型处理器)进行相关处理。typeHandler的作用就是将预处理语句中传入的参数从javaType(Java类型)转换为jdbcType(JDBC类型),或者从数据库取出结果时将jdbcType转换为javaType
为了方便转换,MyBatis框架提供了一些默认的类型处理器,其常用的类型处理器如下:
类型处理器 | Java类型 | JDBC类型 |
---|---|---|
BooleanTypeHandler | java.lang.Boolean,boolean | 数据库兼容的BOOLWAN |
ByteTypeHandler | java.lang.Byte,byte | 数据库兼容的NUMERIC或者BYTE |
ShortTypeHandler | java.lang.Short,short | 数据库兼容的NUMERIC或者SHORT INTEGER |
当MyBatis框架所提供的这些类型处理器不能满足需求时,还可以通过自定义的方式对类型处理器进行扩展(自定义类型处理器可以通过实现TypeHandler接口或者继承BaseTypeHandle类来定义)。
元素就是用于在配置文件中注册自定义的类型处理器的。它的使用方式有两种,具体如下:
1.注册一个类的类型处理器
handler属性用于指定在程序中自定义的类型处理器类
2.注册一个包中所以的类型处理器
5.
元素:MyBatis框架每次创建结果对象的新实例时,都会使用一个对象工厂(ObjectFactory)的实例来完成。MyBatis中默认的ObjectFactory的作用就是实例化目标类,它既可以通过默认构造方法实例化,也可以在参数映射存在的时候通过参数构造方法来实例化
6.
元素:MyBatis允许在已映射语句执行过程中的某一个点进行拦截调用,这种拦截调用是通过插件来实现的。
元素的作用就是配置用户所开发的插件。如果用户想要进行插件开发,必须要先了解其内部运行原理,因为在试图修改或重写已有方法的行为时,很可能会破坏MyBatis原有的核心模块
7.
元素:用于对环境进行配置。MyBatis的环境配置实际上就是数据源的配置,我们可以通过
元素配置多种数据源,即配置多种数据库
其中,
元素用于配置事务管理,它的type属性用于指定事务管理的方式,即使用哪种事务管理器;
元素用于配置数据源,它的type属性用于指定使用哪种数据源
8.
元素:在配置文件中,
元素用于指定MyBatis映射文件的位置,一般可以使用以下4种方法引入映射器文件,具体如下所示:
1.使用类路径引入
2.使用本地文件路径引入
3.使用接口类引入
4.使用包名引入
在MyBatis中,可以配置两种类型的事务管理器,分别是JDBC和MANAGED,具体描述如下:
JDBC:此配置直接使用了JDBC的提交和回滚设置,它依赖于从数据源得到的连接来管理事务的作用域
MANAGED:此配置从来不提交或回滚一个连接,而是让容器来管理事务的整个生命周期。在默认情况下,他会关闭连接,但一些容器并不希望这样,为此可以将closeConnection属性设置为flase来阻止它默认的关闭行为
1.UNPOOLED:配置此数据源类型后,在每次被请求时会打开和关闭连接。它对没有性能要求的简单应用程序是一个很好的选择。
UNPOOLED类型的数据源需要配置5种属性,具体如下:
属性 | 说明 |
---|---|
driver | JDBC驱动的Java类的完全限定名(并不是JDBC驱动中可能包含的数据源类) |
url | 数据库的URL地址 |
username | 登录数据库的用户名 |
password | 登录数据库的密码 |
defaultTransactionlsolationLevel | 默认的连接事务隔离级别 |
2.POOLED:此数据源利用“池”的概念将JDBC连接对象组织起来,避免了在创建新的连接实例时所需要初始化和认证时间。这种方式使得并发Web应用可以快速地响应请求,是当前流行的处理方式
3.JNDI:此数据源可以在EJB或应用服务器等容器中使用。容器可以集中或在外部配置数据源,然后放置一个JNDI上下文的引用
在映射文件中,
元素是映射文件的根元素,其他元素都是它的子元素。这些子元素及其作用如下:
1.元素:用于映射查询语句,它可以帮助我们从数据库中读取数据,并且装数据给业务开发人员
2.
元素:用于映射插入语句,在执行完元素中定义的SQL语句后,会返回一个表示插入记录数的整数
(1)如果使用的数据库支持主键自动增长(如MySQL),那么可以通过keyProperty属性指定PO类的某个属性接收主键返回值(通常会设置到id属性上),然后将useGeneratedKeys的属性值设置为true
3.
元素:映射更新语句,执行后返回一个整数,代表更新的条数
4.
元素:映射删除语句,执行后返回一个整数,代表删除的条数
5.
元素:用于定义可重用的SQL代码片段,然后在其他语句中引用这一代码片段
6.
元素:元素表示结果映射集,是MyBatis中最重要也是最强大的元素。它主要作用是定义映射规则,级联的更新以及定义类型转化器等
元素中包含了一些子元素,它的元素结构如下:
元素的type属性表示需要映射的POJO,id属性是这个resultMap的唯一标识。它的子元素
用于配置构造方法(当一个POJO中未定义无参的构造方法时,就可以使用
元素进行配置)。子元素
用于表示哪个列的主键,而
用于表示POJO和数据表中普通列的映射关系。
和
用于处理多表时的关联关系,而
元素主要用于处理一个单独的数据库查询返回很多不同数据类型结果集的情况
在默认情况下,MyBatis程序在运行时会自动地将查询到的数据于需要返回的对象的属性进行匹配赋值(需要表中的列名与对象的属性名称完成一致)。然而实际开发时,数据表中的列和需要返回的对象的属性可能不会完全一致,这种情况下MyBatis是不会自动赋值的。此时就可以通过
元素进行处理
7.
元素:用于给定命名空间的缓存配置
8.
元素:用于其他命名空间缓存配置的引用