一、MyBatisPlus入门案例与简介
1、入门案例
a、开发方式
- 基于MyBatis使用MP
- 基于Spring使用MP
-
b、SpringBoot整合MyBatis开发过程
创建SpringBoot工程
- 勾选配置使用的技术
- 设置dataSource相关属性
- 定义数据层接口映射配置
c、案例
- 创建项目工程
- 创建数据库及数据表 ```sql create database if not exists db_mybatisplus character set utf8; use db_mybatisplus;
CREATE TABLE tb_user (
user_id
BIGINT(20) PRIMARY KEY auto_increment,
user_name
VARCHAR(32) DEFAULT(“default_name”),
user_pwd
VARCHAR(32) DEFAULT(“default_pwd”),
user_age
INT(3) DEFAULT(21),
user_tel
VARCHAR(32) DEFAULT(“default_tel”)
);
drop table tb_user;
insert into tb_user values(1,’Tom’,’tom’,3,’18866668888’); insert into tb_user values(2,’Jerry’,’jerry’,4,’16688886666’); insert into tb_user values(3,’Jock’,’123456’,41,’18812345678’); insert into tb_user values(4,’zhouge’,’aa’,15,’4006184000’);
SELECT * from tb_user;
3. 修改application.yml
```yaml
spring:
datasource:
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/db_mybatisplus
username: root
password: root
- 创建pojo实体类 ```java package xyz.zhouge.pojo;
import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor;
@Data @NoArgsConstructor @AllArgsConstructor @TableName(“tb_user”) public class User {
@TableId(“user_id”) private long userId ;
@TableField("user_name")
private String userName ;
@TableField("user_pwd")
private String password ;
@TableField("user_age")
private Integer userAge ;
@TableField("user_tel")
private String userTel ;
}
5. 创建dao接口
```java
package xyz.zhouge.dao;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
import xyz.zhouge.pojo.User;
@Mapper
public interface UserDao extends BaseMapper<User>{
}
- 创建service业务层
- 测试
2、MyBatisPlus简介
二、标准数据层开发
1、项目搭建
1,创建项目
2,引入maven依赖
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!-- 引入数据库连接池 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.10</version>
</dependency>
<!-- 引入lombok -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.12</version>
</dependency>
<!-- 引入mybatis-plus -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.4.1</version>
</dependency>
</dependencies>
3,配置yml文件
spring:
datasource:
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://zhouge.xyz:3306/db_mybatisplus
username: admin
password: 991227zg@.
profiles:
active: dev
server:
port: 80
4,创建数据模型
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@NoArgsConstructor
@AllArgsConstructor
@TableName("tb_user")
public class User {
@TableId("user_id")
private long userId ;
@TableField("user_name")
private String userName ;
@TableField("user_pwd")
private String password ;
@TableField("user_age")
private Integer userAge ;
@TableField("user_tel")
private String userTel ;
public User(String userName, String password) {
this.userName = userName;
this.password = password;
}
public User(long userId, String userName, String password) {
this.userId = userId;
this.userName = userName;
this.password = password;
}
}
5,创建数据持久层
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
import xyz.zhouge.pojo.User;
@Mapper
public interface UserDao extends BaseMapper<User>{
}
6,创建测试
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import xyz.zhouge.dao.UserDao;
import xyz.zhouge.pojo.User;
import java.util.List;
@SpringBootTest
public class TestUserService {
@Autowired
private UserService userService;
@Autowired
private UserDao userDao ;
@Test
public void testInsertUser(){
int res = userDao.insert(new User("zhouge1","123456"));
System.out.println(res > 0 ? "添加成功" : "添加失败");
}
@Test
public void testDeleteUser(){
int res = userDao.deleteById(6L);
System.out.println(res > 0 ? "删除成功" : "删除失败");
}
@Test
public void testUpdateUser(){
int res = userDao.updateById(new User(4L,"admin","123456"));
System.out.println(res > 0 ? "修改成功" : "修改失败");
}
@Test
public void testGetAllUsers(){
List<User> users = userService.getAllUsers();
for (User user : users) {
System.out.println(user);
}
}
@Test
public void testGetUserById(){
User user = userDao.selectById(1L);
System.out.println(user);
}
}
2、新增
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import xyz.zhouge.dao.UserDao;
import xyz.zhouge.pojo.User;
import java.util.List;
@SpringBootTest
public class TestUserService {
@Autowired
private UserService userService;
@Autowired
private UserDao userDao ;
@Test
public void testInsertUser(){
int res = userDao.insert(new User("zhouge1","123456"));
System.out.println(res > 0 ? "添加成功" : "添加失败");
}
}
3、删除
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import xyz.zhouge.dao.UserDao;
import xyz.zhouge.pojo.User;
import java.util.List;
@SpringBootTest
public class TestUserService {
@Autowired
private UserService userService;
@Autowired
private UserDao userDao ;
@Test
public void testDeleteUser(){
int res = userDao.deleteById(6L);
System.out.println(res > 0 ? "删除成功" : "删除失败");
}
}
4、修改
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import xyz.zhouge.dao.UserDao;
import xyz.zhouge.pojo.User;
import java.util.List;
@SpringBootTest
public class TestUserService {
@Autowired
private UserService userService;
@Autowired
private UserDao userDao ;
@Test
public void testUpdateUser(){
int res = userDao.updateById(new User(4L,"admin","123456"));
System.out.println(res > 0 ? "修改成功" : "修改失败");
}
}
5、根据Id查询
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import xyz.zhouge.dao.UserDao;
import xyz.zhouge.pojo.User;
import java.util.List;
@SpringBootTest
public class TestUserService {
@Autowired
private UserService userService;
@Autowired
private UserDao userDao ;
@Test
public void testGetUserById(){
User user = userDao.selectById(1L);
System.out.println(user);
}
}
6、查询所有
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import xyz.zhouge.dao.UserDao;
import xyz.zhouge.pojo.User;
import java.util.List;
@SpringBootTest
public class TestUserService {
@Autowired
private UserService userService;
@Autowired
private UserDao userDao ;
@Test
public void testGetAllUsers(){
List<User> users = userService.getAllUsers();
for (User user : users) {
System.out.println(user);
}
}
}
7,分页查询
7.1,搭建项目
7.2,修改maven依赖
<dependencies>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.2.2</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!--引入druid数据库连接池-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.10</version>
</dependency>
<!--引入mybatis-plus-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.4.1</version>
</dependency>
<!--引入lombok-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.12</version>
</dependency>
</dependencies>
7.3,配置application.yml
spring:
datasource:
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://zhouge.xyz:3306/db_mybatisplus
username: admin
password: 991227zg@.
profiles:
active: dev
main:
#springBoot 日志
log-startup-info: off
server:
port: 80
mybatis-plus:
configuration:
#mp 日志设置为标准日志
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
7.4,创建数据模型
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@NoArgsConstructor
@AllArgsConstructor
@TableName("tb_user")
public class User {
@TableId("user_id")
private long userId ;
@TableField("user_name")
private String userName ;
@TableField("user_pwd")
private String password ;
@TableField("user_age")
private Integer userAge ;
@TableField("user_tel")
private String userTel ;
public User(String userName, String password) {
this.userName = userName;
this.password = password;
}
public User(long userId, String userName, String password) {
this.userId = userId;
this.userName = userName;
this.password = password;
}
}
7.5,创建数据访问层
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
import xyz.zhouge.pojo.User;
@Mapper
public interface UserDao extends BaseMapper<User>{
}
7.6,创建拦截器
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class PageInterceptor{
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor(){
//1, 创建一个通用的拦截器
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
//2,指定(添加) 特定的拦截器 分页拦截器
interceptor.addInnerInterceptor(new PaginationInnerInterceptor());
//3,返回拦截器
return interceptor;
}
}
7.7,添加logback配置文件
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
</configuration>
7.8,测试
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import xyz.zhouge.pojo.User;
@SpringBootTest
public class UserDaoTest {
@Autowired
private UserDao userDao;
/**
* 未添加分页拦截器
*/
@Test
public void testPage1() {
//1,创建分页对象
Page<User> page = new Page<User>(1, 2);
//2,执行分页查询
Page<User> userPage = userDao.selectPage(page, null);
//3,获取分页结果
System.out.println("当前页码值:" + userPage.getCurrent());
System.out.println("每页显示数:" + userPage.getSize());
System.out.println("一共多少页:" + userPage.getPages());
System.out.println("一共多少条数据:" + userPage.getTotal());
System.out.println("数据:" + userPage.getRecords());
}
@Test
public void testPage2() {
IPage page = new Page(1, 2);
//2,执行分页查询
IPage userPage = userDao.selectPage(page, null);
//3,获取分页结果
System.out.println("当前页码值:" + userPage.getCurrent());
System.out.println("每页显示数:" + userPage.getSize());
System.out.println("一共多少页:" + userPage.getPages());
System.out.println("一共多少条数据:" + userPage.getTotal());
System.out.println("数据:" + userPage.getRecords());
}
}
三、DQL编程控制
1、条件查询
方法名 | 作用 |
---|---|
lt(column , val) | 查询column 该字段的值小于val的集合 |
gt(column , val) | 查询column 该字段的值大于val的集合 |
eq(column , val) | 查询column 该字段的值等于val的集合 |
or() | 或 关系 |
…. | … |
1.1,搭建项目
1.2,引入maven依赖
<dependencies>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.2.2</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</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.4.1</version>
</dependency>
<!--引入数据库连接池-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.10</version>
</dependency>
<!--引入lombok-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.12</version>
</dependency>
</dependencies>
1.3,配置application.yml
spring:
datasource:
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://zhouge.xyz:3306/db_mybatisplus
username: admin
password: 991227zg@.
profiles:
active: dev
main:
#springBoot 日志
log-startup-info: off
banner-mode: off
server:
port: 80
mybatis-plus:
configuration:
#mp 日志设置为标准日志
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
global-config:
banner: off
1.4,配置logback.xml
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
</configuration>
1.5,创建数据模型
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@NoArgsConstructor
@AllArgsConstructor
@TableName("tb_user")
public class User {
@TableId("user_id")
private long userId ;
@TableField("user_name")
private String userName ;
@TableField("user_pwd")
private String password ;
@TableField("user_age")
private Integer userAge ;
@TableField("user_tel")
private String userTel ;
public User(String userName, String password) {
this.userName = userName;
this.password = password;
}
public User(long userId, String userName, String password) {
this.userId = userId;
this.userName = userName;
this.password = password;
}
}
1.6,创建数据持久层
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
import xyz.zhouge.pojo.User;
@Mapper
public interface UserDao extends BaseMapper<User>{
}
1.7,测试
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import xyz.zhouge.pojo.User;
import xyz.zhouge.pojo.quert.QueryUser;
import java.util.List;
@SpringBootTest
public class UserDaoTest {
@Autowired
private UserDao userDao ;
@Test
public void testSelectList(){
List<User> users = userDao.selectList(null);
users.forEach(user -> System.out.println(user));
}
// todo 测试QueryWrapper
@Test
public void testSelectList1(){
//创建查询条件包装器 未添加条件,则为空条件
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
//执行查询
List<User> users = userDao.selectList(queryWrapper);
//输出
users.forEach(user -> System.out.println(user));
}
// todo 多条件查询
@Test
public void testSelectList2(){
//创建查询条件包装器
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.gt("user_age",10);//添加查询条件,user_age 字段大于10
queryWrapper.lt("user_age",40);//添加查询条件,user_age 字段小于40
//执行查询
List<User> users = userDao.selectList(queryWrapper);
//输出
users.forEach(user -> System.out.println(user));
}
// todo 测试 LambdaQueryWrapper
@Test
public void testSelectList3(){
//创建查询条件包装器
LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
lambdaQueryWrapper.gt(User::getUserAge,10);
lambdaQueryWrapper.lt(User::getUserAge,40);
//执行查询
List<User> users = userDao.selectList(lambdaQueryWrapper);
//输出
users.forEach(user -> System.out.println(user));
}
// todo 测试 or()
@Test
public void testSelectList4(){
//创建查询条件包装器
LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
lambdaQueryWrapper.gt(User::getUserAge,20)
.or()
.lt(User::getUserAge,10);
//执行查询
List<User> users = userDao.selectList(lambdaQueryWrapper);
//输出
users.forEach(user -> System.out.println(user));
}
// todo 测试eq()
@Test
public void testSelectList5(){
//创建查询条件包装器
LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
lambdaQueryWrapper.eq(User::getUserName,"Tom");
//执行查询
List<User> users = userDao.selectList(lambdaQueryWrapper);
//输出
users.forEach(user -> System.out.println(user));
}
// todo 测试null 1
@Test
public void testSelectNull(){
//模拟从网页传递过来的数据
QueryUser queryUser = new QueryUser();
//queryUser.setUserAge(20);
queryUser.setAge2(40);
//创建查询条件包装器
LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
lambdaQueryWrapper.gt(User::getUserAge,queryUser.getUserAge());
lambdaQueryWrapper.lt(User::getUserAge,queryUser.getAge2());
//执行查询
List<User> users = userDao.selectList(lambdaQueryWrapper);
//输出
users.forEach(user -> System.out.println(user));
}
// todo 测试null 2
@Test
public void testSelectNull2(){
//模拟从网页传递过来的数据
QueryUser queryUser = new QueryUser();
queryUser.setUserAge(20);
//queryUser.setAge2(40);
//创建查询条件包装器
LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
if (null != queryUser.getUserAge()){
lambdaQueryWrapper.gt(User::getUserAge,queryUser.getUserAge());
}
if (null != queryUser.getAge2()){
lambdaQueryWrapper.lt(User::getUserAge,queryUser.getAge2());
}
//执行查询
List<User> users = userDao.selectList(lambdaQueryWrapper);
//输出
users.forEach(user -> System.out.println(user));
}
// todo 测试null 3
@Test
public void testSelectNull3(){
//模拟从网页传递过来的数据
QueryUser queryUser = new QueryUser();
//queryUser.setUserAge(10);
queryUser.setAge2(40);
//创建查询条件包装器
LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
// 如果condition 为 true ,则添加条件 ; 如果为false 则不添加
lambdaQueryWrapper.gt(null != queryUser.getUserAge() , User::getUserAge ,queryUser.getUserAge());
lambdaQueryWrapper.lt(null != queryUser.getAge2() , User::getUserAge ,queryUser.getAge2());
//执行查询
List<User> users = userDao.selectList(lambdaQueryWrapper);
//输出
users.forEach(user -> System.out.println(user));
}
}
2、查询投影
package xyz.zhouge.dao;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import xyz.zhouge.pojo.User;
import java.util.List;
import java.util.Map;
@SpringBootTest
public class UserDaoTest {
@Autowired
private UserDao userDao ;
@Test
public void testField(){
LambdaQueryWrapper<User> lqw = new LambdaQueryWrapper<>();
List<User> users = userDao.selectList(lqw);
users.forEach(user -> System.out.println(user));
}
@Test
public void testField1(){
LambdaQueryWrapper<User> lqw = new LambdaQueryWrapper<>();
//指定需要查询的字段 LambdaQueryWrapper 可以用 Lambda 来表示
lqw.select(User::getUserId,User::getUserName,User::getUserTel);
List<User> users = userDao.selectList(lqw);
users.forEach(user -> System.out.println(user));
}
@Test
public void testField2(){
QueryWrapper<User> qw = new QueryWrapper<>();
//指定需要查询的字段 QueryWrapper 只能使用字符串来表示
qw.select("user_id","user_name","user_tel");
List<User> users = userDao.selectList(qw);
users.forEach(user -> System.out.println(user));
}
@Test
public void testField3(){
QueryWrapper<User> qw = new QueryWrapper<>();
//指定需要查询的字段 不能使用 LambdaQueryWrapper
//qw.select("avg(user_age)");
//qw.select("max(user_age)");
qw.select("count(*) as count");
//使用 selectMaps 将查询的字段作为键名 , 查询的结果作为值
List<Map<String, Object>> maps = userDao.selectMaps(qw);
maps.forEach(map -> System.out.println(map));
}
//todo 分组查询
@Test
public void testField4(){
QueryWrapper<User> qw = new QueryWrapper<>();
//指定需要查询的字段 不能使用 LambdaQueryWrapper
qw.select("count(*) as count,user_tel");
//qw.groupBy("user_tel");
//使用 selectMaps 将查询的字段作为键名 , 查询的结果作为值
List<Map<String, Object>> maps = userDao.selectMaps(qw);
maps.forEach(map -> System.out.println(map));
}
//todo 模糊查询
@Test
public void testField5(){
LambdaQueryWrapper<User> lqw = new LambdaQueryWrapper<>();
lqw.select(User::getUserId,User::getUserName,User::getPassword);
//lqw.like(User::getUserName,"tom");
//lqw.likeLeft(User::getUserName,"om");
//lqw.likeRight(User::getUserName,"T");
//使用 selectMaps 将查询的字段作为键名 , 查询的结果作为值
List<Map<String, Object>> maps = userDao.selectMaps(lqw);
maps.forEach(map -> System.out.println(map));
}
//todo 等值判定
@Test
public void testField6(){
LambdaQueryWrapper<User> lqw = new LambdaQueryWrapper<>();
lqw.select(User::getUserId,User::getUserName,User::getPassword);
lqw.eq(User::getUserName ,"Tom").eq(User::getPassword,"tom");
//使用 selectMaps 将查询的字段作为键名 , 查询的结果作为值
User user = userDao.selectOne(lqw);
System.out.println(user);
}
//todo 范围查询
@Test
public void testField7(){
LambdaQueryWrapper<User> lqw = new LambdaQueryWrapper<>();
lqw.select(User::getUserId,User::getUserName,User::getPassword,User::getUserAge);
lqw.between(User::getUserAge,20,45);
//使用 selectMaps 将查询的字段作为键名 , 查询的结果作为值
List<User> users = userDao.selectList(lqw);
users.forEach(user -> System.out.println(user));
}
// todo 排序查询
@Test
public void testField8(){
QueryWrapper<User> qw = new QueryWrapper<>();
qw.select("user_name","user_pwd","user_tel","user_age");
qw.groupBy("user_age");
List<Map<String, Object>> maps = userDao.selectMaps(qw);
System.out.println(maps);
}
}
3、查询条件
package xyz.zhouge.dao;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import xyz.zhouge.pojo.User;
import java.util.List;
import java.util.Map;
@SpringBootTest
public class UserDaoTest {
@Autowired
private UserDao userDao ;
@Test
public void testField(){
LambdaQueryWrapper<User> lqw = new LambdaQueryWrapper<>();
List<User> users = userDao.selectList(lqw);
users.forEach(user -> System.out.println(user));
}
@Test
public void testField1(){
LambdaQueryWrapper<User> lqw = new LambdaQueryWrapper<>();
//指定需要查询的字段 LambdaQueryWrapper 可以用 Lambda 来表示
lqw.select(User::getUserId,User::getUserName,User::getUserTel);
List<User> users = userDao.selectList(lqw);
users.forEach(user -> System.out.println(user));
}
@Test
public void testField2(){
QueryWrapper<User> qw = new QueryWrapper<>();
//指定需要查询的字段 QueryWrapper 只能使用字符串来表示
qw.select("user_id","user_name","user_tel");
List<User> users = userDao.selectList(qw);
users.forEach(user -> System.out.println(user));
}
@Test
public void testField3(){
QueryWrapper<User> qw = new QueryWrapper<>();
//指定需要查询的字段 不能使用 LambdaQueryWrapper
//qw.select("avg(user_age)");
//qw.select("max(user_age)");
qw.select("count(*) as count");
//使用 selectMaps 将查询的字段作为键名 , 查询的结果作为值
List<Map<String, Object>> maps = userDao.selectMaps(qw);
maps.forEach(map -> System.out.println(map));
}
//todo 分组查询
@Test
public void testField4(){
QueryWrapper<User> qw = new QueryWrapper<>();
//指定需要查询的字段 不能使用 LambdaQueryWrapper
qw.select("count(*) as count,user_tel");
//qw.groupBy("user_tel");
//使用 selectMaps 将查询的字段作为键名 , 查询的结果作为值
List<Map<String, Object>> maps = userDao.selectMaps(qw);
maps.forEach(map -> System.out.println(map));
}
//todo 模糊查询
@Test
public void testField5(){
LambdaQueryWrapper<User> lqw = new LambdaQueryWrapper<>();
lqw.select(User::getUserId,User::getUserName,User::getPassword);
//lqw.like(User::getUserName,"tom");
//lqw.likeLeft(User::getUserName,"om");
//lqw.likeRight(User::getUserName,"T");
//使用 selectMaps 将查询的字段作为键名 , 查询的结果作为值
List<Map<String, Object>> maps = userDao.selectMaps(lqw);
maps.forEach(map -> System.out.println(map));
}
//todo 等值判定
@Test
public void testField6(){
LambdaQueryWrapper<User> lqw = new LambdaQueryWrapper<>();
lqw.select(User::getUserId,User::getUserName,User::getPassword);
lqw.eq(User::getUserName ,"Tom").eq(User::getPassword,"tom");
//使用 selectMaps 将查询的字段作为键名 , 查询的结果作为值
User user = userDao.selectOne(lqw);
System.out.println(user);
}
//todo 范围查询
@Test
public void testField7(){
LambdaQueryWrapper<User> lqw = new LambdaQueryWrapper<>();
lqw.select(User::getUserId,User::getUserName,User::getPassword,User::getUserAge);
lqw.between(User::getUserAge,20,45);
//使用 selectMaps 将查询的字段作为键名 , 查询的结果作为值
List<User> users = userDao.selectList(lqw);
users.forEach(user -> System.out.println(user));
}
// todo 排序查询
@Test
public void testField8(){
QueryWrapper<User> qw = new QueryWrapper<>();
qw.select("user_name","user_pwd","user_tel","user_age");
qw.groupBy("user_age");
List<Map<String, Object>> maps = userDao.selectMaps(qw);
System.out.println(maps);
}
}
4、映射匹配兼容性
四、DML编程控制
1、id生成策略控制
名称 | @TableId |
---|---|
类型 | 属性注解 |
位置 | 模型类中用于表示主键的属性定义上方 |
作用 | 模型类中用于表示主键的属性定义上方 |
相关属性 | value(默认):设置数据库表主键名称 type:设置主键属性的生成策略,值查照IdType的枚举值 |
type | AUTO , INPUT ,ASSIGN_ID,ASSIGN_UUID |
2、多记录操作
3、逻辑删除
3.1在数据库表中添加逻辑删除字段
ALTER TABLE tb_user ADD `user_deleted` int(1) DEFAULT 0 ;
3.2在实体类中添加逻辑删除字段属性
package xyz.zhouge.pojo;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableLogic;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.annotation.Version;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@AllArgsConstructor
@NoArgsConstructor
@Data
@TableName("tb_user")
public class User {
@TableId(value = "user_id" ,type = IdType.ASSIGN_ID)
private long userId ;
@TableField("user_name")
private String userName ;
@TableField("user_pwd")
private String password ;
@TableField("user_age")
private Integer userAge ;
@TableField("user_tel")
private String userTel ;
// value 为默认值,即可被查询出来的值。deval为被删除的值
@TableField("user_deleted")
@TableLogic(value = "0" ,delval = "1")
private Integer userDeleted ;
@TableField("user_version")
@Version
private Integer userVersion ;
public User(String userName, String password, Integer userAge, String userTel) {
this.userName = userName;
this.password = password;
this.userAge = userAge;
this.userTel = userTel;
}
public User(long userId, String userName, String password, Integer userAge, String userTel) {
this.userId = userId;
this.userName = userName;
this.password = password;
this.userAge = userAge;
this.userTel = userTel;
}
public User(long userId, String userName, String password, Integer userAge, String userTel, Integer userVersion) {
this.userId = userId;
this.userName = userName;
this.password = password;
this.userAge = userAge;
this.userTel = userTel;
this.userVersion = userVersion;
}
}
3.3在属性上添加 @TableLogic()注解
// value 为默认值,即可被查询出来的值。deval为被删除的值
@TableLogic(value = “0” ,delval = “1”)
3.4测试
4、乐观锁
4.1在数据库表中添加乐观锁字段
ALTER TABLE tb_user ADD `user_version` int(10) DEFAULT 1;
4.2在实体类中添加乐观锁属性
package xyz.zhouge.pojo;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableLogic;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.annotation.Version;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@AllArgsConstructor
@NoArgsConstructor
@Data
@TableName("tb_user")
public class User {
@TableId(value = "user_id" ,type = IdType.ASSIGN_ID)
private long userId ;
@TableField("user_name")
private String userName ;
@TableField("user_pwd")
private String password ;
@TableField("user_age")
private Integer userAge ;
@TableField("user_tel")
private String userTel ;
// value 为默认值,即可被查询出来的值。deval为被删除的值
@TableField("user_deleted")
@TableLogic(value = "0" ,delval = "1")
private Integer userDeleted ;
@TableField("user_version")
@Version
private Integer userVersion ;
public User(String userName, String password, Integer userAge, String userTel) {
this.userName = userName;
this.password = password;
this.userAge = userAge;
this.userTel = userTel;
}
public User(long userId, String userName, String password, Integer userAge, String userTel) {
this.userId = userId;
this.userName = userName;
this.password = password;
this.userAge = userAge;
this.userTel = userTel;
}
public User(long userId, String userName, String password, Integer userAge, String userTel, Integer userVersion) {
this.userId = userId;
this.userName = userName;
this.password = password;
this.userAge = userAge;
this.userTel = userTel;
this.userVersion = userVersion;
}
}
4.3在字段上添加@Version
@TableField(“user_version”)
@Version
private Integer userVersion ;
4.4添加乐观锁拦截器
package xyz.zhouge.config;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.OptimisticLockerInnerInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class VersionInterceptor {
@Bean
public MybatisPlusInterceptor interceptor(){
//1, 创建一个通用的拦截器
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
//2,指定(添加) 特定的拦截器 分页拦截器
interceptor.addInnerInterceptor(new PaginationInnerInterceptor());//添加分页拦截器
interceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());//添加乐观锁拦截器
//3,返回拦截器
return interceptor;
}
}
4.5测试
五、快速开发
1、代码生成器原理分析
2、代码生成器实现
2.1导入maven依赖
<dependencies>
<!--mybatis-plus-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.4.1</version>
</dependency>
<!--lombok-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.12</version>
</dependency>
<!--druid-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.10</version>
</dependency>
<!--mybatis-plus-generator-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-generator</artifactId>
<version>3.4.1</version>
</dependency>
<!--模板引擎-->
<dependency>
<groupId>org.apache.velocity</groupId>
<artifactId>velocity</artifactId>
<version>1.5</version>
</dependency>
</dependencies>
2.2编写引导类
2.3创建代码生成器类
package xyz.zhouge.generator;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.generator.AutoGenerator;
import com.baomidou.mybatisplus.generator.config.DataSourceConfig;
import com.baomidou.mybatisplus.generator.config.GlobalConfig;
import com.baomidou.mybatisplus.generator.config.PackageConfig;
import com.baomidou.mybatisplus.generator.config.StrategyConfig;
/**
* MybatisPlus 代码生成器
*/
public class CodeGenerator {
public static void main(String[] args) {
try {
//创建代码生成器对象
AutoGenerator generator = new AutoGenerator();
//设置数据库相关配置
DataSourceConfig dataSourceConfig = new DataSourceConfig();
dataSourceConfig.setDriverName("com.mysql.cj.jdbc.Driver");
dataSourceConfig.setUrl("jdbc:mysql://zhouge.xyz/db_mybatisplus");
dataSourceConfig.setUsername("admin");
dataSourceConfig.setPassword("991227zg@.");
generator.setDataSource(dataSourceConfig);//将数据库配置添加到代码生成器中
//设置全局配置
GlobalConfig globalConfig = new GlobalConfig();
globalConfig.setOutputDir(System.getProperty("user.dir")+"/demo6-generator/src/main/java");//设置代码 位置
globalConfig.setOpen(true);//设置生成完代码之后,是否打开文件管理器
globalConfig.setAuthor("周葛");//设置作者
globalConfig.setFileOverride(true);//设置是否覆盖原文件
globalConfig.setMapperName("%sDao");//设置数据访问层接口名字 %s 为占位符
globalConfig.setIdType(IdType.ASSIGN_ID);//设置id生成方案
generator.setGlobalConfig(globalConfig);
//设置包名相关配置
PackageConfig packageConfig = new PackageConfig();
packageConfig.setParent("xyz.zhouge.demo");//设置生成的包名
packageConfig.setEntity("pojo");//设置实体类的包名
packageConfig.setMapper("dao");//设置数据访问层包名
packageConfig.setController("controller");//设置控制层包名
packageConfig.setService("service");
generator.setPackageInfo(packageConfig);
//策略配置
StrategyConfig strategyConfig = new StrategyConfig();
strategyConfig.setInclude("tb_user");//设置需要生成的表明,是一个可变参数,可以写多个表名
strategyConfig.setTablePrefix("tb_");//设置数据表表前缀
strategyConfig.setRestControllerStyle(true);//设置是否启用REST风格
strategyConfig.setVersionFieldName("user_version");//设置乐观锁字段名
strategyConfig.setLogicDeleteFieldName("user_deleted");//设置逻辑删除字段名
strategyConfig.setEntityLombokModel(true);//设置是否启用lombok
generator.setStrategy(strategyConfig);
//执行代码生成器
generator.execute();
} catch (Exception e) {
e.printStackTrace();
}
}
}