在使用Mybatis框架时,主要涉及两个核心对象: SqlSessionFactory 和 SqlSession
SqlSessionFactory是MyBatis框架中十分重要的对象,单个数据库映射关系经过编译后的内存镜像,主要作用是创建SqlSession。SqlSessionFactory对象的实例可以通过SqlSessionFactoryBuilder对象来创建,而SqlSessionFactoryBuilder则可以通过XML配置文件或一个预先定义好的Configuration实例构建出SqlSessionFactory的实例。
//读取配置文件
InputStream inputStream=Resources.getResourceAsStream("配置文件位置");
//根据配置文件构建SqlSessionFactory
SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream);
SqlSessionFactory对象时线程安全的,它一旦被创建,在整个应用执行期间都会存在。如果我们多次地创建同一个数据库的SqlSessionFactory,此数据库的资源将很快被耗尽。(建议使用单例模式)
SqlSession是MyBatis框架中另一个重要对象,它是应用程序与持久层之间执行交互操作的一个单线程对象,主要作用是执行持久化操作。SqlSession对象包含了数据库中所有执行SQL操作的方法,由于底层封装了JDBC连接,所以可以直接使用其实例来执行已映射的SQL语句。
每一个线程都应该有一个自己的SqlSession实例,并且该实例不能被共享的。同时,其也是线程不安全的,其适用范围最好在一次请求或一个方法中,绝不能将其放在一个类的静态字段、实例字段或任何类型的管理范围(如Servlet的HttpSession中),使用完SqlSession对象之后,要及时关闭它,通常在finally块中关闭。
SqlSession对象内置常用的增删改查与事务的API
MyBatis的核心配置文件中,包含很多影响MyBatis行为的重要信息。这些信息通常在一个项目中只会在一个配置文件中编写,并且编写后也不会轻易改动。虽然实际项目中需要开发人员编写或者修改的配置文件不多,但是熟悉配置文件中各个元素的功能还是十分重要的。
元素是配置文件的根元素,其他元素都要在
内配置。
子元素必须按照顺序配置,否则Mybatis解析XML配置文件时会报错
<properties resource="db.properties" /> //最常用
还可以通过配置子元素
或方法参数的方式获取属性值
设置参数 | 描述 | 有效值 | 默认值 |
---|---|---|---|
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 |
<!-- 定义别名 -->
<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类来定义)
<typehandlers>
<typeHandler handler="类全路径" >
</typehandlers>
<typeHandlers>
<package name="包名" />
</typeHandlers>
MyBatis框架每次创建结果对象的新实例时,都会使用一个对象工厂(ObjectFactory)的实例来完成。MyBatis中默认的ObjectFactory作用就是实例化目标类,它既可以通过默认构造方法实例化,也可以在参数映射存在的时候通过参数构造方法实例化。
通常情况下,使用默认的ObjectFactory是由org.apache.ibatis.reflection.DefaultObjectFactory来提供服务,大部分场景不用配置和修改,可以通过自定义的方式修改。
<objectFactory type="xxx">
<property name="name" value="xxx" />
</objectFactory>
元素是配置用户所开发的插件。想进行插件的开发,必须先了解其内部运行原理。因为在试图修改或重写已有方法行为时,可能会破坏MyBatis原有核心模块。
MyBatis中配置两种事务管理器,分别是JDBC和MANAGED
JDBC — 此配置直接使用了JDBC的提交和回滚设置,依赖于从数据源得到的连接来管理事务的作用域。
MANAGED — 此配置从来不提交或回滚一个连接,而是让容器来管理事务的整个声明周期,默认情况下,会关闭连接,但一些容器不希望这样,为此可以将closeConnection属性设置为false阻止它默认的关闭行为。
注意: 如果项目是Spring+MyBatis 则没有必要在MyBatis中配置事务管理器,使用Spring自带管理器来实现事务管理。
对于数据源的配置,MyBatis框架提供了UNPOOLED POOLED JNDI三种数据源类型
属性 | 说明 |
---|---|
poolMaximumActiveConnections | 任意时间可以存在的活动连接数量,默认10 |
poolMaximumidleConnections | 任意时间空闲链接 |
在被强制返回之前,池中连接被检出时间 默认值20000ms | |
poolTimeToWait | 获取连接时间太长,会打印日志并重新尝试获取一个连接 默认20000ms |
poolPingQuery | 发送到数据库的侦测查询,检验连接是否处在正常工作序列中,默认是NO PING QUERY SET 会导致多数数据库驱动失败时带有一定的错误信息 |
poolPingEnabled | 是否启动侦测查询 ,开启则必须使用可执行的SQL语句 设置poolPingQuery 默认false |
poolPingConnectionsNotUsedFor | 配置侦测频率,可以设置成连接超时时间避免不必要的侦测,默认0 |
属性 | 说明 |
---|---|
initail_context | 该属性主要用于在InitialContext中寻找上下文(即initialContext.lookup(initial_context)) 该属性为可选属性,忽略时,data_source属性会直接从InitialContext中寻找 |
data_source | 表示引用数据源实例位置的上下文的路径 |
<mapper resource="xxx/xxx/xxx.xml />
<mapper url="xxx" / >
<mapper class="xxx.xxx.xxx.xxx.xxx" / >
<mapper name="xxx.xxx.xxx.xxx" / >
属性 | 说明 |
---|---|
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(依赖驱动) |
属性 | 说明 |
---|---|
keyProperty | (仅对insert和update有用)插入和更新操作的返回值赋值给PO类的某个属性,通常设置主键。如果要设置联合主键,多值之间逗号隔开 |
keyColumn | (仅对insert和update有用,设置第几列是主键,主键不是第一列需要设置,主键联合逗号相隔) |
useGeneratedKeys | (仅对insert和update有用)此属性会使MyBatis使用JDBC的getGeneratedKeys()方法来获取由数据库内部产生的主键,默认false |
<resultMap type="" id="" >
<constructor> //注入结果到构造方法
<idArg/>//标记结果作为ID
<arg/> //普通结果
</constructor>
<id/>//主键
<result/> //JavaBean属性的普通结果
<association property=""> //一对一映射
<collection proerty=""> //一对多映射
<discriminator javaType="">// 使用结果值决定使用哪个结果映射
<case value=""/> //基于某些值的结果映射
</discriminator>
</resultMap>