文章目录
一、生命周期
上一篇写了几个创建sqlSession对象需要构建出其他的一些对象。对这些对象有一些简单的认识。
1.1 SqlSessionFactoryBuilder
//1.读取配置文件
InputStream inputStream = Resources.getResourceAsStream(resource);
//2.创建 SqlSessionFactory的构建者对象并创建工厂对象 SqlSessionFactory
sqlSessionFactory= new SqlSessionFactoryBuilder().build(inputStream);
创建SqlSessionFactory,需要读取mybatis的配置文件。作为创建SqlSessionFactory的一个对象,一旦SqlSessionFactory被创建之后,就不在需要它了,所以实例的最佳作用域就是方法作用域中。
一个SqlSessionFactoryBuilder可以构建多个SqlSessionFactory
1.2 SqlSessionFactory
SqlSessionFactory被构建成功之后,就要在程序运行过程中一直存在。所以它的最佳作用域是应用作用域,可以使用单例模式或者静态单例模式对SqlSessionFactory进行限定,
1.3 SqlSession
每次对数据库的操作都应该要有一个SqlSession,所以它是不能被共享的,实例不安全。应该存在一次请求中,当处理完请求之后,就需要关闭这个SqlSession
简单理解,SqlSessionFactory 相当于数据库的连接池,每个的SqlSession是一个数据库连接,当使用完毕之后,应当归还连接池中。
所以SqlSession的最佳作用域是在一个请求(对数据库的一次操作)中。
二、mybatis配置文件
这个是官网中介绍mybatis配置文件的所有配置
configuration(配置)
properties(属性)
settings(设置)
typeAliases(类型别名)
typeHandlers(类型处理器)
objectFactory(对象工厂)
plugins(插件)
environments(环境配置)
environment(环境变量)
transactionManager(事务管理器)
dataSource(数据源)
databaseIdProvider(数据库厂商标识)
mappers(映射器)
配置文件中可以配置以上属性
2.1 属性(properties)
可以用来读取外部的配置文件。比如我们可以将连接数据库所需要的几个参数通过读取配置文件进行设置。
db.properties
db.driver=com.mysql.jdbc.Driver
db.url=jdbc:mysql://localhost:3306/mybatis?useSSL=true&useUnicode=true&characterEncoding=utf8&serverTimezone=UTC
db.username=root
db.password=123456
mybatis配置文件中读取配置
<properties resource="db.properties"/>
然后可以在整个配置文件中替换固定的一些属性
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${db.driver}"/>
<property name="url" value="${db.url}"/>
<property name="username" value="${db.username}"/>
<property name="password" value="${db.password}"/>
</dataSource>
</environment>
</environments>
这样的话配置文件中的值就可以通过读取配置文件来获取。代码就变得很灵活。
properties`节点也可以在内部进行设置。
<properties resource="db.properties">
<property name="username" value="dev_user"/>
<property name="password" value="123456"/>
</properties>
读取的配置文件和内部都定义了相同的属性。读取的顺序为
- 优先读取properties元素体内的指定的属性
- 然后看配置文件中是否存在元素体内相同的属性,如果有就进行覆盖
- 最后作为参数进行,其他地方的设置
引用官网的一句话
通过方法参数传递的属性具有最高优先级,resource/url 属性中指定的配置文件次之,最低优先级的则是 properties 元素中指定的属性。
2.2 设置(settings)
这里配置文件中最重要的一个配置,他可以定义优化很多的操作
引用官网配置的完整的setting元素
<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"/>
<setting name="autoMappingUnknownColumnBehavior" value="WARNING"/>
<setting name="defaultExecutorType" value="SIMPLE"/>
<setting name="defaultStatementTimeout" value="25"/>
<setting name="defaultFetchSize" value="100"/>
<setting name="safeRowBoundsEnabled" value="false"/>
<setting name="mapUnderscoreToCamelCase" value="false"/>
<setting name="localCacheScope" value="SESSION"/>
<setting name="jdbcTypeForNull" value="OTHER"/>
<setting name="lazyLoadTriggerMethods" value="equals,clone,hashCode,toString"/>
</settings>
还有更多的设置以及默认值,所对应的作用,官网里面都有。
2.3 类型别名(typeAliases)
可以为Java类型设置一个缩写名称,可以缩写我们的全限定类名
设置单个Java类型
<typeAliases>
<typeAlias type="com.gx.pojo.User" alias="User"/>
</typeAliases>
扫描整个包,也就是说整个包下面的Java Bean都可以使用别名
<typeAliases>
<package name="com.gx.pojo"/>
</typeAliases>
具体使用是在mapper对应xml文件中,方法返回值以及方法的参数进行设置的时候,可以使用别名
之前的配置resultType
<mapper namespace="com.gx.dao.UserMapper">
<select id="selectUser" resultType="com.gx.pojo.User">
select * from user
</select>
设置别名之后
<mapper namespace="com.gx.dao.UserMapper">
<select id="selectUser" resultType="User">
select * from user
</select>
Bean 的首字母小写的非限定类名来作为它的别名
2.4 environments元素
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${db.driver}"/>
<property name="url" value="${db.url}"/>
<property name="username" value="${db.username}"/>
<property name="password" value="${db.password}"/>
</dataSource>
</environment>
</environments>
环境配置,可以让SQL映射在不同的环境配置中。
尽管可以配置多个环境,但每个 SqlSessionFactory 实例只能选择一种环境。
id
设置当前配置环境的id属性,每个environments对应一个id
事务管理器(transactionManager)
Mybaits中有两种类型的事务管理器。
- JDBC
设置为JDBC,依赖从数据源获得的连接来管理事务作用域
- MANAGED
不提交或回滚一个连接,让容器来管理事务的整个生命周期
数据源(daraSource)
type属性:规定使用的数据源
- UNPOOLED
每次请求时打开和关闭连接,对数据库连接要求不高
driver – 这是 JDBC 驱动的 Java 类全限定名(并不是 JDBC 驱动中可能包含的数据源类)。
url – 这是数据库的 JDBC URL 地址。
username – 登录数据库的用户名。
password – 登录数据库的密码。
defaultTransactionIsolationLevel – 默认的连接事务隔离级别。
defaultNetworkTimeout – 等待数据库操作完成的默认网络超时时间(单位:毫秒)。查看 java.sql.Connection#setNetworkTimeout() 的 API 文档以获取更多信息。
- POOLED
池的形式将JDBC连接对象存在一起,避免了创建连接实例所需的时间。可以额外配置一些属性。
poolMaximumActiveConnections – 在任意时间可存在的活动(正在使用)连接数量,默认值:10
poolMaximumIdleConnections – 任意时间可能存在的空闲连接数。
poolMaximumCheckoutTime – 在被强制返回之前,池中连接被检出(checked out)时间,默认值:20000 毫秒(即 20 秒)
poolTimeToWait – 这是一个底层设置,如果获取连接花费了相当长的时间,连接池会打印状态日志并重新尝试获取一个连接(避免在误配置的情况下一直失败且不打印日志),默认值:20000 毫秒(即 20 秒)。
poolMaximumLocalBadConnectionTolerance – 这是一个关于坏连接容忍度的底层设置, 作用于每一个尝试从缓存池获取连接的线程。 如果这个线程获取到的是一个坏的连接,那么这个数据源允许这个线程尝试重新获取一个新的连接,但是这个重新尝试的次数不应该超过 poolMaximumIdleConnections 与 poolMaximumLocalBadConnectionTolerance 之和。 默认值:3(新增于 3.4.5)
poolPingQuery – 发送到数据库的侦测查询,用来检验连接是否正常工作并准备接受请求。默认是“NO PING QUERY SET”,这会导致多数数据库驱动出错时返回恰当的错误消息。
poolPingEnabled – 是否启用侦测查询。若开启,需要设置 poolPingQuery 属性为一个可执行的 SQL 语句(最好是一个速度非常快的 SQL 语句),默认值:false。
poolPingConnectionsNotUsedFor – 配置 poolPingQuery 的频率。可以被设置为和数据库连接超时时间一样,来避免不必要的侦测,默认值:0(即所有连接每一时刻都被侦测 — 当然仅当 poolPingEnabled 为 true 时适用)。
2.5 mappers(映射器)
<mappers>
<package name="com.gx.dao"/>
</mappers>
定义 SQL 映射语句。里面配置的属性就是告诉mybatis去哪儿找到这些SQL语句存在的映射文件。
这里可以使用相对于类路径的资源引用
,类名
,包名
使用类路径
<mappers>
<mapper resource="com/gx/dao/UserMapper.xml"/>
</mappers>
使用类名:
<mappers>
<mapper class="com.gx.dao.UserMapper"/>
</mappers>
要求映射器接口的名称和接口名称一致,并且在同一目录下。
使用包扫描:
<mappers>
<package name="com.gx.dao"/>
</mappers>
mapper放在与接口包名一样的resourcrs下。文件名称和接口名称一致
2.6 mapper文件
<mapper namespace="com.gx.dao.UserMapper">
<select id="selectUser" resultType="com.gx.pojo.User">
select * from user
</select>
</mapper>
namespace:命名空间
- 命名规则:接口的全限定类名,包名+类名
- 接口中的方法与mapper中的sql语句的id一一对应