Mybatis-Plus使用

1 核心功能

  • 通用 CRUD:定義好 Mapper 接口后,只需要繼承 BaseMapper<T> 接口即可獲得通用的增刪改查功能,無需編寫任何接口方法與配置文件
  • 條件構造器:通過 EntityWrapper<T> (實體包裝類)吩愧,可以用于拼接 SQL 語句雁佳,并且支持排序、分組查詢等復雜的 SQL
  • 代碼生成器:支持一系列的策略配置與全局配置星澳,比 MyBatis 的代碼生成更好用

2 基本配置

2.1 添加核心依賴

<!--       數(shù)據(jù)庫驅動-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>
<!--        lombok-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
<!--        mybatis-plus和Springboot整合-->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.4.0</version>
        </dependency>
<!--        mybatis-plus代碼生成器-->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-generator</artifactId>
            <version>3.4.1</version>
        </dependency>
        <!-- 模板引擎 -->
        <dependency>
            <groupId>org.apache.velocity</groupId>
            <artifactId>velocity-engine-core</artifactId>
            <version>2.0</version>
        </dependency>

2.2 配置文件application.yml

spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    username: root
    password: suruomo
    url: jdbc:mysql://127.0.0.1:3306/demo?useUnicode=true&characterEncoding=UTF-8&serverTimezone=GMT%2B8
server:
  port: 8070

功能體驗

3.1 通用CRUD

實體類

package com.suruomo.mybatisplus.entity;

import com.baomidou.mybatisplus.annotation.*;
import lombok.Data;

import java.util.Date;

/**
 * @Author: suruomo
 * @Date: 2020/8/25 14:38
 * @Description:
 */
@Data
@TableName(value = "sys_user")
public class SysUser {
    /**
     * 登錄賬號
     * type = IdType.INPUT表示主鍵輸入
     * 改為AUTO為自增
     */
    @TableId(type = IdType.INPUT)
    private String userId;

    /**
     * 用戶昵稱
     */
    private String userName;

    /**
     * 用戶郵箱
     */
    private String email;

    /**
     * 手機號碼
     */
    private String phonenumber;

    /**
     * 用戶性別(0男 1女 2未知)
     */
    private String sex;

    /**
     * 密碼
     */
    private String password;

    /**
     * 帳號狀態(tài)(0正常 1停用)
     */
    private String status;

    /**
     * 刪除標志(0代表存在 2代表刪除)
     */
    private String delFlag;

    /**
     * 最后登陸IP
     */
    private String loginIp;

    /**
     * 最后登陸時間
     */
    private Date loginDate;

    /**
     * 創(chuàng)建者
     */
    private String createBy;

    /**
     * 創(chuàng)建時間
     * 時間自動填充
     */
    @TableField(fill = FieldFill.INSERT)
    private Date createTime;

    /**
     * 更新者
     */
    private String updateBy;

    /**
     * 更新時間
     * 時間自動修改
     */
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Date updateTime;
}

Mapper接口

package com.suruomo.mybatisplus.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.suruomo.mybatisplus.entity.SysUser;
import org.apache.ibatis.annotations.Mapper;

/**
 * @Author: suruomo
 * @Date: 2020/8/25 14:40
 * @Description: 繼承 BaseMapper<T> 接口即可獲得通用的增刪改查功能
 */
@Mapper
public interface SysUserMapper extends BaseMapper<SysUser> {
}

通用CRUD方法:


通用方法.png

Service層

package com.suruomo.mybatisplus.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.suruomo.mybatisplus.entity.SysUser;

/**
 * @Author: suruomo
 * @Date: 2020/8/25 19:34
 * @Description:
 */
public interface SysUserService extends IService<SysUser> {
}
package com.suruomo.mybatisplus.service.impl;

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.suruomo.mybatisplus.mapper.SysUserMapper;
import com.suruomo.mybatisplus.entity.SysUser;
import com.suruomo.mybatisplus.service.SysUserService;
import org.springframework.stereotype.Service;

/**
 * @Author: suruomo
 * @Date: 2020/8/25 19:36
 * @Description:
 */
@Service
public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> implements SysUserService {

}

測試

**
 * 通用Mapper層接口測試
 * 普通CRUD+分頁
 */
@RunWith(SpringRunner.class)
@SpringBootTest
class MapperTest {

    @Resource
    private SysUserMapper sysUserMapper;

    /**
     * 查找所有
     */
    @Test
    void selectList() {
        List<SysUser> userList = sysUserMapper.selectList(null);
        userList.forEach(System.out::println);
    }

    /**
     * 分頁查找
     */
    @Test
    void selectByPage() {
        Page<SysUser> page = new Page<>(1, 3);
        IPage<SysUser> userIPage  = sysUserMapper.selectPage(page, null);
        System.out.println("總記錄數(shù):" + page.getTotal());
        System.out.println("總頁數(shù)" + page.getPages());
        List<SysUser> list=userIPage.getRecords();
        list.forEach(System.out::println);
    }
    /**
     * 插入
     */
    @Test
    void insert(){
        SysUser user=new SysUser();
        user.setUserId("25");
        user.setUserName("susu");
        sysUserMapper.insert(user);
    }

    /**
     * 根據(jù)id刪除
     */
    @Test
    void deleteById(){
        sysUserMapper.deleteById("zxc");
    }

    /**
     * 根據(jù)map刪除
     */
    @Test
     void DeleteByMap(){
        HashMap<String, Object> map = new HashMap<>();
        map.put("user_id","25");
        sysUserMapper.deleteByMap(map);
    }
    /**
     * 根據(jù)id更新
     */
    @Test
    void update(){
        SysUser user=new SysUser();
        user=sysUserMapper.selectById("ry");
        user.setUserName("ry");
        sysUserMapper.updateById(user);
    }

}

3.2 自動填充功能

經常會遇到一些數(shù)據(jù)士修,每次都使用相同的方式填充李命,例如記錄的創(chuàng)建時間黔州,更新時間等流妻。我們可以使用MyBatis Plus的自動填充功能涣达,完成這些字段的賦值工作:
1.數(shù)據(jù)庫中添加相應字段
2.實體類中添加注解

/**
 * 創(chuàng)建時間
 * 時間自動填充
 */
@TableField(fill = FieldFill.INSERT)
private Date createTime;

/**
 * 更新時間
 * 時間自動修改
 */
@TableField(fill = FieldFill.INSERT_UPDATE)
private Date updateTime;

3.實現(xiàn)元對象處理器接口

@Component
public class MyMetaObjectHandler 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);
    }
}

3.3 分頁功能

MyBatis Plus自帶分頁插件,只要簡單的配置即可實現(xiàn)分頁功能
配置類:

@Configuration
public class PaginationConfig {
    /**
     * 分頁插件
     */
    @Bean
    public PaginationInterceptor paginationInterceptor() {
        return new PaginationInterceptor ();
    }
}

使用:

/**
 * 分頁查找
 */
@Test
void selectByPage() {
    Page<SysUser> page = new Page<>(1, 3);
    IPage<SysUser> userIPage  = sysUserMapper.selectPage(page, null);
    System.out.println("總記錄數(shù):" + page.getTotal());
    System.out.println("總頁數(shù)" + page.getPages());
    List<SysUser> list=userIPage.getRecords();
    list.forEach(System.out::println);

3.4 EntityWrapper 條件構造器

Mybatis-Plus 通過 EntityWrapper(簡稱 EW,MP 封裝的一個查詢條件構造器)或者Condition(與 EW 類似) 來讓用戶自由的構建查詢條件甩骏,簡單便捷饮笛,沒有額外的負擔,能夠有效提高開發(fā)效率

實體包裝器素跺,主要用于處理 sql 拼接,排序踊跟,實體參數(shù)查詢等

注意: 使用的是數(shù)據(jù)庫的字段,不是java的屬性名稱

參數(shù)說明見:https://baomidou.com/guide/wrapper.html#and

使用:

@RunWith(SpringRunner.class)
@SpringBootTest
public class QueryWrapperTest {
    @Resource
    private SysUserMapper sysUserMapper;

    @Test
    public void selectByInfo(){
        QueryWrapper<SysUser> wrapper = new QueryWrapper<>();
        // 查找性別為0,姓名為a開頭的人
        wrapper.select("user_id", "user_name", "email","sex").eq("sex", 0).like("user_name", "a");
        List<SysUser> users = sysUserMapper.selectList(wrapper);
        users.forEach(user -> System.out.println(user));
    }
}

3.5 代碼生成器

AutoGenerator 是 MyBatis-Plus 的代碼生成器炬藤,通過 AutoGenerator 可以快速生成 Entity沈矿、Mapper睡互、Mapper XML就珠、Service、Controller 等各個模塊的代碼蹂季,極大的提升了開發(fā)效率偿洁。

public class GenerateCode {
    public static void main(String[] args) {
        // 需要構建一個 代碼自動生成器 對象
        AutoGenerator mpg = new AutoGenerator();
        // 配置策略
        // 1、全局配置
        GlobalConfig gc = new GlobalConfig();
        String projectPath = System.getProperty("user.dir");
        gc.setOutputDir(projectPath+"/src/main/java");
        gc.setAuthor("suruomo");//作者名稱
        gc.setOpen(false);
        // 自定義文件命名宾肺,注意 %s 會自動填充表實體屬性!
        gc.setServiceName("%sService");
        gc.setControllerName("%sController");
        gc.setServiceName("%sService");
        gc.setServiceImplName("%sServiceImpl");
        gc.setMapperName("%sMapper");
        gc.setXmlName("%sMapper");

        mpg.setGlobalConfig(gc);

        //2增拥、設置數(shù)據(jù)源
        DataSourceConfig dsc = new DataSourceConfig();
        dsc.setUrl("jdbc:mysql://127.0.0.1:3306/demo?useUnicode=true&characterEncoding=UTF-8&serverTimezone=GMT%2B8");
                dsc.setDriverName("com.mysql.cj.jdbc.Driver");
        // dsc.setDriverName("com.mysql.jdbc.Driver"); //mysql5.6以下的驅動
        dsc.setUsername("root");
        dsc.setPassword("suruomo");
        dsc.setDbType(DbType.MYSQL);
        mpg.setDataSource(dsc);
        //3、包的配置
        PackageConfig pc = new PackageConfig();
        pc.setParent("com.suruomo"); //包名
        pc.setModuleName("mybatisplus"); //模塊名
        pc.setEntity("entity");
        pc.setMapper("mapper");
        pc.setService("service");
        pc.setController("controller");
        mpg.setPackageInfo(pc);

        //4、策略配置
        StrategyConfig strategy = new StrategyConfig();
        strategy.setInclude("sys_user","aluminum","sys_log"); // 設置要映射的表名
        strategy.setNaming(NamingStrategy.underline_to_camel);
        strategy.setColumnNaming(NamingStrategy.underline_to_camel);
        strategy.setEntityLombokModel(true); // 自動lombok逾苫;
        strategy.setLogicDeleteFieldName("deleted");
        strategy.setRestControllerStyle(true); //rest請求
        //自動轉下劃線铅搓,比如localhost:8080/hello_id_2
        strategy.setControllerMappingHyphenStyle(true);
        mpg.setStrategy(strategy);
        mpg.execute(); //執(zhí)行
    }
}
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市氢烘,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌蜀踏,老刑警劉巖果覆,帶你破解...
    沈念sama閱讀 211,123評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件菱属,死亡現(xiàn)場離奇詭異钳榨,居然都是意外死亡,警方通過查閱死者的電腦和手機纽门,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,031評論 2 384
  • 文/潘曉璐 我一進店門薛耻,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人膜毁,你說我怎么就攤上這事愤钾∥帘酰” “怎么了?”我有些...
    開封第一講書人閱讀 156,723評論 0 345
  • 文/不壞的土叔 我叫張陵能颁,是天一觀的道長杂瘸。 經常有香客問我,道長伙菊,這世上最難降的妖魔是什么败玉? 我笑而不...
    開封第一講書人閱讀 56,357評論 1 283
  • 正文 為了忘掉前任敌土,我火速辦了婚禮,結果婚禮上运翼,老公的妹妹穿的比我還像新娘返干。我一直安慰自己,他們只是感情好血淌,可當我...
    茶點故事閱讀 65,412評論 5 384
  • 文/花漫 我一把揭開白布矩欠。 她就那樣靜靜地躺著,像睡著了一般悠夯。 火紅的嫁衣襯著肌膚如雪癌淮。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,760評論 1 289
  • 那天沦补,我揣著相機與錄音乳蓄,去河邊找鬼。 笑死夕膀,一個胖子當著我的面吹牛虚倒,可吹牛的內容都是我干的。 我是一名探鬼主播产舞,決...
    沈念sama閱讀 38,904評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼裹刮,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了庞瘸?” 一聲冷哼從身側響起捧弃,我...
    開封第一講書人閱讀 37,672評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎擦囊,沒想到半個月后违霞,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經...
    沈念sama閱讀 44,118評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡瞬场,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,456評論 2 325
  • 正文 我和宋清朗相戀三年买鸽,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片贯被。...
    茶點故事閱讀 38,599評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡眼五,死狀恐怖,靈堂內的尸體忽然破棺而出彤灶,到底是詐尸還是另有隱情看幼,我是刑警寧澤,帶...
    沈念sama閱讀 34,264評論 4 328
  • 正文 年R本政府宣布幌陕,位于F島的核電站诵姜,受9級特大地震影響,放射性物質發(fā)生泄漏搏熄。R本人自食惡果不足惜棚唆,卻給世界環(huán)境...
    茶點故事閱讀 39,857評論 3 312
  • 文/蒙蒙 一暇赤、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧宵凌,春花似錦鞋囊、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,731評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至微饥,卻和暖如春逗扒,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背欠橘。 一陣腳步聲響...
    開封第一講書人閱讀 31,956評論 1 264
  • 我被黑心中介騙來泰國打工矩肩, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人肃续。 一個月前我還...
    沈念sama閱讀 46,286評論 2 360
  • 正文 我出身青樓黍檩,卻偏偏與公主長得像,于是被迫代替她去往敵國和親始锚。 傳聞我的和親對象是個殘疾皇子刽酱,可洞房花燭夜當晚...
    茶點故事閱讀 43,465評論 2 348

推薦閱讀更多精彩內容