1、映射文件概述

创建映射文件时一定要给映射文件添加约束头,约束头相对固定,可以直接复制:

<?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这一个根元素,在这个元素下有几个顶级元素:

  • cache:该命名空间的缓存配置。
  • cache-ref:引用其它命名空间的缓存配置。
  • resultMap : 描述如何从数据库结果集中加载对象,是最复杂也是最强大的元素。
  • sql : 可被其它语句引用的可重用语句块。
  • insert :映射插入语句。
  • update : 映射更新语句。
  • delete: 映射删除语句。
  • select :映射查询语句。

2、插入数据操作 ——select

select元素是 MyBatis 中最常用的元素之一,因此 MyBatis 在查询和结果映射做了相当多的改进。一个简单查询的select元素是非常简单的。比如:

<!-- 查询 User 表的全部内容 -->
<!-- id 表示唯一标识符,parameterType 表示查询返回结果全限定名或别名 -->
<select id="selectPerson" resultType="com.itlong.domain.User">
  SELECT * FROM USER
</select>

select元素的一些比较常见属性:

  • id:在命名空间中唯一的标识符。

  • parameterType:传入这条语句的参数的类型。

  • resultType:语句中返回结果的类全限定名或别名。

  • resultMap:对外部 resultMap 的命名引用。

  • resultOrdered:该属性仅仅针对嵌套结果 select 语句,默认值为 false

  • resultSets:将列出语句执行后返回的结果集并赋予每个结果集一个名称,多个名称之间以逗号分隔,仅适用于多结果集的情况。

  • timeout:在抛出异常之前,驱动程序等待数据库返回请求结果的秒数,默认没设置。

  • statementType:可选STATEMENT,PREPARED 或 CALLABLE,默认值:PREPARED。

上述属性可以分为三类:查询设置、查询参数和结果映射

3、增删改操作数据操作 ——insert, update 和 delete

这三个元素也是 MyBatis 中最常用的元素之一。具体实例:

<insert id="add" parameterType="com.itlong.domain.User">
	insert into user (id,name,age) values(#{id},#{name},#{age})
</insert>

<update id="update" parameterType="com.itlong.domain.User">
    update user set name=#{name},age=#{age} where id=#{id}
</update>

<delete id="delete" parameterType="int">
    delete from user where id= #{id}
</delete>

insert, updatedelete三个元素的共有常用属性有:idparameterTypetimeoutstatementType,具体含义同select元素。

insertupdate两个元素的共有常用属性:

  • useGeneratedKeys:当执行插入或者修改操作后,可以获取到该对象的自增主键 id。
  • keyProperty:用于指定对象中定义的自增主键属性,后续可通过获取对象的该属性,将 useGeneratedKeys元素获取的自增主键 id 赋值给它。
  • keyColumn:与keyProperty的区别是,keyColumn指的是数据库表中自增主键的字段名。如果不止一个,可以用逗号分隔多个属性名称。

这三个属性需要配合在一起使用,模拟一个添加订单的应用场景:

  1. 业务::一个新用户添加了一个新的订单,这两个表主键id都是自增的。
  2. 条件:用户表和订单表,主键id都是自增的。
  3. 分析:首先我们要给用户表添加一个新用户,添加成功查询该用户的 ID,然后再执行订单添加操作。

这个简单的场景我们就进行了三步,用上面三个属性能进行简化:

<!-- 简单来说  useGeneratedKeys 用于获取 id-->
<!-- keyProperty 用于将获取到的 id 赋值给传过来的 user对象的 id 字段 -->
<!-- keyColumn 用于指定该表中有那些 主键自增字段 -->
<insert id="add" parameterType="com.itlong.domain.User" useGeneratedKeys="true" keyProperty="id" keyColumn="id">
	insert into user (name,age) values(#{name},#{age})
</insert>

因为insert, update 和 delete操作涉及到了数据库数据变化,所以我们需要提交事务。

4、定义可重用的 SQL 代码——sql

sql元素标签用来定义可重复使用的SQL代码片段,使用时只需要用include元素标签引用即可,最终达到SQL语句重用的目的。同时它可以被静态地(在加载参数) 参数化,不同的属性值通过包含的实例变化,比如:

<!-- 建立sql片段 -->
<sql id="userCols">
	id,name,age
</sql>
 
<!-- 使用include引用sql片段 -->
<select id="findUser" resultType="com.itlong.domain.User">
	select <include refid="userCols"/>
    from user
</select>
 
<!-- 引用其它mapper.xml的sql片段 -->
<include refid="namespace.sql片段"/>

include元素标签中的 refid属性就是用于指定使用的 sql 片段。还有另外一种使用方法:

<!-- 建立sql片段 -->
<sql id="userCols"> ${user}.id,${user}.name,${user}.age</sql>
<select id="findUser" resultType="com.itlong.domain.User">
  select  
       <include refid="userColumns">
           <!-- 将 userColumns 片段中的${alias},替换成 user -->
           <property name="alias" value="user"/>
       </include>
  from user
</select>

include元素标签中的子标签property就是用于替换sql标签中定义的变量的,property元素标签的name属性表示需要将sql元素中的被替换项,value属性表示将sql元素中替换项。这种放方式可以动态改变 sql 片段中的值。

还有一种比较绕的用法:

<!-- 建立sql片段 -->
<sql id="sometable">
  ${prefix}Table
</sql>
<!-- 建立sql片段 -->
<sql id="someinclude">
  from
    <!-- 在这个sql片段中引入 ${include_target} 这个片段,
    ${include_target} 这个片段在使用该片段传递过来  -->
    <include refid="${include_target}"/>
</sql>

<select id="select" resultType="map">
  select
    field1, field2, field3
   <!-- 引入 someinclude 片段
    将该片段中 prefix 值替换为 Some
    将该片段中 include_target值替换为 sometable

    因为 someinclude 片段中 有一个 include_target 变量,替换完
    之后就表明在 someinclude 片段中引入了 sometable 片段,
    而 sometable 片段有一个 prefix 变量,替换完之后,sometable 片段
    就为:SomeTable,someinclude 片段就为:from SomeTable
     -->
  <include refid="someinclude">
    <property name="prefix" value="Some"/>
    <property name="include_target" value="sometable"/>
  </include>
</select>
Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐