MyBatis学习之核心配置

  我们对MyBatis已经有了初步的了解,但这些只是基础,还远远不够,我们还需要对MyBatis中的核心对象、映射文件和配置文件有更加深入的了解。

  1. MyBatis的核心对象
  1. 1 SqlSessionFactory
  SqlSessionFactory是MyBatis中的关键对象,它是单个数据库映射关系经过编译后的内存镜像,其主要作用是创建SqlSession。SqlSessionFactory对象的实例可以通过SqlSessionFactoryBuilder对象来构建,而SqlSessionFactoryBuilder则可以通过XML配置文件或预先定义好的Configuration实例构建出SqlSessionFactory的实例。

  // 读取配置文件
  String resource = "mybatis-config.xml";
  InputStream inputStream = 
                     Resources.getResourceAsStream(resource);
  // 根据配置文件构建SqlSessionFactory
  SqlSessionFactory sqlSessionFactory = 
                     new SqlSessionFactoryBuilder().build(inputStream);

  SqlSessionFactory对象是线程安全的,它一旦被创建,在整个应用执行期间都会存在。
  如果我们多次创建同一个数据库的SqlSessionFactory,那么此数据库的资源将很容易被耗尽。为此,通常每一个数据库都会只对应一个SqlSessionFactory,所以在构建SqlSessionFactory实例时,建议使用单列模式。

  1. 2 SqlSession
  SqlSession是MyBatis中另一个关键对象,它是应用程序与持久层之间执行交互操作的一个单线程对象,其主要作用是执行持久化操作。SqlSession对象包含了数据库中所有执行SQL操作的方法,其底层封装了JDBC连接,可以直接使用其实例来执行已映射的SQL语句。
  每个线程都应该有自己的SqlSession实例,并且SqlSession的实例是不能被共享的,SqlSession实例也是线程不安全的。因此最佳的范围是一次请求或一个方法中,绝对不能将其放在一个类的静态字段、实例字段或任何类型的管理范围(如Serlvet的HttpSession)中。 使用完SqlSession对象后要及时关闭,通常可以将其放在finally块中关闭。

SqlSession sqlSession = sqlSessionFactory.openSession();
try {
       // 此处执行持久化操作
} finally {
      sqlSession.close();
}

  SqlSession中常用的方法:
  查询方法:

方法 说明
T selectOne(String statement); 参数statement是在配置文件中定义的
T selectOne(String statement, Object parameter); 参数statement是在配置文件中定义的
List selectList(String statement); 参数statement是在配置文件中定义的
List selectList(String statement,Object parameter); 参数statement是在配置文件中定义的
List selectList(String statement, Object parameter, RowBounds rowBounds); 参数statement是在配置文件中定义的
void select(String statement, Object parameter, ResultHandler handler); 参数statement是在配置文件中定义的

  插入、更新和删除方法:

方法 说明
int insert(String statement); 参数statement是在配置文件中定义的元素的id,使用后,会返回执行SQL语句所影响的行数。
int insert(String statement, Object parameter); 参数statement是在配置文件中定义的元素的id,parameter是插入所需的参数,使用后,会返回执行SQL语句所影响的行数。
int update(String statement); 参数statement是在配置文件中定义的元素的id,使用后,会返回执行SQL语句所影响的行数。
int update(String statement, Object parameter); 参数statement是在配置文件中定义的元素的id,使用后,parameter是更新所需的参数,会返回执行SQL语句所影响的行数。
int delete(String statement); 参数statement是在配置文件中定义的元素的id,使用后,会返回执行SQL语句所影响的行数。
int delete(String statement, Object parameter); 参数statement是在配置文件中定义的

  其他方法:

方法 说明
void commit(); 提交事务的方法。
oid rollback(); 回滚事务的方法。
void close(); 关闭SqlSession对象。
T getMapper(Class type); 返回Mapper接口的代理对象。
Connection getConnection(); 获取JDBC数据库连接对象的方法。

  2. 配置文件

  在MyBatis框架的核心配置文件中,元素是配置文件的根元素,其他元素都要在元素内配置。
MyBatis学习之核心配置_第1张图片
  2.1. 元素

  是一个配置属性的元素,该元素通常用来将内部的配置外在化,即通过外部的配置来动态的替换内部定义的属性。例如,数据库的连接等属性,就可以通过典型的Java属性文件中的配置来替换,具体方式如下:

  (1).编写db.properties

    jdbc.driver=com.mysql.jdbc.Driver
     jdbc.url=jdbc:mysql://localhost:3306/mybatis
     jdbc.username=root
     jdbc.password=root

  (2).配置属性

 <properties resource="db.properties" />

  (3).修改配置文件中数据库连接的信息

<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>

  2.2. 元素
  元素主要用于改变MyBatis运行时的行为,例如开启二级缓存、开启延迟加载等。下述配置通常不需要开发人员去配置,仅仅作为了解。


     <settings>
         <setting name="cacheEnabled" value="true" />
         <setting name="lazyLoadingEnabled" value="true" />
         <setting name="multipleResultSetsEnabled" value="true" />
         <setting name="useColumnLabel" value="true" />
         <setting name="useGeneratedKeys" value="false" />
         <setting name="autoMappingBehavior" value="PARTIAL" />
         ...
     settings>

  2.3. 元素
  元素用于为配置文件中的Java类型设置一个简短的名字,即设置别名。别名的设置与XML配置相关,其使用的意义在于减少全限定类名的冗余。
  (1). 使用元素配置别名的方法如下:

<typeAliases>
     <typeAlias alias="user" type="com.example.test.User"/>
typeAliases>

  (2). 当POJO类过多时,可以通过自动扫描包的形式自定义别名,具体如下:

<typeAliases>
     <package name="com.example.test"/>
typeAliases>

  MyBatis框架默认为许多常见的Java类型提供了相应的类型别名,如下表所示:
MyBatis学习之核心配置_第2张图片
  2.4. 元素
  typeHandler的作用就是将预处理语句中传入的参数从javaType(Java类型)转换为jdbcType(JDBC类型),或者从数据库取出结果时将jdbcType转换为javaType。
  元素可以在配置文件中注册自定义的类型处理器,它的使用方式有两种:
  (1).注册一个类的类型处理器

<typeHandlers> 
     <typeHandler handler="com.example.test.UsertypeHandler" />
typeHandlers>

  (2).注册一个包中所有的类型处理器

<typeHandlers> 
    <package name="com.itheima.test" />
typeHandlers>

  2.5. 元素
  MyBatis中默认的ObjectFactory的作用是实例化目标类,它既可以通过默认构造方法实例化,也可以在参数映射存在的时候通过参数构造方法来实例化。通常使用默认的ObjectFactory即可。
  2.6. 元素
  MyBatis允许在已映射语句执行过程中的某一点进行拦截调用,这种拦截调用是通过插件来实现的。 元素的作用就是配置用户所开发的插件。
  2.7. 元素
  元素用于对环境进行配置。MyBatis的环境配置实际上就是数据源的配置,我们可以通过元素配置多种数据源,即配置多种数据库。
  使用元素 进行环境配置的示例如下:

<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>

  2.7.1 事务管理器的配置:
  在MyBatis中,可以配置两种类型的事务管理器,分别是JDBC和MANAGED。关于这两个事务管理器的描述如下:
  1. JDBC: 此配置直接使用了JDBC的提交和回滚设置,它依赖于从数据源得到的连接来管理事务的作用域。
  2. MANAGED:此配置从来不提交或回滚一个连接,而是让容器来管理事务的整个生命周期。默认情况下,它会关闭连接,但一些容器并不希望这样,为此可以将closeConnection属性设置为false来阻止它默认的关闭行为。
  注意: 如果项目中使用的是Spring+ MyBatis,则没有必要在MyBatis中配置事务管理器,因为实际开发中,会使用Spring自带的管理器来实现事务管理。
  2.7.2 数据源的配置:
  1.UNPOOLED
  配置此数据源类型后,在每次被请求时会打开和关闭连接。它对没有性能要求的简单应用程序是一个很好的选择。在使用时,需要配置5种属性。

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

  2.POOLED
  此数据源利用“池”的概念将JDBC连接对象组织起来,避免了在创建新的连接实例时所需要初始化和认证的时间。这种方式使得并发Web应用可以快速的响应请求,是当前流行的处理方式。在使用时,可以配置更多的属性。

属性 说明
poolMaximumActiveConnections 在任意时间可以存在的活动(也就是正在使用)连接数量,默认值:10
poolMaximumIdleConnections 任意时间可能存在的空闲连接数
poolMaximumCheckoutTime 在被强制返回之前,池中连接被检出(checked out)时间,默认值:20000毫秒,即20秒
poolTimeToWait 如果获取连接花费的时间较长,它会给连接池打印状态日志并重新尝试获取一个连接(避免在误配置的情况下一直处于无 提示的失败),默认值: 20000毫秒,即20秒
poolPingQuery 发送到数据库的侦测查询,用来检验连接是否处在正常工作秩序中。默认是“NO PING QUERY SET",这会导致多数数据库驱动失败时带有一定的错误消息
poolPingEnabled 是否启用侦测查询。若开启,必须使用一个可执行的SQL语句设置,poolPingQuery属性(最好是一个非常快的SQL),默认值: false
poolPingConnectionsNotUsedFor 配置poolPingQuery的使用频度。可以被设置成匹配具体的数据库连接超时时间,来避免不必要的侦测,默认值: 0 (表示所有连接每一时刻都被侦测,只有poolPingEnabled的属性值为true时适用)

  3.JNDI
  可以在EJB或应用服务器等容器中使用。容器可以集中或在外部配置数据源,然后放置一个JNDI上下文的引用。在使用时,需要配置2个属性。

属性 说明
initial_context 此属性主要用于在InitialContext中寻找上下文(即initialContext.lookup(initial_context))。该属性为可选属性,在忽略时,data_source属性会直接从InitialContext中寻找
data_source 此属性表示引用数据源实例位置的上下文的路径。如果提供了initial_context配置,那么程序会在其返回的上下文中进行查找;如果没有提供,则直接在InitialContext中查找

  2.8. 元素
  元素用于指定MyBatis映射文件的位置,一般可以使用以下4种方法引入映射器文件,具体如下:
  (1).使用类路径引入

<mappers>
    <mapper resource="com/example/mapper/UserMapper.xml"/>
mappers>

  (2).使用本地文件路径引入

<mappers>
    <mapper url="file:///D:/com/example/mapper/UserMapper.xml"/>
mappers>

  (3).使用接口类引入

<mappers>
    <mapper class="com.itheima.mapper.UserMapper"/>
mappers>

  (4).使用包名引入

<mappers>
    <package name="com.itheima.mapper"/>
mappers>

  3. 映射文件
  在映射文件中,元素是映射文件的根元素,其他元素都是它的子元素。
MyBatis学习之核心配置_第3张图片
  3.1. 元素元素用来映射查询语句,它可以帮助我们从数据库中读取出数据,并组装数据给业务开发人员。其常用属性如下:

属性 说明
id 表示命名空间中的唯一标识符,常与命名空间组合起来使用。组合后如果不唯一,MyBatis会抛出异常
parameterType 该属性表示传入SQL语句的参数类的全限定名或者别名。它是一个可选属性,因为MyBatis可以通过TypeHandler推断出具体传入语句的参数。其默认值是unset (依赖于驱动)
resultType 从SQL语句中返回的类型的类的全限定名或者别名。如果是集合类型,那么返回的应该是集合可以包含的类型,而不是集合本身。返回时可以使用resultType或resultMap之一
resultMap 表示外部resultMap的命名引用。返回时可以使用resultType或resultMapresultMap之一
useCache 用来控制二级缓存的开启和关闭。其值为布尔类型(true/false), 默认值为true,表示将查询结果存入二级缓存中
timeout 用于设置超时参数,单位为秒。超时时将抛出异常
fetchSize 获取记录的总条数设定,其默认值是unset (依赖于驱动)
resultSetType 表示结果集的类型,其值可设置为FORWARD_ONLY、SCROLL_SENSITIVE或SCROLL_INSENSITIVE, 它的默认值是unset(依赖于驱动)
<select id="findUesrById" parameterType="Integer"
            resultType="com.example.po.User">
            select * from user where id = #{id}
select>

  3.2. 元素
  元素用于映射插入语句,在执行完元素中定义的SQL语句后,会返回一个表示插入记录数的整数。
  元素的属性与