ToB企服应用市场:ToB评测及商务社交产业平台

标题: [笔记] MyBatis-Plus XML 配置详解:从基础到高级,全面提升开辟服从 [打印本页]

作者: 瑞星    时间: 5 天前
标题: [笔记] MyBatis-Plus XML 配置详解:从基础到高级,全面提升开辟服从

MyBatis-Plus 是一个 MyBatis 的增强工具,旨在简化开辟过程,提供更便捷的数据库操作方式。在 MyBatis-Plus 中,XML 配置文件扮演着紧张的角色,它允许开辟者定义 SQL 语句、映射结果集以及配置各种数据库操作。本文将详细介绍 MyBatis-Plus XML 配置文件中的各种标签和功能,从基础的查询、插入、更新、删除操作,到高级的动态 SQL、结果映射和批量操作,帮助你全面把握 MyBatis-Plus 的 XML 配置技巧,提升开辟服从。(重要就是因为 mybatis-plus 封装的太好了,能不写sql就不写,到写的时间都忘记了…)
MyBatis-Plus 官网 : Mybatis-Plus
MyBatis 官网 : Mybatis中文官网
SQL 优化 :[笔记] SQL数据库优化实战 : SQL 全面优化

一. 基础标签

1. select 标签

  1. <select id="getById" resultType="User" parameterType="long">
  2.     SELECT * FROM user WHERE id = #{id}
  3. </select>
复制代码
  用于查询操作,最根本的查询标签。
  
  2. insert 标签

  1. <insert id="insert" parameterType="User" useGeneratedKeys="true" keyProperty="id">
  2.     INSERT INTO user (username, age) VALUES (#{username}, #{age})
  3. </insert>
复制代码
  用于插入操作。
  
  3. update 标签

  1. <update id="update" parameterType="User">
  2.     UPDATE user SET username = #{username} WHERE id = #{id}
  3. </update>
复制代码
  用于更新操作。
  
  4. delete 标签

  1. <delete id="deleteById" parameterType="long">
  2.     DELETE FROM user WHERE id = #{id}
  3. </delete>
复制代码
  用于删除操作。
  
  
二. 动态 SQL 标签

1. if 标签

  1. <if test="username != null and username != ''">
  2.     AND username LIKE CONCAT('%', #{username}, '%')
  3. </if>
复制代码
  条件判断,当 test 属性中的条件建立时,才会将其包罗的 SQL 片断拼接到终极的 SQL 中。
  
  2. choose-when-otherwise 标签

  1. <choose>
  2.     <when test="status != null">
  3.         AND status = #{status}
  4.     </when>
  5.     <when test="type != null">
  6.         AND type = #{type}
  7.     </when>
  8.     <otherwise>
  9.         AND create_time > SYSDATE
  10.     </otherwise>
  11. </choose>
复制代码
  雷同 Java 中的 switch 语句,只会执行一个条件。
  3. where 标签

  1. <where>
  2.     <if test="username != null">
  3.         AND username = #{username}
  4.     </if>
  5.     <if test="age != null">
  6.         AND age >= #{age}
  7.     </if>
  8. </where>
复制代码
  主动处理 WHERE 子句,会主动去除多余的 AND 或 OR。
  4. set 标签

  1. <update id="updateUser">
  2.     UPDATE user
  3.     <set>
  4.         <if test="username != null">username = #{username},</if>
  5.         <if test="age != null">age = #{age},</if>
  6.     </set>
  7.     WHERE id = #{id}
  8. </update>
复制代码
  用在 UPDATE 语句中,主动处理 SET 关键字和逗号。
  5. trim 标签

  1. <trim prefix="WHERE" prefixOverrides="AND|OR" suffix=")" suffixOverrides=",">
  2.     <if test="username != null">
  3.         AND username = #{username},
  4.     </if>
  5. </trim>
复制代码
  更灵活的前缀/后缀处理。
  
  6. foreach 标签

  1. <foreach collection="list" item="item" index="index" open="(" separator="," close=")">
  2.     #{item}
  3. </foreach>
复制代码
  循环遍历集合或数组。
  
  
三. 高级映射

1. resultMap 标签

  1. <resultMap id="UserResultMap" type="User">
  2.     <!-- 主键映射 -->
  3.     <id property="id" column="user_id"/>
  4.    
  5.     <!-- 普通属性映射 -->
  6.     <result property="username" column="user_name"/>
  7.    
  8.     <!-- 一对一关系 -->
  9.     <association property="profile" javaType="UserProfile">
  10.         <id property="id" column="profile_id"/>
  11.         <result property="address" column="address"/>
  12.     </association>
  13.    
  14.     <!-- 一对多关系 -->
  15.     <collection property="roles" ofType="Role">
  16.         <id property="id" column="role_id"/>
  17.         <result property="roleName" column="role_name"/>
  18.     </collection>
  19. </resultMap>
复制代码
  自定义结果映射关系。
  
  
  
  
  
  
  
  
  
  2. sql 标签

  1. <!-- 定义 SQL 片段 -->
  2. <sql id="Base_Column_List">
  3.     id, username, age, email, create_time
  4. </sql>
  5. <!-- 使用 SQL 片段 -->
  6. <select id="selectById">
  7.     SELECT <include refid="Base_Column_List"/> FROM user
  8. </select>
复制代码
  定义可重用的 SQL 片断。
  
四. 特殊功能

1. bind 标签

  1. <select id="selectByName">
  2.     <bind name="pattern" value="'%' + name + '%'"/>
  3.     SELECT * FROM user WHERE username LIKE #{pattern}
  4. </select>
复制代码
  创建一个变量并绑定到上下文中。
  2. 特殊字符:CDATA 区段(关联 XML 实体)

  1. <select id="getUsers">
  2.     SELECT * FROM user
  3.     WHERE age <![CDATA[ >= ]]> #{minAge}
  4. </select>
复制代码
  处理特殊字符。
  3. 特殊字符:XML 实体(关联 CDATA 区段)


  1. <select id="getUsers">
  2.     SELECT * FROM user
  3.     WHERE age &gt;= #{minAge}
  4. </select>
复制代码
  预定义的 XML 实体
  
  
  1. <!-- DOCTYPE声明 -->
  2. <!DOCTYPE example [
  3.     <!ENTITY myEntity "This is a custom entity">
  4. ]>
  5. <!-- 使用 -->
  6. <example>
  7.     Here is the custom entity: &myEntity;
  8. </example>
  9. <!-- 结果 -->
  10. <example>
  11.     Here is the custom entity: This is a custom entity
  12. </example>
复制代码
  自定义实体允许你在XML文档中定义一些简短的更换符号,这些符号可以在文档的不同部分引用。
  代码表明
  
  
  渲染结果
  当你剖析这个XML文档时,剖析器会将&myEntity;更换为其定义的值。终极的结果将是:
  1. <example>
  2.     Here is the custom entity: This is a custom entity
  3. </example>
复制代码

五. 实用场景示例

1. 动态表关联

  1. <select id="getUserDetails" resultMap="UserDetailMap">
  2.     SELECT u.*
  3.     FROM user u
  4.     <!-- 动态关联用户资料表 -->
  5.     <if test="includeProfile">
  6.         LEFT JOIN user_profile up ON u.id = up.user_id
  7.     </if>
  8.     <!-- 动态关联角色表 -->
  9.     <if test="includeRoles">
  10.         LEFT JOIN user_role ur ON u.id = ur.user_id
  11.         LEFT JOIN role r ON ur.role_id = r.id
  12.     </if>
  13.     WHERE u.id = #{userId}
  14. </select>
复制代码
  根据条件决定是否关联其他表。
     动态地从多个表中获取用户详细信息。
    代码剖析
  
  
  调用
传参:
  
  天生的SQL:
  1. SELECT u.*
  2. FROM user u
  3. LEFT JOIN user_profile up ON u.id = up.user_id
  4. LEFT JOIN user_role ur ON u.id = ur.user_id
  5. LEFT JOIN role r ON ur.role_id = r.id
  6. WHERE u.id  
复制代码
2. 批量操作优化

  1. <!-- MySQL批量更新 -->
  2. <update id="batchUpdate">
  3.     UPDATE user
  4.     <trim prefix="SET" suffixOverrides=",">
  5.         <trim prefix="username = CASE" suffix="END,">
  6.             <foreach collection="list" item="item">
  7.                 WHEN id = #{item.id} THEN #{item.username}
  8.             </foreach>
  9.         </trim>
  10.     </trim>
  11.     WHERE id IN
  12.     <foreach collection="list" item="item" open="(" separator="," close=")">
  13.         #{item.id}
  14.     </foreach>
  15. </update>
复制代码
  适用于大量数据的批量操作。
     批量更新用户表中的数据。
    代码剖析
  
  
  整体效果
  假设你传入的参数是一个包罗两个用户的列表,每个用户都有一个id和一个新的username值:
  1. List<User> userList = new ArrayList<>();
  2. userList.add(new User(1, "newUsername1"));
  3. userList.add(new User(2, "newUsername2"));
复制代码
天生的终极SQL语句将会是:
  1. UPDATE user
  2. SET username = CASE
  3.     WHEN id = 1 THEN 'newUsername1'
  4.     WHEN id = 2 THEN 'newUsername2'
  5. END
  6. WHERE id IN (1, 2);
复制代码

六. 最佳实践

1. 性能优化


2. 安全性


3. 可维护性



七. 留意事项



免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4