[toc]
一、Mapper标签
Mapper 标签是 Mybatis 中最重要的标签之一,它用于描述 SQL 映射关系。Mapper 标签有以下属性:
- namespace:指定 Mapper 接口的完整路径名。
- resultMap:指定结果映射关系,将查询结果映射成 Java 对象。
- parameterMap:指定参数映射关系,将 Java 对象映射成 SQL 参数。
- sql:定义可重用的 SQL 片段。
- insert、update、delete、select:定义对应的 SQL 语句及参数映射关系。
二、ResultMap 标签
ResultMap 标签用于描述查询结果集与 Java 对象之间的映射关系。ResultMap 标签有以下属性:
- id:指定 ResultMap 的唯一标识符。
- type:指定映射的 Java 对象类型。
- extends:指定继承的 ResultMap。
- discriminator:用于多表关联查询时进行分组判断。
- constructor、id、result、association、collection:用于定义映射关系。
<resultMap id="userMap" type="User">
<id property="id" column="id"/>
<result property="name" column="name"/>
<result property="age" column="age"/>
</resultMap>
<select id="selectUserById" resultMap="userMap">
select * from user where id = #{id}
</select>
三、Sql 标签
Sql 标签用于定义可重用的 SQL 片段,可以在 SQL 映射文件中多次引用。Sql 标签有以下属性:
id:指定 Sql 片段的唯一标识符。
databaseId:指定 Sql 片段适用的数据库类型。
lang:指定 Sql 片段使用的脚本语言。
statementType、parameterType、resultType:用于定义 Sql 片段的类型信息。
<sql id="userColumns">
id, name, age
</sql>
<select id="getUserById" resultType="com.example.User" parameterType="int">
SELECT <include refid="userColumns"/> FROM user WHERE id = #{id}
</select>
SQL标签是MyBatis中最常用的标签之一,它用于定义SQL语句,包括增删改查等操作。SQL标签有以下几种:
3.1 select
select标签用于定义查询语句,可以包含where、order by、group by等子句
<select id="selectUserById" resultType="User">
select * from user where id = #{id}
</select>
3.2 insert
insert标签用于定义插入语句,可以插入单条或多条数据
<insert id="insertUser" parameterType="User">
insert into user (name, age) values (#{name}, #{age})
</insert>
3.3 update
update标签用于定义更新语句,可以更新单条或多条数据。
<update id="updateUser" parameterType="User">
update user set name = #{name}, age = #{age} where id = #{id}
</update>
3.4 delete
delete标签用于定义删除语句,可以删除单条或多条数据
<delete id="deleteUserById" parameterType="int">
delete from user where id = #{id}
</delete>
3.5 selectKey
selectKey标签用于在插入数据时获取自动生成的主键值。该标签有多种属性,包括resultType、keyProperty等。
<insert id="addUser" parameterType="com.example.User">
<selectKey resultType="int" keyProperty="id" order="AFTER">
SELECT LAST_INSERT_ID()
</selectKey>
INSERT INTO user (name, age) VALUES (#{name}, #{age})
</insert>
四、Insert、Update、Delete、Select 标签
Insert、Update、Delete、Select 标签分别对应 SQL 语句中的插入、更新、删除和查询操作。这些标签都有以下属性:
id:指定 SQL 语句的唯一标识符。
parameterType:指定输入参数类型。
resultMap:指定结果映射关系。
flushCache、useCache:控制缓存行为。
timeout:指定 SQL 执行超时时间。
statementType:指定 SQL 类型。
keyProperty、keyColumn:仅对插入操作有效,用于获取自动生成的主键值。
五、动态SQL标签
动态SQL标签用于根据不同的条件生成不同的SQL语句,可以大大提高代码的复用性和可读性。
5.1 if
if标签用于根据条件生成不同的SQL语句。
<select id="selectUserByNameAndAge" resultType="User">
select * from user
<where>
<if test="name != null and name != ''">
and name like concat('%', #{name}, '%')
</if>
<if test="age != null">
and age = #{age}
</if>
</where>
</select>
5.2 choose、when、otherwise
choose、when、otherwise标签用于根据不同的条件生成不同的SQL语句。
<select id="selectUserByCondition" resultType="User">
select * from user
<where>
<choose>
<when test="name != null and name != ''">
and name like concat('%', #{name}, '%')
</when>
<when test="age != null">
and age = #{age}
</when>
<otherwise>
and 1=1
</otherwise>
</choose>
</where>
</select>
5.3 foreach
foreach标签用于循环生成SQL语句。
<delete id="deleteUsersByIds" parameterType="List">
delete from user where id in
<foreach collection="list" item="id" open="(" separator="," close=")">
#{id}
</foreach>
</delete>
foreach标签可以用于各种情况,例如:
1.在WHERE子句中使用IN运算符
使用foreach标签来生成逗号分隔的整数列表,并将其插入到查询中:
SELECT * FROM users WHERE id IN
<foreach collection="ids" item="id" open="(" close=")" separator=",">
#{id}
</foreach>
2.在INSERT语句中使用VALUES子句
使用foreach标签来生成多个VALUES子句,并将它们插入到INSERT语句中:
INSERT INTO users (name, age) VALUES
<foreach collection="users" item="user" separator=",">
(#{user.name}, #{user.age})
</foreach>
3.在UPDATE语句中使用SET子句
使用foreach标签来生成多个SET子句,并将它们插入到UPDATE语句中:
UPDATE users SET
<foreach collection="users" item="user" separator=",">
age = #{user.age}
</foreach>
WHERE id IN
<foreach collection="ids" item="id" open="(" close=")" separator=",">
#{id}
</foreach>
5.4 where、set、trim等标签
这些标签都是用于拼接SQL语句的辅助标签,可以大大提高代码的可读性和可维护性。
where标签用于动态生成WHERE子句,可以根据条件判断是否生成WHERE子句。
<select id="selectUsers" resultType="User">
SELECT * FROM users
<where>
<if test="id != null">
AND id = #{id}
</if>
<if test="name != null">
AND name = #{name}
</if>
</where>
</select>
set标签用于动态生成SET子句,可以根据条件判断是否生成SET子句。
<update id="updateUser" parameterType="com.example.User">
UPDATE user
<set>
<if test="name != null">
name = #{name},
</if>
<if test="age != null">
age = #{age},
</if>
</set>
WHERE id = #{id}
</update>
六、Result 标签
Result 标签用于描述查询结果集中的一列与 Java 对象之间的映射关系。Result 标签有以下属性:
property:指定映射到 Java 对象中的属性名。
column:指定查询结果集中的列名。
jdbcType:指定查询结果集中列的数据类型。
typeHandler:指定类型处理器,将查询结果集中列的数据类型转换成 Java 对象或将 Java 对象转换成查询结果集中列的数据类型。
select、insert、update、delete:仅对存储过程有效,用于指定输出参数类型和输出参数名称。