入门
- springboot是简化spring的
- MyBatisPlus是简化mybatis的,增强工具
创建MyBatisPlus工程的步骤
- 创建springboot的项目 勾选mysql选项,然后在pom.xml中加入MyBatisPlus坐标
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.4.1</version>
</dependency>
- 在自己写的dao的类里继承BaseMapper<>,之后就完成了,连方法也不用写。
简介
标志CRUD开发
小工具 lombok
下面这一堆注解可以由lombok的@Data代替(不包含构造器的注解)
分页功能开发
首先要写一个MyBatisPlus针对分页的拦截器(bean)
之后按照mp提供的方法调用即可
开启mybatisplus日志(输出到控制台)
DQL编程控制(按条件查询)
- lt代表小于 gt代表大于
- **LambdaQueryWrapper<>:用labda的方式建立条件封装类 最常用 **
方式一:按条件查询
QueryWrapper qw = new QueryWrapper();
qw.lt("age",18);
List<User> userList = userDao.selectList(qw);
System.out.println(userList);
方式二:lambda格式按条件查询
QueryWrapper<User> qw = new QueryWrapper<User>();
qw.lambda().lt(User::getAge, 10);
List<User> userList = userDao.selectList(qw);
System.out.println(userList);
方式三:lambda格式按条件查询 (最常用)
//相当于方式二的
//QueryWrapper<User> qw = new QueryWrapper<User>();
//qw.lambda().lt(User::getAge, 10);
LambdaQueryWrapper<User> lqw = new LambdaQueryWrapper<User>();
lqw.lt(User::getAge, 10);
List<User> userList = userDao.selectList(lqw);
System.out.println(userList);
多条件查询
LambdaQueryWrapper<User> lqw = new LambdaQueryWrapper<User>();
并且关系:10到30岁之间
lqw.lt(User::getAge, 30).gt(User::getAge, 10); //链式编程
或者关系:小于10岁或者大于30岁
lqw.lt(User::getAge, 10).or().gt(User::getAge, 30);
List<User> userList = userDao.selectList(lqw);
System.out.println(userList);
条件查询null判定
用户很多情况下设置的查询条件时,不会都有填,比如填写下界后就不填上界了
采用带判定的条件查询即可
查询投影(查看自己设定的字段)
QueryWrapper<User> lqw = new QueryWrapper<User>();
lqw.select("count(*) as count, tel"); //统计
lqw.groupBy("tel"); //分组
List<Map<String, Object>> userList = userDao.selectMaps(lqw);
System.out.println(userList);
如果有些查询语句mybatisPlus不支持,则需要回到dao中自己写
条件查询
各种条件语句官网 baomidou.com/pages/10c80…
条件查询
LambdaQueryWrapper<User> lqw = new LambdaQueryWrapper<User>();
//等同于=
lqw.eq(User::getName,"Jerry").eq(User::getPassword,"jerry");
User loginUser = userDao.selectOne(lqw);
System.out.println(loginUser);
LambdaQueryWrapper<User> lqw = new LambdaQueryWrapper<User>();
//范围查询 lt le gt ge eq between
lqw.between(User::getAge,10,30);
List<User> userList = userDao.selectList(lqw);
System.out.println(userList);
模糊查询
LambdaQueryWrapper<User> lqw = new LambdaQueryWrapper<User>();
//模糊匹配 like
lqw.like(User::getName,"J"); ===> J%
lqw.likeRight(User::getName,"J"); ===> J%
lqw.likeLeft(User::getName,"J"); ===》%J
List<User> userList = userDao.selectList(lqw);
System.out.println(userList);
映射匹配兼容性
字段映射与表名映射
- 问题一
使用mp提供的属性注解解决
- 问题二
使用mp属性注解 @TableField
- 问题三
设定属性注解
- 问题4
DML编程
新增
id生成策略(不同类型的表,需要不同的id生成形式)
每次建立实体都需要自定id生成策略? 太麻烦了
还可以使用配置文件全局的配置@TableName("tbl_user")
多数据删除
逻辑删除(不进行真正的删除)
当删除一个数据后会有他的关联数据,会损失数据
- 解决方法:增加逻辑删除字段
运行删除方法发现实际执行的是update语句
查全局表时,发现其实是条件查询
每个表都要配置太麻烦了 所以要进行全局配置
修改操作 (乐观锁)
乐观锁 解决业务带来的并发问题
实质
update set abc=1,version=version+1 where version=1
步骤
代码生成器
模板
- 导入坐标
- 运行此代码后生成文件
public class CodeGenerator {
public static void main(String[] args) {
//1.获取代码生成器的对象
AutoGenerator autoGenerator = new AutoGenerator();
//设置数据库相关配置
DataSourceConfig dataSource = new DataSourceConfig();
dataSource.setDriverName("com.mysql.cj.jdbc.Driver");
dataSource.setUrl("jdbc:mysql://localhost:3306/mybatisplus_db?serverTimezone=UTC");
dataSource.setUsername("root");
dataSource.setPassword("root");
autoGenerator.setDataSource(dataSource);
//设置全局配置
GlobalConfig globalConfig = new GlobalConfig();
globalConfig.setOutputDir(System.getProperty("user.dir")+"/mybatisplus_04_generator/src/main/java"); //设置代码生成位置
globalConfig.setOpen(false); //设置生成完毕后是否打开生成代码所在的目录
globalConfig.setAuthor("黑马程序员"); //设置作者
globalConfig.setFileOverride(true); //设置是否覆盖原始生成的文件
globalConfig.setMapperName("%sDao"); //设置数据层接口名,%s为占位符,指代模块名称
globalConfig.setIdType(IdType.ASSIGN_ID); //设置Id生成策略
autoGenerator.setGlobalConfig(globalConfig);
//设置包名相关配置
PackageConfig packageInfo = new PackageConfig();
packageInfo.setParent("com.aaa"); //设置生成的包名,与代码所在位置不冲突,二者叠加组成完整路径
packageInfo.setEntity("domain"); //设置实体类包名
packageInfo.setMapper("dao"); //设置数据层包名
autoGenerator.setPackageInfo(packageInfo);
//策略设置
StrategyConfig strategyConfig = new StrategyConfig();
strategyConfig.setInclude("tbl_user"); //设置当前参与生成的表名,参数为可变参数
strategyConfig.setTablePrefix("tbl_"); //设置数据库表的前缀名称,模块名 = 数据库表名 - 前缀名 例如: User = tbl_user - tbl_
strategyConfig.setRestControllerStyle(true); //设置是否启用Rest风格
strategyConfig.setVersionFieldName("version"); //设置乐观锁字段名
strategyConfig.setLogicDeleteFieldName("deleted"); //设置逻辑删除字段名
strategyConfig.setEntityLombokModel(true); //设置是否启用lombok
autoGenerator.setStrategy(strategyConfig);
//2.执行生成操作
autoGenerator.execute();
}
}