MyBatis 配置文件类型

MyBatis配置文件有两种类型,如下:

  • 全局配置文件(如 mybatis-config.xml)
  • Mapper XML 映射文件(如 UserMapper.xml)

上篇讲解全局配置文件,这篇接着讲解Mapper 接口映射文件

Mapper XML 映射文件详解

  • CRUD 标签(或元素)
    • select

      Mapper 接口方法:

      public List<UserEntity> selectUserByAge(@Param("age") int age);

      SQL 语句映射:

      <!--结果集映射(ORM)-->
      <resultMap id="userResultMap" type="entity.UserEntity">
      <!-- propery表示UserEntity属性名,column表示tb_user表字段名-->
      <id property="id" column="id" />
      <result property="userName" column="user_name" />
      <result property="password" column="password" />
      <result property="name" column="name" />
      <result property="age" column="age" />
      <result property="sex" column="sex" />
      <result property="birthday" column="birthday" />
      <result property="created" column="created" />
      <result property="updated" column="updated" />
      </resultMap>
      <select id="selectUserByAge" parameterType="int" resultMap="userResultMap">
      select * from tb_user where age > #{age}
      </select>
      <!--上下两种映射方式效果相同(二选一)-->
      <select id="selectUserByAge" parameterType="int" resultType="entity.UserEntity">
      select * from tb_user where age > #{age}
      </select>
      • select 标签:定义 查询 SQL 语句
      • id 属性:当前名称空间下的 SQL 语句唯一标识( id 属性值要求必须和 mapper 接口方法名相同)
      • resultType 属性:直接将结果集映射为 Java 实体类实例
      • resultMap 属性:引用自定义的结果集 ORM 映射(与resultType可以二选一)
      • parameterType 属性:传入参数类型(可以省略)

      可能你会有所疑问,虽然 resultType 属性和 resultMap 属性效果相同,但是它们应该还是有所区别吧。

      是的,从上面例子可以看出来,使用 resultMap 属性更复杂,需要用到 resultMap 标签自定义结果集 ORM 映射;而 resultType 属性只需要直接设置实体类即可,MyBatis 会自动完成结果集映射。

      这显然 resultType 属性更方便、简洁,对吧。不过,当遇到复杂的 SQL 语句时,比如联表查询,这时候需要使用 resultMap标签和属性了,resultType 属性就搞不定了啦。

      后面还会专门详细讲解 resultMap 标签,它可是 MyBatis 中最重要最强大最复杂的标签。如果不掌握 resultMap 标签,那么遇到复杂的 SQL 查询,就只能傻眼啦。

    • insert

      Mapper 接口方法:

      public int insertUser(UserEntity user);

      SQL 语句映射:

      <insert id="insertUser" useGeneratedKeys="true" keyProperty="id">
      insert into tb_user (id,userName, password, name, age, sex, birthday, created, updated) values
      (null,#{userName},#{password},#{name},#{age},#{sex},#{birthday},now(),now());</insert>
      • insert 标签:定义 插入 SQL 语句
      • id 属性:当前名称空间下的 SQL 语句唯一标识( id 属性值要求必须和 mapper 接口方法名相同)
      • parameterType 属性:传入参数类型(可以省略)
      • useGeneratedKeys 属性:开启主键回写
      • keyProperty 属性:数据库主键对应的实体类主键标识属性名

      useGeneratedKeys 属性和 keyProperty 属性是一起用的。可能你会疑惑,这个开启主键回写是啥意思呀。

      意思是一般数据库主键都是自增主键,这就意味着将实体类实例插入到数据库前,实体类主键标识属性值是空的,这时候也不可能知道主键值是多少。等插入操作完成后,数据库会自动生成主键值。

      开启主键回写的作用就是将数据库自动生成的主键值,回写到插入数据库的实体类实例的主键标识属性中,可以理解为将数据库主键和实体类的主键标识属性进行同步。而 keyProperty 属性的作用就是告诉 MyBatis 需要回写的实体类实例的主键标识属性名,这样才知道回写实体类的哪个属性哈。

      那是否必须开启主键回写功能,不是的,这个需根据开发需要决定,也就是是否需要获取插入数据库自动生成的主键值。

    • update

      Mapper 接口方法:

      public int updateUser(@Param("id") int id,@Param("name") String name);

      SQL 语句映射:

      <update id="updateUser">
      update tb_user set name=#{name} where id=#{id};
      </update>
      • update 标签:定义 更新 SQL 语句
      • id 属性:当前名称空间下的 SQL 语句唯一标识( id 属性值要求必须和 mapper 接口方法名相同)
      • parameterType 属性:传入参数类型(可以省略)
    • delete

      Mapper 接口方法:

      public int deleteUserById(int id);

      SQL 语句映射:

      <delete id="deleteUserById">
      delete from tb_user where id=#{id};
      </delete>
      • Delete 标签:定义 删除 SQL 语句
      • id 属性:当前名称空间下的 SQL 语句唯一标识( id 属性值要求必须和 mapper 接口方法名相同)
      • parameterType 属性:传入参数类型(可以省略)
  • resultMap 标记(或元素)

    之前已经提到过 resultMap 是 MyBatis 中最重要最强大也是最复杂的标记,如下:

    <!-- resultMap 结果集映射-->
    <resultMap id="userResultMap" type="entity.UserEntity" autoMapping="true">
    <!-- propery表示UserEntity属性名,column表示tb_user表字段名-->
    <id property="id" column="id" />
    <result property="userName" column="user_name" />
    <result property="password" column="password" />
    <result property="name" column="name" />
    <result property="age" column="age" />
    <result property="sex" column="sex" />
    <result property="birthday" column="birthday" />
    <result property="created" column="created" />
    <result property="updated" column="updated" />
    </resultMap> <!-- 使用 resultMap 标记的结果集映射-->
    <select id="selectUserByAge" parameterType="int" resultMap="userResultMap">
    select * from tb_user where age > #{age}
    </select>
    • resultMap 标签:定义 结果集 ORM 映射规则
    • id 属性:当前名称空间下的唯一标识(resultMap 属性值填写 id 属性引用 resultMap 定义的结果集映射)
    • type 属性:Java 实体类全名
    • autoMapping 属性:自动映射开关
    • id 子标签:数据库主键字段与Java 实体类主键标识属性映射
    • result 子标签:数据库普通字段与 Java 实体类普通属性映射
    • property 属性:Java 实体类属性名
    • column 属性:数据库字段名

    这些标签和属性的作用一目了然,不用做过多解释,但 autoMapping 属性的作用大家可能不太明白。

    如果 autoMapping 属性设置为 true,表示开启自动映射开关,意思就是如果数据库字段名和 Java 实体类属性名相同,那么就可以不用使用 id 子标签或 result 子标签手动映射了。

    MyBatis 会自动完成映射这些相同的数据库字段名。至于,不相同的数据库字段名,那还是麻烦你手动映射一下哈。

    还记得之前讲过的 resultType 属性,它的作用也是完成自动映射,不过它要求数据库表所有字段名和 Java 实体类属性名必须全部相同,否则有与 Java 实体类属性名不同的字段名无法正常映射的。

    所以,resultMap 标记 和 autoMapping 属性一起使用,相当于让 resultMap 的一个一个数据库字段纯手工映射变为半自动映射啦,一方面不失灵活性,一方面不失简洁性。

    开启 autoMapping 属性,以上 resultMap 标记可以改写如下,是不是简洁多了。

    <!-- resultMap 结果集映射-->
    <resultMap id="userResultMap" type="entity.UserEntity" autoMapping="true">
    <result property="userName" column="user_name" />
    </resultMap>

    MyBatis 使用 resultMap 标记主要解决两大问题:

    • Java 实体类属性名与数据库表字段名不一致的问题
    • 完成复杂(或高级)SQL 操作,比如联表查询(一对一、一对多或多对多)、子查询、分组查询等

    当实体类属性名和数据库表字段名不同时,有两种情况如下:

    • 情况一:如果数据库字段是经典数据库命名规则,Java 实体类属性名是驼峰命名规则,如下:

      数据库字段:user_name

      Java 属性名:userName

      这种情况,有两种解决办法:

      一种是使用 resultMap 标记,手动设置数据库字段和实体类属性名的映射关系,如下:

    <result property="userName" column="user_name" />

    ​ 一种是使用 resultType 属性,自动进行结果集映射,不过需要 settings 设置打开自动驼峰命名规则映射开关,如下:

    <!-- 开启自动驼峰命名规则映射开关 -->
    <setting name="mapUnderscoreToCamelCase" value="true"/>
    • 情况二:如果数据库字段和 Java 实体类属性名完全不一致,如下:

      数据库字段:my_user_name

      Java 属性名:userName

      这种情况,只有一种解决办法,那就是 resultMap 标记,如下:

      <result property="userName" column="my_user_name" />

    以上仅是 resultMap 标记的基本用法而非完整用法,关于它的高级使用如何完成复杂(或高级)SQL 操作后面会详细讲解。

  • sql 片段

    sql 片段是啥意思,其实类似于代码片段,就是将部分 SQL 语句打包或封装到一个 sql 片段里。

    这个 sql 片段到底有什么用处呀。

    sql 片段的用处类似于 Java 的方法,可以复用 SQL 语句,减少 SQL 语句冗余,便于 SQL 语句的维护和管理。

    那么 sql 片段的使用就有两个步骤:

    • 定义 sql 片段

      <sql id=””></sql>
      • sql 标记:定义 sql 片段
      • id 属性:sql 片段唯一标识
    • 引用 sql 片段

      <include refId=”” />
      • include 标记:定义 sql 片段引用
      • refId 属性:引用 sql 片段的 id 属性(唯一标识)

    sql 片段使用举例如下:

     <insert id="insertUser">
    insert into tb_user (id,userName, password, name, age, sex, birthday, created, updated) values
    (null,#{userName},#{password},#{name},#{age},#{sex},#{birthday},now(),now());
    </insert> <insert id="insertUserEx">
    insert into tb_user (id,userName, password, name, age, sex, birthday, created, updated) values
    (null,null,null,null,null,null,null,now(),now());
    </insert>

    以上有两个 UserMapper 接口方法对应的插入 SQL 语句映射,对比后发现有部分 SQL 语句片段是相同的,具体内容如下:

    id,userName, password, name, age, sex, birthday, created, updated

    那么,我们就可以把相同的 SQL 语句打包到一个 sql 片段里,如下:

    <sql id="partSql">
    (id,userName,password,name,age,sex,birthday,created,updated)
    </sql>

    然后,我们就可以在需要的地方去使用定义好的 sql 片段,如下:

    <insert id="insertUser">
    insert into tb_user <include refid="partSql"></include> values
    (null,#{userName},#{password},#{name},#{age},#{sex},#{birthday},now(),now());
    </insert> <insert id="insertUserEx">
    insert into tb_user <include refid="partSql"></include> values
    (null,null,null,null,null,null,null,now(),now());
    </insert>

    sql 片段还可以与 Mapper XML 映射文件分开,创建一个单独的 XML 文件来存放,不过需要在 MyBatis 全局配置文件中引用该外部 XML 文件。

    这里我不打算细讲如何使用了,因为实际项目中很少用到,所以了解一下就可以了。

总结

Mapper 映射文件标记
  • CURD 标记:select、insert、update、delete
  • resultMap 标记:MyBatis 中最重要最强大也是最复杂的标记
  • sql 片段:复用 SQL 语句减少冗余

MyBatis 映射文件详解(六)的更多相关文章

  1. MyBatis 映射文件详解

    1. MyBatis 映射文件之<select>标签 <select>用来定义查询操作; "id": 唯一标识符,需要和接口中的方法名一致; paramet ...

  2. Mybatis SQL映射文件详解

    Mybatis SQL映射文件详解 mybatis除了有全局配置文件,还有映射文件,在映射文件中可以编写以下的顶级元素标签: cache – 该命名空间的缓存配置. cache-ref – 引用其它命 ...

  3. Hibernate配置文件和映射文件详解

    Hibernate是一个彻底的ORM(Object Relational Mapping,对象关系映射)开源框架. 我们先看一下官方文档所给出的,Hibernate 体系结构的高层视图: 其中PO=P ...

  4. mybatis核心文件详解

    MyBatis配置文件详解 configuration  这是配置文件的根元素标签,所有的其他元素都要在这个标签下使用. environments   用于管理所有环境,并可以指定默认使用哪个环境,通 ...

  5. Mybatis学习(三)————— 映射文件详解

    前面说了全局配置文件中内容的详解,大家应该清楚了,现在来说说这映射文件,这章就对输入映射.输出映射.动态sql这几个知识点进行说明,其中高级映射(一对一,一对多,多对多映射)在下一章进行说明. 一.输 ...

  6. Mybatis(三) 映射文件详解

    前面说了全局配置文件中内容的详解,大家应该清楚了,现在来说说这映射文件,这章就对输入映射.输出映射.动态sql这几个知识点进行说明,其中高级映射(一对一,一对多,多对多映射)在下一章进行说明. 一.输 ...

  7. MyBatis的SQL语句映射文件详解

    SQL 映射XML 文件是所有sql语句放置的地方.需要定义一个workspace,一般定义为对应的接口类的路径.写好SQL语句映射文件后,需要在MyBAtis配置文件mappers标签中引用 < ...

  8. Mybatis的配置文件和映射文件详解

    一.Mybatis的全局配置文件 1.SqlMapConfig.xml是mybatis的全局配置文件,配置内容如下: properties(属性) settings(全局配置参数) typeAlias ...

  9. MyBatis映射配置文件详解

    <?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE mapperPUBLIC "-// ...

随机推荐

  1. Install Tensorflow object detection API in Anaconda (Windows)

    This blog is to explain how to install Tensorflow object detection API in Anaconda in Windows 10 as ...

  2. 后端Spring Boot+前端Android交互+MySQL增删查改(Java+Kotlin实现)

    1 前言&概述 这篇文章是基于这篇文章的更新,主要是更新了一些技术栈以及开发工具的版本,还有修复了一些Bug. 本文是SpringBoot+Android+MySQL的增删查改的简单实现,用到 ...

  3. Fiddler使用 断点 模拟返回 AutoResponder Mock 模拟数据 相关学习记录

    断点 测试中有时需要改变发出去的请求信息,需要用到打断点的方法.断点包含两种方式: before response:在request请求的时候,未到达服务器之前,一般用来修改请求参数 after re ...

  4. Jenkins 系统管理与配置

    1. Jenkins 安装插件的两种方式 2. 添加凭据(Credentials) 3. 系统管理--全局工具配置 4. 系统管理--系统设置 5. 常用插件说明 Extended E-mail No ...

  5. python 闭包函数与装饰器

    1.什么是闭包函数 (1):什么是闭包函数: #内部函数包含对外部作用域而非全局作用域的引用, 简而言之, 闭包的特点就是内部函数引用了外部函数中的变量. 在Python中,支持将函数当做对象使用,也 ...

  6. Ubuntu20.04安装Redis

    本文介绍了如何在Ubuntu20.04上安装Redis. 安装Redis sudo apt install redis-server 检查服务的状态 安装完成后可以通过以下命令检查服务的状态 sudo ...

  7. 路由器逆向分析------QEMU的下载和安装(Linux平台)

    本文博客地址:http://blog.csdn.net/qq1084283172/article/details/68953160 一.QEMU源码的下载和编译 QEMU源码的github下载地址:h ...

  8. hdu2276 矩阵构造

    题意:      给了n个灯泡的状态,他们绕成一个环,0是灭,1是亮,每一秒灯泡的状态都会改变,规则是如果当前这个灯泡的左边的灯泡当前是状态1,那么下一秒当前的这个灯泡状态就改变0变1,1变0,最后问 ...

  9. Python爬虫之使用正则表达式抓取数据

    目录 匹配标签 匹配title标签 a标签 table标签 匹配标签里面的属性 匹配a标签里面的URL 匹配img标签里的 src 相关文章:Linux中的正则表达式 Python中的正则表达式 实例 ...

  10. UVA10391复合词

    题意:      给定一个词典,然后问里面那些是复合词,复合词就是当前这个单词正好是有两个单词拼接而成. 思路:       用map来标记是否出现过,然后先按长短排序,把每个单体拆分成任意两个可能的 ...