MyBatis中通用SQL寫法的幾種方法實現(xiàn)
1. 批量操作優(yōu)化
批量操作能夠顯著提升數(shù)據(jù)庫的處理效率,MyBatis通過<foreach>
標(biāo)簽支持批量插入、更新和刪除。
批量插入:
<insert id="batchInsert" parameterType="java.util.List"> INSERT INTO user (username, email, create_time) VALUES <foreach collection="list" item="item" separator=","> (#{item.username}, #{item.email}, #{item.createTime}) </foreach> </insert>
此示例展示了如何批量插入用戶數(shù)據(jù)。通過<foreach>
遍歷傳入的用戶列表,將每個用戶的信息插入到數(shù)據(jù)庫中。
批量更新:
<update id="batchUpdate" parameterType="java.util.List"> <foreach collection="list" item="item" separator=";"> UPDATE user SET username = #{item.username}, email = #{item.email} WHERE id = #{item.id} </foreach> </update>
此示例演示了如何批量更新用戶信息。對每個用戶,根據(jù)其ID更新用戶名和郵箱。
批量刪除:
<delete id="batchDelete" parameterType="java.util.List"> DELETE FROM user WHERE id IN <foreach collection="list" item="id" open="(" separator="," close=")"> #{id} </foreach> </delete>
此示例展示了如何批量刪除用戶。通過<foreach>
生成一個ID列表,并刪除這些ID對應(yīng)的用戶。
2. 動態(tài)SQL
動態(tài)SQL允許根據(jù)條件動態(tài)構(gòu)建SQL語句,MyBatis通過<if>
標(biāo)簽實現(xiàn)這一功能。
動態(tài)查詢:
<select id="findUsers" resultType="User"> SELECT * FROM user WHERE 1=1 <if test="username != null and username != ''"> AND username LIKE CONCAT('%', #{username}, '%') </if> <if test="email != null and email != ''"> AND email = #{email} </if> <if test="status != null"> AND status = #{status} </if> </select>
此示例展示了如何根據(jù)傳入的條件動態(tài)構(gòu)建查詢語句。如果某個條件為空,則相應(yīng)的查詢部分不會被添加到SQL中。
3. 多條件分支查詢
對于更復(fù)雜的查詢邏輯,MyBatis提供了<choose>
、<when>
和<otherwise>
標(biāo)簽。
多條件分支查詢:
<select id="findUsersByCondition" resultType="User"> SELECT * FROM user WHERE 1=1 <choose> <when test="searchType == 'username'"> AND username LIKE CONCAT('%', #{keyword}, '%') </when> <when test="searchType == 'email'"> AND email LIKE CONCAT('%', #{keyword}, '%') </when> <otherwise> AND (username LIKE CONCAT('%', #{keyword}, '%') OR email LIKE CONCAT('%', #{keyword}, '%')) </otherwise> </choose> </select>
此示例展示了如何根據(jù)不同的搜索類型選擇不同的查詢條件。如果沒有指定搜索類型,則默認(rèn)搜索用戶名和郵箱。
4. SQL語句優(yōu)化
使用<trim>
標(biāo)簽可以優(yōu)化生成的SQL語句,避免多余的AND
或OR
關(guān)鍵字。
SQL語句優(yōu)化:
<select id="findUsers" resultType="User"> SELECT * FROM user <trim prefix="WHERE" prefixOverrides="AND |OR "> <if test="username != null and username != ''"> AND username LIKE CONCAT('%', #{username}, '%') </if> <if test="email != null and email != ''"> AND email = #{email} </if> <if test="status != null"> AND status = #{status} </if> </trim> </select>
此示例展示了如何使用<trim>
標(biāo)簽去除多余的AND
或OR
,并在有查詢條件時添加WHERE
關(guān)鍵字。
5. 自動生成主鍵
在插入操作中,經(jīng)常需要獲取數(shù)據(jù)庫自動生成的主鍵。MyBatis提供了<selectKey>
標(biāo)簽和useGeneratedKeys
屬性來實現(xiàn)這一功能。
自動生成主鍵:
<insert id="insertUser" parameterType="User" useGeneratedKeys="true" keyProperty="id"> INSERT INTO user (username, email, create_time) VALUES (#{username}, #{email}, #{createTime}) </insert>
(注意:這里的<selectKey>
標(biāo)簽通常不是必需的,因為useGeneratedKeys=true
和keyProperty
已經(jīng)足夠讓MyBatis自動處理主鍵生成。)
此示例展示了如何在插入用戶后自動獲取生成的主鍵,并將其賦值給傳入的User對象的id屬性。
6. 注解方式使用MyBatis
除了XML配置,MyBatis還支持使用注解來定義SQL操作,使代碼更簡潔。
注解方式示例:
public interface UserMapper { @Select("SELECT * FROM user WHERE id = #{id}") User getUserById(Long id); @Insert("INSERT INTO user (username, email, create_time) VALUES (#{username}, #{email}, #{createTime})") @Options(useGeneratedKeys = true, keyProperty = "id") int insertUser(User user); @Update("UPDATE user SET username = #{username}, email = #{email} WHERE id = #{id}") int updateUser(User user); @Delete("DELETE FROM user WHERE id = #{id}") int deleteUser(Long id); }
此示例展示了如何使用注解來定義簡單的CRUD操作。對于復(fù)雜的SQL語句,仍然建議使用XML配置。
7. 高級映射
MyBatis提供了強大的對象關(guān)系映射功能,可以處理復(fù)雜的表關(guān)系。
一對多映射:
<resultMap id="userWithOrdersMap" type="User"> <id property="id" column="user_id"/> <result property="username" column="username"/> <collection property="orders" ofType="Order"> <id property="id" column="order_id"/> <result property="orderNumber" column="order_number"/> <result property="createTime" column="order_create_time"/> </collection> </resultMap> <select id="getUserWithOrders" resultMap="userWithOrdersMap"> SELECT u.id as user_id, u.username, o.id as order_id, o.order_number, o.create_time as order_create_time FROM user u LEFT JOIN orders o ON u.id = o.user_id WHERE u.id = #{userId} </select>
此示例展示了如何將用戶和訂單信息映射到一個復(fù)雜的對象結(jié)構(gòu)中,實現(xiàn)一對多映射。
8. MyBatis-Plus集成
MyBatis-Plus是MyBatis的增強工具,提供了便捷的CRUD操作和強大的條件構(gòu)造器。
MyBatis-Plus使用示例:
@Service public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService { public List<User> findUsersByCondition(String username, String email) { return this.list(new QueryWrapper<User>() .like(StringUtils.isNotBlank(username), "username", username) .eq(StringUtils.isNotBlank(email), "email", email)); } }
到此這篇關(guān)于MyBatis中通用SQL寫法的幾種方法實現(xiàn)的文章就介紹到這了,更多相關(guān)MyBatis 通用SQL寫法內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
springboot restTemplate連接池整合方式
這篇文章主要介紹了springboot restTemplate連接池整合方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-10-10SpringBoot 整合WebSocket 前端 uniapp 訪問的詳細(xì)方法
這篇文章主要介紹了SpringBoot 整合WebSocket 前端 uniapp 訪問的詳細(xì)方法,本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-09-09spring?boot如何通過自定義注解和AOP攔截指定的請求
這篇文章主要介紹了spring?boot通過自定義注解和AOP攔截指定的請求,本文主要通過切面類和自定注解的方式,攔截指定的接口(代碼中已經(jīng)作了詳細(xì)的說明),需要的朋友可以參考下2024-06-06