springboot使用mybatis-plus
1. 初始化
1.1环境初始化
- 引入依赖
- 添加插件
- 在application中配置数据源
- 添加日志
- 添加mapper注解,表明mapper接口的位置
1.2 通用service
- 创建接口继承IService接口
public interface UserService extends IService<User> { }
- 创建类继承ServiceImpl,并实现自定义的接口,自定义的可以用来扩展功能
@Service public class UserServiceImpl extends ServiceImpl<mapper, pojo> implements UserService { }
2.常用注解
2.1 @TableName
- 实现实体类与表的对应
2.2 @TableId
- 声明主键,并规定主键的自增策略
2.3 @TableField
- 实现属性与表中字段的映射
- mybatis-plus会将将下划线命名风格转化为驼峰命名风格
- 也可使用TableField实现映射关系
2.4 @TableLogic
- 实现逻辑删除
- 逻辑删除:仅仅是将数据标记成删除状态,数据依旧真实存在
- @TableLogic : 声明用于用于标记逻辑删除的字段
3.条件构造器和常用接口
3.1 wapper介绍
3.1.1 it
- lt 小于
3.1.2 le
- 小于等于
3.1.3 like
-
notlike
- NOT LIKE ‘%值%’
-
likeLeft
- LIKE ‘%值’
-
likeRight
- like ‘值%’
3.2 querywrapper
3.2.1 组装查询条件和排序
3.2.2 实现条件的优先级
-
SQL中的优先级是小括号表示的
-
在wrapper
- 使用or
适合于或者的关系
- 使用lambda表达式
适合于优先去判断并且是否满足要求
queryWrapper.like("username", "a").and(i -> i.gt("age", 20).or().isNull("email"));
3.2.3 select查询(特定字段的查询)
``queryWrapper.select(“username”, “age”);`
3.2.4 实现子查询
@Test public void test06() {
//查询id小于等于3的用户信息
//SELECT id,username AS name,age,email,is_deleted FROM t_user WHERE (id IN (select id from t_user where id <= 3))
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
//in
queryWrapper.inSql("id", "select id from t_user where id <= 3");
List<User> list = userMapper.selectList(queryWrapper);
list.forEach(System.out::println); }
inSql("id", "select id from table where id < 3")`--->`id in (select id from table where id < 3)
3.2.5 无视规则将SQL语句拼接到最后
- last()
3.3 updateWrapper
3.3.1 set
- sql set字段
3.3.2 setSQL
- 设置set部分的SQL
setSql("name = '老李头'")
4. condition
-
在真正开发的过程中,组装条件是常见的功能,而这些条件数据来源于用户输入,是可选的,因
此我们在组装这些条件时,必须先判断用户是否选择了这些条件,若选择则需要组装该条件,若
没有选择则一定不能组装,以免影响SQL执行的结果
-
为true,将条件添加到SQL中,本质上是方法的重载而已
4.1 condition使用实例
queryWrapper .like(StringUtils.isNotBlank(username), User::getName, username) .ge(ageBegin != null, User::getAge, ageBegin);
4.2 LamdaUpdateWrapper
- 确定更新的字段
updateWrapper ..set(User::getAge, 18)
5.分页插件
5.1 添加配置类
@Configuration @MapperScan("com.atguigu.mybatisplus.mapper")
//可以将主类中的注解移到此处
public class MybatisPlusConfig { @Bean public MybatisPlusInterceptor mybatisPlusInterceptor() { MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor(); interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL)); return interceptor; } }
5.2 使用分页插件
@Test public void testPage(){
//设置分页参数
Page<User> page = new Page<>(1, 5);
userMapper.selectPage(page, null);
//获取分页数据
List<User> list = page.getRecords(); list.forEach(System.out::println);
System.out.println("当前页:"+page.getCurrent());
System.out.println("每页显示的条数:"+page.getSize());
System.out.println("总记录数:"+page.getTotal());
System.out.println("总页数:"+page.getPages());
System.out.println("是否有上一页:"+page.hasPrevious());
System.out.println("是否有下一页:"+page.hasNext()); }
6.乐观锁与悲观锁
- 乐观锁:
- 用户更新数据后,会进行更新版本号
- 更新数据,会将版本号转为条件
- 悲观锁
- 必须等待前一位,用户完成,下一位才进行可以操作
6.1 实现原理
- 在修改数据,会去校对版本号是否一致,如果不一致,不修改,返回0;如果一致,修改,返回1;
6.2 优化思路
- 如果修改失败,重新获取数据,再提交修改
7.枚举类
7.1 声明枚举类属性
public enum GradeEnum {
PRIMARY(1, "小学"), SECONDORY(2, "中学"), HIGH(3, "高中");
GradeEnum(int code, String descp) {
this.code = code;
this.descp = descp;
}
@EnumValue//标记数据库存的值是code
private final int code;
//。。。
}
7.2 实体类使用枚举类
public class User {
/**
* 名字
* 数据库字段: name varchar(20)
*/
private String name;
/**
* 年龄,IEnum接口的枚举处理
* 数据库字段:age INT(3)
*/
private AgeEnum age;
/**
* 年级,原生枚举(带{@link com.baomidou.mybatisplus.annotation.EnumValue}):
* 数据库字段:grade INT(2)
*/
private GradeEnum grade;
}
7.3 通用配置扫描枚举
mybatis-plus:
# 支持统配符 * 或者 ; 分割
typeEnumsPackage: com.baomidou.springboot.entity.enums
com.baomidou.mybatisplus.annotation.EnumValue}):
* 数据库字段:grade INT(2)
*/
private GradeEnum grade;
}
7.3 通用配置扫描枚举
mybatis-plus:
# 支持统配符 * 或者 ; 分割
typeEnumsPackage: com.baomidou.springboot.entity.enums