动态标签
1.用于处理SQL语句中的空白字符和多余的逗号
-- prefix:指定在SQL语句开头添加的内容。
-- prefixOverrides:指定需要移除的开头部分的内容。
-- suffix:指定在SQL语句结尾添加的内容。
-- suffixOverrides:指定需要移除的结尾部分的内容。
<select id="getUserList" parameterType="map" resultType="User">SELECT *FROM users<trim prefix="WHERE" prefixOverrides="AND | OR "><if test="name != null">AND name = #{name}</if><if test="email != null">AND email = #{email}</if></trim>
</select>
2.构建UPDATE语句中的SET
<update id="updateUser" parameterType="User">UPDATE users<set><if test="name != null">name = #{name},</if><if test="email != null">email = #{email},</if><if test="age != null">age = #{age},</if></set>WHERE id = #{id}
</update>
3.定义可重用的SQL片段
<sql id="columns">name, age, email
</sql><select id="getUser" parameterType="int" resultType="User">SELECT <include refid="columns"/>FROM usersWHERE id = #{id}
</select><insert id="insertUser" parameterType="User">INSERT INTO users (<include refid="columns"/>)VALUES (#{name}, #{age}, #{email})
</insert>-- 动态<sql>
<sql id="dynamicWhere"><where><if test="name != null">AND name = #{name}</if><if test="age != null">AND age = #{age}</if></where>
</sql><select id="getUser" parameterType="User" resultType="User">SELECT *FROM users<include refid="dynamicWhere"/>
</select> -- 终极动态<sql id="selectColumns">SELECT<if test="columns != null">${columns}</if><if test="columns == null">*</if>FROM users
</sql><select id="getUser" parameterType="User" resultType="User"><include refid="selectColumns">-- 给sql标签传参?<property name="columns" value="id, name"/></include>
</select>
4.用于将表达式计算的结果绑定到变量上。可以在SQL语句中使用这些变量
<select id="getUser" parameterType="Map" resultType="User"><bind name="minAge" value="'18'"/>SELECT *FROM usersWHERE age > #{minAge}
</select>-- 动态变量
<select id="getUser" parameterType="Map" resultType="User"><bind name="minAge" value="${age > 18 ? 18 : age}"/>SELECT *FROM usersWHERE age >= #{minAge}
</select>
5.用于在SQL语句中生成动态的WHERE
子句。可以根据条件动态地生成不同的WHERE
语句
-- where中会省略开头的语句 例如: 例子中的AND
<select id="getUser" parameterType="User" resultType="User">SELECT *FROM users<where><if test="name != null">AND name = #{name}</if><if test="age != null">AND age = #{age}</if></where>
</select>
6.
collection:指定要遍历的集合或数组参数的名称,可以是参数对象的属性名或者是@Param注解中指定的名称。
item:指定在循环中每次遍历的元素的名称,可以在循环中使用该名称获取当前元素。
index:指定在循环中每次遍历的索引的名称,可以在循环中使用该名称获取当前元素的索引。
open:指定循环开始时的拼接字符串,默认为空字符串。
close:指定循环结束后的拼接字符串,默认为空字符串。
separator:指定每次遍历元素之间的分隔字符串,默认为空字符串。
itemIndex:指定index是否可用,取值为true或false,默认为false。
<select id="getUsersByIds" parameterType="List" resultType="User">SELECT * FROM usersWHERE id IN<foreach collection="ids" item="id" index="index" open="(" close=")" separator=",">#{id}</foreach>
</select>
-- 生成后sql :SELECT * FROM users WHERE id IN (1, 2, 3)<insert id="batchInsertUsers" parameterType="java.util.List">INSERT INTO users (name, age) VALUES<foreach collection="list" item="user" separator=",">(#{user.name}, #{user.age})</foreach>
</insert>
-- 生成后sql
INSERT INTO users (name, age) VALUES
('Alice', 25),
('Bob', 30),
('Charlie', 28)
转义符
<
(小于号):需要使用<
进行转义。>
(大于号):需要使用>
进行转义。&
(和号):需要使用&
进行转义。"
(双引号):需要使用"
进行转义。'
(单引号):需要使用'
进行转义。
@Options
@Options
是MyBatis中的注解之一,用于为数据库操作提供一些可选配置选项。
在MyBatis中,可以通过在Mapper接口中使用@Options
注解来配置一些与数据库操作相关的选项,例如设置缓存、批量操作、主键生成策略等。
常见的@Options
注解选项:
useCache
:是否使用二级缓存,默认值为true
。flushCache
:执行该操作时是否刷新缓存,默认值为false
。timeout
:数据库操作的超时时间(单位:毫秒)。fetchSize
:每次获取结果集的行数。statementType
:语句类型,可选值为STATEMENT
、PREPARED
和CALLABLE
。keyProperty
:主键属性名,用于指定插入操作后生成的主键值将被设置到哪个实体类属性上。keyColumn
:主键列名,用于指定插入操作后生成的主键值对应的数据库列名。useGeneratedKeys
:是否使用自动生成的主键,默认值为false
。
-- 主键回填
@Insert("INSERT INTO users(name) VALUES(#{name})")
@Options(useGeneratedKeys = true, keyProperty = "id", keyColumn = "id")
int insertUser(User user);