AI 摘要

文章系统梳理 MyBatis 入门要点:先阐释框架与 ORM 概念,对比主流持久层方案;继而以 step-by-step 方式演示环境搭建、配置、实体与 Mapper 编写、SqlSession 使用及工具类封装;最后解析核心配置文件各元素作用与最佳实践,并总结 MyBatis 优缺点及适用场景,为后续 SSM 整合奠定扎实基础。

框架技术概述

框架概念

框架(Framework)是一种经过检验的、按一定规则组织的一组组件、提供可重用的公共结构、具有特定功能的半成品。

框架针对特定的功能或架构需要,对基础代码进行了封装并提供相应的 API,不同的框架能够提供不同的功能,开发者需要在框架的基础上,加入具体的业务逻辑,开发出一套自己的应用。

使用框架技术的优势:

  • 不用再考虑公共问题,这些问题框架已经做好了实现。
  • 专心在业务逻辑的实现上,提升开发效率。
  • 项目结构统一,易于学习、维护。
  • 新手也可写出好程序。

主流框架技术简介

MyBatis:基于 ORM 的优秀的 DAO 层持久化框架,支持动态 SQL 等特性,小巧易学。

Spring:开源、轻量级的企业级应用框架,覆盖了 Java EE 技术的方方面面,可以很方便的与其他框架集成使用,使得开发过程更加快捷高效。

Spring MVC:基于 Servlet API 构建的 Web 框架,是目前最主要的 MVC 框架,具有高度可配置性,使用灵活。

Hibernate:优秀的 DAO 层持久化框架,使用面向对象的方式操作数据库,而不需要直接编写 SQL 查询语句

Struts2:基于 Web 的 MVC 框架,支持拦截器、OGNL 表达式等特性。

数据持久化及 ORM

持久化

持久化是程序数据在瞬时状态和持久状态间转换的过程。

ORM

ORM(Object/Relational Mapping,对象/关系映射)是一种在关系型数据库和面向对象编程语言之间进行数据转换的编程技术。

ORM 的作用:

  • 编写程序的时候,以面向对象的方式处理数据。
  • 保存数据的时候,却以关系型数据库的方式存储。

ORM 的解决方案:

  • 在持久化对象上执行基本的增、删、改、查操作。
  • 对持久化对象提供一种查询语言或者 API。
  • 对象关系映射工具。
  • 提供与事务对象交互、执行检查、延迟加载以及其他优化功能。

使用 MyBatis 实现数据库操作

MyBatis 概述

MyBatis 的前身叫做 iBatis,是 Apache 的一个开源的项目。

MyBatis 文档:https://mybatis.net.cn/

MyBatis 简介:

  • MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。
  • MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。
  • 通过 XML 或注解可以将特定的 SQL 语句与 Java 实体类关联起来,借助 MyBatis 提供的 API 执行 SQL 语句并完成数据在两种模型之间的转换。
  • 是一种半自动化的 ORM 实现。

MyBatis 初体验

搭建 MyBatis 开发环境的步骤:

  • 导入 JAR 依赖包:MySQL 驱动、MyBatis、Log4J。
  • 编写 MyBatis 核心配置文件 mybatis-config.xml。
  • 编写数据库表所对应的实体类。
  • 编写数据访问层 Mapper 接口。
  • 编写 SQL 映射文件。
  • 编写测试类、测试方法。

示例:搭建 MyBatis 开发环境

SQL 脚本:

SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

-- ----------------------------
-- Table structure for t_address
-- ----------------------------
DROP TABLE IF EXISTS `t_address`;
CREATE TABLE `t_address` (
  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键id',
  `contact` varchar(15) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '联系人姓名',
  `addressDesc` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '收货地址明细',
  `postCode` varchar(15) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '邮编',
  `tel` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '联系人电话',
  `userId` bigint DEFAULT NULL COMMENT '用户id',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='地址表';

-- ----------------------------
-- Records of t_address
-- ----------------------------
BEGIN;
INSERT INTO `t_address` (`id`, `contact`, `addressDesc`, `postCode`, `tel`, `userId`) VALUES (1, '张三', '福建省泉州市安溪县宝龙城市广场', '362400', '13275000001', 1);
INSERT INTO `t_address` (`id`, `contact`, `addressDesc`, `postCode`, `tel`, `userId`) VALUES (2, '张三', '福建省厦门市集美区软件园3期', '361000', '13275000002', 1);
COMMIT;

-- ----------------------------
-- Table structure for t_sys_role
-- ----------------------------
DROP TABLE IF EXISTS `t_sys_role`;
CREATE TABLE `t_sys_role` (
  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键id',
  `code` varchar(15) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '角色编码',
  `roleName` varchar(15) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '角色名称',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='角色表';

-- ----------------------------
-- Records of t_sys_role
-- ----------------------------
BEGIN;
INSERT INTO `t_sys_role` (`id`, `code`, `roleName`) VALUES (1, 'SYS_ADMIN', '管理员');
INSERT INTO `t_sys_role` (`id`, `code`, `roleName`) VALUES (2, 'SYS_MANAGER', '店长');
INSERT INTO `t_sys_role` (`id`, `code`, `roleName`) VALUES (3, 'SYS_EMPLOYEE', '店员');
COMMIT;

-- ----------------------------
-- Table structure for t_sys_user
-- ----------------------------
DROP TABLE IF EXISTS `t_sys_user`;
CREATE TABLE `t_sys_user` (
  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键id',
  `account` varchar(15) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '账号',
  `realName` varchar(15) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '真实姓名',
  `password` varchar(15) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '密码',
  `sex` int DEFAULT NULL COMMENT '性别,1女/2男',
  `birthday` date DEFAULT NULL COMMENT '出生日期',
  `phone` varchar(15) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '手机号码',
  `roleId` bigint DEFAULT NULL COMMENT '用户角色id',
  `certFile` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '证件照片',
  `avatarFile` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '工作证照片',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=12 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='用户表';

-- ----------------------------
-- Records of t_sys_user
-- ----------------------------
BEGIN;
INSERT INTO `t_sys_user` (`id`, `account`, `realName`, `password`, `sex`, `birthday`, `phone`, `roleId`, `certFile`, `avatarFile`) VALUES (1, 'admin', 'admin', '0000000', 1, '1980-11-01', '13888888888', 1, NULL, NULL);
INSERT INTO `t_sys_user` (`id`, `account`, `realName`, `password`, `sex`, `birthday`, `phone`, `roleId`, `certFile`, `avatarFile`) VALUES (2, 'limingxing', '李明星', '0000000', 2, '1983-12-10', '13188888888', 2, NULL, NULL);
INSERT INTO `t_sys_user` (`id`, `account`, `realName`, `password`, `sex`, `birthday`, `phone`, `roleId`, `certFile`, `avatarFile`) VALUES (3, 'wanglulu', '王璐璐', '0000000', 2, '1984-06-05', '15766666666', 2, NULL, NULL);
INSERT INTO `t_sys_user` (`id`, `account`, `realName`, `password`, `sex`, `birthday`, `phone`, `roleId`, `certFile`, `avatarFile`) VALUES (4, 'hauzhiqing', '华志强', '0000000', 1, '1983-06-15', '15866666666', 3, NULL, NULL);
INSERT INTO `t_sys_user` (`id`, `account`, `realName`, `password`, `sex`, `birthday`, `phone`, `roleId`, `certFile`, `avatarFile`) VALUES (5, 'huangweihua', '黄卫华', '0000000', 2, '1982-12-31', '13800099999', 3, NULL, NULL);
INSERT INTO `t_sys_user` (`id`, `account`, `realName`, `password`, `sex`, `birthday`, `phone`, `roleId`, `certFile`, `avatarFile`) VALUES (6, 'zhaogang', '赵刚', '0000000', 2, '1980-01-01', '15266655555', 2, NULL, NULL);
INSERT INTO `t_sys_user` (`id`, `account`, `realName`, `password`, `sex`, `birthday`, `phone`, `roleId`, `certFile`, `avatarFile`) VALUES (7, 'liuyang', '刘阳', '0000000', 2, '1978-03-12', '17099999999', 2, NULL, NULL);
INSERT INTO `t_sys_user` (`id`, `account`, `realName`, `password`, `sex`, `birthday`, `phone`, `roleId`, `certFile`, `avatarFile`) VALUES (8, 'lijiangtao', '李江涛', '0000000', 1, '1983-12-10', '13277777777', 3, NULL, NULL);
INSERT INTO `t_sys_user` (`id`, `account`, `realName`, `password`, `sex`, `birthday`, `phone`, `roleId`, `certFile`, `avatarFile`) VALUES (9, 'liuzhong', '刘忠', '0000000', 2, '1981-11-04', '15388888888', 3, NULL, NULL);
INSERT INTO `t_sys_user` (`id`, `account`, `realName`, `password`, `sex`, `birthday`, `phone`, `roleId`, `certFile`, `avatarFile`) VALUES (10, 'zhangfeng', '张峰', '0000000', 2, '1980-01-01', '19288899999', 3, NULL, NULL);
INSERT INTO `t_sys_user` (`id`, `account`, `realName`, `password`, `sex`, `birthday`, `phone`, `roleId`, `certFile`, `avatarFile`) VALUES (11, 'songke', '宋科', '0000000', 1, '1983-10-10', '18900000000', 2, NULL, NULL);
COMMIT;

SET FOREIGN_KEY_CHECKS = 1;

示例效果:

导入相关依赖 JAR 文件,并添加为库。

示例效果:

Log4J 配置文件(classpath:log4j.properties):

log4j.rootLogger=debug,CONSOLE

##################
# Console Appender
##################
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.Threshold=debug
log4j.appender.CONSOLE.Target=System.out
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern= - (%r ms) - %d{yyyy-M-d HH:mm:ss}%x[%5p](%F:%L) %m%n

数据库配置文件(classpath:database.properties):

db_driver=com.mysql.cj.jdbc.Driver
db_url=jdbc:mysql://127.0.0.1:3306/cvs_db?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai
db_user=root
db_password=123456..

MyBatis 核心配置文件(classpath:mybatis-config.xml):

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <!-- 1、引入数据库配置文件 -->
    <properties resource="database.properties"/>

    <!-- 3、配置MyBatis框架运行时行为 -->
    <settings>
        <!-- 配置日志实现为LOG4J -->
        <setting name="logImpl" value="LOG4J"/>
    </settings>

    <!-- 2、配置MyBatis框架运行环境 -->
    <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>

    <!-- 4、配置SQL映射文件 -->
    <mappers>
        <mapper resource="cn/duozai/dao/SysUserMapper.xml"/>
    </mappers>
</configuration>

用户表实体类(cn.duozai.entity.SysUser):

public class SysUser implements Serializable {

    /**
     * 主键id
     */
    private Integer id;

    /**
     * 账号
     */
    private String account;

    /**
     * 真实姓名
     */
    private String realName;

    /**
     * 密码
     */
    private String password;

    /**
     * 性别,1女/2男
     */
    private Integer sex;

    /**
     * 出生日期
     */
    private Date birthday;

    /**
     * 手机号码
     */
    private String phone;

    /**
     * 用户角色id
     */
    private Integer roleId;

    /**
     * 证件照片
     */
    private String certFile;

    /**
     * 工作证照片
     */
    private String avatarFile;

    // ...

}

用户表数据访问接口(cn.duozai.dao.SysUserMapper):

public interface SysUserMapper {

    /**
     * 查询用户表记录数
     *
     * @return 用户表记录总数
     */
    int count();

}

用户表数据访问接口 SQL 映射文件(cn/duozai/dao/SysUserMapper.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">
<!--
    <mapper>标签:根标签
    namespace属性:SQL映射文件的命名空间,保证全局唯一
    namespace一般对应DAO接口的全限定名,即包+接口名
-->
<mapper namespace="cn.duozai.dao.SysUserMapper">
    <!--
        <select>标签:定义查询语句
        id属性:SQL语句的标识符,在命名空间下唯一,一般对应DAO接口的方法名
        resultType属性:SQL语句返回值类型/方法的返回值类型
    -->
    <select id="count" resultType="int">
        SELECT COUNT(1) FROM t_sys_user
    </select>
</mapper>

测试类(test.SysUserMapperTest):

public class SysUserMapperTest {

    private static final Logger logger = Logger.getLogger(SysUserMapperTest.class);

    /**
     * 查询用户表记录数
     *
     * @return void
     */
    @Test
    public void count() throws IOException {
        // 1、读取MyBatis核心配置文件的输入流
        InputStream is = Resources.getResourceAsStream("mybatis-config.xml");

        // 2、使用SqlSessionFactoryBuilder构建SqlSessionFactory工厂实例
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);

        // 3、创建SqlSession会话实例
        SqlSession sqlSession = sqlSessionFactory.openSession();

        // 4、通过字符串关键字标识执行SQL:namespace+id
        // int count = sqlSession.selectOne("cn.duozai.dao.SysUserMapper.count");

        // 5、构建Mapper接口执行SQL:创建SysUserMapper接口实例,调用方法执行SQL
        int count = sqlSession.getMapper(SysUserMapper.class).count();

        // 6、调试输出执行结果
        logger.debug("count => " + count);

        // 7、关闭SqlSession会话实例
        sqlSession.close();
    }

}

示例效果:


搭建 MyBatis 开发环境的注意事项:

  • 一般情况下,项目的配置文件放在 resources 目录下,并将该目录标记为资源根目录。
  • MyBatis 的核心配置文件默认叫做 configuration.xml,为了与其他框架的配置文件进行区分,习惯将 MyBatis 的核心配置文件命名为 mybatis-config.xml。
  • 一般情况下,实体类中的属性名要和数据库表中的字段名一致。
  • Mapper 接口定义的操作一般针对特定的实体类,所以习惯上采用实体类名 + Mapper 的规则进行命名。
  • SQL 映射文件的命名与其对应的 Mapper 接口的命名一致,且通常情况下与其对应的 Mapper 接口放在同一包路径下。
  • 对于返回值类型为集合的方法,其 SQL 映射文件中的 resultType 属性指定的是集合中元素的类型,而不是集合本身的类型。

示例:查询数据列表

用户表数据访问接口(cn.duozai.dao.SysUserMapper):

public interface SysUserMapper {

    // ...

    /**
     * 查询用户列表
     *
     * @return 用户列表
     */
    List<SysUser> getUserList();

}

用户表数据访问接口 SQL 映射文件(cn/duozai/dao/SysUserMapper.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">
<mapper namespace="cn.duozai.dao.SysUserMapper">
    <!-- ... -->

    <!--
        resultType属性:方法返回值为集合列表时,其取值为集合中元素的类型
    -->
    <select id="getUserList" resultType="cn.duozai.entity.SysUser">
        SELECT * FROM t_sys_user
    </select>
</mapper>

测试类(test.SysUserMapperTest):

public class SysUserMapperTest {

    // ...

    /**
     * 查询用户列表
     *
     * @return void
     */
    @Test
    public void getUserList() throws IOException {
        InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);

        SqlSession sqlSession = sqlSessionFactory.openSession();

        List<SysUser> sysUserList = sqlSession.getMapper(SysUserMapper.class).getUserList();

        for (SysUser sysUser : sysUserList) {
            logger.debug("SysUser => " + sysUser.getRealName());
        }
  
        sqlSession.close();
    }

}

示例效果:


MyBatis 优缺点及其适用场景

MyBatis 的优点:

  • 与 JDBC 相比,使用 MyBatis 操作数据库,减少了 50% 以上的代码量。
  • MyBatis 是最简单的持久化框架,小巧并简单易学,能够快速上手应用。
  • 在 MyBatis 中,SQL 代码从程序代码中彻底分离,通过 XML 文件进行维护,便于管理和优化。
  • MyBatis 提供了 XML 标签,支持编写动态 SQL。
  • MyBatis 提供了映射标签,支持对象与数据库的 ORM 字段映射。

MyBatis 的缺点:

  • SQL 语句编写工作量大,对开发人员有一定要求。
  • 原生 SQL 语句依赖特定的数据库产品,数据库移植性差。

MyBatis 专注于 SQL 本身,是一个足够灵活的 DAO 层解决方案,适用于性能要求较高或者需求多变的互联网项目。

MyBatis 核心对象

MyBatis 核心对象概述

MyBatis 的核心对象包括核心接口和类。

  • SqlSessionFactory 实例是 MyBatis 应用程序的核心。
  • SqlSessionFactory 实例由 SqlSessionFactoryBuilder 对象根据 XML 配置文件进行构建。
  • 通过 SqlSessionFactory 实例可以获取 SqlSession 实例。
  • SqlSession 实例包含执行 SQL 操作的方法,可以通过该实例执行已映射的 SQL 语句。

MyBatis 三大核心接口和类的关系:

SqlSessionFactoryBuilder

SqlSessionFactoryBuilder 提供了多种 build 方法的重载,负责根据配置信息构建 SqlSessionFactory 实例。

创建 SqlSessionFactory 实例的基本方法:

InputStream is = Resources.getResourceAsStream("mybatis-config.xml");   
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);

一旦创建了 SqlSessionFactory 实例,就不再需要 SqlSessionFactoryBuilder,因此 SqlSessionFactoryBuilder 的最佳作用域范围是存在于方法体内,即为局部变量,用完即销毁。

SqlSessionFactory

SqlSessionFactory 是每个 MyBatis 应用的核心,其作用是创建 SqlSession 实例。

创建 SqlSession 实例的基本方法:

SqlSession sqlSession = sqlSessionFactory.openSession();

openSession 方法的基本参数:

名称描述
autoCommit控制是否开启自动提交事务,默认值为 false

在应用运行过程中,不建议反复销毁和创建 SqlSessionFactory 实例,SqlSessionFactory 实例一旦创建就应该在应用的运行周期中始终存在,存在于整个应用运行时,并且同时只存在一个对象实例(单例),因此 SqlSessionFactory 的最佳作用域范围是应用的全局作用域。


示例:MyBatisUtil

MyBatis 工具类(cn.duozai.utils.MyBatisUtil):

public class MyBatisUtil {

    private static SqlSessionFactory sqlSessionFactory;

    /**
     * 使用静态代码块唯一一次创建SqlSessionFactory实例
     * 静态代码块在类被加载时就会执行,且只执行一次
     * 无论创建多少个该类的对象,静态代码块都不会再次执行
     */
    static {
        try {
            // 读取MyBatis核心配置文件的输入流
            InputStream is = Resources.getResourceAsStream("mybatis-config.xml");

            // 使用SqlSessionFactoryBuilder构建SqlSessionFactory工厂实例
            sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * 创建并返回SqlSession实例
     *
     * @return SqlSession实例
     */
    public static SqlSession createSqlSession() {
        return sqlSessionFactory.openSession();
    }

    /**
     * 关闭SqlSession会话
     *
     * @param sqlSession SqlSession实例
     */
    public static void closeSqlSession(SqlSession sqlSession) {
        if(sqlSession != null) {
            sqlSession.close();
        }
    }

}

测试类(test.SysUserMapperTest):

public class SysUserMapperTest {

    // ...

    /**
     * 查询用户表记录数-使用MyBatisUtil
     *
     * @return void
     */
    @Test
    public void utilTest() {
        // 1、调用MyBatisUtil,创建SqlSession会话
        SqlSession sqlSession = MyBatisUtil.createSqlSession();

        // 2、执行SQL
        int count = sqlSession.getMapper(SysUserMapper.class).count();

        // 3、调试输出执行结果
        logger.debug("count => " + count);

        // 4、关闭SqlSession
        MyBatisUtil.closeSqlSession(sqlSession);
    }

}

SqlSession

SqlSession 表示一次数据库会话,包含了执行 SQL 所需的所有方法,非线程安全,不能共享,其对应一次数据库会话,会话结束必须关闭,因此 SqlSession 的最佳作用域范围是方法作用域内。

使用 SqlSession 执行 SQL 语句的方式:

  • 通过 namespace + id 字符串运行映射的 SQL 语句。
  • 基于 Mapper 接口方式执行 SQL 语句。

MyBatis 核心配置文件

MyBatis 核心配置文件概述

MyBatis 的核心配置文件(classpath:mybatis-config.xml)中设置的是 MyBatis 框架的全局信息,包括数据库连接及事务信息、MyBatis 运行所需的各种特性等。

MyBatis 核心配置文件中的元素必须遵循固定的先后顺序。

- configuration
    - properties
    - settings
    - typeAliases
    - typeHandlers
    - objectFactory
    - plugins    
    - environments
        - environment
            - transactionManager
            - dataSource
    - databaseIdProvider
    - mappers

properties 元素

properties 元素描述的是一些外部的、可替代的属性。

properties 元素的基本用法:

<!-- 1、通过指定外部属性文件 -->
<properties resource="外部文件路径"/>

<!-- 2、直接配置 property 子节点 -->
<properties>
    <property name="键" value="值"/>
    <!-- ... -->
</properties>

<!-- 3、同时使用这两种配置方式,外部属性文件>property子节点 -->
<properties resource="外部文件路径">
    <property name="键" value="值"/>
    <!-- ... -->
</properties>

settings 元素

settings 元素中设置的选项可以影响 MyBatis 框架的运行时行为,主要是 MyBatis 的一些全局配置属性的设置。

settings 元素支持的基本选项:

名称描述
cacheEnabled指定是否全局开启二级缓存
autoMappingBehavior指定 MyBatis 自动映射级别
取值为 NONE/PARTIAL/FULL,默认值为 PARTIAL
logImpl指定 MyBatis 使用的日志实现
取值为 SLF4J/LOG4J 等
mapUnderscoreToCamelCase是否开启驼峰命名自动映射,默认值为 false

settings 元素的基本用法:

<settings>
    <setting name="键" value="值"></setting>
    <!-- ... -->
</settings>

typeAliases 元素

typeAliases 元素可以为 Java 类型配置一个简短的别名,以取代完全限定类名,简化开发。

typeAliases 元素的基本用法:

<!-- 1、给指定的类配置别名 -->
<typeAliases>
    <typeAlias alias="别名" type="完全限定类名"/>
    <!-- ... -->
</typeAliases>

<!-- 2、指定扫包,自动生成别名 -->
<typeAliases>
    <package name="包名"/>
</typeAliases>

MyBatis 中定义的别名在 SQL 映射文件中使用时不区分大小写。

environments 元素

environments 元素可以针对开发、测试、生产部署等不同的需求,为 MyBatis 配置多套运行环境,可以在运行项目时灵活选择。

environments 元素的基本用法:

<environments default="当前使用的环境ID">
    <environment id="环境ID">
        <transactionManager type="事务类型"/>
        <dataSource type="数据源类型">
            <property name="driver" value="数据库驱动"/>
            <!-- ... -->
        </dataSource>
    <environment>

    <environment id="环境ID">
        <!-- ... -->
    <environment>
</environments>

使用 environments 元素的注意事项:

  • 通过设置 environments 节点的 default 属性来指定默认的运行环境 id,必须通过 default 属性指定其中一个为默认运行环境。
  • environment 节点配置用来配置一个具体的环境信息,通过设置 id 属性来指定环境的唯一标识。
  • transactionManager 元素通过设置 type 属性来配置事务管理器,可选 JDBC(使用原生 JDBC 来管理事务)、MANAGED(托管给外部容器来管理事务)。
  • dataSource 元素通过 type 属性来配置数据源类型,可选 UNPOOLED(非池化数据源)、POOLED(池化数据源)、JNDI(Java 命名和目录接口数据源)。

mappers 元素

mappers 元素通知 MyBatis 查找定义了 SQL 语句的 SQL 映射文件的路径,MyBatis 会查找指定包路径下的所有 Mapper 接口,同时加载相同路径下的同名 SQL 映射文件。

mappers 元素的基本用法:

<!-- 1、使用相对于类路径的资源引用 -->
<mappers>
    <mapper resource="相对于类路径的资源引用"/>
</mappers>

<!-- 2、使用映射器接口的完全限定类名 -->
<mappers>
    <mapper class="Mapper接口完全限定类名"/>
</mappers>

<!-- 3、扫包自动加载SQL映射文件 -->
<mappers>
    <package name="Mapper包路径"/>
</mappers>

mappers 元素告诉 MyBatis 应该到哪里去找 SQL 映射文件,如果没有合理地配置 mappers 元素,MyBatis 会找不到 SQL 映射文件,无法对数据进行操作。


示例:MyBatis 核心配置文件扩展

MyBatis 核心配置文件(classpath:mybatis-config.xml):

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <!-- 1、引入数据库配置文件 -->
    <properties resource="database.properties"/>

    <!-- 3、配置MyBatis框架运行时行为 -->
    <settings>
        <!-- 配置日志实现为LOG4J -->
        <setting name="logImpl" value="LOG4J"/>
    </settings>

    <!-- 5、配置别名 -->
    <typeAliases>
        <!-- 指定别名 -->
        <!-- <typeAlias type="cn.duozai.entity.SysUser" alias="sysuser"/> -->
        <!-- 扫包自动设置别名 -->
        <package name="cn.duozai.entity"/>
    </typeAliases>

    <!-- 2、配置MyBatis框架运行环境 -->
    <environments default="development">
        <environment id="development">
            <!-- 配置事务信息 -->
            <transactionManager type="JDBC"/>
            <!-- 配置数据库信息 -->
            <dataSource type="POOLED">
                <property name="driver" value="${driver}"/>
                <property name="url" value="${url}"/>
                <property name="username" value="${db_username}"/>
                <property name="password" value="${db_password}"/>
            </dataSource>
        </environment>
    </environments>

    <!-- 4、配置SQL映射文件 -->
    <mappers>
        <!-- 指定SQL映射文件 -->
        <!-- <mapper resource="cn/duozai/dao/SysUserMapper.xml"/> -->
        <!-- 扫包自动注册SQL映射文件 -->
        <package name="cn.duozai.dao"/>
    </mappers>
</configuration>