MyBatis之映射文件详解(一)
文章目录1、映射文件概述2、插入数据操作 ——select3、增删改操作数据操作 ——insert, update 和 delete4、定义可重用的 SQL 代码——sql1、映射文件概述在创建完 XML 文件之后一定要给映射文件添加约束头,约束头相对固定直接复制即可:<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE mapper
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
, update
和 delete
三个元素的共有常用属性有:id
、parameterType
、timeout
和statementType
,具体含义同select
元素。
insert
和 update
两个元素的共有常用属性:
useGeneratedKeys
:当执行插入或者修改操作后,可以获取到该对象的自增主键 id。keyProperty
:用于指定对象中定义的自增主键属性,后续可通过获取对象的该属性,将useGeneratedKeys
元素获取的自增主键 id 赋值给它。keyColumn
:与keyProperty的区别是,keyColumn指的是数据库表中自增主键的字段名。如果不止一个,可以用逗号分隔多个属性名称。
这三个属性需要配合在一起使用,模拟一个添加订单的应用场景:
- 业务::一个新用户添加了一个新的订单,这两个表主键id都是自增的。
- 条件:用户表和订单表,主键id都是自增的。
- 分析:首先我们要给用户表添加一个新用户,添加成功查询该用户的 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>
更多推荐
所有评论(0)