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

詳解如何使用MyBatis實現數據庫的CRUD

 更新時間:2024年12月02日 08:32:08   作者:愛上語文  
這篇文章主要為大家詳細介紹了如何使用MyBatis實現數據庫的CRUD操作,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學習一下

Mybatis中#占位符和$拼接符的區(qū)別

“#”占位符

在使用MyBatis操作數據庫的時候,可以直接使用如下代碼進行刪除數據

@Delete("delete from user where id=5")
public Integer deleteById();

這個代碼可以成功完成刪除user表中id為5的用戶,但是其實存在一個問題:硬編碼。把這個刪除的SQL語句寫死了,假如說下一次需要刪除id為6的用戶就又要重新編寫一條SQL了。所以說我們可以使用#占位符:

@Delete("delete from user where id=#{id}")
public Integer deleteById(Integer id);

這樣寫,需要給deleteById方法傳遞需要刪除的id,并使用#進行占位,在編譯時,就會將這條SQL語句編譯為一條預編譯SQL:delete from user where id=?。然后再用方法中的參數id去對預編譯SQL中的?進行參數綁定(將 Java 方法中的參數與 SQL 語句中的占位符建立關聯(lián)并賦值的動作),從而避免硬編碼的問題,并且還可以提高SQL語句的執(zhí)行效率(預編譯SQL提高SQL語句的執(zhí)行效率)。

“$”拼接符

和#占位符不同,$只是拼接符,是直接將參數值拼接在SQL中,并不能使SQL語句變成預編譯SQL,所以說還是存在SQL注入問題和性能低下的問題,所以說用的十分少。但是當表名和字段名需要動態(tài)變化的時候,就只能使用$拼接符,如:"select * from ${tablename}"這種動態(tài)的表名會使用$拼接符。

Create

create操作是在數據庫中新增一條數據,通過MyBatis中的@Insert注解可以便捷的完成數據的新增,當進行數據新增操作時,往往會涉及多個不同類型的屬性。從數據組織和管理的角度出發(fā),為了更好地維護數據的完整性和關聯(lián)性,通常會將這些相關屬性封裝為一個實體對象。這種實體對象的設計遵循面向對象編程的原則,以業(yè)務邏輯中的實際實體為藍本,例如在用戶管理系統(tǒng)中,用戶相關的屬性(如用戶名、密碼、姓名、年齡等)會被封裝在一個User實體對象中。這個實體對象會作為參數傳遞給負責新增數據的方法,SQL中的占位符會獲取對象中的屬性來拼接SQL:

@Insert("insert into user(id, username, password, name, age) " +
        "values (#{id}, #{username}, #{password}, #{name}, #{age})")
public Integer insertUser(User user);

values中的值就是User對象中的屬性,是#占位符從User對象中的屬性中獲取的。(如何獲取本文不過多贅述)

測試該方法:

@Test
public void testInsert() {
    User user = new User(null, "zhouyu", "123456", "周瑜", 23);
    Integer rows = userMapper.insertUser(user);
    System.out.println("影響的行數是:" + rows);
}

(因為id字段是主鍵,并且自增,所以說不需要傳遞id的參數。)

原數據表:

測試結果:

看到新增的方法成功在數據庫表中插入了一條新的數據,代表新增方法成功了。需要說明的是:id是自增的,前面自測的時候創(chuàng)建了很多user,所以說id自增到了10,雖然刪除了這些user,但是id也是從10開始自增的,所以說再次添加user,id從10自增,則變成11。

Read

Read操作是查詢(讀?。祿熘械臄祿?,通過MyBatis中的@Select注解可以便捷的完成數據的查詢:

@Select("select * from user where username = #{username} and password = #{password}")
public void selectUser(@Param("username")String username, @Param("password")String password);

此處只需要使用兩個字段進行查找,沒有必要將屬性封裝到User對象中,可以直接傳遞;但是需要非常注意的是此處傳遞的是參數名,#占位符綁定的也是參數名,但是在編譯后方法中的參數名不會保留,只會保留參數的類型,而#占位符參數綁定是在編譯后進行的,但是此時有兩個參數,#占位符無法進行準確綁定,所以說就會報錯。為了解決這個問題,需要在方法的參數之前添加@Param注解來指定該參數的名字,#占位符中也需要和@Param注解中相同的名字(參數名不重要),這樣才可以指定參數。但是假如是官方的SpringBoot框架,無需使用@Param注解,只要保證#占位符中的參數和方法的參數名相同即可,也可以完成綁定。

測試方法:

@Test
public void testFind() {
    User user = userMapper.selectUser("liubei", "123456");
    System.out.println(user);
}

發(fā)現根據username和password成功查詢到了User,說明查找方法成功。

Update

update操作是更新數據庫中的數據,通過MyBatis中的@Update注解可以便捷的完成數據的刪除:

@Update("update user set username=#{username}, password=#{password}, name=#{name}, age=#{age} where id=#{id}")
public Integer updateUser(User user);

和insert操作類似,需要將要更新的字段封裝為對應實體對象的屬性,然后通過#占位符獲取屬性,完成SQL語句的拼接,需要注意的是,在insert操作中,因為id是自增的,所以說不需要傳遞id屬性,但是在update操作中,很多時候都需要根據id屬性來找到要更新哪一條數據,所以說大多數時候是需要傳遞id的,但是也需要根據具體情況而定。

測試方法:

@Test
public void testUpdate() {
    User user = new User(1, "liubei", "123456", "劉備", 25);
    Integer rows = userMapper.updateUser(user);
    System.out.println("影響的行數是:" + rows);
}

測試前數據表:

測試結果:

發(fā)現id為1的用戶被修改為了劉備,說明該修改方法成功修改。

Delete

delete操作是刪除數據庫中的數據,通過MyBatis中的@Delete注解可以便捷的完成數據的刪除:

@Delete("delete from user where id=#{id}")
public Integer deleteById(Integer id);

在MyBatis中執(zhí)行所有的DML語句都是有返回值的,是int類型,代表這條語句影響的記錄數,通過測試方法來測試下這個刪除方法: 原數據表:

測試方法:

@Test
public void testDelete() {
    Integer rows = userMapper.deleteById(5);
    System.out.println("影響的行數是:" + rows);
}

我們看到#占位符確實將SQL變成了一條預編譯的SQL,并且這條SQL影響了一條記錄??纯磾祿熘械淖兓?/p>

id為5的記錄確實被刪除了,說明該方法測試成功。

以上就是詳解如何使用MyBatis實現數據庫的CRUD的詳細內容,更多關于MyBatis實現數據庫CRUD的資料請關注腳本之家其它相關文章!

相關文章

  • SpringBoot后端解決跨域問題的3種方案分享

    SpringBoot后端解決跨域問題的3種方案分享

    這篇文章主要給大家分享介紹了關于SpringBoot后端解決跨域問題的3種方案,跨域指的是瀏覽器不能執(zhí)行其他網站的腳本,它是由瀏覽器的同源策略造成的,是瀏覽器施加的安全限制,需要的朋友可以參考下
    2023-07-07
  • MyBatis/MyBatis-Plus同事務循環(huán)調用存儲過程獲取主鍵重復問題分析及解決

    MyBatis/MyBatis-Plus同事務循環(huán)調用存儲過程獲取主鍵重復問題分析及解決

    MyBatis默認開啟一級緩存,同一事務中循環(huán)調用查詢方法時會重復使用緩存數據,導致獲取的序列主鍵值均為1,需在需要動態(tài)數據(如Oracle序列、存儲過程主鍵)時禁用緩存,避免緩存干擾查詢結果
    2025-09-09
  • java 字符串轉化為字符數組的3種實現案例

    java 字符串轉化為字符數組的3種實現案例

    這篇文章主要介紹了java 字符串轉化為字符數組的3種實現案例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-10-10
  • spring框架中的本地緩存之spring cache基本使用詳解

    spring框架中的本地緩存之spring cache基本使用詳解

    Spring Cache 是 Spring 提供的一整套的緩存解決方案,它提供了一整套的接口和代碼規(guī)范、配置、注解等,這樣它就可以整合各種緩存方案了,本文給大家介紹spring框架中的本地緩存之spring cache基本使用,感興趣的朋友一起看看吧
    2025-05-05
  • 解決spring-boot-maven-plugin報紅的問題

    解決spring-boot-maven-plugin報紅的問題

    這篇文章主要給大家介紹一下如何解決spring-boot-maven-plugin報紅的問題,文中通過圖文講解的非常詳細,具有一定的參考價值,需要的朋友可以參考下
    2023-08-08
  • 分享幾個寫簡潔java代碼的小技巧

    分享幾個寫簡潔java代碼的小技巧

    成為一個優(yōu)秀的Java程序員,有著良好的代碼編寫習慣是必不可少的,下面這篇文章主要給大家介紹了關于寫java代碼的小技巧,文中通過圖文以及實例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-02-02
  • Java 實現二叉搜索樹的查找、插入、刪除、遍歷

    Java 實現二叉搜索樹的查找、插入、刪除、遍歷

    本文主要介紹了Java實現二叉搜索樹的查找、插入、刪除、遍歷等內容。具有很好的參考價值,下面跟著小編一起來看下吧
    2017-02-02
  • Spring Boot 整合 SSE的高級實踐(Server-Sent Events)

    Spring Boot 整合 SSE的高級實踐(Server-Sent Even

    SSE(Server-Sent Events)是一種基于HTTP協(xié)議的單向通信機制,允許服務器向瀏覽器持續(xù)發(fā)送實時更新,這篇文章主要介紹了Spring Boot 整合 SSE的高級實踐(Server-Sent Events),需要的朋友可以參考下
    2025-04-04
  • Java基礎強化訓練輸入錯誤即結束進程

    Java基礎強化訓練輸入錯誤即結束進程

    本文主要介紹了Java編程的基礎知識強化應用,文中實例涉及到了許多基礎知識,new對象,控制臺輸入,if語句等。很實用,需要的朋友可以參考下
    2017-09-09
  • java1.5中訪問環(huán)境變量

    java1.5中訪問環(huán)境變量

    這篇文章主要介紹了如何在java1.5中訪問環(huán)境變量,使用System.getenv()可以訪問環(huán)境變量
    2014-01-01

最新評論

稻城县| 丹寨县| 安平县| 洛川县| 西畴县| 广东省| 湘潭县| 武穴市| 玛多县| 临猗县| 芜湖县| 德格县| 北海市| 福贡县| 衡阳市| 平邑县| 密云县| 丹寨县| 大安市| 白朗县| 安西县| 英德市| 敦化市| 桃园县| 江西省| 宝应县| 乐清市| 平果县| 福清市| 宁南县| 芦溪县| 得荣县| 兴宁市| 鄂州市| 罗江县| 修文县| 津市市| 虹口区| 台北市| 轮台县| 都安|