Java EE之第7章MyBatis的核心配置

第7章 MyBatis的核心配置

  • 7.1 MyBatis的核心对象
    • 7.1.1SqlSessionFactory
    • 7.1.2 SqlSession
  • 7.2 MyBatis核心配置文件
  • 7.3数据源类型
  • 7.4映射文件

7.1 MyBatis的核心对象

MyBatis框架两个核心对象:SqlSessionFactory和SqlSession

7.1.1SqlSessionFactory

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实例,通常使用单列模式

7.1.2 SqlSession

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) T selectOne(String statement)查询方法,参数statement是在配置文件中定义的元素的id,parameter是查询所需的参数。使用该方法后,会返回执行SQL语句查询结果的一条泛型对象

(3) List selectList(String statement)查询方法,参数statement是在配置文件中定义的元素的id,parameter是查询所需的参数。使用该方法后,会返回执行SQL语句查询结果的泛型对象的集合

(5) List selectList(String statement,Object parameter,RowBounds rowBounds)查询方法,参数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) T getMapper(Class type):该方法会返回Mapper接口的代理的对象,该对象关联了SqlSession对象,开发人员可以使用该对象直接调用方法操作数据库。参数type是Mapper的接口类型。MyBatis官方推荐通过Mapper对象访问MyBatis

(17)Connection getConnection():获取JDBC数据库连接对象的方法

7.2 MyBatis核心配置文件

MyBatis配置文件中的主要元素如下:
Java EE之第7章MyBatis的核心配置_第1张图片
1.元素:是一个配置属性的元素,用于将内部的配置外在化,即通过外部的配置来动态地替换内部定义的属性。 例如:数据库的连接等属性(通过典型的Java属性文件中的配置替换)

2.元素:用于改变MyBatis运行时的行为。例如:开启二级缓存,开启延迟加载等

元素中常见配置其描述:
Java EE之第7章MyBatis的核心配置_第2张图片

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

Java EE之第7章MyBatis的核心配置_第3张图片
当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来阻止它默认的关闭行为

7.3数据源类型

1.UNPOOLED:配置此数据源类型后,在每次被请求时会打开和关闭连接。它对没有性能要求的简单应用程序是一个很好的选择。
UNPOOLED类型的数据源需要配置5种属性,具体如下:

属性 说明
driver JDBC驱动的Java类的完全限定名(并不是JDBC驱动中可能包含的数据源类)
url 数据库的URL地址
username 登录数据库的用户名
password 登录数据库的密码
defaultTransactionlsolationLevel 默认的连接事务隔离级别

2.POOLED此数据源利用“池”的概念将JDBC连接对象组织起来,避免了在创建新的连接实例时所需要初始化和认证时间。这种方式使得并发Web应用可以快速地响应请求,是当前流行的处理方式
Java EE之第7章MyBatis的核心配置_第4张图片
3.JNDI此数据源可以在EJB或应用服务器等容器中使用。容器可以集中或在外部配置数据源,然后放置一个JNDI上下文的引用
Java EE之第7章MyBatis的核心配置_第5张图片

7.4映射文件

在映射文件中,元素是映射文件的根元素,其他元素都是它的子元素。这些子元素及其作用如下:
1.