最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

MyBatis 注解Annotation實現(xiàn)CRUD操作全解析

 更新時間:2026年01月23日 10:29:46   作者:chxii  
MyBatis注解方式適用于簡單、輕量級的數(shù)據(jù)庫交互場景,通過將SQL直接寫在Mapper接口方法上,代碼更緊湊,開發(fā)效率更高,注解方式不支持動態(tài)SQL,復(fù)雜邏輯仍需XML配置,本文介紹MyBatis注解Annotation實現(xiàn)CRUD操作全解析,感興趣的朋友一起看看吧

MyBatis 提供了 注解(Annotation) 方式來實現(xiàn) CRUD 操作,適用于簡單、輕量級的數(shù)據(jù)庫交互場景。相比 XML 配置,注解方式將 SQL 直接寫在 Mapper 接口方法上,代碼更緊湊,開發(fā)效率更高。

一、MyBatis 注解 CRUD 核心注解

注解作用說明
@Select查詢對應(yīng) SELECT 語句
@Insert插入對應(yīng) INSERT 語句
@Update更新對應(yīng) UPDATE 語句
@Delete刪除對應(yīng) DELETE 語句
@Param參數(shù)綁定多參數(shù)時指定參數(shù)名
@Options配置選項如主鍵回填、緩存等
@Results / @Result結(jié)果映射替代 <resultMap>
@SelectProvider 等動態(tài) SQL(高級)通過類方法生成 SQL(較少用)

?? 注意:MyBatis 注解 不支持 <if><foreach> 等動態(tài)標(biāo)簽,復(fù)雜邏輯仍需 XML。

二、準(zhǔn)備工作

1. 實體類(User.java)

public class User {
    private Long id;
    private String name;
    private String email;
    // 構(gòu)造函數(shù)、getter/setter 略
}

2. 數(shù)據(jù)庫表(MySQL 示例)

CREATE TABLE users (
    id BIGINT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(50) NOT NULL,
    email VARCHAR(100)
);

三、注解實現(xiàn) CRUD 完整示例

Mapper 接口:UserMapper.java

import org.apache.ibatis.annotations.*;
import java.util.List;
public interface UserMapper {
    // 1. 新增(INSERT)
    @Insert("INSERT INTO users(name, email) VALUES(#{name}, #{email})")
    @Options(useGeneratedKeys = true, keyProperty = "id", keyColumn = "id")
    int insert(User user);
    // 2. 根據(jù) ID 查詢(SELECT)
    @Select("SELECT * FROM users WHERE id = #{id}")
    User selectById(@Param("id") Long id);
    // 3. 查詢所有
    @Select("SELECT * FROM users")
    List<User> selectAll();
    // 4. 更新(UPDATE)
    @Update("UPDATE users SET name = #{name}, email = #{email} WHERE id = #{id}")
    int update(User user);
    // 5. 刪除(DELETE)
    @Delete("DELETE FROM users WHERE id = #{id}")
    int deleteById(@Param("id") Long id);
    // 6. 帶條件查詢(多參數(shù))
    @Select("SELECT * FROM users WHERE name LIKE CONCAT('%', #{name}, '%') AND email = #{email}")
    List<User> findByNameAndEmail(@Param("name") String name, @Param("email") String email);
}

四、關(guān)鍵細(xì)節(jié)詳解

1. 主鍵自增回填(@Options)

@Options(useGeneratedKeys = true, keyProperty = "id", keyColumn = "id")
  • useGeneratedKeys = true:啟用 JDBC 獲取自增主鍵;
  • keyProperty = "id":將生成的主鍵值賦給 User 對象的 id 字段;
  • keyColumn = "id":數(shù)據(jù)庫主鍵列名(通??墒÷?,MyBatis 自動推斷)。

? 插入后,user.getId() 即可獲得數(shù)據(jù)庫生成的 ID。

2. 多參數(shù)傳遞(@Param)

當(dāng)方法有多個參數(shù)時,必須使用 @Param 指定名稱:

@Select("SELECT * FROM users WHERE name = #{name} AND email = #{email}")
User findByTwoParams(@Param("name") String name, @Param("email") String email);

否則 MyBatis 無法識別 #{name} 對應(yīng)哪個參數(shù)。

3. 字段映射(@Results)

如果數(shù)據(jù)庫字段與 Java 屬性名不一致(如 user_name vs userName),可用 @Results 顯式映射:

@Select("SELECT user_id, user_name, user_email FROM users WHERE user_id = #{id}")
@Results({
    @Result(property = "id", column = "user_id"),
    @Result(property = "name", column = "user_name"),
    @Result(property = "email", column = "user_email")
})
User selectByIdWithMapping(@Param("id") Long id);

?? 若開啟 mapUnderscoreToCamelCase,則無需手動映射。

五、測試示例(JUnit + MyBatis)

@Test
public void testCrud() throws IOException {
    try (SqlSession session = sqlSessionFactory.openSession()) {
        UserMapper mapper = session.getMapper(UserMapper.class);
        // 插入
        User user = new User();
        user.setName("王五");
        user.setEmail("wangwu@example.com");
        mapper.insert(user); // 此時 user.id 已被填充
        System.out.println("插入ID: " + user.getId());
        // 查詢
        User found = mapper.selectById(user.getId());
        System.out.println("查詢結(jié)果: " + found.getName());
        // 更新
        found.setEmail("new_wangwu@example.com");
        mapper.update(found);
        // 刪除
        mapper.deleteById(found.getId());
        session.commit(); // 注意:DML 操作需提交事務(wù)
    }
}

?? 重要:MyBatis 默認(rèn)不自動提交事務(wù)!執(zhí)行 INSERT/UPDATE/DELETE 后需調(diào)用 session.commit(),或配置 autoCommit=true(不推薦生產(chǎn)環(huán)境使用)。

六、優(yōu)點與局限性

? 優(yōu)點

  • 代碼簡潔:SQL 與接口方法緊耦合,無需額外 XML 文件;
  • 開發(fā)快速:適合單表、靜態(tài) SQL 場景;
  • 易于理解:CRUD 邏輯一目了然。

? 局限性

問題說明
不支持動態(tài) SQL無法使用 <if><choose>、<foreach> 等標(biāo)簽
SQL 復(fù)雜度受限多表 JOIN、嵌套查詢難以維護(hù)
無法復(fù)用 SQL 片段不能像 XML 那樣用 <sql> 提取公共部分
可讀性差(長 SQL)SQL 寫在字符串中,無語法高亮,易出錯
調(diào)試?yán)щySQL 錯誤只能運行時發(fā)現(xiàn),IDE 無法校驗

七、盡管注解方便,但在以下場景中,XML 映射文件是不可替代的:

1.動態(tài) SQL 支持強(qiáng)大

MyBatis 的核心優(yōu)勢之一是 動態(tài) SQL(如 <if>、<choose><foreach> 等),而注解中寫動態(tài) SQL 極其困難甚至不可讀。

? 注解寫動態(tài) SQL(不推薦):

@Select("<script>" +
        "SELECT * FROM users WHERE 1=1 " +
        "<if test='name != null'> AND name LIKE CONCAT('%', #{name}, '%') </if>" +
        "<if test='email != null'> AND email = #{email} </if>" +
        "</script>")
List<User> findUsers(@Param("name") String name, @Param("email") String email);
  • 字符串拼接易出錯;
  • 無法格式化,難以維護(hù);
  • 不支持 IDE 語法高亮和校驗。

? XML 寫法(清晰優(yōu)雅):

<select id="findUsers" resultType="User">
    SELECT * FROM users
    <where>
        <if test="name != null">
            AND name LIKE CONCAT('%', #{name}, '%')
        </if>
        <if test="email != null">
            AND email = #{email}
        </if>
    </where>
</select>

?? 結(jié)論:只要涉及條件組合、分頁、批量操作等,XML 是唯一合理選擇。

2.復(fù)雜結(jié)果映射(ResultMap)

當(dāng)實體類與數(shù)據(jù)庫字段命名不一致,或存在一對一/一對多關(guān)聯(lián)查詢時,需使用 <resultMap>。

示例:用戶 + 角色關(guān)聯(lián)

<resultMap id="UserWithRoles" type="User">
    <id property="id" column="user_id"/>
    <result property="name" column="user_name"/>
    <collection property="roles" ofType="Role">
        <id property="id" column="role_id"/>
        <result property="name" column="role_name"/>
    </collection>
</resultMap>
<select id="selectUserWithRoles" resultMap="UserWithRoles">
    SELECT u.id AS user_id, u.name AS user_name,
           r.id AS role_id, r.name AS role_name
    FROM users u
    LEFT JOIN user_roles ur ON u.id = ur.user_id
    LEFT JOIN roles r ON ur.role_id = r.id
    WHERE u.id = #{id}
</select>

? 注解無法優(yōu)雅表達(dá)這種嵌套映射,只能通過 @Results 手動配置,代碼冗長且不支持集合映射。

3.SQL 復(fù)用與模塊化

XML 支持 <sql> 片段復(fù)用:

<sql id="userColumns">id, name, email</sql>
<select id="selectAll" resultType="User">
    SELECT <include refid="userColumns"/> FROM users
</select>

注解無法實現(xiàn) SQL 片段提取,導(dǎo)致重復(fù)代碼。

4.可維護(hù)性與團(tuán)隊協(xié)作

  • XML 文件可被 DBA 審查、優(yōu)化;
  • SQL 與 Java 代碼分離,符合“關(guān)注點分離”原則;
  • 更容易做 SQL 性能調(diào)優(yōu)、日志追蹤;
  • 支持 MyBatis Generator 自動生成 XML 和實體類。

5.特殊 SQL 語法兼容性更好

某些數(shù)據(jù)庫特有語法(如 Oracle 的 MERGE、PostgreSQL 的 JSON 操作)在 XML 中更易書寫和調(diào)試。

八、總結(jié)

功能注解實現(xiàn)是否推薦
單表 INSERT/UPDATE/DELETE? 支持? 簡單場景推薦
單條件 SELECT? 支持?
多條件動態(tài)查詢? 不支持(需拼字符串)? 不推薦
關(guān)聯(lián)查詢(JOIN)?? 可寫但難維護(hù)? 不推薦
主鍵回填? 支持(@Options)?
字段映射? 支持(@Results)?? 開啟駝峰更佳

?? 結(jié)論
MyBatis 注解是 輕量級 CRUD 的利器,但 不是萬能方案。
在快速開發(fā)、腳本工具、微服務(wù) DAO 層等場景下非常高效;
但在企業(yè)級應(yīng)用中,XML 仍是主力,注解僅作補(bǔ)充。

注解是“糖”,XML 是“飯”
糖可以提味,但不能當(dāng)飯吃。在真實業(yè)務(wù)系統(tǒng)中,XML 的靈活性、可讀性和功能完整性使其具有不可替代的地位。

到此這篇關(guān)于MyBatis 注解Annotation實現(xiàn)CRUD操作全解析的文章就介紹到這了,更多相關(guān)MyBatis 注解實現(xiàn)CRUD內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評論

巩义市| 周口市| 文化| 郧西县| 十堰市| 昆明市| 保德县| 北京市| 鹤岗市| 龙江县| 顺平县| 博湖县| 屯门区| 西贡区| 柞水县| 塔城市| 蒙山县| 集安市| 荃湾区| 汝南县| 南涧| 郴州市| 井陉县| 汕尾市| 根河市| 荣昌县| 肥东县| 民丰县| 天祝| 湖北省| 江孜县| 沁阳市| 吉木萨尔县| 仁化县| 永登县| 凌海市| 西平县| 镇远县| 盐池县| 武邑县| 睢宁县|