MyBatis的核心配置
MyBatis的核心对象
SqlSessionFactory
SqlSessionFactory是线程安全的,一旦被创建在整个应用执行期间都会存在。如果多次创建同一个数据库的SqlSessionFactory,那么此数据库的资源将很容易被耗尽。所以,通常每一个数据库都会只对应一个SqlSessionFactory,所以在构建SqlSessionFactory实例时,通常使用单例模式。
SqlSession
SqlSession是MyBatis框架中另一个重要的角色,他是应用程序与持久层之间执行交互操作的一个单线程对象,其主要作用是执行持久化操作,SqlSession对象包含了数据库中所有执行SQL操作的方法,由于其底层封装JDBC连接,所以可以直接使用其实例来执行已映射的SQL语句。
但同时SqlSession实例也是线程不安全的,因此其使用范围最好在一次请求或者一个方法中,绝不能将其放在一个类的静态字段、实例字段或者任何类型的管理范围中使用。使用完SqlSession对象之后,要及时地关闭,通常可以放在finally块中关闭。
SqlSession对象中包含了很多方法,其常用方法如下所示:
- 查询方法:selectOne(String statement , Object parameter),selectOne(String statement );查询方法,parameter是查询所需的参数。使用该方法后,会返回执行SQL语句查询结果的泛型对象的集合。
常用方法 | 作用 |
---|---|
selectOne(String statement )/selectOne(String statement,Object parameter) | 查询方法,参数Statement是在配置文件中定义的元素的的id,parameter是查询所需的参数。使用该方法后,会返回执行SQL语句查询结果的一条泛型对象 |
List selectList(String Statement)/List selectList(String Statement,Object parameter) | 查询方法,和上面的差不多,但返回的结果是SQL语句查询的泛型对象的集合 |
void select (String statement,Object parameter,ResultHandler handler ) | 查询方法。参数statement实在配置文件中定义的元素的id,parameter是查询所需的参数,ResultHandler对象用于处理查询返回的复杂结果集,通常是用于多表查询 |
int insert (String statement)/int insert (String statement,Object parameter) | 插入方法,使用该方法后,会返回SQL语句所影响的行数,parameter是插入所需的参数 |
int update (String statement )/int update (String statement,Object parameter) | 更新操作,使用该方法后,会返回执行SQL语句所影响的行数 |
int delete(String statement )/int delete(String statement,Object parameter) | 删除方法,使用后返回执行SQL语句所影响的行数 |
void commit() | 提交事务的方法 |
void close() | 关闭session对象 |
void rollback | 回滚事务 |
T getMapper(Class type) | 该方法会返回Mapper接口的代理对象,该对象关联了SqlSession对象 |
---|---|
Connection getConnection | 获取JDBC数据库连接对象的方法 |
配置文件
主要元素
在MyBatis框架的核心配置文件中,元素是配置文件的根元素,其他元素都要在元素内配置
的子元素必须按照上图中由上到下的顺序进行配置,否则在解析XML文件的时候会出错
properties元素
是一个配置属性的元素,该元素通常用于将内部的配置外在化,即通过外部的配置来动态的替换内部定义的属性
-
在项目的src目录下,添加一个全名为db.properties的配置文件,编辑后的代码如下所示。
jdbc.driver=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql://localhost:3306/mybatis?useSSL=false&serverTimezone=UTC&characterEncoding=utf8 jdbc.username=root jdbc.password=root
-
在MyBatis配置文件mybatis-config.xml中配置元素,具体如下
<properties resource="db.properties"/>
-
修改配置文件中数据库连接的信息,具体如下
<dataSource type="POOLED"> <property name="driver" value="${jdbc.driver}"/> <property name="url" value="${jdbc.url}"/> <property name="username" value="${jdbc.username}"/> <property name="password" value="${jdbc.password}"/> </dataSource>
完成上述配置后,dataSource中连接数据库的4个属性(driver,url,username和password)值将会由db.properties文件中对应的值来动态替换。
settings元素
元素主要用于改变MyBatis运行时的行为,例如开启二级缓存、开启延迟加载等。虽然不配置元素,也可以正常运行MyBatis,但是熟悉的配置内容以及它们的作用还是十分必要的。
元素中的常见配置及配置如下所示
这些参数在设置的时候都遵循的方式
typeAliases元素
元素用于为配置文件中的Java类型设置一个简短的名字,即设置别名。别名的设置与XML配置相关,其使用的意义在于减少全限定类名的冗余。
使用元素配置别名的方法如下
<!-- 定义别名-->
<typeAliases>
<typeAlias alias="user" type="com.itheima.po.user"/>
</typeAliases>
上述示例中,如果省略alias属性,MyBatis会默认将类名首字母小写后的名称作为别名
当POJO类过多时,还可以通过自动扫描包的形式自定义别名
<!-- 使用自动扫描包来定义别名-->
<typeAliases>
<package name="com.itheima.po"/>
</typeAliases>
上述示例中,元素中的子元素中的name属性用于指定要被定义别名的包,MyBatis会将所有com.itheima.po包中的POJO类以首字母小写的非限定类名来作为它的别名。比如com.itheima.po.User的别名为user,com.itheima.po.Customer的别名为customer
需要注意的是,上述方式的别名只适用于没有使用注解的情况。如果程序中使用了注解,则别名为其注解的值。
@Alias(value="user")
public class user{
........
}
typeHandler元素
typeHandler的作用就是将预处理语句中传入的参数从java类型转换为jdbc类型,或者从数据库去除结果时将jdbc类型转换为java类型
<configuration>
<typeHandlers>
<!--
当配置package的时候,mybatis会去配置的package扫描TypeHandler
<package name="com.dy.demo"/>
-->
<!-- handler属性直接配置我们要指定的TypeHandler -->
<typeHandler handler=""/>
<!-- javaType 配置java类型,例如String, 如果配上javaType, 那么指定的typeHandler就只作用于指定的类型 -->
<typeHandler javaType="" handler=""/>
<!-- jdbcType 配置数据库基本数据类型,例如varchar, 如果配上jdbcType, 那么指定的typeHandler就只作用于指定的类型 -->
<typeHandler jdbcType="" handler=""/>
<!-- 也可两者都配置 -->
<typeHandler javaType="" jdbcType="" handler=""/>
</typeHandlers>
......
</configuration>
objectFactory元素
MyBatis框架每次创建结果对象的新实例时,都会使用一个对象工厂(ObjectFactory)的实例来完成
MyBatis默认的ObjectFactory的作用就是实例化目标类,它既可以通过默认构造方法来实例化,也可以在参数映射存在的时候通过参数构造方法来实例化。
在通常情况下,我们使用默认的ObjectFactory即可,MyBatis中默认的ObjectFactory大部分情况下都不用配置和修改,但如果想覆盖ObjectFactory的默认行为,则可以通过自定义ObjectFactory来实现,具体方式如下。
-
自定义一个对象工厂,自定义的对象工厂需要实现ObjectFactory接口,或者继承DefaultObjectFactory类。由于DefaultObjectFactory类已经实现了ObjectFactory接口,所以通继承DefaultObjectFactory类实现即可。
-
在配置文件中使用元素配置自定义的ObjectFactory,如下所示
<objectFactory type="com.itheima.factory.MyObjectFactory"> <property name="name" value ="MyObjectFactory"/> </objectFactory>
plugins元素
元素的作用就是配置用户所开发的插件。
environments元素
在配置文件中,元素用于对环境进行配置。MyBatis的环境配置实际上就是数据源的配置,我们可以通过元素配置多种数据源、即配置多种数据库。
使用元素进行环境配置的实例如下
<environments default="development">
<environment id ="development">
<!-- 使用JDBC事务管理-->
<transactionManager type="JDBC"/>
<!--配置数据源 -->
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</dataSource>
</environment>
</environments>
在上述示例代码中, 是环境配置的根元素,它包含一个default属性,该属性用于指定默认的环境。是元素的子元素,它可以定义多个,其属性用于表示所定义环境的ID值。在元素内,包含事务管理和数据源的配置信息,其中元素用于配置事务管理,它的type属性用于指定事务管理的方式,即使用哪种事务管理器;元素用于配置数据源,它的type属性用于指定使用哪种数据源。
在MyBatis中。可以配置两种类型的事务管理器,分别是JDBC和MANAGED
- JDBC: 此配置直接使用了JDBC的提交和回滚设置,它依赖于从数据源得到的连接来管理事务的作用域
- MANAGED: 此配置从来不提交或回滚一个连接,而是让容器来管理事务的整个生命周期。在默认情况下,它会关闭连接,但一些容器并不希望这样,为此可以将closeConnection属性设置为false来阻止它默认的关闭行为。
对于数据源的配置,MyBatis框架提供了UNPOOLED、POOLED和JNDI三种数据源类型
- UNPOOLED类型的数据源需要配置5种属性
属性 | 说明 |
---|---|
driver | JDBC驱动的Java类的完全限定名 |
url | 数据库的url地址 |
username | 登录数据库的用户名 |
password | 登录数据库的密码 |
defaultTransactionlsolationLevel | 默认的连接事务隔离级别 |
- POOLED
此数据源利用"池"的概念将JDBC连接对象组织起来,避免了在创建新的连接实例时所需要初始化和认证的时间。这种方式使得并发Web应用可以快速地相应请求。
- JNDI
此数据源可以在EJB(Enterprise Java Beans)或应用服务器等容器种使用。容器可以集中或在外部配置数据源,然后放置一个JNDI上下文的引用。
配置JNDI数据源时,只需要配置两个属性
属性 | 说明 |
---|---|
initial_context | 此属性主要用于在IntialContext种寻找上下文,在忽略此属性时,data_source属性会直接从InitialContext中寻找 |
data_source | 此属性表示引用数据源实例位置的上下文的路径。如果提供了Initial_context配置,那么程序会在其返回的上下文中进行查找;如果没有提供,则直接在InitialContext中查找 |