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)
在使用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)加以實踐搞坝,熟練操作搔谴。