Mybatis之配置文件与映射文件的“那些事”,你真的知道吗?(上)

本文涉及的产品
RDS MySQL DuckDB 分析主实例,集群系列 4核8GB
简介: Mybatis之配置文件与映射文件的“那些事”,你真的知道吗?(上)

编译软件:IntelliJ IDEA 2019.2.4 x64

操作系统:win10 x64 位 家庭版

Maven版本:apache-maven-3.6.3

Mybatis版本:3.5.6

一.详解Mybatis的核心配置文件【mybatis-config.xml】

1.1 核心配置文件概述

MyBatis的配置文件包含了会深深影响MyBatis行为的设置和属性等相关信息

1.2 核心配置文件之根标签

作用:

在根标签内部设置所有的子标签

语法:

<configuration>
</configuration>

1.3核心配置文件之常用子标签

1.3.1 properties子标签

作用:

可以定义属性或引入外部属性文件

为什么要引入外部属性文件?

实现数据库连接属性的解耦

应用场景:

①在properties 元素中设置相应属性

怎么设置?

在properties 元素的子元素中设置数据库连接对象的driver与与ur的属性值

设好的属性driver与url可以在dataSource标签下相同的属性中动态替换它们的属性值,如下图所示。

用法案例:在核心配置文件中使用properties子标签设置数据库连接需要的driver与url属性,将其属性值引用至environments标签下的dataSource子标签中相应的属性中,运行测试。

示例代码如下:

①在核心配置文件中使用properties子标签设置数据库连接需要的driver与url属性,将其属性值引用至environments标签下的dataSource子标签中相应的属性中

<properties>
    <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
    <property name="url" value="jdbc:mysql://localhost:3306/0411db?serverTimezone=UTC"/>
</properties>
<environments default="development">
    <environment id="development">
        <transactionManager type="JDBC"/>
        <dataSource type="POOLED">
            <!--   下面是mysql8版本            -->
            <property name="driver" value="${driver}"/>
            <!--    url后要加时区 ?serverTimezone=UTC" ,不然报错           -->
            <property name="url" value="${url}"/>
        <!-- 下面是mysql5版本的写法
             <property name="driver"value="com.mysql.jdbc.Driver"/>
             <property name="url"value="jdbc:mysql://localhost:3306/0411db"/>
            -->
            <property name="username" value="root"/>
            <property name="password" value="123456"/>
        </dataSource>
    </environment>
</environments>

②运行测试

②引入外部属性文件

如何在外部定义并引入数据库连接的属性文件?

  1. 例如在resources目录下定义一个db.properties文件,用以存放数据库连接的相关属性值

  1. 在核心配置文件中使用properties标签引入外部的属性文件db.properties

注意:properties标签内两种引用文件的方式resource与url)的区别,如下图所示:

示例代码如下:

<properties resource="db.properties"></properties>
<environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <!--   下面是mysql8版本            -->
                <property name="driver" value="${db.driver}"/>
                <!--    url后要加时区 ?serverTimezone=UTC" ,不然报错           -->
                <property name="url" value="${db.url}"/>
            <!-- 下面是mysql5版本的写法
                 <property name="driver"value="com.mysql.jdbc.Driver"/>
                 <property name="url"value="jdbc:mysql://localhost:3306/0411db"/>
                -->
                <property name="username" value="root"/>
                <property name="password" value="123456"/>
            </dataSource>
        </environment>
    </environments>

1.3.2 settings 子标签

作用:

这是MyBatis中极为重要的调整设置,它会改变MyBatis的运行时行为。

常用属性:

mapUnderscoreToCamelCase属性是否开启驼峰命名自动映射,默认值为false,如设置true会自动将数据库中的字段a_col与Java对象中的aCol属性自动映射

注意:

只能将字母相同的字段与属性自动映射

示例代码如下;

a.在核心配置文件中的settings里未设置mapUnderscoreToCamelCase的值时:

b.在核心配置文件中设置mapUnderscoreToCamelCase的属性为true时:

<settings>
    <setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>

1.3.3 typeAliases(类型别名)子标签

作用:

类型别名可为Java类型设置一个别名

语法及特点:

①为Java pojo(Java bean【实体类】)设置别名(不常用)

<typeAliases>
  //为指定类型定义别名,前者是类的全类名,后者是该类的别名(小名)
    <typeAlias type="mybatis.mapper.EmployeeMapper" alias="employee"
</typeAliases>

②为指定包下的所有pojo起别名(常用)

<typeAliases>
  //为指定包【mybatis.pojo】下所有的类定义别名。
  //默认将类名作为别名,不区分大小写【推荐使用小写字母】
    <package name="mybatis.pojo"/>
</typeAliases>

1.3.3.1 Mybatis 常用的自定义别名

别名 类型
_int int
integer或int Integer
string String
list或arraylist ArrayList
map或hashmap HashMap

注:Java的其他基本数据类型与int的Mybatis自定义别名的命名风格雷同,包装类型也是如此,这里不做赘述。

1.3.4 environments(环境配置)子标签

作用:

设置数据库连接环境

示例代码如下:

//设置数据库的连接环境
<environments default="development">
  //可设置多个<environment></environment>
    <environment id="development">
      //设置事务管理器的相应属性
        <transactionManager type="JDBC"/>
        //设置数据源
        <dataSource type="POOLED">
          //设置数据库连接的相应属性 
            <!--   下面是mysql8版本            -->
            //设置数据库连接的driver(驱动)
            <property name="driver" value="${db.driver}"/>
            <!--    url后要加时区 ?serverTimezone=UTC" ,不然报错  ->
             //设置数据库连接的url
            <property name="url" value="${db.url}"/>
          <!-- 下面是mysql5版本的写法
             <property name="driver"value="com.mysql.jdbc.Driver"/>
             <property name="url"value="jdbc:mysql://localhost:3306/0411db"/>
            -->
             //设置数据库连接所需要的能够登录MySQL的用户名
            <property name="username" value="root"/>
             //设置密码
            <property name="password" value="123456"/>
        </dataSource>
    </environment>
</environments>

1.3.5 mappers(映射器)子标签

作用:

设置加载映射文件的路径

示例代码如下:

<mappers>
  <mapper resource="mapper/EmployeeMapper.xml"/>
  //有些老项目可能会这么写
  <!--要求:接口的包名与陕射义件的包名需要致-->
  <package name="com.atguigu.mybatis.mapper"/>
</mappers>

注意:

核心配置文件中的子标签,是有顺序要求的

默认顺序如下:

不信,大可以试试!


二. 详解Mybatis的映射文件

2.1 映射文件概述

Mybatis的真正强大在于它的语句映射,这是它的魔力所在。如果拿它跟具有相同功能的JDBC代码进行对比,你会立即发现省掉了将近95%的代码。(摘自官方文档)

2.2 映射文件之根标签

根标签:mapper标签

注意:

mapper中的namespace要求与接口的全类名一致

如何获取接口(方法/ pojo)的全类名?

①将光标置于要获取的接口名上

如下图所示:

②鼠标右击打开下面的选项栏,点击"copy Reference“

③”mybatis.mapper.DeptMapper"就是刚才接口名的全名称

2.3 映射文件子标签

2.3.1 insert标签

功能:

定义添加sql语句

用法案例:

使用insert标签插入一条数据(employee对象)到数据库中

①在EmployeeMapper接口中先定义添加数据的方法

代码示例如下:

//添加员工
public void insertEmployee(Employee employee);

②在上述接口对应的映射文件中使用insert标签

代码示例如下:

<insert id="insertEmployee">
    insert into
        tbl_employee(last_name,email,salary)
    <!--  这里是要将employee对象中的属性值传到mysql中    -->
    values(#{lastName},#{email},#{salary})
</insert>

③测试

@Test
public void testInsertEmployee(){
    try {
        String resource = "mybatis-config.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);
        SqlSessionFactory sqlSessionFactory = new                           SqlSessionFactoryBuilder().build(inputStream);
        //通过SqlSessionFactory对象调用openSession();
        SqlSession sqlSession = sqlSessionFactory.openSession();
        //获取EmployeeMapper的代理对象
        EmployeeMapper employeeMapper = sqlSession.getMapper(EmployeeMapper.class);
        employeeMapper.insertEmployee(new Employee("张三","hdfjf@163.com",9000.0));
        //开启事务,数据才能真正存进数据库中,why?
        sqlSession.commit();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

这里有一个问题:即使用mybatis,添加数据到MySQL数据库中时,代码中为什么要加sqlSession.commit()这句代码后,数据才能真正存进数据库中?

解释:

在使用 Mybatis 操作数据时,调用插入或更新方法后,SQL 语句并不会立即执行,而是被缓存到当前的 SqlSession 对象中。这个字面意义上的 Session 就像一个会话,预计会涉及多个数据库操作,其生命周期通常是跨越过多个请求和响应 (request,response) 阶段。

因此,如果想要将数据真正存入数据库中,需要手动触发一次提交 (commit) 动作。Mybatis 中 SqlSession 接口提供了 commit() 方法来提交事务,以便将所有未提交的 SQL 语句立即执行,并将结果存入数据库。

也就是说,sqlSession.commit() 可以将之前缓存的 SQL 语句批量地发送给数据库进行处理。同时,如果没有提交事务,之前所做的更改全部都将被回滚,并且数据库不会有任何变化。

因此,在使用 Mybatis 进行数据操作时,添加 sqlSession.commit() 这句代码是非常必要的,否则可能出现数据插入失败的情况。

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。 &nbsp; 相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/mysql&nbsp;
相关文章
|
4月前
|
SQL Java 数据库连接
MyBatis 的映射关系
MyBatis 核心功能之一是映射关系,支持一对一、一对多和多对多三种 ORM 映射。通过实体类与配置文件结合,开发者可灵活实现数据关联,提升数据库操作效率。
317 4
|
10月前
|
SQL Java 数据库连接
【YashanDB知识库】解决mybatis的mapper文件sql语句结尾加分号";"报错
【YashanDB知识库】解决mybatis的mapper文件sql语句结尾加分号";"报错
|
5月前
|
SQL Java 数据库连接
MyBatis的配置文件中定义类型别名(type aliases)的技巧。
类型别名提供了一种便捷的方式来引用复杂的全限定类名。通过使用 `<package>`标签进行自动扫描或使用 `<typeAlias>`标签手动指定,可以在整个MyBatis配置中提高清晰度和维护性。无论是简化mapper文件中的配置,还是提高整体的配置可读性,类型别名都是一个非常有用的配置工具。
218 0
|
8月前
|
SQL XML Java
菜鸟之路Day35一一Mybatis之XML映射与动态SQL
本文介绍了MyBatis框架中XML映射与动态SQL的使用方法,作者通过实例详细解析了XML映射文件的配置规范,包括namespace、id和resultType的设置。文章还对比了注解与XML映射的优缺点,强调复杂SQL更适合XML方式。在动态SQL部分,重点讲解了`&lt;if&gt;`、`&lt;where&gt;`、`&lt;set&gt;`、`&lt;foreach&gt;`等标签的应用场景,如条件查询、动态更新和批量删除,并通过代码示例展示了其灵活性与实用性。最后,通过`&lt;sql&gt;`和`&lt;include&gt;`实现代码复用,优化维护效率。
786 5
|
10月前
|
SQL Java 数据库连接
【YashanDB 知识库】解决 mybatis 的 mapper 文件 sql 语句结尾加分号";"报错
【YashanDB 知识库】解决 mybatis 的 mapper 文件 sql 语句结尾加分号";"报错
|
10月前
|
XML Java 数据库连接
三、MyBatis核心配置文件详解
三、MyBatis核心配置文件详解
238 15
|
10月前
|
SQL XML Java
七、MyBatis自定义映射resultMap
七、MyBatis自定义映射resultMap
292 6
|
10月前
|
Java 数据库连接 mybatis
MyBatis篇-映射关系(1-1 1-n n-n)
本文介绍了MyBatis中四种常见关系映射的配置方法,包括一对一、一对多、多对一和多对多。**一对一**通过`resultMap`实现属性与字段的映射;**一对多**以用户-角色为例,使用`&lt;collection&gt;`标签关联集合数据;**多对一**以作者-博客为例,利用`&lt;association&gt;`实现关联;**多对多**则通过引入第三方类(如UserForDept)分别在User和Dept类中添加集合属性,并配置对应的`&lt;collection&gt;`标签完成映射。这些方法解决了复杂数据关系的处理问题,提升了开发效率。
|
XML Java 数据库连接
Mybatis映射关系
简介:本文介绍了MyBatis框架中四种常见的关系映射方式,包括一对一、一对多、多对一及多对多。一对一通过简单属性映射实现;一对多通过在主对象中添加集合属性并使用`&lt;collection&gt;`标签映射子对象集合;多对一则利用`&lt;association&gt;`标签在主对象中映射单个子对象;多对多需引入第三方类,分别在两个主对象中添加对方的集合属性,并通过`&lt;collection&gt;`标签实现映射。
243 32
|
SQL 缓存 Java
【详细实用のMyBatis教程】获取参数值和结果的各种情况、自定义映射、动态SQL、多级缓存、逆向工程、分页插件
本文详细介绍了MyBatis的各种常见用法MyBatis多级缓存、逆向工程、分页插件 包括获取参数值和结果的各种情况、自定义映射resultMap、动态SQL
【详细实用のMyBatis教程】获取参数值和结果的各种情况、自定义映射、动态SQL、多级缓存、逆向工程、分页插件