mybatis-plus整合SpringBoot

1 環境配置

1.1 說明

Mybatis-Plus是一個Mybatis框架的增強插件,根據官方描述,MP只做增強不做改變,引入它不會對現有工程產生影響,如絲般順滑.並且只需簡單配置,即可快速進行 CRUD 操作,從而節省大量時間.代碼生成,分頁,性能分析等功能一應俱全,最新已經更新到了3.1.1版本了,3.X系列支持lambda語法,讓我在寫條件構造的時候少了很多的"魔法值",從代碼結構上更簡潔了.
在這裏插入圖片描述
在這裏插入圖片描述最終的目錄結構在這裏插入圖片描述

1. 2 項目環境

  • MyBatis-Plus版本: 3.1.0

  • SpringBoot版本:2.1.7

  • JDK版本:1.8

1. 3 POM

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.47</version>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <!-- mybatisPlus 核心庫 -->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.1.0</version>
        </dependency>
        <!-- 引入阿里數據庫連接池 -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.1.6</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <!--swagger-->
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger2</artifactId>
            <version>2.9.2</version>
        </dependency>
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger-ui</artifactId>
            <version>2.9.2</version>
        </dependency>
        <!--swagger-->
    </dependencies>

1. 4 配置

# 配置端口
server:
  port: 8080
spring:
  # 配置數據源
  datasource:
    driver-class-name: com.mysql.jdbc.Driver
    url: jdbc:mysql://localhost:3306/user?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&useSSL=false&zeroDateTimeBehavior=convertToNull
    username: root
    password: 123456
    type: com.alibaba.druid.pool.DruidDataSource
# mybatis-plus相關配置
mybatis-plus:
  # xml掃描,多個目錄用逗號或者分號分隔(告訴 Mapper 所對應的 XML 文件位置)
  mapper-locations: classpath:mapper/*.xml
  # 以下配置均有默認值,可以不設置
  global-config:
    db-config:
      #主鍵類型 AUTO:"數據庫ID自增" INPUT:"用戶輸入ID",ID_WORKER:"全局唯一ID (數字類型唯一ID)", UUID:"全局唯一ID UUID";
      id-type: auto
      #字段策略 IGNORED:"忽略判斷"  NOT_NULL:"非 NULL 判斷")  NOT_EMPTY:"非空判斷"
      field-strategy: NOT_EMPTY
      #數據庫類型
      db-type: MYSQL
  configuration:
    # 是否開啓自動駝峯命名規則映射:從數據庫列名到Java屬性駝峯命名的類似映射
    map-underscore-to-camel-case: true
    # 如果查詢結果中包含空值的列,則 MyBatis 在映射的時候,不會映射這個字段
    call-setters-on-nulls: true
    # 這個配置會將執行的sql打印出來,在開發或測試的時候可以用
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

1. 5 sql

CREATE TABLE `user_info` (
  `id` bigint(11) NOT NULL AUTO_INCREMENT COMMENT 'ID',
  `name` varchar(32) DEFAULT NULL COMMENT '姓名',
  `age` int(11) DEFAULT NULL COMMENT '年齡',
  `skill` varchar(32) DEFAULT NULL COMMENT '技能',
  `evaluate` varchar(64) DEFAULT NULL COMMENT '評價',
  `fraction` bigint(11) DEFAULT NULL COMMENT '分數',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=16 DEFAULT CHARSET=utf8mb4 COMMENT='學生信息表';
INSERT INTO `user_info` VALUES (1, '小明', 20, '畫畫', '該學生在畫畫方面有一定天賦', 89);
INSERT INTO `user_info` VALUES (2, '小蘭', 19, '遊戲', '近期該學生由於遊戲的原因導致分數降低了', 64);
INSERT INTO `user_info` VALUES (3, '張張', 18, '英語', '近期該學生參加英語比賽獲得二等獎', 90);
INSERT INTO `user_info` VALUES (4, '大黃', 20, '體育', '該學生近期由於參加籃球比賽,導致腳傷', 76);
INSERT INTO `user_info` VALUES (5, '大白', 17, '繪畫', '該學生參加美術大賽獲得三等獎', 77);
INSERT INTO `user_info` VALUES (7, '小龍', 18, 'JAVA', '該學生是一個在改BUG的碼農', 59);
INSERT INTO `user_info` VALUES (9, 'Sans', 18, '睡覺', 'Sans是一個愛睡覺,並且身材較矮骨骼巨大的骷髏小胖子', 60);
INSERT INTO `user_info` VALUES (10, 'papyrus', 18, 'JAVA', 'Papyrus是一個講話大聲、個性張揚的骷髏,給人自信、有魅力的骷髏小瘦子', 58);
INSERT INTO `user_info` VALUES (11, '刪除數據1', 3, '畫肖像', NULL, 61);
INSERT INTO `user_info` VALUES (12, '刪除數據2', 3, NULL, NULL, 61);
INSERT INTO `user_info` VALUES (13, '刪除數據3', 3, NULL, NULL, 61);
INSERT INTO `user_info` VALUES (14, '刪除數據4', 5, '刪除', NULL, 10);
INSERT INTO `user_info` VALUES (15, '刪除數據5', 6, '刪除', NULL, 10);

2 編寫類

2.1 在啓動類上添加掃描DAO的註解

注意: MapperScan 對應的你是的com.dao 包底下的dao

@SpringBootApplication
@MapperScan(basePackages = {"com.dao"}) //掃描DAO
public class MybatisPlusApplication {

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

}

2.2 編寫Config配置類

@Configuration
public class MybatisPlusConfig {
    /**
     * mybatis-plus SQL執行效率插件【生產環境可以關閉】
     */
    @Bean
    public PerformanceInterceptor performanceInterceptor() {
        return new PerformanceInterceptor();
    }
    /**
     * 分頁插件
     */
    @Bean
    public PaginationInterceptor paginationInterceptor() {
        return new PaginationInterceptor();
    }
}

2.3 編寫Entity類

自己去get,set,toString

@TableName("user_info")//@TableName中的值對應着表名
public class UserInfoEntity {
    @TableId(type = IdType.AUTO)
    private Long id;
    /**
     * 姓名
     */
    private String name;
    /**
     * 年齡
     */
    private Integer age;
    /**
     * 技能
     */
    private String skill;
    /**
     * 評價
     */
    private String evaluate;
    /**
     * 分數
     */
    private Long fraction;

2.4 編寫Dao類

/**
 * @Description 用戶信息DAO
 * @Author Yuz
 * @CreateTime 2019/6/8 16:24
 */
public interface UserInfoDao extends BaseMapper<UserInfoEntity> {
}

2.5 編寫Service類

/**
 * @Description 用戶業務接口
 * @Author Yuz
 * @CreateTime 2019/6/8 16:26
 */
public interface UserInfoService extends IService<UserInfoEntity> {
}

2.6 編寫ServiceImpl類

/**
 * @Description 用戶業務實現
 * @Author Sans
 * @CreateTime 2019/6/8 16:26
 */
@Service
@Transactional
public class UserInfoSerivceImpl extends ServiceImpl<UserInfoDao, UserInfoEntity> implements UserInfoService {
}

2.7 Controller層

package com.controller;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.entity.UserInfoEntity;
import com.service.UserInfoService;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.*;

/**
 * @description:
 * @author: Yuz
 * @creat_time: 2019/8/30
 **/
@RestController
@RequestMapping("/userInfo")
public class UserInfoController {
    @Autowired
    private UserInfoService userInfoService;

    /**
     * 根據ID獲取用戶信息
     * @Author Sans
     * @CreateTime 2019/6/8 16:34
     * @Param  userId  用戶ID
     * @Return UserInfoEntity 用戶實體
     */
    @ApiOperation("根據ID獲取用戶信息")
    @PostMapping("/getInfo")
    public UserInfoEntity getInfo(@RequestBody String userId){
        UserInfoEntity userInfoEntity = userInfoService.getById(userId);
        return userInfoEntity;
    }
    /**
     * 查詢全部信息
     * @Author Sans
     * @CreateTime 2019/6/8 16:35
     * @Param  userId  用戶ID
     * @Return List<UserInfoEntity> 用戶實體集合
     */
    @ApiOperation("查詢全部信息")
    @PostMapping("/getList")
    public List<UserInfoEntity> getList(){
        List<UserInfoEntity> userInfoEntityList = userInfoService.list();
        return userInfoEntityList;
    }
    /**
     * 分頁查詢全部數據
     * @Author Sans
     * @CreateTime 2019/6/8 16:37
     * @Return IPage<UserInfoEntity> 分頁數據
     */
    @ApiOperation("分頁查詢全部數據")
    @PostMapping("/getInfoListPage")
    public IPage<UserInfoEntity> getInfoListPage(){
        //需要在Config配置類中配置分頁插件
        IPage<UserInfoEntity> page = new Page<>();
        page.setCurrent(5); //當前頁
        page.setSize(1);    //每頁條數
        page = userInfoService.page(page);
        return page;
    }
    /**
     * 根據指定字段查詢用戶信息集合
     * @Author Sans
     * @CreateTime 2019/6/8 16:39
     * @Return Collection<UserInfoEntity> 用戶實體集合
     */
    @ApiOperation("根據指定字段查詢用戶信息集合")
    @PostMapping("/getListMap")
    public Collection<UserInfoEntity> getListMap(){
        Map<String,Object> map = new HashMap<>();
        //kay是字段名 value是字段值
        map.put("age",20);
        Collection<UserInfoEntity> userInfoEntityList = userInfoService.listByMap(map);
        return userInfoEntityList;
    }
    /**
     * 新增用戶信息
     * @Author Sans
     * @CreateTime 2019/6/8 16:40
     */
    @ApiOperation("新增用戶信息")
    @PostMapping("/saveInfo")
    public void saveInfo(){
        UserInfoEntity userInfoEntity = new UserInfoEntity();
        userInfoEntity.setName("小龍");
        userInfoEntity.setSkill("JAVA");
        userInfoEntity.setAge(18);
        userInfoEntity.setFraction(59L);
        userInfoEntity.setEvaluate("該學生是一個在改BUG的碼農");
        userInfoService.save(userInfoEntity);
    }
    /**
     * 批量新增用戶信息
     * @Author Sans
     * @CreateTime 2019/6/8 16:42
     */
    @ApiOperation("批量新增用戶信息")
    @PostMapping("/saveInfoList")
    public void saveInfoList(){
        //創建對象
        UserInfoEntity sans = new UserInfoEntity();
        sans.setName("Sans");
        sans.setSkill("睡覺");
        sans.setAge(18);
        sans.setFraction(60L);
        sans.setEvaluate("Sans是一個愛睡覺,並且身材較矮骨骼巨大的骷髏小胖子");
        UserInfoEntity papyrus = new UserInfoEntity();
        papyrus.setName("papyrus");
        papyrus.setSkill("JAVA");
        papyrus.setAge(18);
        papyrus.setFraction(58L);
        papyrus.setEvaluate("Papyrus是一個講話大聲、個性張揚的骷髏,給人自信、有魅力的骷髏小瘦子");
        //批量保存
        List<UserInfoEntity> list =new ArrayList<>();
        list.add(sans);
        list.add(papyrus);
        userInfoService.saveBatch(list);
    }
    /**
     * 更新用戶信息
     * @Author Sans
     * @CreateTime 2019/6/8 16:47
     */
    @ApiOperation("更新用戶信息")
    @PostMapping("/updateInfo")
    public void updateInfo(){
        //根據實體中的ID去更新,其他字段如果值爲null則不會更新該字段,參考yml配置文件
        UserInfoEntity userInfoEntity = new UserInfoEntity();
        userInfoEntity.setId(1L);
        userInfoEntity.setAge(19);
        userInfoService.updateById(userInfoEntity);
    }
    /**
     * 新增或者更新用戶信息
     * @Author Sans
     * @CreateTime 2019/6/8 16:50
     */
    @ApiOperation("新增或者更新用戶信息")
    @PostMapping("/saveOrUpdateInfo")
    public void saveOrUpdate(){
        //傳入的實體類userInfoEntity中ID爲null就會新增(ID自增)
        //實體類ID值存在,如果數據庫存在ID就會更新,如果不存在就會新增
        UserInfoEntity userInfoEntity = new UserInfoEntity();
        userInfoEntity.setId(1L);
        userInfoEntity.setAge(20);
        userInfoService.saveOrUpdate(userInfoEntity);
    }
    /**
     * 根據ID刪除用戶信息
     * @Author Sans
     * @CreateTime 2019/6/8 16:52
     */
    @ApiOperation("根據ID刪除用戶信息")
    @PostMapping("/deleteInfo")
    public void deleteInfo(String userId){
        userInfoService.removeById(userId);
    }
    /**
     * 根據ID批量刪除用戶信息
     * @Author Sans
     * @CreateTime 2019/6/8 16:55
     */
    @ApiOperation("根據ID批量刪除用戶信息")
    @PostMapping("/deleteInfoList")
    public void deleteInfoList(){
        List<String> userIdlist = new ArrayList<>();
        userIdlist.add("12");
        userIdlist.add("13");
        userInfoService.removeByIds(userIdlist);
    }
    /**
     * 根據指定字段刪除用戶信息
     * @Author Sans
     * @CreateTime 2019/6/8 16:57
     */
    @ApiOperation("根據指定字段刪除用戶信息")
    @PostMapping("/deleteInfoMap")
    public void deleteInfoMap(){
        //kay是字段名 value是字段值
        Map<String,Object> map = new HashMap<>();
        map.put("skill","刪除");
        map.put("fraction",10L);
        userInfoService.removeByMap(map);
    }
}

3 條件MyBatis-Plus的QueryWrapper條件構造器

當查詢條件複雜的時候,我們可以使用MP的條件構造器,請參考下面的QueryWrapper條件參數說明

下面我們來舉一些常見的示例

/**
 * @Description UserInfoPlusController
 * @Author Sans
 * @CreateTime 2019/6/9 14:52
 */
@RestController
@RequestMapping("/userInfoPlus")
public class UserInfoPlusController {

    @Autowired
    private UserInfoService userInfoService;

    /**
     * MP擴展演示
     * @Author Sans
     * @CreateTime 2019/6/8 16:37
     * @Return Map<String,Object> 返回數據
     */
    @RequestMapping("/getInfoListPlus")
    public Map<String,Object> getInfoListPage(){
        //初始化返回類
        Map<String,Object> result = new HashMap<>();
        //查詢年齡等於18歲的學生
        //等價SQL: SELECT id,name,age,skill,evaluate,fraction FROM user_info WHERE age = 18
        QueryWrapper<UserInfoEntity> queryWrapper1 = new QueryWrapper<>();
        queryWrapper1.lambda().eq(UserInfoEntity::getAge,18);
        List<UserInfoEntity> userInfoEntityList1 = userInfoService.list(queryWrapper1);
        result.put("studentAge18",userInfoEntityList1);
        //查詢年齡大於5歲的學生且小於等於18歲的學生
        //等價SQL: SELECT id,name,age,skill,evaluate,fraction FROM user_info WHERE age > 5 AND age <= 18
        QueryWrapper<UserInfoEntity> queryWrapper2 = new QueryWrapper<>();
        queryWrapper2.lambda().gt(UserInfoEntity::getAge,5);
        queryWrapper2.lambda().le(UserInfoEntity::getAge,18);
        List<UserInfoEntity> userInfoEntityList2 = userInfoService.list(queryWrapper2);
        result.put("studentAge5",userInfoEntityList2);
        //模糊查詢技能字段帶有"畫"的數據,並按照年齡降序
        //等價SQL: SELECT id,name,age,skill,evaluate,fraction FROM user_info WHERE skill LIKE '%畫%' ORDER BY age DESC
        QueryWrapper<UserInfoEntity> queryWrapper3 = new QueryWrapper<>();
        queryWrapper3.lambda().like(UserInfoEntity::getSkill,"畫");
        queryWrapper3.lambda().orderByDesc(UserInfoEntity::getAge);
        List<UserInfoEntity> userInfoEntityList3 = userInfoService.list(queryWrapper3);
        result.put("studentAgeSkill",userInfoEntityList3);
        //模糊查詢名字帶有"小"或者年齡大於18的學生
        //等價SQL: SELECT id,name,age,skill,evaluate,fraction FROM user_info WHERE name LIKE '%小%' OR age > 18
        QueryWrapper<UserInfoEntity> queryWrapper4 = new QueryWrapper<>();
        queryWrapper4.lambda().like(UserInfoEntity::getName,"小");
        queryWrapper4.lambda().or().gt(UserInfoEntity::getAge,18);
        List<UserInfoEntity> userInfoEntityList4 = userInfoService.list(queryWrapper4);
        result.put("studentOr",userInfoEntityList4);
        //查詢評價不爲null的學生,並且分頁
        //等價SQL: SELECT id,name,age,skill,evaluate,fraction FROM user_info WHERE evaluate IS NOT NULL LIMIT 0,5
        IPage<UserInfoEntity> page = new Page<>();
        page.setCurrent(1);
        page.setSize(5);
        QueryWrapper<UserInfoEntity> queryWrapper5 = new QueryWrapper<>();
        queryWrapper5.lambda().isNotNull(UserInfoEntity::getEvaluate);
        page = userInfoService.page(page,queryWrapper5);
        result.put("studentPage",page);
        return result;
    }
}

4 自定義SQL

引入Mybatis-Plus不會對項目現有的 Mybatis 構架產生任何影響,而且Mybatis-Plus支持所有 Mybatis 原生的特性,這也是我喜歡使用它的原因之一,由於某些業務複雜,我們可能要自己去寫一些比較複雜的SQL語句,我們舉一個簡單的例子來演示自定義SQL.

示例:查詢大於設置分數的學生(分數爲動態輸入,且有分頁)

4.1 編寫Mapper.xml文件

<mapper namespace="com.dao.UserInfoDao">
  
    <select id="selectUserInfoByGtFraction" resultType="com.mp.demo.entity.UserInfoEntity" parameterType="long">
    SELECT * FROM user_info WHERE fraction > #{fraction}
    </select>
</mapper>

4.2 在DAO中加入方法

/**
     * 查詢大於該分數的學生
     * @Author Sans
     * @CreateTime 2019/6/9 14:28
     * @Param  page  分頁參數
     * @Param  fraction  分數
     * @Return IPage<UserInfoEntity> 分頁數據
     */
    IPage<UserInfoEntity> selectUserInfoByGtFraction(IPage<UserInfoEntity> page, Long fraction);

4.3 在service中加入方法

  /**
     * 查詢大於該分數的學生
     * @Author Sans
     * @CreateTime 2019/6/9 14:27
     * @Param  page  分頁參數
     * @Param  fraction  分數
     * @Return IPage<UserInfoEntity> 分頁數據
     */
    IPage<UserInfoEntity> selectUserInfoByGtFraction(IPage<UserInfoEntity> page,Long fraction);

4.4 在在serviceImpl加入方法

    /**
     * 查詢大於該分數的學生
     * @Author Sans
     * @CreateTime 2019/6/9 14:27
     * @Param  page  分頁參數
     * @Param  fraction  分數
     * @Return IPage<UserInfoEntity> 分頁數據
     */
    @Override
    public IPage<UserInfoEntity> selectUserInfoByGtFraction(IPage<UserInfoEntity> page, Long fraction) {
        return this.baseMapper.selectUserInfoByGtFraction(page,fraction);
    }

4.5 在Controller中測試

    /**
     * MP自定義SQL
     * @Author Sans
     * @CreateTime 2019/6/9 14:37
     * @Return IPage<UserInfoEntity> 分頁數據
     */
    @RequestMapping("/getInfoListSQL")
    public IPage<UserInfoEntity> getInfoListSQL(){
        //查詢大於60分以上的學生,並且分頁
        IPage<UserInfoEntity> page = new Page<>();
        page.setCurrent(1);
        page.setSize(5);
        page = userInfoService.selectUserInfoByGtFraction(page,60L);
        return page;
    }

轉載地址爲:
https://mp.weixin.qq.com/s?__biz=MzU2MTI4MjI0MQ==&mid=2247487238&idx=2&sn=7817f65c2c85bc867b4fb35cacf3f94f&chksm=fc7a62a8cb0debbead3d4bd5868103b2fc13fc4f1d87eeddfe5ad19fd042a2189b1a9cf3f4b6&mpshare=1&scene=23&srcid=08306ZyTODKmbtq4zuF8ZOpV&sharer_sharetime=1567155004097&sharer_shareid=1e3b61ef8ad1de53ab0a082002bf7bc8#rd

它的公衆號是:後端技術精選

本文章和原文章有很多不同的地方改動

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章