MyBatis 真正的核心在映射文件中,通过映射的形式节省了大量的 JDBC 代码。而且将 SQL 语句独立在 Java 代码之外,可以进行更为细致的 SQL 优化。
mybatis-config.xml 中的内容几乎是固定的,大多是配置一些数据库相关配置,mapper.xml 文件的映射关系配置,以及实体类别名配置等等。
在核心配置文件中有严格的顺序要求,如果标签放的顺序不对,就会报错。
标签详解
数据源配置
configuration:声明在标签里面的信息是配置信息
environments :声明在该标签内的环境变量,default表示默认的环境变量,一个 environment 表示一个jdbc连接数据库,如果有很多数据库的话就需要用到不同的环境变量。
environment :声明环境变量
transactionManager :声明事务管理器,通过 type属性来控制 MyBatis 使用那种事务管理。有JDBC(基于jdbc的事务) 和 MANAGED(托管的事务)两种事务。
JDBC事务:使用 JdbcTransactionFactory 事务工厂,由 MyBatis 独立管理事务,直接使用JDK提供的 java.sql.Connection 对象来管理事务的各个环节:提交(commit())、回滚(rollback())、关闭(close())等操作;
MANAGED事务:使用 ManagedTransactionFactory 事务工厂,MyBatis 不负责持久层管理事务,而是将事务管理托付给其他框架,比如 Spring等;
dataSource :声名数据源,数据源的类型有NOPOOLED ,POOLED ,还有JIDN,在数据量少的话用ONPOOLED,测试和开发过程一般用POOLED,实际运行使用JIDN
配置 mapper.xml 映射关系
mappers:声明一个或者多个 mapper.xml,与这些xml产生映射关系
配置实体类别名,配置完之后mapper.xml中无需配置实体类全路径,直接引用别名即可
typeAliases: 为实体类路径起别名
注:使用该标签为实体类路径做映射时需要搭配 @Alias(“实体类名”)使用,直接放在实体类上即可
mybatis-config.xml 实例:
<?xml version="1.0" encoding="UTF8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD SQL Map Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!--设置启用数据库字段下划线映射到java对象的驼峰式命名属性,默认为false-->
<settings>
<setting name="mapUnderscoreToCamelCase" value="true"/>
<!-- 打印sql语句-->
<setting name="logImpl" value="STDOUT_LOGGING"/>
</settings>
<!-- 配置实体类路径别名 -->
<typeAliases>
<typeAlias type="com.demo_02.entity.Teacher" alias="Teacher"/>
<typeAlias type="com.demo_02.entity.Student" alias="Student"/>
</typeAliases>
<!-- 配置数据源,可以是多个数据源。default 属性:调用那个数据源-->
<environments default="mysql">
<!-- 数据源1 -->
<environment id="mysql">
<!-- 配置事务管理器类型,JDBC 是 JdbcTransactionFactory.class 的别名 -->
<transactionManager type="JDBC"></transactionManager>
<!-- 配置数据源。POOLED 是 PooledDataSourceFactory.class 的别名 -->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="url"/>
<property name="username" value="username"/>
<property name="password" value="password"/>
</dataSource>
</environment>
<!-- 数据源2 -->
<environment id="mysqls">
<transactionManager type="JDBC"></transactionManager>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="url"/>
<property name="username" value="username"/>
<property name="password" value="password"/>
</dataSource>
</environment>
</environments>
<!-- 配置写sql的xml文件,该文件需要是在resources文件下,不然映射不到该文件 -->
<mappers>
<mapper resource="mapper/XXX.xml"></mapper>
<mapper resource="mapper/XXX.xml"></mapper>
<mapper resource="mapper/XXX.xml"></mapper>
</mappers>
</configuration>
在MyBatis 框架的学习中,生命周期和作用域这一环节是至关重要的,如果错误的使用生命周期和作用域,可能会导致严重的并发问题,这在开发中是绝对不允许的。
SqlSessionFactoryBuilder: 程序开始读取 mybatis-config.xml 文件创建 SqlSessionFactory 工厂,当工厂创建完成之后便不在需要 SqlSessionFactoryBuilder 了。
SqlSessionFactory: 可以理解为数据库连接池。
SqlSessionFactory 在程序的运行期间一直存在,且不可丢弃也不能重新创建新的 SqlSessionFactory 工厂。
SqlSessionFactory 的最佳作用域是应用作用域。
SqlSession:
通过 SqlSession 实例创建 Mapper 接口的代理对象,通过代理对象便可以调用接口中的 mapper 方法了。最后将 SqlSession 实例以及 SqlSessionFactory 工厂关闭,程序结束。
这类 XML 通常被定义为 XXXMapper.xml,其中标签的内容大多是编写 SQL 语句,或者围绕着编写 sql 语句而存在的。主要有外级标签(最外层的标签),顶级标签和动态标签。
mapper 标签主要作用是将映射文件引入到当前 XML 文件中。
DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.demo.mapper.XXXMapper" >
mapper>