通过入门学习后,我们很容易发现,mybatis的重点在于核心配置文件,mybatis的配置文件包含了会深入影响mybatis行为的设置和属性信息。下面我们就来针对核心配置文件中进行深入的学习。
一、environments元素
1、如下所示,配置好的属性可以在整个配置文件中用来替换要动态配置的属性值。另外mybatis中可以有多套运行环境,将SQL映射到多个不同的数据库上,但是必须指定其默认的运行环境:<environments default="development">
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
</dataSource>
</environment>
</environments>
2、这个实例中的username和password将会有properties元素中设置的相应的值来替换。
driver=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/mybatis?useSSL=true&useUnicode=true&serverTimezone=UTC&characterEncoding=UTF-8
username=root
password=root
3、当然这里需要我们在核心配置文件中进行引入,还可以像实例中这样即在properties文件中配置,同时也可以在核心配置文件中配置,如果同时有配置,他们先执行的外部配置文件。
<!--引入外部配置文件:优先使用外部配置文件-->
<properties resource="db.properties">
<property name="username" value="root"/>
<property name="password" value="root"/>
</properties>
4、重点属性讲解:
-
default:指定默认的运行环境,可以选择任意一个environment节点的id
-
environment:子元素节点
-
dataSource:数据源,这里一般都使用标准的JDBC连接对象的资源<transactionManager type="JDBC"/>,其实这里有三种内建的数据源类型type="[UNPOOLED | POOLED | JNDI]"
-
transactionManager:事务管理器<transactionManager type="JDBC"/>
-
JDBC – 这个配置就是直接使用了JDBC的提交和回滚设置,它依赖于从数据源得到的连接来管理事务作用域。
-
MANAGED – 这个配置几乎没做什么。它从来不提交或回滚一个连接,而是让容器来管理事务的整个生命周期(比如JEE应用服务器的上下文)。默认情况下它会关闭连接,然而一些容器并不希望这样,因此需要将closeConnection属性设置为false来阻止它默认的关闭行为。
-
unpooled:这个数据源的实现只是每次被请求时打开和关闭连接。
-
pooled:这种数据源的实现利用“池”的概念将 JDBC 连接对象组织起来 , 这是一种使得并发 Web 应用快速响应请求的流行处理方式。这是我们最常用的一种。
-
jndi:这个数据源的实现是为了能在如 Spring 或应用服务器这类容器中使用,容器可以集中或在外部配置数据源,然后放置一个 JNDI 上下文的引用。
二、mappers元素
mappers元素:映射器,主要定义映射SQL语句文件
1、使用相对路径进行配置
<mappers>
<mapper resource="com/jason/dao/Mapper.xml"/>
</mappers>
2、使用绝对路径进行配置
<mappers>
<mapper resource="file:///var/dao/Mapper.xml"/>
</mappers>
3、使用接口信息进行配置
<mappers>
<mapper class="com.jason.dao.Mapper"/>
</mappers>
4、使用接口所在的包进行配置
<mappers>
<package name="com.jason.dao"/>
</mappers>
三、Mapper文件
MyBatis 的真正强大在于它的映射语句,这是它的魔力所在。由于它的异常强大,映射器的 XML 文件就显得相对简单。
1、具体代码如下:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.jason.dao.UserDao">
</mapper>
2、namespace:命名空间,这个必须跟某个接口同名,接口中的方法与映射文件中的SQL语句id应该一一对应。
接口如下:
public interface UserDao {
List<User> getUserList();
}
Mapper文件中的SQL语句:
<mapper namespace="com.jason.dao.UserDao">
<select id="getUserList" resultType="user">
select * from mybatis.user ;
</select>
</mapper>
3、namespace和子元素的id联合保证唯一,绑定DAO接口,命名规则是:报名+类名
四、typeAliases优化
类型别名是为了java类型设置的一个短的名字,他只和XML配置有关,存在的意义仅仅在于用来减少完全限定名的冗余。
1、配置别名注意顺序,下面的配置中User可以使用在com.jason.pojo.User的地方:
<typeAliases>
<typeAlias type="com.jason.pojo.User" alias="User"/>
</typeAliases>
2、我们也可以指定一个包名,在没有注解的情况下,会使用Bean的首字母小写的非限定类名来作为他的别名
<typeAliases>
<!--给包起别名-->
<package name="com.jason.pojo"/>
</typeAliases>
如果有注解,别名就是其注解值,
@Alias("user")
public class User {
}
五、对象工厂
MyBatis 每次创建结果对象的新实例时,它都会使用一个对象工厂(ObjectFactory)实例来完成。默认的对象工厂需要做的仅仅是实例化目标类,要么通过默认构造方法,要么在参数映射存在的时候通过有参构造方法来实例化。如果想覆盖对象工厂的默认行为,则可以通过创建自己的对象工厂来实现。
1、结构图
2、SqlSessionFactoryBuilder
这个类可以在任何时候被实例化、使用和销毁。一旦您创造了SqlSessionFactory 就不需要再保留它了。SqlSessionFactoryBuilder 实例的最好的作用域是方法体内(即一个本地方法变量)。
3、SqlSessionFactory
一旦创建,SqlSessionFactory 将会存在于您的应用程序整个运行生命周期中。很少或根本没有理由去销毁它或重新创建它。最佳实践是不要在一个应用中多次创建SqlSessionFactory。所是SqlSessionFactory 最好的作用域范围是一个应用的生命周期范围。这可以由多种方式来实现,最简单的方式是使用Singleton 模式或静态Singleton 模式。但这不是被广泛接受的最佳做法,相反,您可能更愿意使用像Google Guice 或Spring 的依赖注入方式。这些框架允许您创造一个管理器,用于管理SqlSessionFactory 的生命周期。
4、SqlSession
每个线程都有一个SqlSession 实例,SqlSession 实例是不被共享的,并且不是线程安全的。因此最好的作用域是request 或者method。决不要用一个静态字段或者一个类的实例字段来保存SqlSession 实例引用。也不要用任何一个管理作用域,如Servlet 框架中的HttpSession,来保存SqlSession 的引用。如果您正在用一个WEB 框架,可以把SqlSession 的作用域看作类似于HTTP 的请求范围。也就是说,在收到一个HTTP 请求,您可以打开一个SqlSession,当您把response 返回时,就可以把SqlSession 关闭。关闭会话是非常重要的,您应该要确保会话在一个finally 块中被关闭。