Mybatis-Plus 快速實現(xiàn)

Mvnw 配置

    
//mysql驅動
     <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.25</version>
        </dependency>

//mabatis-plus
    <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.4.3</version>
     </dependency>

application.yml 配置

spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/springdb?useUnicode=true&characterEncoding=utf-8
    username: root
    password: 123456

啟動類上面加MapperScan

@MapperScan("mapper")
public class DemoApplication {

    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }
}

數(shù)據(jù)類

package entity;
public class User
{
    private long id;
    private String name;
    private Integer age;
    private String email;
    //省略Get  Set方法
}

接口類

package mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import entity.User;

public interface UserMapper extends BaseMapper<User> {
}

測試類

package com.example.demo;

import entity.User;
import mapper.UserMapper;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

import java.util.List;

@SpringBootTest
class DemoApplicationTests {

    @Autowired
    private UserMapper userMapper;
    
    //查詢
    @Test
   public void selectData()
    {
        List<User> userList = userMapper.selectList(null);
        userList.forEach(System.out::println); 
    }
    //更新
       @Test
    void UpdateData()
    {
        User user=new User();
        user.setId(6);
        user.setName("zs更新123");
        int rows=userMapper.updateById(user);
        System.out.println("update的"+rows);
    }
     //插入
        @Test
    void testInsert(){
        User user=new User();
        user.setName("zhangxu12345111");
        user.setAge(4);
        user.setEmail("26195888@qq.com");
        int result=userMapper.insert(user);
        System.out.println(result);
    }
   //刪除通過id
    @Test
    void testDeleteById()
    {
        int rows=userMapper.deleteById(7);
        System.out.println("delete"+rows);
    }
//刪除通過Map
    @Test
    void testDeleteByMap(){
        Map<String,Object> map=new HashMap<>();
        map.put("age",11);
        int rows=userMapper.deleteByMap(map);
        System.out.println("update的"+rows);

    }

}

配置輸出日志

mybatis-plus:
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

自動填充時間

1碰酝、在數(shù)據(jù)庫創(chuàng)建字段 create_time 創(chuàng)建時間 update_time 更新時間

2吼鱼、實體類字段屬性上需要增加注解

    @TableField(fill = FieldFill.INSERT)
    private Date createTime;

    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Date updateTime;

3糙及、編寫處理器來處理注解 handle.MyMetaObjectHandle.class

package com.zhang.handler;
import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.stereotype.Component;
import java.util.Date;

@Component
public class MyMetaObjectHandle implements MetaObjectHandler {


    @Override
    public void insertFill(MetaObject metaObject) {

        this.setFieldValByName("createTime", new Date(),metaObject);
        this.setFieldValByName("updateTime", new Date(),metaObject);
    }

    @Override
    public void updateFill(MetaObject metaObject)
    {
        this.setFieldValByName("updateTime", new Date(),metaObject);
    }
}

樂觀鎖

1让腹、在數(shù)據(jù)庫增加version字段

2啃勉、在實體類的字段上加上@Version注解

@Version
private Integer version;

3罕拂、添加配置類加上注解 config.MybatisPlusConfig.class

package com.zhang.config;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.OptimisticLockerInnerInterceptor;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.transaction.annotation.EnableTransactionManagement;

@EnableTransactionManagement
@Configuration
@MapperScan("com.zhang.mapper")
public class MybatisPlusConfig {

    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        interceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());
        return interceptor;
    }
}

查詢操作

    //單個用戶查詢
    @Test
    void testSelectById(){
        User user = userMapper.selectById(1);
        System.out.println(user);
    }

    //多個用戶查詢
    @Test
    void testSelectBybatchId(){
        List<User> users = userMapper.selectBatchIds(Arrays.asList(1, 2, 3));
        System.out.println(users);
    }
    //條件查詢使用map
    @Test
    void testSelectBybatchIds(){
        HashMap<String, Object> map = new HashMap<>();
        map.put("age",11);
        List<User> users = userMapper.selectByMap(map);
        System.out.println(users);
    }

分頁查詢

1仰剿、再配置類里面添加配置插件 MybatisPlusConfig

   // 最新版
    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.H2));
        return interceptor;
    }

2卧须、測試查詢

    //測試分頁查詢
    @Test
    void testPage(){

        Page<User> page = new Page<>(1,3);
        userMapper.selectPage(page,null);
        page.getRecords().forEach(System.out::println);

    }

Wrapper應用

原文鏈接:https://blog.csdn.net/weixin_44870909/article/details/108761753

1. ge另绩、gt、le花嘶、lt笋籽、isNull、isNotNull

  • ge 大于等于

  • gt 大于

  • le 小于等于

  • lt 小于

  • isNull 字段 IS NULL (該字段為空)

  • isNotNull 字段 IS NOT NULL (該字段不為空)

  • 下面示例是邏輯刪除 而不是物理刪除

    @Test
    public void testDelete() {
    
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        queryWrapper
            .isNull("name")
            .ge("age", 12)
            .isNotNull("email");
        int result = userMapper.delete(queryWrapper);
        System.out.println("delete return count = " + result);
    }
    

2. eq椭员、ne

  • eq 等于
  • ne 不等于
@Test
public void testSelectOne() {

    QueryWrapper<User> queryWrapper = new QueryWrapper<>();
    queryWrapper.eq("name", "Tom");

    User user = userMapper.selectOne(queryWrapper);
    System.out.println(user);
}

3. between车海、notBetween

  • between BETWEEN 值1 AND 值2

  • notBetween NOT BETWEEN 值1 AND 值2

  • 包含大小邊界

    @Test
    public void testSelectCount() {
    
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        queryWrapper.between("age", 20, 30);
    
        Integer count = userMapper.selectCount(queryWrapper);
        System.out.println(count);
    }
    

4、allEq

  • allEq 全部相等
@Test
public void testSelectList() {

    QueryWrapper<User> queryWrapper = new QueryWrapper<>();
    Map<String, Object> map = new HashMap<>();
    map.put("id", 2);
    map.put("name", "Jack");
    map.put("age", 20);

    queryWrapper.allEq(map);
    List<User> users = userMapper.selectList(queryWrapper);

    users.forEach(System.out::println);
}

5隘击、like侍芝、notLike、likeLeft埋同、likeRight

  • like LIKE ‘%值%’
  • notLike NOT LIKE ‘%值%’
  • likeLeft LIKE ‘%值’
  • likeRight LIKE ‘值%’
  • selectMaps返回Map集合列表
@Test
public void testSelectMaps() {

    QueryWrapper<User> queryWrapper = new QueryWrapper<>();
    queryWrapper
        .notLike("name", "e")
        .likeRight("email", "t");

    List<Map<String, Object>> maps = userMapper.selectMaps(queryWrapper);//返回值是Map列表
    maps.forEach(System.out::println);
}

6州叠、in、notIn凶赁、inSql咧栗、notInSql、exists虱肄、notExists

in 字段 IN (v0, v1, v2, …)

notIn 字段 NOT IN(v0, v1, v2, …)

inSql 字段 IN (SQL語句)

notInSql 字段 NOT IN (SQL語句)

exists 拼接 EXISTS (SQL語句)

notExists 拼接 NOT EXISTS (SQL語句)

in致板、notIn:

notIn(“age”,{1,2,3})—>age not in (1,2,3)

notIn(“age”, 1, 2, 3)—>age not in (1,2,3)

inSql、notinSql:可以實現(xiàn)子查詢
例: inSql(“age”, “1,2,3,4,5,6”)—>age in (1,2,3,4,5,6)
例: inSql(“id”, “select id from table where id < 3”)—>id in (select id from table where id < 3)

@Test
public void testSelectObjs() {

    QueryWrapper<User> queryWrapper = new QueryWrapper<>();
    //queryWrapper.in("id", 1, 2, 3);
    queryWrapper.inSql("id", "select id from user where id < 3");

    List<Object> objects = userMapper.selectObjs(queryWrapper);//返回值是Object列表
    objects.forEach(System.out::println);
}

7. or咏窿、and

  • 注意:這里使用的是 UpdateWrapper
    不調用or則默認為使用 and 連
@Test
public void testUpdate1() {

    //修改值
    User user = new User();
    user.setAge(99);
    user.setName("Andy");

    //修改條件
    UpdateWrapper<User> userUpdateWrapper = new UpdateWrapper<>();
    userUpdateWrapper
        .like("name", "h")
        .or()
        .between("age", 20, 30);

    int result = userMapper.update(user, userUpdateWrapper);

    System.out.println(result);
}

8. 嵌套or斟或、嵌套and

這里使用了lambda表達式,or中的表達式最后翻譯成sql時會被加上圓括號

@Test
public void testUpdate2() {

    //修改值
    User user = new User();
    user.setAge(99);
    user.setName("Andy");

    //修改條件
    UpdateWrapper<User> userUpdateWrapper = new UpdateWrapper<>();
    userUpdateWrapper
        .like("name", "h")
        .or(i -> i.eq("name", "李白").ne("age", 20));

    int result = userMapper.update(user, userUpdateWrapper);

    System.out.println(result);
}
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末翰灾,一起剝皮案震驚了整個濱河市缕粹,隨后出現(xiàn)的幾起案子稚茅,更是在濱河造成了極大的恐慌,老刑警劉巖平斩,帶你破解...
    沈念sama閱讀 219,490評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件亚享,死亡現(xiàn)場離奇詭異,居然都是意外死亡绘面,警方通過查閱死者的電腦和手機欺税,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,581評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來揭璃,“玉大人晚凿,你說我怎么就攤上這事∈葩桑” “怎么了歼秽?”我有些...
    開封第一講書人閱讀 165,830評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長情组。 經常有香客問我燥筷,道長,這世上最難降的妖魔是什么院崇? 我笑而不...
    開封第一講書人閱讀 58,957評論 1 295
  • 正文 為了忘掉前任肆氓,我火速辦了婚禮,結果婚禮上底瓣,老公的妹妹穿的比我還像新娘谢揪。我一直安慰自己,他們只是感情好捐凭,可當我...
    茶點故事閱讀 67,974評論 6 393
  • 文/花漫 我一把揭開白布拨扶。 她就那樣靜靜地躺著,像睡著了一般柑营。 火紅的嫁衣襯著肌膚如雪屈雄。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,754評論 1 307
  • 那天官套,我揣著相機與錄音酒奶,去河邊找鬼。 笑死奶赔,一個胖子當著我的面吹牛惋嚎,可吹牛的內容都是我干的。 我是一名探鬼主播站刑,決...
    沈念sama閱讀 40,464評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼另伍,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起摆尝,我...
    開封第一講書人閱讀 39,357評論 0 276
  • 序言:老撾萬榮一對情侶失蹤温艇,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后堕汞,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體勺爱,經...
    沈念sama閱讀 45,847評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,995評論 3 338
  • 正文 我和宋清朗相戀三年讯检,在試婚紗的時候發(fā)現(xiàn)自己被綠了琐鲁。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,137評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡人灼,死狀恐怖围段,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情投放,我是刑警寧澤奈泪,帶...
    沈念sama閱讀 35,819評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站灸芳,受9級特大地震影響段磨,放射性物質發(fā)生泄漏。R本人自食惡果不足惜耗绿,卻給世界環(huán)境...
    茶點故事閱讀 41,482評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望砾隅。 院中可真熱鬧误阻,春花似錦、人聲如沸晴埂。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,023評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽儒洛。三九已至精耐,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間琅锻,已是汗流浹背卦停。 一陣腳步聲響...
    開封第一講書人閱讀 33,149評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留恼蓬,地道東北人惊完。 一個月前我還...
    沈念sama閱讀 48,409評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像处硬,于是被迫代替她去往敵國和親小槐。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,086評論 2 355

推薦閱讀更多精彩內容

  • Mybatis-Plus(MP)在 MyBatis 的基礎上只做增強不做改變荷辕,簡化開發(fā)凿跳、提高效率件豌。 本篇是根據(jù)My...
    h2coder閱讀 11,556評論 4 41
  • Mybatis-Plus(MP)在 MyBatis 的基礎上只做增強不做改變,簡化開發(fā)控嗜、提高效率茧彤。 本篇是根據(jù)My...
    h2coder閱讀 922評論 0 1
  • MybatisPlus 特性 無侵入:只做增強不做改變,引入它不會對現(xiàn)有工程產生影響躬审,如絲般順滑 損耗屑帧:啟動即會...
    njitzyd閱讀 586評論 0 0
  • 我是黑夜里大雨紛飛的人啊 1 “又到一年六月,有人笑有人哭承边,有人歡樂有人憂愁遭殉,有人驚喜有人失落,有的覺得收獲滿滿有...
    陌忘宇閱讀 8,536評論 28 53
  • 信任包括信任自己和信任他人 很多時候博助,很多事情险污,失敗、遺憾富岳、錯過蛔糯,源于不自信,不信任他人 覺得自己做不成窖式,別人做不...
    吳氵晃閱讀 6,190評論 4 8