SpringBoot整合mybatis-plus

mybatis-plus官網(wǎng):https://mybatis.plus

springboot 2.1.7
maven 3.5.0
mysql 5.7.24
mybatis-plus 3.2.0

一、新建SpringBoot項目

在mybatis-plus官網(wǎng)上看到:

引入 MyBatis-Plus 之后請不要再次引入 MyBatis 以及 MyBatis-Spring柬赐,以避免因版本差異導(dǎo)致的問題兰迫。

因此我選擇了新建項目整合嘗試。

1.pom文件maven依賴如下所示:
<dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
        </dependency>
        <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</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <!-- mybatis-plus依賴 -->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.2.0</version>
        </dependency>
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus</artifactId>
            <version>3.2.0</version>
        </dependency>
    </dependencies>
2.application.yml配置文件如下所示:
#自定義項目端口號
server:
  port: 6000
  session-timeout: 30
  tomcat.max-threads: 0
  tomcat.uri-encoding: UTF-8

#mysql
spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/demo
    username: root
    password: 123456
3.啟動類配置 MapperScan 注解
package com.liulin.demo;

import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@MapperScan("com.liulin.demo.mapper")
@SpringBootApplication
public class DemoApplication {

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

4.項目結(jié)構(gòu)
項目結(jié)構(gòu)

在使用maven等構(gòu)建工具時,默認會將源碼(java文件夾)編譯后再加上資源目錄(resources文件夾)的文件放到target目錄下作為最后運行的文件起胰,xml文件放到Java文件夾里升酣,編譯時會被maven忽略,因此常采用在resources下新建文件夾煞茫,用來存放mapper的xml文件帕涌。

二、代碼準備

1.表結(jié)構(gòu)
這里我使用了MP官網(wǎng)給的表续徽。

CREATE TABLE user (
  id BIGINT(20) NOT NULL COMMENT '主鍵ID',
  name VARCHAR(30) NULL DEFAULT NULL COMMENT '姓名',
  age INT(11) NULL DEFAULT NULL COMMENT '年齡',
  email VARCHAR(50) NULL DEFAULT NULL COMMENT '郵箱',
  PRIMARY KEY (id)
);

其對應(yīng)的數(shù)據(jù)庫Data腳本:

INSERT INTO user (id, name, age, email) VALUES
(1, 'Jone', 18, 'test1@baomidou.com'),
(2, 'Jack', 20, 'test2@baomidou.com'),
(3, 'Tom', 28, 'test3@baomidou.com'),
(4, 'Sandy', 21, 'test4@baomidou.com'),
(5, 'Billie', 24, 'test5@baomidou.com'),
(6, 'JackSon', 27, 'test6@baomidou.com');

2.實體類

@Data
public class User {
    private Long id;
    private String name;
    private Integer age;
    private String email;
}

3.DAO層

Mapper通用CRUD封裝BaseMapper接口蚓曼,自動解析實體表關(guān)系映射轉(zhuǎn)換為 Mybatis 內(nèi)部對象注入容器

package com.liulin.demo.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.liulin.demo.entity.User;

/**
 * Created by liulin on 2019-08-29 23:44
 */
public interface UserMapper extends BaseMapper<User> {
}

4.Service層

通用Service CRUD封裝IService接口
get 查詢單行
remove 刪除
list 查詢集合
page 分頁

(1) Service類

package com.liulin.demo.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.liulin.demo.entity.User;

/**
 * Created by liulin on 2019-09-02 23:48
 */
public interface UserService extends IService<User> {
}

(2) ServiceImpl類

package com.liulin.demo.service.impl;

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.liulin.demo.entity.User;
import com.liulin.demo.mapper.UserMapper;
import com.liulin.demo.service.UserService;
import org.springframework.stereotype.Service;

/**
 * Created by liulin on 2019-09-02 23:57
 */
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {
}

5.Controller層

package com.liulin.demo.controller;

import com.liulin.demo.entity.User;
import com.liulin.demo.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * Created by liulin on 2019-09-03 14:43
 */
@RestController
@RequestMapping("/user")
public class UserController {
    
    @Autowired UserService userService;

    @PostMapping("/getUserInfo")
    public User getUserInfo(Integer userId) {
        User user = userService.getById(userId);
        return user;
    }
}

三、Postman調(diào)試

1.以getUserInfo方法為例

Postman(localhost:6000/user/getUserInfo?userId=1)輸出結(jié)果如下:

{
    "id":1,
    "name":"Jone",
    "age":18,
    "email":"test1@baomidou.com"
}

可以看到钦扭,Service纫版、Mapper一個方法都沒寫的情況下,從表里查出了userId為1的全部信息客情,省去了mybatis中xml的sql查詢那一步其弊,在官方給出的文檔中,可以看到基本上都是基于主鍵id返回單一實體或?qū)嶓wlist膀斋。

2.條件構(gòu)造器

(1)查詢年齡等于28的結(jié)果
因為表是自建梭伐,age=18的結(jié)果只有1條,所以這里使用的是IService的getOne方法概页,如果是多條結(jié)果的話籽御,該方法就會報錯。

@PostMapping("/getUserByAge")
public User getUserByAge(int age) {
    QueryWrapper<User> queryWrapper = new QueryWrapper<>();
    //lambda寫法:
    queryWrapper.lambda().eq(User::getAge, age);
    User user = userService.getOne(queryWrapper);
    return user;
}

Postman(localhost:6000/user/getUserByAge?age=18)輸出結(jié)果如下:

{
    "id": 3,
    "name": "Tom",
    "age": 28,
    "email": "test3@baomidou.com"
}

(2)查詢年齡大于20小于25的結(jié)果

    @PostMapping("/getUserListByAgeLimit")
    public List<User> getUserListByAgeLimit() {
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        queryWrapper.lambda().gt(User::getAge, 20);
        queryWrapper.lambda().lt(User::getAge, 25);
        List<User> userList = userService.list(queryWrapper);
        return userList;
    }

Postman(localhost:6000/user/getUserListByAgeLimit)輸出結(jié)果如下:

[
    {
        "id": 4,
        "name": "Sandy",
        "age": 21,
        "email": "test4@baomidou.com"
    },
    {
        "id": 5,
        "name": "Billie",
        "age": 24,
        "email": "test5@baomidou.com"
    }
]

(3)自定義sql
使用Wrapper構(gòu)造條件自定義sql子句,官網(wǎng)提供了兩種方案:

第一種:Mapper.java使用注解
package com.liulin.demo.mapper;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.toolkit.Constants;
import com.liulin.demo.entity.User;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;

import java.util.List;

/**
 * Created by liulin on 2019-08-29 23:44
 */
public interface UserMapper extends BaseMapper<User> {

    @Select("select * from user ${ew.customSqlSegment} ")
    List<User> getUserListByCondition(@Param(Constants.WRAPPER) QueryWrapper<User> condition);
}

Service層

package com.liulin.demo.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.liulin.demo.entity.User;

import java.util.List;

/**
 * Created by liulin on 2019-09-02 23:48
 */
public interface UserService extends IService<User> {

    List<User> getUserListByCondition(String name);
    
}

ServiceImpl類

package com.liulin.demo.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.liulin.demo.entity.User;
import com.liulin.demo.mapper.UserMapper;
import com.liulin.demo.service.UserService;
import org.springframework.stereotype.Service;

import java.util.List;

/**
 * Created by liulin on 2019-09-02 23:57
 */
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {

    @Override
    public List<User> getUserListByCondition(String name) {
        QueryWrapper<User> condition = new QueryWrapper<>();
        //like模糊查詢且年齡小于25
        condition.lambda().like(User::getName, name).lt(User::getAge, 25);
        return baseMapper.getUserListByCondition(condition);
    }
}

Controller層

    @PostMapping("/getUserListBySql")
    public List<User> getUserListBySql(String name) {
        List<User> userList = userService.getUserListByCondition(name);
        return userList;
    }

Postman(localhost:6000/user/getUserListBySql?name=Jac)輸出結(jié)果如下:

[
    {
        "id": 2,
        "name": "Jack",
        "age": 20,
        "email": "test2@baomidou.com"
    }
]
第二種:Mapper.xml文件
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.liulin.demo.mapper.UserMapper">
    
    <select id="getUserListByCondition" resultType="com.liulin.demo.entity.User">
        SELECT * FROM user where name = #{name}
    </select>
</mapper>

四、其他

1.mybatis-plus配置執(zhí)行sql輸出到控制臺
application.yml文件:

mybatis-plus:
  configuration:
    #控制臺打印完整帶參數(shù)SQL語句
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

有SQL執(zhí)行時技掏,控制臺輸出結(jié)果如下:

JDBC Connection [HikariProxyConnection@1882318550 wrapping com.mysql.cj.jdbc.ConnectionImpl@2022fa88] will not be managed by Spring
==>  Preparing: SELECT id,name,email,age FROM user WHERE (age = ?) 
==> Parameters: 28(Integer)
<==    Columns: id, name, email, age
<==        Row: 3, Tom, test3@baomidou.com, 28
<==      Total: 1
Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@3291f605]

2.使用Mapper.xml形式時配置文件
application.yml文件

mybatis-plus:
  configuration:
    #控制臺打印完整帶參數(shù)SQL語句
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
  #resources目錄下
  mapper-locations: classpath:/mapper/**.xml

總結(jié):

1铃将、mybatis-plus是mybatis的增強版,在MyBatis的基礎(chǔ)上只做增強不做改變哑梳。
2劲阎、mybatis-plus官網(wǎng)條件構(gòu)造器一節(jié)中提供了eq、ne鸠真、like悯仙、isNull、having等拼接的方法吠卷,使用lambda寫法使之簡潔有效锡垄,單表操作的情況下,使用Mapper和Service封裝的CURD方法節(jié)約代碼量和工作量祭隔。
3货岭、在多表聯(lián)合復(fù)雜查詢的時候就需要在xml文件里寫sql語句。

以上就是SpringBoot整合mybatis-plus整合學(xué)習(xí)過程疾渴,關(guān)于mybatis-plus方法千贯,只學(xué)習(xí)了select的用法,其他增改刪后期還需結(jié)合官網(wǎng)加以實踐搞坝,熟練操作搔谴。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市桩撮,隨后出現(xiàn)的幾起案子敦第,更是在濱河造成了極大的恐慌,老刑警劉巖店量,帶你破解...
    沈念sama閱讀 217,277評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件申尼,死亡現(xiàn)場離奇詭異,居然都是意外死亡垫桂,警方通過查閱死者的電腦和手機师幕,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評論 3 393
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來诬滩,“玉大人霹粥,你說我怎么就攤上這事√勰瘢” “怎么了后控?”我有些...
    開封第一講書人閱讀 163,624評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長空镜。 經(jīng)常有香客問我浩淘,道長捌朴,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,356評論 1 293
  • 正文 為了忘掉前任张抄,我火速辦了婚禮砂蔽,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘署惯。我一直安慰自己左驾,他們只是感情好,可當我...
    茶點故事閱讀 67,402評論 6 392
  • 文/花漫 我一把揭開白布极谊。 她就那樣靜靜地躺著诡右,像睡著了一般。 火紅的嫁衣襯著肌膚如雪轻猖。 梳的紋絲不亂的頭發(fā)上帆吻,一...
    開封第一講書人閱讀 51,292評論 1 301
  • 那天,我揣著相機與錄音咙边,去河邊找鬼桅锄。 笑死,一個胖子當著我的面吹牛样眠,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播翠肘,決...
    沈念sama閱讀 40,135評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼檐束,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了束倍?” 一聲冷哼從身側(cè)響起被丧,我...
    開封第一講書人閱讀 38,992評論 0 275
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎绪妹,沒想到半個月后甥桂,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,429評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡邮旷,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,636評論 3 334
  • 正文 我和宋清朗相戀三年黄选,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片婶肩。...
    茶點故事閱讀 39,785評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡办陷,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出律歼,到底是詐尸還是另有隱情民镜,我是刑警寧澤,帶...
    沈念sama閱讀 35,492評論 5 345
  • 正文 年R本政府宣布险毁,位于F島的核電站制圈,受9級特大地震影響们童,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜鲸鹦,卻給世界環(huán)境...
    茶點故事閱讀 41,092評論 3 328
  • 文/蒙蒙 一慧库、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧亥鬓,春花似錦完沪、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至熟呛,卻和暖如春宽档,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背庵朝。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評論 1 269
  • 我被黑心中介騙來泰國打工吗冤, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人九府。 一個月前我還...
    沈念sama閱讀 47,891評論 2 370
  • 正文 我出身青樓椎瘟,卻偏偏與公主長得像,于是被迫代替她去往敵國和親侄旬。 傳聞我的和親對象是個殘疾皇子肺蔚,可洞房花燭夜當晚...
    茶點故事閱讀 44,713評論 2 354

推薦閱讀更多精彩內(nèi)容