springboot整合mybatis-plus
一、簡單了解
0、前言
我是再IT技術上探索的求知者,剛進入IT這扇大門,希望能夠通過每天的總結,讓自己變得更加優秀。寫一些,我遇到的一些技術問題,其他的問題,等以后遇到的時候再整理,希望自己能夠堅持下去,並且能給你帶來一些幫助。
1 mybais-plus簡介
MyBatis-Plus (opens new window)(簡稱 MP)是一個 MyBatis (opens new window) 的增強工具,在 MyBatis 的基礎上只做增強不做改變,為簡化開發、提高效率而生。
2 框架結構

二、開始實戰
1 創建數據庫
CREATE DATABASE db_test CHARSET=utf8;
USE db_test;
DROP TABLE tab_student;
CREATE TABLE tab_student(
sid INT PRIMARY KEY AUTO_INCREMENT,
sname VARCHAR(20),
sage INT,
sex VARCHAR(2)
);
INSERT INTO tab_student
VALUES(NULL,SUBSTR(UUID(),1,5),
TRUNCATE(RAND()*10+10,0),IF(RAND()>0.5,"男","女"));
2 創建項目
3 引入依賴
<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>
<version>5.1.45</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>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.3.2</version>
</dependency>
<!--引入fastjson-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.58</version>
</dependency>
4 配置文件
#鏈接數據庫的四大參數
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.url=jdbc:mysql://localhost:3306/db_test?useUnicode=true&characterEncoding=UTF-8
#顯示sql
logging.level.com.baizhou.mapper=debug
server.port=8081
5 創建實體類
@Data
@AllArgsConstructor
@NoArgsConstructor
@TableName(value = "tab_student")
public class Student implements Serializable {
@TableId(value = "sid",type = IdType.AUTO)//指定主鍵,主鍵自增策略,數據庫自增
private Integer sid;
@TableField(value = "sname")
private String sname;
@TableField(value = "sage")
private Integer sage;
@TableField(value = "sex")
private String sex;
}
6 創建dao層
@Repository
public interface StudentMapper extends BaseMapper<Student> {
}
7 創建service層
public interface StudentService {
//增刪改查
int addOne(Student student);
int deleteOne(Integer sid);
int updateOne(Student student);
Student getOne(Integer sid);
List<Student> getAll();
//通過請求進行模糊查詢查詢,通過名字,或者性別,id進行查詢
IPage<Student> getAllByResquest(String request);
//通過名字進行模糊查詢
List<Student> getAllByLike(String sname);
}
import com.alibaba.fastjson.JSONObject;
import com.baizhou.entity.Student;
import com.baizhou.mapper.StudentMapper;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import lombok.val;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class StudentServiceImp implements StudentService {
@Autowired
private StudentMapper studentMapper;//自動裝配
@Override
public int addOne(Student student) {
return studentMapper.insert(student);
}
//@Transactional(isolation = Isolation.READ_UNCOMMITTED):讀取未提交數據(會出現臟讀,
//@Transactional(isolation = Isolation.READ_COMMITTED):讀取已提交數據(會出現不可重復讀和幻讀)
//@Transactional(isolation = Isolation.REPEATABLE_READ):可重復讀(會出現幻讀)
//@Transactional(isolation = Isolation.SERIALIZABLE):串行化
@Override
public int deleteOne(Integer sid) {
val student = studentMapper.selectById(sid);//查詢是否存在
if (student == null) {
return 0;//不存在,刪除失敗
}
studentMapper.deleteById(sid);
return 1;//刪除成功
}
@Override
public int updateOne(Student student) {
return studentMapper.updateById(student);
}
@Override
public Student getOne(Integer sid) {
if (sid == null) {
return null;
}
Student student = studentMapper.selectById(sid);
if (student == null) {
return null;
}
return student;
}
@Override
public List<Student> getAll() {
return studentMapper.selectList(null);
}
/**
* 請求格式:進行分頁查詢,模糊查詢,有sid根據sid查詢,沒有則不根據sid查詢
* {
* "sid":1,
* "sname":"x",
* "sex":"男",
* "pageNum":1,
* "pageSize":1
* }
*/
@Override
public IPage<Student> getAllByResquest(String request) {
//request是json字符串
//把json串轉換成json對象
val requestJson = JSONObject.parseObject(request);
LambdaQueryWrapper<Student> queryWrapper = new LambdaQueryWrapper();
//進行模糊查詢
queryWrapper.eq(requestJson.getString("sid") != null, Student::getSid, requestJson.getString("sid"))
.and(wrapper -> wrapper.like(Student::getSname, requestJson.getString("sname"))
.or().like(Student::getSex, requestJson.getString("sex")
));
//進行分頁查詢
Page page=new Page(requestJson.getInteger("pageNum"),requestJson.getInteger("pageSize"));
IPage<Student> ipage=studentMapper.selectPage(page,queryWrapper);
return ipage;
}
@Override
public List<Student> getAllByLike(String sname) {
val queryWrapper=new LambdaQueryWrapper<Student>();
queryWrapper.like(Student::getSname,sname);
return studentMapper.selectList(queryWrapper);
}
}
8 測試
@SpringBootTest
class SpringbootMybatisPlusApplicationTests {
@Autowired
private StudentService studentService;
@Test
void setStudentServiceTest() {
studentService.getAll();
studentService.getAllByLike("3");
String requestJson= "{ \"sid\":1, \"sname\":\"x\", \"sex\":\"男\", \"pageNum\":1, \"pageSize\":1 }";
String requestJson2= "{ \"sname\":\"3\", \"sex\":\"男\", \"pageNum\":1, \"pageSize\":5 }";
studentService.getAllByResquest(requestJson);
studentService.getAllByResquest(requestJson2);
}
}
studentService.getAll();
==> Preparing: SELECT sid,sname,sage,sex FROM tab_student
2021-07-27 23:35:45.005 DEBUG 1600 --- [ main] c.b.mapper.StudentMapper.selectList : ==> Parameters:
2021-07-27 23:35:45.026 DEBUG 1600 --- [ main] c.b.mapper.StudentMapper.selectList : <== Total: 9
studentService.getAllByLike("3");
==> Preparing: SELECT sid,sname,sage,sex FROM tab_student WHERE (sname LIKE ?)
2021-07-27 23:35:45.069 DEBUG 1600 --- [ main] c.b.mapper.StudentMapper.selectList : ==> Parameters: %3%(String)
2021-07-27 23:35:45.073 DEBUG 1600 --- [ main] c.b.mapper.StudentMapper.selectList : <== Total: 9
studentService.getAllByResquest(requestJson);
2021-07-27 23:35:45.159 DEBUG 1600 --- [ main] c.b.mapper.StudentMapper.selectPage : ==> Preparing: SELECT sid,sname,sage,sex FROM tab_student WHERE (sid = ? AND (sname LIKE ? OR sex LIKE ?))
2021-07-27 23:35:45.159 DEBUG 1600 --- [ main] c.b.mapper.StudentMapper.selectPage : ==> Parameters: 1(String), %x%(String), %男%(String)
2021-07-27 23:35:45.160 DEBUG 1600 --- [ main] c.b.mapper.StudentMapper.selectPage : <== Total: 0
studentService.getAllByResquest(requestJson2);
2021-07-27 23:35:45.163 DEBUG 1600 --- [ main] c.b.mapper.StudentMapper.selectPage : ==> Preparing: SELECT sid,sname,sage,sex FROM tab_student WHERE ((sname LIKE ? OR sex LIKE ?))
2021-07-27 23:35:45.163 DEBUG 1600 --- [ main] c.b.mapper.StudentMapper.selectPage : ==> Parameters: %3%(String), %男%(String)
2021-07-27 23:35:45.164 DEBUG 1600 --- [ main] c.b.mapper.StudentMapper.selectPage : <== Total: 9
三、總結
今天遇到了使用mybatis-plus,進行模糊查詢是and和or進行嵌套的問題,所以寫下了一個小案例。
// A or (B and C)
.eq("a", "A").or(i -> i.eq("b", "B").eq("c", "C"));
// A or (B or C)
.eq("a", "A").or(i -> i.eq("b", "B").or().eq("c", "C"));
// A and (B and C)
.eq("a", "A").and(i -> i.eq("b", "B").eq("c", "C"));
// A and (B or C)
.eq("a", "A").and(i -> i.eq("b", "B").or().eq("c", "C"));