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. JavaFX+SpringBoot+验证码功能的小型薪酬管理系统

    2020.07.22更新 1 概述 1.1 简介 一个简单的小型薪酬管理系统,前端JavaFX+后端Spring Boot,功能倒没多少,主要精力放在了UI和前端的一些逻辑上面,后端其实做得很简单. ...

  2. lvs 负载均衡 _DR模式 _Python脚本

    import paramiko vip='192.168.83.6' # 虚拟IP # direct_server_information ds_info={ 'ip':'192.168.83.5', ...

  3. Linux 基础命令 命令进阶

    Linux命令格式:命令 选项 参数 (大部分命令是这个格式) 注意: 1.命令区分大小写 2.短选项可以合并   长选项不能合并 如 : 短选项 -l  -h 可以合并为 -lh 长选项  不能合并 ...

  4. Go-14-解决 go get golang.org/x/text 拉取失败问题

    现象 在执行go get -v github.com/spf13/cobra/cobra 时,报go get golang.org/x/text 拉取失败问题 解决方法: 在 ${gopath}/sr ...

  5. 把握好集成测试大关,ERP就成功了一大半

    欢迎关注微信公众号:sap_gui (ERP咨询顾问之家) 前段时间收到一个朋友的信息,说他们目前正在实施ERP系统,已经到了集成测试环节了,但整个测试过程下来并不是太理想,很多接口不通,功能也还在开 ...

  6. ASP检测客户是否取消微信公众号

    有时因为项目内需要用到检测客户是否已经取消关注微信公众号,只有没被取消执行相关模板信息发送.图文信息发送.视频语音等信息发送给客户才有意义.也可以知道多少客户还在我们的微信公众号关注内.方便后期做公众 ...

  7. Redis系统学习之SpringBoot集成Redis操作API(集成SpringDataRedis及其分析)

    SpringDataRedis调用Redis底层解读 在SpringBoot2.X之前还是直接使用的官方推荐的Jedis连接的Redis 在2.X之后换为了lettuce Jedis:采用直接连接,多 ...

  8. think php 5.x

    # Exploit Title: thinkphp 5.X RCE # Date: 2019-1-14 # Exploit Author: vr_system # Vendor Homepage: h ...

  9. 利用Xposed Hook打印Java函数调用堆栈信息的几种方法

    本文博客链接:http://blog.csdn.net/QQ1084283172/article/details/79378374 在进行Android逆向分析的时候,经常需要进行动态调试栈回溯,查看 ...

  10. 基于任务的异步编程(Task,async,await)

    这节讲一下比较高级的异步编程用法Task,以及两个异步关键字async和await. Task是在C#5.0推出的语法,它是基于任务的异步编程语法,是对Thread的升级,也提供了很多API,先看一下 ...