亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

詳解如何使用MyBatis實(shí)現(xiàn)數(shù)據(jù)庫(kù)的CRUD

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

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

“#”占位符

在使用MyBatis操作數(shù)據(jù)庫(kù)的時(shí)候,可以直接使用如下代碼進(jìn)行刪除數(shù)據(jù)

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

這個(gè)代碼可以成功完成刪除user表中id為5的用戶(hù),但是其實(shí)存在一個(gè)問(wèn)題:硬編碼。把這個(gè)刪除的SQL語(yǔ)句寫(xiě)死了,假如說(shuō)下一次需要?jiǎng)h除id為6的用戶(hù)就又要重新編寫(xiě)一條SQL了。所以說(shuō)我們可以使用#占位符:

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

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

“$”拼接符

和#占位符不同,$只是拼接符,是直接將參數(shù)值拼接在SQL中,并不能使SQL語(yǔ)句變成預(yù)編譯SQL,所以說(shuō)還是存在SQL注入問(wèn)題和性能低下的問(wèn)題,所以說(shuō)用的十分少。但是當(dāng)表名和字段名需要?jiǎng)討B(tài)變化的時(shí)候,就只能使用$拼接符,如:"select * from ${tablename}"這種動(dòng)態(tài)的表名會(huì)使用$拼接符。

Create

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

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

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

測(cè)試該方法:

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

(因?yàn)閕d字段是主鍵,并且自增,所以說(shuō)不需要傳遞id的參數(shù)。)

原數(shù)據(jù)表:

測(cè)試結(jié)果:

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

Read

Read操作是查詢(xún)(讀取)數(shù)據(jù)庫(kù)中的數(shù)據(jù),通過(guò)MyBatis中的@Select注解可以便捷的完成數(shù)據(jù)的查詢(xún):

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

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

測(cè)試方法:

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

發(fā)現(xiàn)根據(jù)username和password成功查詢(xún)到了User,說(shuō)明查找方法成功。

Update

update操作是更新數(shù)據(jù)庫(kù)中的數(shù)據(jù),通過(guò)MyBatis中的@Update注解可以便捷的完成數(shù)據(jù)的刪除:

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

和insert操作類(lèi)似,需要將要更新的字段封裝為對(duì)應(yīng)實(shí)體對(duì)象的屬性,然后通過(guò)#占位符獲取屬性,完成SQL語(yǔ)句的拼接,需要注意的是,在insert操作中,因?yàn)閕d是自增的,所以說(shuō)不需要傳遞id屬性,但是在update操作中,很多時(shí)候都需要根據(jù)id屬性來(lái)找到要更新哪一條數(shù)據(jù),所以說(shuō)大多數(shù)時(shí)候是需要傳遞id的,但是也需要根據(jù)具體情況而定。

測(cè)試方法:

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

測(cè)試前數(shù)據(jù)表:

測(cè)試結(jié)果:

發(fā)現(xiàn)id為1的用戶(hù)被修改為了劉備,說(shuō)明該修改方法成功修改。

Delete

delete操作是刪除數(shù)據(jù)庫(kù)中的數(shù)據(jù),通過(guò)MyBatis中的@Delete注解可以便捷的完成數(shù)據(jù)的刪除:

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

在MyBatis中執(zhí)行所有的DML語(yǔ)句都是有返回值的,是int類(lèi)型,代表這條語(yǔ)句影響的記錄數(shù),通過(guò)測(cè)試方法來(lái)測(cè)試下這個(gè)刪除方法: 原數(shù)據(jù)表:

測(cè)試方法:

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

我們看到#占位符確實(shí)將SQL變成了一條預(yù)編譯的SQL,并且這條SQL影響了一條記錄??纯磾?shù)據(jù)庫(kù)中的變化:

id為5的記錄確實(shí)被刪除了,說(shuō)明該方法測(cè)試成功。

以上就是詳解如何使用MyBatis實(shí)現(xiàn)數(shù)據(jù)庫(kù)的CRUD的詳細(xì)內(nèi)容,更多關(guān)于MyBatis實(shí)現(xiàn)數(shù)據(jù)庫(kù)CRUD的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • springboot設(shè)置了server.port但是沒(méi)有用,還是8080問(wèn)題

    springboot設(shè)置了server.port但是沒(méi)有用,還是8080問(wèn)題

    這篇文章主要介紹了springboot設(shè)置了server.port但是沒(méi)有用,還是8080問(wèn)題的解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • java枚舉類(lèi)的屬性、方法和構(gòu)造方法應(yīng)用實(shí)戰(zhàn)

    java枚舉類(lèi)的屬性、方法和構(gòu)造方法應(yīng)用實(shí)戰(zhàn)

    這篇文章主要介紹了java枚舉類(lèi)的屬性、方法和構(gòu)造方法應(yīng)用,結(jié)合實(shí)例形式分析了java枚舉類(lèi)的定義、構(gòu)造及相關(guān)應(yīng)用操作技巧,需要的朋友可以參考下
    2019-08-08
  • Java如何利用POI讀取Excel行數(shù)

    Java如何利用POI讀取Excel行數(shù)

    這篇文章主要介紹了java如何利用POI讀取Excel行數(shù),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-02-02
  • IDEA實(shí)現(xiàn)遠(yuǎn)程調(diào)試步驟詳解

    IDEA實(shí)現(xiàn)遠(yuǎn)程調(diào)試步驟詳解

    這篇文章主要介紹了IDEA實(shí)現(xiàn)遠(yuǎn)程調(diào)試步驟詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-09-09
  • Java Spring boot 2.0 跨域問(wèn)題的解決

    Java Spring boot 2.0 跨域問(wèn)題的解決

    本篇文章主要介紹了Java Spring boot 2.0 跨域問(wèn)題的解決,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-04-04
  • Java網(wǎng)絡(luò)編程之簡(jiǎn)單的服務(wù)端客戶(hù)端應(yīng)用實(shí)例

    Java網(wǎng)絡(luò)編程之簡(jiǎn)單的服務(wù)端客戶(hù)端應(yīng)用實(shí)例

    這篇文章主要介紹了Java網(wǎng)絡(luò)編程之簡(jiǎn)單的服務(wù)端客戶(hù)端應(yīng)用,以實(shí)例形式較為詳細(xì)的分析了java網(wǎng)絡(luò)編程的原理與服務(wù)器端客戶(hù)端的實(shí)現(xiàn)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-04-04
  • Java 內(nèi)部類(lèi)的定義與范例

    Java 內(nèi)部類(lèi)的定義與范例

    說(shuō)起內(nèi)部類(lèi)這個(gè)詞,想必很多人都不陌生,但是又會(huì)覺(jué)得不熟悉。原因是平時(shí)編寫(xiě)代碼時(shí)可能用到的場(chǎng)景不多,用得最多的是在有事件監(jiān)聽(tīng)的情況下,并且即使用到也很少去總結(jié)內(nèi)部類(lèi)的用法。今天我們就來(lái)一探究竟
    2021-11-11
  • Springboot Mybatis-Plus數(shù)據(jù)庫(kù)單元測(cè)試實(shí)戰(zhàn)(三種方式)

    Springboot Mybatis-Plus數(shù)據(jù)庫(kù)單元測(cè)試實(shí)戰(zhàn)(三種方式)

    這篇文章主要介紹了Springboot Mybatis-Plus數(shù)據(jù)庫(kù)單元測(cè)試實(shí)戰(zhàn)(三種方式),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-12-12
  • Spring Boot配置接口WebMvcConfigurer的實(shí)現(xiàn)

    Spring Boot配置接口WebMvcConfigurer的實(shí)現(xiàn)

    這篇文章主要介紹了SpringBoot配置接口WebMvcConfigurer的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-11-11
  • Java8中List轉(zhuǎn)Map的多種方式代碼

    Java8中List轉(zhuǎn)Map的多種方式代碼

    這篇文章主要給大家介紹了關(guān)于Java8中List轉(zhuǎn)Map的多種方式,在實(shí)際項(xiàng)目中我們經(jīng)常會(huì)用到List轉(zhuǎn)Map操作,本文介紹了多種方法的實(shí)現(xiàn)代碼,需要的朋友可以參考下
    2023-08-08

最新評(píng)論