<selectid="getUserList"resultType="User"> SELECT * FROM user WHERE 1=1 <iftest="name != null and name != ''"> AND name LIKE CONCAT('%', #{name}, '%') </if> <iftest="age != null"> AND age = #{age} </if> </select>
choose (when/otherwise)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
<selectid="getUserByCondition"resultType="User"> SELECT * FROM user WHERE <choose> <whentest="name != null and name != ''"> name LIKE CONCAT('%', #{name}, '%') </when> <whentest="email != null and email != ''"> email = #{email} </when> <otherwise> status = 1 </otherwise> </choose> </select>
<!-- trim 替代 where --> <selectid="getUserList"resultType="User"> SELECT * FROM user <trimprefix="WHERE"prefixOverrides="AND |OR "> <iftest="name != null and name != ''"> AND name LIKE CONCAT('%', #{name}, '%') </if> <iftest="age != null"> AND age = #{age} </if> </trim> </select>
<!-- trim 替代 set --> <updateid="updateUser"> UPDATE user <trimprefix="SET"suffixOverrides=","> <iftest="name != null">name = #{name},</if> <iftest="age != null">age = #{age},</if> <iftest="email != null">email = #{email},</if> </trim> WHERE id = #{id} </update>
<!-- where 标签自动处理 AND/OR --> <selectid="getUserList"resultType="User"> SELECT * FROM user <where> <iftest="name != null and name != ''"> AND name LIKE CONCAT('%', #{name}, '%') </if> <iftest="age != null"> AND age = #{age} </if> </where> </select>
<!-- set 标签自动处理逗号 --> <updateid="updateUser"> UPDATE user <set> <iftest="name != null">name = #{name},</if> <iftest="age != null">age = #{age},</if> <iftest="email != null">email = #{email},</if> </set> WHERE id = #{id} </update>
<!-- IN 查询 --> <selectid="getUserByIds"resultType="User"> SELECT * FROM user WHERE id IN <foreachitem="id"collection="list"open="("separator=","close=")"> #{id} </foreach> </select>
<!-- 批量插入 --> <insertid="batchInsertUser"> INSERT INTO user (name, age, email) VALUES <foreachcollection="list"item="user"separator=","> (#{user.name}, #{user.age}, #{user.email}) </foreach> </foreach>
<!-- 批量更新 --> <updateid="batchUpdateUser"> <foreachcollection="list"item="user"separator=";"> UPDATE user SET name = #{user.name}, age = #{user.age} WHERE id = #{user.id} </foreach> </update>
<selectid="getUserWithProfile"resultMap="userDetailMap"> SELECT u.*, p.id as profile_id, p.avatar, p.bio FROM user u LEFT JOIN user_profile p ON u.id = p.user_id WHERE u.id = #{id} </select>
<selectid="getUserWithOrders"resultMap="userWithOrdersMap"> SELECT u.*, o.id as order_id, o.order_no, o.amount, o.create_time FROM user u LEFT JOIN `order` o ON u.id = o.user_id WHERE u.id = #{id} </select>
4. 多表联查
JOIN 查询
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
<selectid="getUserOrderInfo"resultType="map"> SELECT u.name as userName, u.email, o.order_no, o.amount, o.create_time FROM user u INNER JOIN `order` o ON u.id = o.user_id <where> <iftest="userName != null and userName != ''"> AND u.name LIKE CONCAT('%', #{userName}, '%') </if> <iftest="startDate != null"> AND o.create_time >= #{startDate} </if> </where> ORDER BY o.create_time DESC </select>
5. 子查询
1 2 3 4 5 6 7 8 9 10 11
<selectid="getUserWithOrderCount"resultType="UserVO"> SELECT u.*, (SELECT COUNT(*) FROM `order` o WHERE o.user_id = u.id) as orderCount FROM user u <where> <iftest="hasOrder != null and hasOrder == true"> AND EXISTS (SELECT 1 FROM `order` o WHERE o.user_id = u.id) </if> </where> </select>
6. 分页查询
简单分页
1 2 3 4 5 6 7 8 9 10
<selectid="getUserListWithPage"resultType="User"> SELECT * FROM user <where> <iftest="name != null and name != ''"> AND name LIKE CONCAT('%', #{name}, '%') </if> </where> ORDER BY id DESC LIMIT #{offset}, #{limit} </select>
使用 PageHelper
1 2 3 4 5 6 7 8 9
<selectid="getUserList"resultType="User"> SELECT * FROM user <where> <iftest="name != null and name != ''"> AND name LIKE CONCAT('%', #{name}, '%') </if> </where> ORDER BY id DESC </select>
<selectid="getUserStatistics"resultType="map"> SELECT COUNT(*) as total, COUNT(CASE WHEN age >= 18 THEN 1 END) as adultCount, AVG(age) as avgAge, MAX(age) as maxAge, MIN(age) as minAge FROM user <where> <iftest="status != null"> AND status = #{status} </if> </where> </select>
<!-- 分组查询 --> <selectid="getUserCountByStatus"resultType="map"> SELECT status, COUNT(*) as count FROM user GROUP BY status HAVING COUNT(*) > #{minCount} </select>
8. 常用技巧
字符串拼接
1 2 3 4
<selectid="searchUser"resultType="User"> SELECT * FROM user WHERE CONCAT(name, '-', email) LIKE CONCAT('%', #{keyword}, '%') </select>
日期处理
1 2 3 4 5 6
<selectid="getUserByDateRange"resultType="User"> SELECT * FROM user WHERE create_time BETWEEN #{startDate} AND #{endDate} <!-- 或者使用 DATE 函数 --> AND DATE(create_time) = DATE(#{specificDate}) </select>
排序动态化
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
<selectid="getUserList"resultType="User"> SELECT * FROM user <where> <iftest="name != null and name != ''"> AND name LIKE CONCAT('%', #{name}, '%') </if> </where> ORDER BY <choose> <whentest="orderBy == 'name'">name</when> <whentest="orderBy == 'age'">age</when> <whentest="orderBy == 'createTime'">create_time</when> <otherwise>id</otherwise> </choose> <choose> <whentest="orderType == 'desc'">DESC</when> <otherwise>ASC</otherwise> </choose> </select>