SSM(MyBatis的核心配置)

第七章、MyBatis的核心配置

  • 7.1 MyBatis的核心对象
    • 7.1.1 SqlSessionFactory
    • 7.1.2 SqlSession
  • 7.2 配置文件
    • 7.2.1主要元素
  • 7.3 映射文件

7.1 MyBatis的核心对象

在使用Mybatis框架时,主要涉及两个核心对象: SqlSessionFactory 和 SqlSession

7.1.1 SqlSessionFactory

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

//读取配置文件
InputStream inputStream=Resources.getResourceAsStream("配置文件位置");
//根据配置文件构建SqlSessionFactory
SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream);

SqlSessionFactory对象时线程安全的,它一旦被创建,在整个应用执行期间都会存在。如果我们多次地创建同一个数据库的SqlSessionFactory,此数据库的资源将很快被耗尽。(建议使用单例模式)

7.1.2 SqlSession

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

SqlSession对象内置常用的增删改查与事务的API

  • T getMapper(Class type);
    该方法会返回Mapper接口的代理对象,该对象关联了SqlSession对象,开发人员可以使用该对象直接调用方法操作数据库。参数type是Mapper的接口类型。MyBatis官方推荐通过Mapper对象访问MyBatis。
  • Connection getConnection();
    获取JDBC数据库连接对象的方法

7.2 配置文件

MyBatis的核心配置文件中,包含很多影响MyBatis行为的重要信息。这些信息通常在一个项目中只会在一个配置文件中编写,并且编写后也不会轻易改动。虽然实际项目中需要开发人员编写或者修改的配置文件不多,但是熟悉配置文件中各个元素的功能还是十分重要的。

7.2.1主要元素

元素是配置文件的根元素,其他元素都要在内配置。

子元素必须按照顺序配置,否则Mybatis解析XML配置文件时会报错


  • 该元素用于将内部的配置外在化,通过外部的配置来动态地替换内部定义的属性。例如数据库的连接等
<properties resource="db.properties" />   //最常用

还可以通过配置子元素或方法参数的方式获取属性值


  • 该元素用于改变MyBatis运行时的行为,例如开启二级缓存,开启延迟加载等。
设置参数 描述 有效值 默认值
cacheEnable 影响所有映射器配置的缓存开关 true,false false
lazyLoadingEnabled 延迟加载全局开关,开启时,所有关联对象都会延迟加载。特定关联关系中可以通过设置fetchType属性覆盖该项的开关状态 true,false false
aggressiveLazyLoading 关联对象属性的延迟加载开关。当启用时,对任意延迟属性的调用会使带有延迟加载属性对象完整加载,反之,每种属性都会按需加载 true,false true
mutipleResultSetsEnabled 是否允许单一语句返回多结果集(需要兼容驱动) true,false true
userColumnLabel 使用列标签代替列名,不同的驱动不同的表现 true,false true
useGeneratedKeys 允许JDBC支持自动生成主键,需要驱动兼容。如果设置为true,则这个设置强制使用自动生成主键,尽管一些驱动不兼容 true,false false
autoMappingBehavior 指定MyBatis 应如何自动映射列到字段或属性。NONE表示取消自动映射;PARTIAL只会自动映射没有定义嵌套结果集映射的结果集;FULL会自动映射任意复杂的结果集(无论是否嵌套) NONE PARTIAL FULL PARTIAL
defaultStatementTimeout 设置超时时间,它决定驱动等待数据库响应的秒数,没有设置,取驱动默认时间 任何正整数 没有设置
mapUnderscoreToCamelCase 是否开启自动驼峰命名规则(camel case)映射 true,false false
jdbcTypeForNull 没有为参数提供特定的JDBC类型时,为空值指定JDBC类型。某些驱动需要指定列的JDBC类型,多数情况直接用一般类型 NULL VARCHAR OTHER NULL VARCHAR OTHER OTHER

  • 用于为配置文件中Java类型设置一个简短的名字,即设置别名,别名的设置与XML配置相关,其使用的意义在于减少全限定类名的冗余。
<!-- 定义别名 -->
<typeAliases>
<!--  type(全限定名) alias(自定义别名-省略时别名为类名首字母小写) -->
  <typeAlias alias="user" type="xxx.xxx.xxx.xxx" />
</typeAliases>

当POJO类过多时 通过自动扫描包的形式自定义别名

<!-- 自动扫描包定义别名-->
<typeAliase>
<package name="包名" />
</typeAliase>
注解 指定别名
@Alias(value="user")
public class User{
}

除了Mybatis框架默认为许多常见的Java类型(数值、字符串、日期和集合等)提供相应的类型别名。

基础数据类型前加(_) 其他数据类型首字母小写

MyBatis在预处理语句(PreparedStatement)中设置一个参数或者从结果集(ResultSet)中取出一个值时,都会用其框架内部注册了的typeHander(类型处理器)进行相关处理。

typeHandler的作用就是将预处理语句中传入的参数从javaType(Java类型)转换为jdbcType(JDBC类型),或者从数据库取出结果时将jdbcType转换为javaType

当MyBatis框架所提供的这些类型处理器不能够满足需求时,可以通过自定义的方式对类型处理器进行扩展(自定义类型处理器可以通过实现TypeHandler接口或者继承BaseTypeHandle类来定义)

  1. 注册一个类的类型处理器
<typehandlers>
<typeHandler handler="类全路径" >
</typehandlers>
  1. 注册一个包中所有类型处理器
<typeHandlers>
<package  name="包名" />
</typeHandlers>

MyBatis框架每次创建结果对象的新实例时,都会使用一个对象工厂(ObjectFactory)的实例来完成。MyBatis中默认的ObjectFactory作用就是实例化目标类,它既可以通过默认构造方法实例化,也可以在参数映射存在的时候通过参数构造方法实例化。

通常情况下,使用默认的ObjectFactory是由org.apache.ibatis.reflection.DefaultObjectFactory来提供服务,大部分场景不用配置和修改,可以通过自定义的方式修改。

  1. 自定义对象工厂
    实现ObjectFactory接口或者继承DefaultObjectFactory类
  2. 配置自定义ObjectFactory
<objectFactory type="xxx">
<property name="name" value="xxx" />
</objectFactory>

  • Mybatis允许已映射语句执行过程中的某一点进行拦截调用,拦截调用通过插件来完成。
    元素是配置用户所开发的插件。想进行插件的开发,必须先了解其内部运行原理。因为在试图修改或重写已有方法行为时,可能会破坏MyBatis原有核心模块。

MyBatis中配置两种事务管理器,分别是JDBC和MANAGED

JDBC — 此配置直接使用了JDBC的提交和回滚设置,依赖于从数据源得到的连接来管理事务的作用域。
MANAGED — 此配置从来不提交或回滚一个连接,而是让容器来管理事务的整个声明周期,默认情况下,会关闭连接,但一些容器不希望这样,为此可以将closeConnection属性设置为false阻止它默认的关闭行为。

注意: 如果项目是Spring+MyBatis 则没有必要在MyBatis中配置事务管理器,使用Spring自带管理器来实现事务管理。

对于数据源的配置,MyBatis框架提供了UNPOOLED POOLED JNDI三种数据源类型

  1. UNPOOLED
    配置此数据源类型后,每次请求时会打开和关闭连接,对没有性能要求的程序是好选择
    driver url username password defaultTransactionlsolationLevel(默认事务隔离级别)
  2. POOLED
    此数据源利用“池”的概念将JDBC连接对象组织起来,避免新连接实例时所需的初始化和认证的时间。
属性 说明
poolMaximumActiveConnections 任意时间可以存在的活动连接数量,默认10
poolMaximumidleConnections 任意时间空闲链接
在被强制返回之前,池中连接被检出时间 默认值20000ms
poolTimeToWait 获取连接时间太长,会打印日志并重新尝试获取一个连接 默认20000ms
poolPingQuery 发送到数据库的侦测查询,检验连接是否处在正常工作序列中,默认是NO PING QUERY SET 会导致多数数据库驱动失败时带有一定的错误信息
poolPingEnabled 是否启动侦测查询 ,开启则必须使用可执行的SQL语句 设置poolPingQuery 默认false
poolPingConnectionsNotUsedFor 配置侦测频率,可以设置成连接超时时间避免不必要的侦测,默认0
  1. JNDI
    在EJB或应用服务器等容器中使用,容器可以集中或在外部配置数据源,然后放置一个JNDI上下文的引用。
属性 说明
initail_context 该属性主要用于在InitialContext中寻找上下文(即initialContext.lookup(initial_context)) 该属性为可选属性,忽略时,data_source属性会直接从InitialContext中寻找
data_source 表示引用数据源实例位置的上下文的路径

  • 指定MyBatis映射文件的位置
  1. 类路径
<mapper resource="xxx/xxx/xxx.xml />
  1. 本地文件路径
<mapper  url="xxx" / >
  1. 接口类
<mapper  class="xxx.xxx.xxx.xxx.xxx" / >
  1. 包名
<mapper  name="xxx.xxx.xxx.xxx" / >

7.3 映射文件

  • select
属性 说明
id 唯一标识符
parameterType 表示参数类的全限定名或别名,可选属性,因为MyBatis可以通过TypeHandler推断出具体传入语句的参数。默认值是unset(依赖于驱动)
resultType 类或集合可包含类型的全限定名或者别名
resultMap 引用
flushCache 调用SQL语句之后,是否需要清空之前查询的本地缓存和二级缓存。true,false 默认为false 设置为true,任何时候只要SQL调用都会清空本地缓存和二级缓存
useCache 控制二级缓存的开启和关闭 true,false 默认为ture将查询结果存入二级缓存
timeout 超时参数,单位为秒
fetchSize 获取记录的总条数设定,默认是unset(依赖驱动)
starementType 设置MyBatis使用哪个JDBC的Statement工作 STATEMENT PREPARED CALLABLE 分别对应JDBC中的Statement PreparedStatement 和 CallableStatement
resultSetType 结果集的类型,其值可设置为FORWARD_ONLY SCROLL_SENSITIVE 或 SCROLL_INSENSITIVE 默认是unset(依赖驱动)
  • insert
属性 说明
keyProperty (仅对insert和update有用)插入和更新操作的返回值赋值给PO类的某个属性,通常设置主键。如果要设置联合主键,多值之间逗号隔开
keyColumn (仅对insert和update有用,设置第几列是主键,主键不是第一列需要设置,主键联合逗号相隔)
useGeneratedKeys (仅对insert和update有用)此属性会使MyBatis使用JDBC的getGeneratedKeys()方法来获取由数据库内部产生的主键,默认false
  • update
  • delete
  • sql
  • cache
  • cache-ref
  • resultMap
<resultMap type="" id="" >
<constructor> //注入结果到构造方法
<idArg/>//标记结果作为ID
<arg/> //普通结果
</constructor>
<id/>//主键
<result/> //JavaBean属性的普通结果
<association property=""> //一对一映射
<collection proerty=""> //一对多映射

<discriminator javaType="">// 使用结果值决定使用哪个结果映射
<case value=""/>  //基于某些值的结果映射
</discriminator>

</resultMap>

你可能感兴趣的:(SSM,mybatis,java,ssm)