SpringBoot整合MyBatis-Plus3.1詳細(xì)教程

一.說(shuō)明

Mybatis-Plus是一個(gè)Mybatis框架的增強(qiáng)插件,根據(jù)官方描述,MP只做增強(qiáng)不做改變,引入它不會(huì)對(duì)現(xiàn)有工程產(chǎn)生影響,如絲般順滑.并且只需簡(jiǎn)單配置,即可快速進(jìn)行 CRUD 操作,從而節(jié)省大量時(shí)間.代碼生成,分頁(yè),性能分析等功能一應(yīng)俱全,最新已經(jīng)更新到了3.1.1版本了,3.X系列支持lambda語(yǔ)法,讓我在寫條件構(gòu)造的時(shí)候少了很多的"魔法值",從代碼結(jié)構(gòu)上更簡(jiǎn)潔了.

二.項(xiàng)目環(huán)境

MyBatis-Plus版本: 3.1.0

SpringBoot版本:2.1.5

JDK版本:1.8

Maven依賴如下:

<dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </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 核心庫(kù) --> 
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.1.0</version>
        </dependency>
        <!-- 引入阿里數(shù)據(jù)庫(kù)連接池 --> 
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.1.6</version>
        </dependency></dependencies>

配置如下:

# 配置端口server:
  port: 8081
spring:
  # 配置數(shù)據(jù)源
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/mp_student?useUnicode=true&characterEncoding=utf-8
    username: root
    password: root
    type: com.alibaba.druid.pool.DruidDataSource
# mybatis-plus相關(guān)配置
mybatis-plus:
  # xml掃描,多個(gè)目錄用逗號(hào)或者分號(hào)分隔(告訴 Mapper 所對(duì)應(yīng)的 XML 文件位置)
  mapper-locations: classpath:mapper/*.xml
  # 以下配置均有默認(rèn)值,可以不設(shè)置
  global-config:
    db-config: 
     #主鍵類型 auto:"數(shù)據(jù)庫(kù)ID自增" 1:"用戶輸入ID",2:"全局唯一ID (數(shù)字類型唯一ID)", 3:"全局唯一ID UUID";
      id-type: auto
      #字段策略 IGNORED:"忽略判斷"  NOT_NULL:"非 NULL 判斷")  NOT_EMPTY:"非空判斷"
      field-strategy: NOT_EMPTY
      #數(shù)據(jù)庫(kù)類型
      db-type: MYSQL
  configuration:
    # 是否開啟自動(dòng)駝峰命名規(guī)則映射:從數(shù)據(jù)庫(kù)列名到Java屬性駝峰命名的類似映射
    map-underscore-to-camel-case: true
    # 如果查詢結(jié)果中包含空值的列,則 MyBatis 在映射的時(shí)候,不會(huì)映射這個(gè)字段
    call-setters-on-nulls: true
    # 這個(gè)配置會(huì)將執(zhí)行的sql打印出來(lái),在開發(fā)或測(cè)試的時(shí)候可以用
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

表結(jié)構(gòu):

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 '評(píng)價(jià)', 
 `fraction` bigint(11) DEFAULT NULL COMMENT '分?jǐn)?shù)', 
 PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=16 DEFAULT CHARSET=utf8mb4 COMMENT='學(xué)生信息表';

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

INSERT INTO `user_info` VALUES (1, '小明', 20, '畫畫', '該學(xué)生在畫畫方面有一定天賦', 89);
INSERT INTO `user_info` VALUES (2, '小蘭', 19, '游戲', '近期該學(xué)生由于游戲的原因?qū)е路謹(jǐn)?shù)降低了', 64);
INSERT INTO `user_info` VALUES (3, '張張', 18, '英語(yǔ)', '近期該學(xué)生參加英語(yǔ)比賽獲得二等獎(jiǎng)', 90);
INSERT INTO `user_info` VALUES (4, '大黃', 20, '體育', '該學(xué)生近期由于參加籃球比賽,導(dǎo)致腳傷', 76);
INSERT INTO `user_info` VALUES (5, '大白', 17, '繪畫', '該學(xué)生參加美術(shù)大賽獲得三等獎(jiǎng)', 77);
INSERT INTO `user_info` VALUES (7, '小龍', 18, 'JAVA', '該學(xué)生是一個(gè)在改BUG的碼農(nóng)', 59);
INSERT INTO `user_info` VALUES (9, 'Sans', 18, '睡覺', 'Sans是一個(gè)愛睡覺,并且身材較矮骨骼巨大的骷髏小胖子', 60);
INSERT INTO `user_info` VALUES (10, 'papyrus', 18, 'JAVA', 'Papyrus是一個(gè)講話大聲、個(gè)性張揚(yáng)的骷髏,給人自信、有魅力的骷髏小瘦子', 58);
INSERT INTO `user_info` VALUES (11, '刪除數(shù)據(jù)1', 3, '畫肖像', NULL, 61);
INSERT INTO `user_info` VALUES (12, '刪除數(shù)據(jù)2', 3, NULL, NULL, 61);
INSERT INTO `user_info` VALUES (13, '刪除數(shù)據(jù)3', 3, NULL, NULL, 61);
INTO `user_info` VALUES (14, '刪除數(shù)據(jù)4', 5, '刪除', NULL, 10);
INSERT INTO `user_info` VALUES (15, '刪除數(shù)據(jù)5', 6, '刪除', NULL, 10);

二.編寫基礎(chǔ)類

在啟動(dòng)類上添加掃描DAO的注解

@SpringBootApplication
@MapperScan(basePackages = {"com.mp.demo.dao"}) //掃描DAO
public class DemoApplication {
    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }
}

編寫Config配置類

/**
 * @Description MybatisPlus配置類
 * @Author Sans
 * @CreateTime 2019/5/26 17:20
 */
@Configuration
public class MybatisPlusConfig {
    /**
     * mybatis-plus SQL執(zhí)行效率插件【生產(chǎn)環(huán)境可以關(guān)閉】
     */
    @Bean
    public PerformanceInterceptor performanceInterceptor() {
        return new PerformanceInterceptor();
    } 
   /** 
    * 分頁(yè)插件
    */    
    @Bean
    public PaginationInterceptor paginationInterceptor() {
        return new PaginationInterceptor(); 
   }
}

編寫Entity類

/**
 * @Description 學(xué)生信息實(shí)體類
 * @Author Sans
 * @CreateTime 2019/5/26 21:41
 */
@Data@TableName("user_info")//@TableName中的值對(duì)應(yīng)著表名
public class UserInfoEntity {
     /**
     * 主鍵
     * @TableId中可以決定主鍵的類型,不寫會(huì)采取默認(rèn)值,默認(rèn)值可以在yml中配置
     * AUTO: 數(shù)據(jù)庫(kù)ID自增
     * INPUT: 用戶輸入ID
     * ID_WORKER: 全局唯一ID,Long類型的主鍵
     * ID_WORKER_STR: 字符串全局唯一ID
     * UUID: 全局唯一ID,UUID類型的主鍵
     * NONE: 該類型為未設(shè)置主鍵類型
     */    
@TableId(type = IdType.AUTO)
    private Long id;
    /**
     * 姓名
     */
    private String name;
    /**
     * 年齡
     */
    private Integer age;
    /**
     * 技能
     */
    private String skill;
    /**
     * 評(píng)價(jià)
     */
    private String evaluate;
    /**
     * 分?jǐn)?shù)
     */
    private Long fraction;
}

編寫Dao類

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

編寫Service類

/**
 * @Description 用戶業(yè)務(wù)接口
 * @Author Sans
 * @CreateTime 2019/6/8 16:26 
 */
public interface UserInfoService extends IService<UserInfoEntity> {
}

編寫ServiceImpl類

/**
 * @Description 用戶業(yè)務(wù)實(shí)現(xiàn)
 * @Author Sans 
* @CreateTime 2019/6/8 16:26
 */
@Service
@Transactional
public class UserInfoSerivceImpl extends ServiceImpl<UserInfoDao, UserInfoEntity> implements UserInfoService {
}

三.MyBatis-Plus基礎(chǔ)演示

這里我們看到,service中我們沒有寫任何方法,MyBatis-Plus官方封裝了許多基本CRUD的方法,可以直接使用大量節(jié)約時(shí)間,MP共通方法詳見IService,ServiceImpl,BaseMapper源碼,寫入操作在ServiceImpl中已有事務(wù)綁定,這里我們舉一些常用的方法演示.

/**
 * @Description UserInfoController
 * @Author Sans
 * @CreateTime 2019/6/8 16:27
 */
@RestController
@RequestMapping("/userInfo")
public class UserInfoController {
     @Autowired
    private UserInfoService userInfoService;
     /**
     * 根據(jù)ID獲取用戶信息
     * @Author Sans
     * @CreateTime 2019/6/8 16:34
     * @Param  userId  用戶ID
     * @Return UserInfoEntity 用戶實(shí)體
     */
    @RequestMapping("/getInfo")
    public UserInfoEntity getInfo(String userId){
        UserInfoEntity userInfoEntity = userInfoService.getById(userId);
        return userInfoEntity;
    }
    /**
     * 查詢?nèi)啃畔?     * @Author Sans
     * @CreateTime 2019/6/8 16:35
     * @Param  userId  用戶ID
     * @Return List<UserInfoEntity> 用戶實(shí)體集合
     */
    @RequestMapping("/getList")
    public List<UserInfoEntity> getList(){
        List<UserInfoEntity> userInfoEntityList = userInfoService.list();
        return userInfoEntityList;
    }
    /**
     * 分頁(yè)查詢?nèi)繑?shù)據(jù)
     * @Author Sans
     * @CreateTime 2019/6/8 16:37
     * @Return IPage<UserInfoEntity> 分頁(yè)數(shù)據(jù)
     */    @RequestMapping("/getInfoListPage")
    public IPage<UserInfoEntity> getInfoListPage(){
        //需要在Config配置類中配置分頁(yè)插件
        IPage<UserInfoEntity> page = new Page<>();
        page.setCurrent(5); //當(dāng)前頁(yè)
        page.setSize(1);    //每頁(yè)條數(shù)
        page = userInfoService.page(page);
        return page;
    }
    /**
     * 根據(jù)指定字段查詢用戶信息集合
     * @Author Sans
     * @CreateTime 2019/6/8 16:39
     * @Return Collection<UserInfoEntity> 用戶實(shí)體集合
     */
    @RequestMapping("/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
     */
    @RequestMapping("/saveInfo")
    public void saveInfo(){
        UserInfoEntity userInfoEntity = new UserInfoEntity();
        userInfoEntity.setName("小龍");
        userInfoEntity.setSkill("JAVA");
        userInfoEntity.setAge(18);
        userInfoEntity.setFraction(59L);
        userInfoEntity.setEvaluate("該學(xué)生是一個(gè)在改BUG的碼農(nóng)");
        userInfoService.save(userInfoEntity);
    }
    /**
     * 批量新增用戶信息
     * @Author Sans
     * @CreateTime 2019/6/8 16:42
     */
    @RequestMapping("/saveInfoList")
    public void saveInfoList(){
        //創(chuàng)建對(duì)象
        UserInfoEntity sans = new UserInfoEntity();
        sans.setName("Sans");
        sans.setSkill("睡覺");
        sans.setAge(18);
        sans.setFraction(60L);
        sans.setEvaluate("Sans是一個(gè)愛睡覺,并且身材較矮骨骼巨大的骷髏小胖子");
        UserInfoEntity papyrus = new UserInfoEntity();
        papyrus.setName("papyrus");
        papyrus.setSkill("JAVA");
        papyrus.setAge(18);
        papyrus.setFraction(58L);
        papyrus.setEvaluate("Papyrus是一個(gè)講話大聲、個(gè)性張揚(yáng)的骷髏,給人自信、有魅力的骷髏小瘦子");
        //批量保存
        List<UserInfoEntity> list =new ArrayList<>();
        list.add(sans);
        list.add(papyrus);
        userInfoService.saveBatch(list);
    }
    /**
     * 更新用戶信息
     * @Author Sans
     * @CreateTime 2019/6/8 16:47
     */
    @RequestMapping("/updateInfo")
    public void updateInfo(){
        //根據(jù)實(shí)體中的ID去更新,其他字段如果值為null則不會(huì)更新該字段,參考yml配置文件
        UserInfoEntity userInfoEntity = new UserInfoEntity();
        userInfoEntity.setId(1L);
        userInfoEntity.setAge(19);
        userInfoService.updateById(userInfoEntity);
    }
    /**
     * 新增或者更新用戶信息
     * @Author Sans
     * @CreateTime 2019/6/8 16:50
     */
    @RequestMapping("/saveOrUpdateInfo")
    public void saveOrUpdate(){
        //傳入的實(shí)體類userInfoEntity中ID為null就會(huì)新增(ID自增)
        //實(shí)體類ID值存在,如果數(shù)據(jù)庫(kù)存在ID就會(huì)更新,如果不存在就會(huì)新增
        UserInfoEntity userInfoEntity = new UserInfoEntity();
        userInfoEntity.setId(1L);
        userInfoEntity.setAge(20);
        userInfoService.saveOrUpdate(userInfoEntity);
    }
    /**
     * 根據(jù)ID刪除用戶信息
     * @Author Sans
     * @CreateTime 2019/6/8 16:52
     */
    @RequestMapping("/deleteInfo")
    public void deleteInfo(String userId){
        userInfoService.removeById(userId);
    }
    /**
     * 根據(jù)ID批量刪除用戶信息
     * @Author Sans
     * @CreateTime 2019/6/8 16:55
     */
    @RequestMapping("/deleteInfoList")
    public void deleteInfoList(){
        List<String> userIdlist = new ArrayList<>();
        userIdlist.add("12");
        userIdlist.add("13");
        userInfoService.removeByIds(userIdlist);
    }
    /**
     * 根據(jù)指定字段刪除用戶信息
     * @Author Sans
     * @CreateTime 2019/6/8 16:57
     */
    @RequestMapping("/deleteInfoMap")
    public void deleteInfoMap(){
        //kay是字段名 value是字段值
        Map<String,Object> map = new HashMap<>();
        map.put("skill","刪除");
        map.put("fraction",10L);
        userInfoService.removeByMap(map);
    }
}

四.MyBatis-Plus的QueryWrapper條件構(gòu)造器

當(dāng)查詢條件復(fù)雜的時(shí)候,我們可以使用MP的條件構(gòu)造器,請(qǐng)參考下面的QueryWrapper條件參數(shù)說(shuō)明

查詢方式 方法說(shuō)明
setSqlSelect 設(shè)置 SELECT 查詢字段
where WHERE 語(yǔ)句,拼接 + WHERE 條件
and AND 語(yǔ)句,拼接 + AND 字段=值
or OR 語(yǔ)句,拼接 + OR 字段=值
eq 等于=
allEq 基于 map 內(nèi)容等于=
ne 不等于<>
gt 大于>
ge 大于等于>=
lt 小于<
le 小于等于<=
like 模糊查詢 LIKE
notLike 模糊查詢 NOT LIKE
in IN 查詢
notIn NOT IN 查詢
isNull NULL 值查詢
isNotNull IS NOT NULL
groupBy 分組 GROUP BY
having HAVING 關(guān)鍵詞
orderBy 排序 ORDER BY
orderByAsc ASC 排序 ORDER BY
orderByDesc DESC 排序 ORDER BY
exists EXISTS 條件語(yǔ)句
notExists NOT EXISTS 條件語(yǔ)句
between BETWEEN 條件語(yǔ)句
notBetween NOT BETWEEN 條件語(yǔ)句
addFilter 自由拼接 SQL
last 拼接在最后,例如:last("LIMIT 1")

下面我們來(lái)舉一些常見的示例

/**
 * @Description UserInfoPlusController
 * @Author Sans
 * @CreateTime 2019/6/9 14:52
 */
@RestController
@RequestMapping("/userInfoPlus")
public class UserInfoPlusController {
     @Autowired
     private UserInfoService userInfoService;
     /**
     * MP擴(kuò)展演示
     * @Author Sans
     * @CreateTime 2019/6/8 16:37
     * @Return Map<String,Object> 返回?cái)?shù)據(jù)
     */
    @RequestMapping("/getInfoListPlus")
    public Map<String,Object> getInfoListPage(){
        //初始化返回類
        Map<String,Object> result = new HashMap<>();
        //查詢年齡等于18歲的學(xué)生
        //等價(jià)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歲的學(xué)生且小于等于18歲的學(xué)生
        //等價(jià)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);
        //模糊查詢技能字段帶有"畫"的數(shù)據(jù),并按照年齡降序
        //等價(jià)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的學(xué)生
        //等價(jià)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);
        //查詢?cè)u(píng)價(jià)不為null的學(xué)生,并且分頁(yè)
        //等價(jià)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;
    }
}

五.自定義SQL

引入Mybatis-Plus不會(huì)對(duì)項(xiàng)目現(xiàn)有的 Mybatis 構(gòu)架產(chǎn)生任何影響,而且Mybatis-Plus支持所有 Mybatis 原生的特性,這也是我喜歡使用它的原因之一,由于某些業(yè)務(wù)復(fù)雜,我們可能要自己去寫一些比較復(fù)雜的SQL語(yǔ)句,我們舉一個(gè)簡(jiǎn)單的例子來(lái)演示自定義SQL.

示例:查詢大于設(shè)置分?jǐn)?shù)的學(xué)生(分?jǐn)?shù)為動(dòng)態(tài)輸入,且有分頁(yè))

編寫Mapper.xml文件

<mapper namespace="com.mp.demo.dao.UserInfoDao">
    <!-- Sans 2019/6/9 14:35 -->
    <select id="selectUserInfoByGtFraction" resultType="com.mp.demo.entity.UserInfoEntity" parameterType="long">
    SELECT * FROM user_info WHERE fraction > #{fraction}
    </select>
</mapper>

在DAO中加入方法

    /**     * 查詢大于該分?jǐn)?shù)的學(xué)生
     * @Author Sans
     * @CreateTime 2019/6/9 14:28
     * @Param  page  分頁(yè)參數(shù)
     * @Param  fraction  分?jǐn)?shù)
     * @Return IPage<UserInfoEntity> 分頁(yè)數(shù)據(jù)
     */
    IPage<UserInfoEntity> selectUserInfoByGtFraction(IPage<UserInfoEntity> page, Long fraction);

在service加入方法

    /**
     * 查詢大于該分?jǐn)?shù)的學(xué)生
     * @Author Sans
     * @CreateTime 2019/6/9 14:27
     * @Param  page  分頁(yè)參數(shù)
     * @Param  fraction  分?jǐn)?shù)
     * @Return IPage<UserInfoEntity> 分頁(yè)數(shù)據(jù)
     */
    IPage<UserInfoEntity> selectUserInfoByGtFraction(IPage<UserInfoEntity> page,Long fraction);

在serviceImpl加入方法

    /**
     * 查詢大于該分?jǐn)?shù)的學(xué)生
     * @Author Sans
     * @CreateTime 2019/6/9 14:27
     * @Param  page  分頁(yè)參數(shù)
     * @Param  fraction  分?jǐn)?shù)
     * @Return IPage<UserInfoEntity> 分頁(yè)數(shù)據(jù)
     */
    @Override
    public IPage<UserInfoEntity> selectUserInfoByGtFraction(IPage<UserInfoEntity> page, Long fraction) {  
      return this.baseMapper.selectUserInfoByGtFraction(page,fraction);
    }

在Controller中測(cè)試

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

六.項(xiàng)目源碼

個(gè)人確實(shí)很喜歡用MyBatis-Plus,不僅節(jié)約時(shí)間,代碼也簡(jiǎn)潔干凈,它給了我那時(shí)候從SSM到SpringBoot過(guò)度的那種感覺

嗯,這玩意真香~

謝謝大家閱讀,如果喜歡,請(qǐng)收藏點(diǎn)贊,文章不足之處,也請(qǐng)給出寶貴意見.

轉(zhuǎn)載于:https://juejin.im/post/5cfa6e465188254ee433bc69

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 一、MyBatis vs JPA 1、MyBatis優(yōu)勢(shì) (1)自由控制 SQL語(yǔ)句,可手動(dòng)優(yōu)化SQL語(yǔ)句 (2)...
    sdouclzh閱讀 5,051評(píng)論 0 0
  • mybatis-plus官網(wǎng):https://mybatis.plus springboot 2.1.7maven...
    佛系千樹閱讀 7,483評(píng)論 1 2
  • 1. 簡(jiǎn)介 1.1 什么是 MyBatis ? MyBatis 是支持定制化 SQL、存儲(chǔ)過(guò)程以及高級(jí)映射的優(yōu)秀的...
    笨鳥慢飛閱讀 6,241評(píng)論 0 4
  • Mybatis介紹 MyBatis 本是apache的一個(gè)開源項(xiàng)目iBatis, 2010年這個(gè)項(xiàng)目由apache...
    day_Sunny閱讀 2,902評(píng)論 0 6
  • 前言 本篇將完成DAO層的設(shè)計(jì)與開發(fā),包括: 數(shù)據(jù)庫(kù)、DAO實(shí)體與接口設(shè)計(jì)與編碼 基于MyBatis實(shí)現(xiàn)DAO編程...
    MOVE1925閱讀 1,480評(píng)論 0 4

友情鏈接更多精彩內(nèi)容