文章目录
MyBatis 真正的核心在映射文件中,通过映射的形式节省了大量的 JDBC 代码。而且将 SQL 语句独立在 Java 代码之外,可以进行更为细致的 SQL 优化。
一、mybatis-config.xml:核心配置文件(数据源配置)
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
- property:配置数据源
- property:配置数据源
-
-
-
-
配置 mapper.xml 映射关系
-
mappers:声明一个或者多个 mapper.xml,与这些xml产生映射关系
- mapper:配置这些 XML 的路径
-
-
配置实体类别名,配置完之后mapper.xml中无需配置实体类全路径,直接引用别名即可
-
typeAliases: 为实体类路径起别名
- typeAlias
- type :配置实体类路径
- alias: 配置别名
- typeAlias
-
注:使用该标签为实体类路径做映射时需要搭配 @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 是连接到数据库连接池的一个请求!
- SqlSession 的实例不是线程安全的,因此是不能被共享的,所以它的最佳的作用域是请求或方法作用域。
- 用完后需要赶紧关闭,否则资源被占用!
通过 SqlSession 实例创建 Mapper 接口的代理对象,通过代理对象便可以调用接口中的 mapper 方法了。最后将 SqlSession 实例以及 SqlSessionFactory 工厂关闭,程序结束。
三、MyBatis 框架 XML 常用标签
这类 XML 通常被定义为 XXXMapper.xml,其中标签的内容大多是编写 SQL 语句,或者围绕着编写 sql 语句而存在的。主要有外级标签(最外层的标签),顶级标签和动态标签。
1、mybatis 的 mapper 映射器引入映射文件
mapper 标签主要作用是将映射文件引入到当前 XML 文件中。
- mapper
- 属性:namespace,该属性内容需要和 mapper 接口的路径完全一致,以此来与接口产生映射关系。
- XML 文件示例:
<?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">
<!-- namespace名字必须与dao包路径接口名完全相同 -->
<mapper namespace="com.demo.mapper.XXXMapper" >
</mapper>