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

MyBatis無縫轉(zhuǎn)MyBatis-plus的基本使用

 更新時間:2024年10月31日 11:12:05   作者:STZ程序猿  
本文介紹了使用MyBatis-plus來優(yōu)化MyBatis的使用,包括引入依賴、改造Mapper、實體類注解使用、Service層方法改造等,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

1.引入依賴

引入MyBatis-plus依賴取代MyBatis

<!--mybatis-plus起步依賴-->
<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-boot-starter</artifactId>
    <version>3.5.3.1</version>
</dependency>

2.改造Mapper

繼承BaseMapper

public interface 原來的Mapper extends BaseMapper<這里填入這個mapper對應(yīng)的實體類> {

}

3.改造實體類

需要用到以下三個注解

@TableName("這里填寫表名") // 指定數(shù)據(jù)庫表的對應(yīng)

@TableId(value = "這里填寫主鍵字段名",type = IdType.AUTO) // 指定主鍵的對應(yīng)

@TableField("這里填寫字段名") // 指定字段的對應(yīng)

一個完整的實體類參考如下:

@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@TableName("table_name")
public class tableName implements Serializable {
    @TableId(value = "table_id",type = IdType.AUTO)
    private Long tableId;
    @TableField("table_field")
    private String tableField;
}

注意:

一般情況下我們并不需要給字段添加@TableField注解,一些特殊情況除外:

  • 成員變量名與數(shù)據(jù)庫字段名不一致

  • 成員變量是以isXXX命名,按照JavaBean的規(guī)范,MybatisPlus識別字段時會把is去除,這就導(dǎo)致與數(shù)據(jù)庫不符。

  • 成員變量名與數(shù)據(jù)庫一致,但是與數(shù)據(jù)庫的關(guān)鍵字沖突。使用@TableField注解給字段名添加轉(zhuǎn)義字符:``

支持的其它屬性如下:

屬性類型必填默認(rèn)值描述
valueString""數(shù)據(jù)庫字段名
existbooleantrue是否為數(shù)據(jù)庫表字段
conditionString""字段 where 實體查詢比較條件,有值設(shè)置則按設(shè)置的值為準(zhǔn),沒有則為默認(rèn)全局的 %s=#{%s},參考(opens new window)
updateString""字段 update set 部分注入,例如:當(dāng)在version字段上注解update="%s+1" 表示更新時會 set version=version+1 (該屬性優(yōu)先級高于 el 屬性)
insertStrategyEnumFieldStrategy.DEFAULT舉例:NOT_NULL insert into table_a(<if test="columnProperty != null">column</if>) values (<if test="columnProperty != null">#{columnProperty}</if>)
updateStrategyEnumFieldStrategy.DEFAULT舉例:IGNORED update table_a set column=#{columnProperty}
whereStrategyEnumFieldStrategy.DEFAULT舉例:NOT_EMPTY where <if test="columnProperty != null and columnProperty!=''">column=#{columnProperty}</if>
fillEnumFieldFill.DEFAULT字段自動填充策略
selectbooleantrue是否進(jìn)行 select 查詢
keepGlobalFormatbooleanfalse是否保持使用全局的 format 進(jìn)行處理
jdbcTypeJdbcTypeJdbcType.UNDEFINEDJDBC 類型 (該默認(rèn)值不代表會按照該值生效)
typeHandlerTypeHander類型處理器 (該默認(rèn)值不代表會按照該值生效)
numericScaleString""指定小數(shù)點后保留的位數(shù)

4-1.改造Service

第一種情況:使用條件構(gòu)造器

QueryWrapper

除了新增以外,修改、刪除、查詢的SQL語句都需要指定where條件。因此BaseMapper中提供的相關(guān)方法除了以id作為where條件以外,還支持更加復(fù)雜的where條件。

基本用法:

List<xx> xxList = xxMapper.selectList(new QueryWrapper<xx>());

mapper對象調(diào)用方法,里面?zhèn)鬟f一個queryWrapper對象

其它方法:

UpdateWrapper

基于BaseMapper中的update方法更新時只能直接賦值,對于一些復(fù)雜的需求就難以實現(xiàn)。 例如:更新id為1,2,4的用戶的余額,扣200,對應(yīng)的SQL應(yīng)該是:

UPDATE user SET balance = balance - 200 WHERE id in (1, 2, 4)

SET的賦值結(jié)果是基于字段現(xiàn)有值的,這個時候就要利用UpdateWrapper中的setSql功能了:

@Test
void testUpdateWrapper() {
    List<Long> ids = List.of(1L, 2L, 4L);
    // 1.生成SQL
    UpdateWrapper<User> wrapper = new UpdateWrapper<User>()
            .setSql("balance = balance - 200") // SET balance = balance - 200
            .in("id", ids); // WHERE id in (1, 2, 4)
        // 2.更新,注意第一個參數(shù)可以給null,也就是不填更新字段和數(shù)據(jù),
    // 而是基于UpdateWrapper中的setSQL來更新
    userMapper.update(null, wrapper);
}

LambdaQueryWrapper

無論是QueryWrapper還是UpdateWrapper在構(gòu)造條件的時候都需要寫死字段名稱,會出現(xiàn)字符串魔法值。這在編程規(guī)范中顯然是不推薦的。 那怎么樣才能不寫字段名,又能知道字段名呢?

其中一種辦法是基于變量的gettter方法結(jié)合反射技術(shù)。因此我們只要將條件對應(yīng)的字段的getter方法傳遞給MybatisPlus,它就能計算出對應(yīng)的變量名了。而傳遞方法可以使用JDK8中的方法引用Lambda表達(dá)式。 因此MybatisPlus又提供了一套基于Lambda的Wrapper,包含兩個:

  • LambdaQueryWrapper

  • LambdaUpdateWrapper

分別對應(yīng)QueryWrapper和UpdateWrapper

其使用方式如下:

@Test
void testLambdaQueryWrapper() {
    // 1.構(gòu)建條件 WHERE username LIKE "%o%" AND balance >= 1000
    QueryWrapper<User> wrapper = new QueryWrapper<>();
    wrapper.lambda()
            .select(User::getId, User::getUsername, User::getInfo, User::getBalance)
            .like(User::getUsername, "o")
            .ge(User::getBalance, 1000);
    // 2.查詢
    List<User> users = userMapper.selectList(wrapper);
    users.forEach(System.out::println);
}

第二種情況:使用自定義SQL

在演示UpdateWrapper的案例中,我們在代碼中編寫了更新的SQL語句:

這種寫法在某些企業(yè)也是不允許的,因為SQL語句最好都維護(hù)在持久層,而不是業(yè)務(wù)層。就當(dāng)前案例來說,由于條件是in語句,只能將SQL寫在Mapper.xml文件,利用foreach來生成動態(tài)SQL。 這實在是太麻煩了。假如查詢條件更復(fù)雜,動態(tài)SQL的編寫也會更加復(fù)雜。

所以,MybatisPlus提供了自定義SQL功能,可以讓我們利用Wrapper生成查詢條件,再結(jié)合Mapper.xml編寫SQL

基本用法

Service

@Test
void testCustomWrapper() {
    // 1.準(zhǔn)備自定義查詢條件
    List<Long> ids = List.of(1L, 2L, 4L);
    QueryWrapper<User> wrapper = new QueryWrapper<User>().in("id", ids);
?
    // 2.調(diào)用mapper的自定義方法,直接傳遞Wrapper
    userMapper.deductBalanceByIds(200, wrapper);
}

Mapper

package com.itheima.mp.mapper;
?
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.itheima.mp.domain.po.User;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Update;
import org.apache.ibatis.annotations.Param;
?
public interface UserMapper extends BaseMapper<User> {
    @Select("UPDATE user SET balance = balance - #{money} ${ew.customSqlSegment}")
    void deductBalanceByIds(@Param("money") int money, @Param("ew") QueryWrapper<User> wrapper);
}

多表關(guān)聯(lián)

理論上來講MyBatisPlus是不支持多表查詢的,不過我們可以利用Wrapper中自定義條件結(jié)合自定義SQL來實現(xiàn)多表查詢的效果。 例如,我們要查詢出所有收貨地址在北京的并且用戶id在1、2、4之中的用戶 要是自己基于mybatis實現(xiàn)SQL,大概是這樣的:

<select id="queryUserByIdAndAddr" resultType="com.itheima.mp.domain.po.User">
      SELECT *
      FROM user u
      INNER JOIN address a ON u.id = a.user_id
      WHERE u.id
      <foreach collection="ids" separator="," item="id" open="IN (" close=")">
          #{id}
      </foreach>
      AND a.city = #{city}
  </select>

可以看出其中最復(fù)雜的就是WHERE條件的編寫,如果業(yè)務(wù)復(fù)雜一些,這里的SQL會更變態(tài)。

但是基于自定義SQL結(jié)合Wrapper的玩法,我們就可以利用Wrapper來構(gòu)建查詢條件,然后手寫SELECT及FROM部分,實現(xiàn)多表查詢。

查詢條件這樣來構(gòu)建:

@Test
void testCustomJoinWrapper() {
    // 1.準(zhǔn)備自定義查詢條件
    QueryWrapper<User> wrapper = new QueryWrapper<User>()
            .in("u.id", List.of(1L, 2L, 4L))
            .eq("a.city", "北京");
?
    // 2.調(diào)用mapper的自定義方法
    List<User> users = userMapper.queryUserByWrapper(wrapper);
?
    users.forEach(System.out::println);
}

然后在UserMapper中自定義方法:

@Select("SELECT u.* FROM user u INNER JOIN address a ON u.id = a.user_id ${ew.customSqlSegment}")
List<User> queryUserByWrapper(@Param("ew")QueryWrapper<User> wrapper);

當(dāng)然,也可以在UserMapper.xml中寫SQL:

<select id="queryUserByIdAndAddr" resultType="com.itheima.mp.domain.po.User">
    SELECT * FROM user u INNER JOIN address a ON u.id = a.user_id ${ew.customSqlSegment}
</select>

4-2.IService使用

4-1的查詢數(shù)據(jù)庫的方式相比Mybatis已經(jīng)很方便了,至少不用再手寫sql語句。

但是還可以更簡便,我們可以直接在Controller接口層實現(xiàn)數(shù)據(jù)庫的調(diào)用。

首先和4-1一樣,需要提前準(zhǔn)備Mapper、pojo、Service、ServiceImpl、Controller

改造Service層

public interface xxService extends IService<你的pojo> {
}

改造ServiceImpl層

@Service
public class xxServiceImpl extends ServiceImpl<你的Mapper, 你的pojo> implements xxService {
}

然后就可以在Controller使用了

新增

- save是新增單個元素
- saveBatch是批量新增
- saveOrUpdate是根據(jù)id判斷,如果數(shù)據(jù)存在就更新,不存在則新增
- saveOrUpdateBatch是批量的新增或修改

刪除

- removeById:根據(jù)id刪除
- removeByIds:根據(jù)id批量刪除
- removeByMap:根據(jù)Map中的鍵值對為條件刪除
- remove(Wrapper<T>):根據(jù)Wrapper條件刪除

修改

- updateById:根據(jù)id修改
- update(Wrapper<T>):根據(jù)UpdateWrapper修改,Wrapper中包含set和where部分
- update(T,Wrapper<T>):按照T內(nèi)的數(shù)據(jù)修改與Wrapper匹配到的數(shù)據(jù)
- updateBatchById:根據(jù)id批量修改

查詢

- getById:根據(jù)id查詢1條數(shù)據(jù)
- getOne(Wrapper<T>):根據(jù)Wrapper查詢1條數(shù)據(jù)
- getBaseMapper:獲取Service內(nèi)的BaseMapper實現(xiàn),某些時候需要直接調(diào)用Mapper內(nèi)的自定義SQL時可以用這個方法獲取到Mapper
?
- listByIds:根據(jù)id批量查詢
- list(Wrapper<T>):根據(jù)Wrapper條件查詢多條數(shù)據(jù)
- list():查詢所有
?
- count():統(tǒng)計所有數(shù)量
- count(Wrapper<T>):統(tǒng)計符合Wrapper條件的數(shù)據(jù)數(shù)量

到此這篇關(guān)于MyBatis無縫轉(zhuǎn)MyBatis-plus的基本使用的文章就介紹到這了,更多相關(guān)MyBatis無縫轉(zhuǎn)MyBatis-plus內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 淺談Java中實現(xiàn)深拷貝的兩種方式—clone() & Serialized

    淺談Java中實現(xiàn)深拷貝的兩種方式—clone() & Serialized

    這篇文章主要介紹了Java中實現(xiàn)深拷貝的兩種方式—clone() & Serialized,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-03-03
  • Maven項目改為spring boot項目的方法圖解

    Maven項目改為spring boot項目的方法圖解

    這篇文章主要介紹了Maven項目改為spring boot項目的方法圖解 ,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價值,需要的朋友可以參考下
    2018-09-09
  • SpringBoot如何通過Map實現(xiàn)策略模式

    SpringBoot如何通過Map實現(xiàn)策略模式

    策略模式是一種行為設(shè)計模式,它允許在運行時選擇算法的行為,在Spring框架中,我們可以利用@Resource注解和Map集合來優(yōu)雅地實現(xiàn)策略模式,這篇文章主要介紹了SpringBoot如何通過Map實現(xiàn)策略模式,需要的朋友可以參考下
    2025-03-03
  • Spring boot webService使用方法解析

    Spring boot webService使用方法解析

    這篇文章主要介紹了Spring boot webService使用方法解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-09-09
  • 最新Spring Security實戰(zhàn)教程之Spring Security安全框架指南

    最新Spring Security實戰(zhàn)教程之Spring Security安全框架指南

    SpringSecurity是Spring生態(tài)系統(tǒng)中的核心組件,提供認(rèn)證、授權(quán)和防護(hù)機(jī)制,以保護(hù)應(yīng)用免受各種安全威脅,它支持多種認(rèn)證方式,并通過攔截器和過濾器鏈進(jìn)行安全檢查,本文通過搭建SpringBoot+SpringSecurity項目,幫助如何快速上手并應(yīng)用SpringSecurity,感興趣的朋友一起看看吧
    2025-03-03
  • 關(guān)于properties配置文件的加密方式

    關(guān)于properties配置文件的加密方式

    這篇文章主要介紹了關(guān)于properties配置文件的加密方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-10-10
  • Java 數(shù)據(jù)結(jié)構(gòu)與算法系列精講之環(huán)形鏈表

    Java 數(shù)據(jù)結(jié)構(gòu)與算法系列精講之環(huán)形鏈表

    無論是靜態(tài)鏈表還是動態(tài)鏈表,有時在解決具體問題時,需要我們對其結(jié)構(gòu)進(jìn)行稍微地調(diào)整。比如,可以把鏈表的兩頭連接,使其成為了一個環(huán)狀鏈表,通常稱為循環(huán)鏈表
    2022-02-02
  • 你所不知道的Spring自動注入詳解

    你所不知道的Spring自動注入詳解

    這篇文章主要給大家介紹了關(guān)于你所不知道的Spring自動注入的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-10-10
  • Spring?Security中的CORS詳解

    Spring?Security中的CORS詳解

    CORS(Cross-Origin?Resource?Sharing)是一種允許不同源之間進(jìn)行資源共享的W3C標(biāo)準(zhǔn),它通過在服務(wù)器端設(shè)置特定的HTTP響應(yīng)頭,實現(xiàn)了跨域請求的功能,這種機(jī)制要求瀏覽器和服務(wù)器的支持,本文給大家介紹Spring?Security中的CORS,感興趣的朋友一起看看吧
    2024-10-10
  • 詳解Java多線程編程中線程的啟動、中斷或終止操作

    詳解Java多線程編程中線程的啟動、中斷或終止操作

    在Java中start和tun方法可用被用來啟動線程,而用interrupt方法來中斷或終止線程,以下我們就來詳解Java多線程編程中線程的啟動、中斷或終止操作
    2016-07-07

最新評論