Mybatis-动态标签

本文详细介绍了MyBatis中如何使用动态标签处理SQL语句的空白、多余逗号,以及构建动态的SET、WHERE子句、遍历集合的foreach功能。展示了如何通过参数化和可重用片段提高代码复用性。
摘要由CSDN通过智能技术生成

动态标签

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 users
  WHERE 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 users
  WHERE age &gt; #{minAge}
</select>

-- 动态变量
<select id="getUser" parameterType="Map" resultType="User">
  <bind name="minAge" value="${age > 18 ? 18 : age}"/>
  SELECT *
  FROM users
  WHERE age &gt;= #{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 users
  WHERE 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)

转义符

  1. <(小于号):需要使用<进行转义。
  2. >(大于号):需要使用>进行转义。
  3. &(和号):需要使用&进行转义。
  4. "(双引号):需要使用"进行转义。
  5. '(单引号):需要使用'进行转义。

@Options

@Options是MyBatis中的注解之一,用于为数据库操作提供一些可选配置选项。

在MyBatis中,可以通过在Mapper接口中使用@Options注解来配置一些与数据库操作相关的选项,例如设置缓存、批量操作、主键生成策略等。

常见的@Options注解选项:

  1. useCache:是否使用二级缓存,默认值为true
  2. flushCache:执行该操作时是否刷新缓存,默认值为false
  3. timeout:数据库操作的超时时间(单位:毫秒)。
  4. fetchSize:每次获取结果集的行数。
  5. statementType:语句类型,可选值为STATEMENTPREPAREDCALLABLE
  6. keyProperty:主键属性名,用于指定插入操作后生成的主键值将被设置到哪个实体类属性上。
  7. keyColumn:主键列名,用于指定插入操作后生成的主键值对应的数据库列名。
  8. useGeneratedKeys:是否使用自动生成的主键,默认值为false
-- 主键回填
@Insert("INSERT INTO users(name) VALUES(#{name})")
@Options(useGeneratedKeys = true, keyProperty = "id", keyColumn = "id")
int insertUser(User user);
mybatis-plus是MyBatis的增强工具,在标签使用上与MyBatis相似。以下是mybatis-plus中常用标签的使用示例: 1. insert标签 ```xml <insert id="insertUser" parameterType="User"> INSERT INTO user(name, age, email) VALUES(#{name}, #{age}, #{email}) </insert> ``` 2. update标签 ```xml <update id="updateUserById" parameterType="User"> UPDATE user SET name=#{name}, age=#{age}, email=#{email} WHERE id=#{id} </update> ``` 3. delete标签 ```xml <delete id="deleteUserById" parameterType="Long"> DELETE FROM user WHERE id=#{id} </delete> ``` 4. select标签 ```xml <select id="getUserById" parameterType="Long" resultType="User"> SELECT id, name, age, email FROM user WHERE id=#{id} </select> ``` 5. resultMap标签 ```xml <resultMap id="userMap" type="User"> <id property="id" column="id"/> <result property="name" column="name"/> <result property="age" column="age"/> <result property="email" column="email"/> </resultMap> ``` 6. association标签 ```xml <resultMap id="userMapWithDepartment" type="User"> <id property="id" column="id"/> <result property="name" column="name"/> <result property="age" column="age"/> <result property="email" column="email"/> <association property="department" javaType="Department" column="department_id" select="getDepartmentById"/> </resultMap> <select id="getUserWithDepartmentById" parameterType="Long" resultMap="userMapWithDepartment"> SELECT u.id, u.name, u.age, u.email, u.department_id FROM user u LEFT JOIN department d ON u.department_id=d.id WHERE u.id=#{id} </select> <select id="getDepartmentById" parameterType="Long" resultType="Department"> SELECT id, name FROM department WHERE id=#{id} </select> ``` 以上是mybatis-plus标签的使用示例,希望对你有所帮助。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值