MyBatis中通用SQL寫法的幾種方法實現(xiàn)
1. 批量操作優(yōu)化
批量操作能夠顯著提升數(shù)據(jù)庫的處理效率,MyBatis通過<foreach>標簽支持批量插入、更新和刪除。
批量插入:
<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對應的用戶。
2. 動態(tài)SQL
動態(tài)SQL允許根據(jù)條件動態(tài)構建SQL語句,MyBatis通過<if>標簽實現(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)構建查詢語句。如果某個條件為空,則相應的查詢部分不會被添加到SQL中。
3. 多條件分支查詢
對于更復雜的查詢邏輯,MyBatis提供了<choose>、<when>和<otherwise>標簽。
多條件分支查詢:
<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ù)不同的搜索類型選擇不同的查詢條件。如果沒有指定搜索類型,則默認搜索用戶名和郵箱。
4. SQL語句優(yōu)化
使用<trim>標簽可以優(yōu)化生成的SQL語句,避免多余的AND或OR關鍵字。
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>標簽去除多余的AND或OR,并在有查詢條件時添加WHERE關鍵字。
5. 自動生成主鍵
在插入操作中,經(jīng)常需要獲取數(shù)據(jù)庫自動生成的主鍵。MyBatis提供了<selectKey>標簽和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>標簽通常不是必需的,因為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操作。對于復雜的SQL語句,仍然建議使用XML配置。
7. 高級映射
MyBatis提供了強大的對象關系映射功能,可以處理復雜的表關系。
一對多映射:
<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>此示例展示了如何將用戶和訂單信息映射到一個復雜的對象結構中,實現(xiàn)一對多映射。
8. MyBatis-Plus集成
MyBatis-Plus是MyBatis的增強工具,提供了便捷的CRUD操作和強大的條件構造器。
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));
}
}到此這篇關于MyBatis中通用SQL寫法的幾種方法實現(xiàn)的文章就介紹到這了,更多相關MyBatis 通用SQL寫法內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
SpringBoot 導出數(shù)據(jù)生成excel文件返回方式
這篇文章主要介紹了SpringBoot 導出數(shù)據(jù)生成excel文件返回方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-10-10
詳解mybatis批量插入10萬條數(shù)據(jù)的優(yōu)化過程
這篇文章主要介紹了詳解mybatis批量插入10萬條數(shù)據(jù)的優(yōu)化過程,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2021-04-04
Java調(diào)用Coze?API詳細實現(xiàn)步驟
Coze是一款由字節(jié)跳動推出的低代碼AI開發(fā)平臺,讓非專業(yè)開發(fā)者也能輕松創(chuàng)建智能應用,這篇文章主要介紹了Java調(diào)用Coze?API的相關資料,文中通過代碼介紹的非常詳細,需要的朋友可以參考下2026-01-01
Java SpringMVC框架開發(fā)之數(shù)據(jù)導出Excel文件格式實例詳解
這篇文章主要介紹了Java基礎開發(fā)之數(shù)據(jù)導出Excel文件格式實例詳解,需要的朋友可以參考下2020-02-02
深入了解Java中的過濾器Filter和監(jiān)聽器Listener
這篇文章主要為大家詳細介紹了Java中的過濾器Filter和監(jiān)聽器Listener的使用以及二者的區(qū)別,文中的示例代碼講解詳細,需要的可以參考一下2022-06-06
在SpringBoot中使用jwt實現(xiàn)token身份認證的實例代碼
你還不會在SpringBoot中使用jwt實現(xiàn)token身份認證嗎,本文小編就給大家詳細的介紹一下在SpringBoot中使用jwt實現(xiàn)token身份認證的實例代碼,感興趣的同學可以自己動手試一試2023-09-09

