在上一篇博客实操的项目中,一开始需要在mybatis-config.xml文件中配置各种信息,这一次我们来深入解析这个配置文件
当然,最好的方式是结合MyBatis的官方文档来Configuration
MyBatis 的配置文件包含了会深深影响 MyBatis 行为的设置和属性信息。 配置文档的顶层结构如下:
首先我们从环境配置开始,以上一篇博客项目的mybatis-config.xml为例:
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mybatis?useSSL=true&useUnicode=true&characterEncoding=UTF-8"/>
<property name="username" value="root"/>
<property name="password" value="mysql"/>
dataSource>
environment>
environments>
,每个环境可以连接到一个数据库。(连接多个数据库的作用可以是用于生产和测试)
<environments default="test">
<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>
<environment id="test">
<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>
One important thing to remember though: While you can configure multiple environments, you can only choose ONE per SqlSessionFactory instance.*
一件很重要的事情需要去记住:虽然你可以配置多个环境,但每个SqlSessionFactory实例只能选择一个环境。
transactionManager
是JDBC
,默认的dataSource
是POOLED
,如果要了解和使用其他的可以直接上官网查询。db.properties
,这个文件含有数据库连接的配置信息driver=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/mybatis?useSSL=true&useUnicode=true&characterEncoding=UTF-8
username=root
password=mysql
注意在配置文件里直接用
&
,不需要跟原来xml文件中的&
这样的转义写法了
properties
配置,注意,我们添加的这些配置是有顺序的,如果你不按照顺序的话,那么会报下面这个错误:The content of element type “configuration” must match “(properties?,settings?,typeAliases?,typeHandlers?,objectFactory?,objectWrapperFactory?,reflectorFactory?,plugins?,environments?,databaseIdProvider?,mappers?)”.
这个错误表示mybatis-config.xml中的标签中元素位置不能随意,必须匹配其顺序要求。
${value}
的格式: <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>
A type alias is simply a shorter name for a Java type. It’s only relevant to the XML configuration and simply exists to reduce redundant typing of fully qualified classnames.
别名是Java类名的简短名字。它对XML配置唯一的意义和存在是去减少冗余的全限定类名的输入。
配置别名信息 <typeAliases>
<typeAlias type="com.cap.pojo.User" alias="user">typeAlias>
typeAliases>
起好别名后,就可以直接在UserMapping.xml中使用了
<select id="getUserById" resultType="user" parameterType="int">
SELECT * FROM mybatis.user
WHERE id = #{id};
select>
<update id="updateUser" parameterType="user" >
UPDATE mybatis.user
SET name=#{name},pwd=#{pwd}
WHERE id=#{id};
update>
<typeAliases>
<package name="com.cap.pojo"/>
typeAliases>
指定包名的话,MyBatis会去扫描包下类别名注解@Alias("alias_name")
,如果没有指明注解别名的话,MyBatis会默认使用小写首字母的类名作为别名,相当于:
@Alias("user")
public class User{
...
}
These are extremely important tweaks that modify the way that MyBatis behaves at runtime. 这是MyBatis中极为重要的调整设置,他们会改变MyBatis在运行时的行为。
下面列举比较重要的几个设置,其余可以见官网
映射器的作用是告诉MyBatis去哪里找我们定义的SQL映射语句。
官网提到的映射器配置有四种方式,下面列举三种最常用的方式,其中首推使用第一种方式,因为它最通用,也不像第二、第三种一样注意点多。
<mappers>
<mapper resource="com/cap/dao/UserMapping.xml"/>
mappers>
<mappers>
<mapper class="com.cap.dao.UserMapping" />
mappers>
注意点:
UserMapper
接口和UserMapper.xml
<mappers>
<package name="com.cap.dao"/>
mappers>
注意点和方式二一样
其他配置不常用,这里不展开描述
我们知道MyBatis框架中持久层的流程大约如下:
那么我们来解析一下SqlSessionFactoryBuilder
、SqlSessionFactory
、SqlSession
这三个类的生命周期和作用域,如果你不了解他们的话,那么后期可能会造成严重的并发问题
SqlSessionFactoryBuilder
SqlSessionFactory
There should be little or no reason to ever dispose of it or recreate it. 没有理由丢弃它再去重新创建该实例。
SqlSession
SqlSession
实例。SqlSession
线程不安全,所以线程间不要共享。Mapper
Mapper
是一些绑定映射语句的接口。Mapper
的实例可以从SqlSession
实例中获取Mapper
实例最好的作用域是方法内的局部变量,并且你不需要显式地关闭它。尽管在整个请求作用域保留映射器实例不会有什么问题,但是你很快会发现,在这个作用域上管理太多像 SqlSession 的资源会让你忙不过来。 因此,最好将映射器放在方法作用域内。