一、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```yamlspring:datasource:type: com.alibaba.druid.pool.DruidDataSourcedriver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://localhost:3306/db_mybatisplususername: rootpassword: 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接口```javapackage xyz.zhouge.dao;import com.baomidou.mybatisplus.core.mapper.BaseMapper;import org.apache.ibatis.annotations.Mapper;import xyz.zhouge.pojo.User;@Mapperpublic 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.DruidDataSourcedriver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://zhouge.xyz:3306/db_mybatisplususername: adminpassword: 991227zg@.profiles:active: devserver: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;@Mapperpublic 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;@SpringBootTestpublic class TestUserService {@Autowiredprivate UserService userService;@Autowiredprivate UserDao userDao ;@Testpublic void testInsertUser(){int res = userDao.insert(new User("zhouge1","123456"));System.out.println(res > 0 ? "添加成功" : "添加失败");}@Testpublic void testDeleteUser(){int res = userDao.deleteById(6L);System.out.println(res > 0 ? "删除成功" : "删除失败");}@Testpublic void testUpdateUser(){int res = userDao.updateById(new User(4L,"admin","123456"));System.out.println(res > 0 ? "修改成功" : "修改失败");}@Testpublic void testGetAllUsers(){List<User> users = userService.getAllUsers();for (User user : users) {System.out.println(user);}}@Testpublic 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;@SpringBootTestpublic class TestUserService {@Autowiredprivate UserService userService;@Autowiredprivate UserDao userDao ;@Testpublic 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;@SpringBootTestpublic class TestUserService {@Autowiredprivate UserService userService;@Autowiredprivate UserDao userDao ;@Testpublic 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;@SpringBootTestpublic class TestUserService {@Autowiredprivate UserService userService;@Autowiredprivate UserDao userDao ;@Testpublic 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;@SpringBootTestpublic class TestUserService {@Autowiredprivate UserService userService;@Autowiredprivate UserDao userDao ;@Testpublic 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;@SpringBootTestpublic class TestUserService {@Autowiredprivate UserService userService;@Autowiredprivate UserDao userDao ;@Testpublic 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.DruidDataSourcedriver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://zhouge.xyz:3306/db_mybatisplususername: adminpassword: 991227zg@.profiles:active: devmain:#springBoot 日志log-startup-info: offserver:port: 80mybatis-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;@Mapperpublic 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;@Configurationpublic class PageInterceptor{@Beanpublic 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;@SpringBootTestpublic class UserDaoTest {@Autowiredprivate UserDao userDao;/*** 未添加分页拦截器*/@Testpublic 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());}@Testpublic 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.DruidDataSourcedriver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://zhouge.xyz:3306/db_mybatisplususername: adminpassword: 991227zg@.profiles:active: devmain:#springBoot 日志log-startup-info: offbanner-mode: offserver:port: 80mybatis-plus:configuration:#mp 日志设置为标准日志log-impl: org.apache.ibatis.logging.stdout.StdOutImplglobal-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;@Mapperpublic 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;@SpringBootTestpublic class UserDaoTest {@Autowiredprivate UserDao userDao ;@Testpublic void testSelectList(){List<User> users = userDao.selectList(null);users.forEach(user -> System.out.println(user));}// todo 测试QueryWrapper@Testpublic void testSelectList1(){//创建查询条件包装器 未添加条件,则为空条件QueryWrapper<User> queryWrapper = new QueryWrapper<>();//执行查询List<User> users = userDao.selectList(queryWrapper);//输出users.forEach(user -> System.out.println(user));}// todo 多条件查询@Testpublic void testSelectList2(){//创建查询条件包装器QueryWrapper<User> queryWrapper = new QueryWrapper<>();queryWrapper.gt("user_age",10);//添加查询条件,user_age 字段大于10queryWrapper.lt("user_age",40);//添加查询条件,user_age 字段小于40//执行查询List<User> users = userDao.selectList(queryWrapper);//输出users.forEach(user -> System.out.println(user));}// todo 测试 LambdaQueryWrapper@Testpublic 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()@Testpublic 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()@Testpublic 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@Testpublic 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@Testpublic 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@Testpublic 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;@SpringBootTestpublic class UserDaoTest {@Autowiredprivate UserDao userDao ;@Testpublic void testField(){LambdaQueryWrapper<User> lqw = new LambdaQueryWrapper<>();List<User> users = userDao.selectList(lqw);users.forEach(user -> System.out.println(user));}@Testpublic 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));}@Testpublic 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));}@Testpublic 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 分组查询@Testpublic void testField4(){QueryWrapper<User> qw = new QueryWrapper<>();//指定需要查询的字段 不能使用 LambdaQueryWrapperqw.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 模糊查询@Testpublic 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 等值判定@Testpublic 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 范围查询@Testpublic 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 排序查询@Testpublic 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;@SpringBootTestpublic class UserDaoTest {@Autowiredprivate UserDao userDao ;@Testpublic void testField(){LambdaQueryWrapper<User> lqw = new LambdaQueryWrapper<>();List<User> users = userDao.selectList(lqw);users.forEach(user -> System.out.println(user));}@Testpublic 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));}@Testpublic 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));}@Testpublic 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 分组查询@Testpublic void testField4(){QueryWrapper<User> qw = new QueryWrapper<>();//指定需要查询的字段 不能使用 LambdaQueryWrapperqw.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 模糊查询@Testpublic 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 等值判定@Testpublic 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 范围查询@Testpublic 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 排序查询@Testpublic 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")@Versionprivate 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")@Versionprivate 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;@Configurationpublic class VersionInterceptor {@Beanpublic 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);//设置是否启用lombokgenerator.setStrategy(strategyConfig);//执行代码生成器generator.execute();} catch (Exception e) {e.printStackTrace();}}}
