一.Springboot整合MP
1.创建SpringBoot工程
过程省略…
2.pom.xml补全依赖
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.4.1</version>
</dependency>
3.:根据数据库表创建实体类
过程省略…
4.创建dao接口继承BaseMapper
@Mapper
public interface UserDao extends BaseMapper<User>{
}
1
ok齐活!开始奔放~
二.标准数据层开发
1.标准crud使用
2.新增
创建测试类方法进行新增
@Test
void test() {
User user = new User();
user.setAge(18);
user.setEmail("hefutang@qq.com");
userdao.insert(user);
}
3.删除
测试类中方法
@Test
void test3() {
userdao.deleteById("1794276560905269249l");
}
4.修改
@Test
void test1() {
User user = new User();
user.setId(1l);
user.setAge(18);
user.setEmail("hefutang@qq.com");
userdao.updateById(user);
}
5.根据id查询
@Test
void test2() {
User user = userdao.selectById("1794276560905269249l");
System.out.println(user);
}
6.查询所有
@Test
void contextLoads() {
userdao.selectList(null).forEach(System.out::println);
}
7.Lombok
概念:
Lombok,一个Java类库,提供了一组注解,简化POJO实体类开发。
使用步骤:
1.添加maven依赖
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.12</version>
</dependency>
2.在模型类上方添加注解
Lombok常见的注解有:
@Setter:为模型类的属性提供setter方法
@Getter:为模型类的属性提供getter方法
@ToString:为模型类的属性提供toString方法
@EqualsAndHashCode:为模型类的属性提供equals和hashcode方法
@Data:是个组合注解,包含上面的注解的功能
@NoArgsConstructor:提供一个无参构造函数
@AllArgsConstructor:提供一个包含所有参数的构造函数
8.分页功能
@Test
void test4() {
IPage page = new Page(1,3);
IPage iPage = userdao.selectPage(page, null);
System.out.println("当前页数:" + iPage.getCurrent());
System.out.println("当页数据数:" + iPage.getSize());
System.out.println("一共的页数:" + iPage.getPages());
System.out.println("一共多少数据:" + iPage.getTotal());
System.out.println("数据:" + iPage.getRecords());
}
当然需要拦截器我们才可以看到结果,拦截器添加方法:
@Configuration
public class MPconfig {
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
interceptor.addInnerInterceptor(new PaginationInnerInterceptor());
return interceptor;
}
}
三.DQL编程控制
1.条件查询
1.条件查询的类
准备工作:
1.pom中的依赖
<dependencies>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.12</version>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.5.6</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.16</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.48</version>
</dependency>
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
<version>8.3.0</version>
<scope>compile</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
2.编写userdao类
@Mapper
public interface Userdao extends BaseMapper<User>{
}
3.编写模型类
@Data
@TableName("user")
public class User {
private Long id;
private String name;
private Integer age;
private String email;
}
4.配置文件
spring:
datasource:
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://81.70.146.77:3306/yulong?serverTimezone=UTC
username: root
password: a1611142319
# 关闭springboot控制台logo
main:
banner-mode: off
# 开启mp的日志(输出到控制台)
mybatis-plus:
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
global-config:
banner: false #关闭mybatis启动logo
2.构建条件查询
常见的三种查询方式:
@Test
void test5() {
//方式一:条件查询
// QueryWrapper<User> qw = new QueryWrapper<>();
// qw.lt("age",20);
// List<User> users = userdao.selectList(qw);
// System.out.println(users);
//方式二:按照lambda表达式查询
// QueryWrapper<User> qw = new QueryWrapper<User>();
// qw.lambda().lt(User::getAge,20);
// List<User> users = userdao.selectList(qw);
// System.out.println(users);
// //方式二:按照lambda表达式查询
LambdaQueryWrapper<User> lqw = new LambdaQueryWrapper<User>();
lqw.gt(User::getAge,18).or()
.lt(User::getAge,24);
List<User> users = userdao.selectList(lqw);
System.out.println(users);
}
3.null值处理
添加测试类
LambdaQueryWrapper<User> lqw = new LambdaQueryWrapper<User>();
UserQury uq = new UserQury();
uq.setAge(18);
uq.setAge2(24);
lqw.lt(User::getAge, uq.getAge())
.ge(User::getAge, uq.getAge());
//如果条件为null则后边的查询不再执行
//链式编程
lqw.lt(null != uq.getAge(),User::getAge,uq.getAge())
.ge(null !=uq.getAge2(),User::getAge,uq.getAge2());
4.查询投影
4.1查询指定字段
创建测试类
@Test
void test6() {
//查询投影
//1.使用lambda查询
LambdaQueryWrapper<User> lqw = new LambdaQueryWrapper<User>();
lqw.select(User::getAge,User::getId,User::getEmail);
List<User> users = userdao.selectList(lqw);
System.out.println(users);
//指定字段查询
QueryWrapper<User> qw = new QueryWrapper<>();
qw.select("id", "name", "age", "email");
List<User> users1 = userdao.selectList(qw);
System.out.println(users1);
}
4.2聚合查询
聚合函数查询,完成count、max、min、avg、sum的使用
count:总记录数
max:最大值
min:最小值
avg:平均值
sum:求和
创建测试类:示例avg使用规则其他类同
@Test
void test7() {
//聚合查询
QueryWrapper<User> qw = new QueryWrapper<>();
qw.select("avg(age) as avgAge");
List<Map<String, Object>> maps = userdao.selectMaps(qw);
System.out.println(maps);
}
· ### 4.3分组查询
完成groupby查询、创建测试类
@Test
void test8() {
QueryWrapper<User> qw = new QueryWrapper<>();
qw.select("count(*) as count","email");
qw.groupBy("email");
List<Map<String, Object>> maps = userdao.selectMaps(qw);
System.out.println(maps);
}
四.查询条件
MP的查询条件有很多:
范围匹配(> 、 = 、between)
模糊匹配(like)
空判定(null)
包含性匹配(in)
分组(group)
排序(order)
…
1.等值查询
创建测试类
@Test
void test9() {
//等值查询
LambdaQueryWrapper<User> qw = new LambdaQueryWrapper<>();
qw.eq(User::getEmail, "test5@baomidou.com")
.eq(User::getAge, 24);
User user = userdao.selectOne(qw);
System.out.println(user);
}
2.范围查询
创建测试类
@Test
void test10() {
//范围查询
LambdaQueryWrapper<User> qw = new LambdaQueryWrapper<>();
qw.between(User::getAge, 18, 30);
List<User> users = userdao.selectList(qw);
System.out.println(users);
}
3.模糊查询
创建测试类
@Test
void test11() {
LambdaQueryWrapper<User> qw = new LambdaQueryWrapper<>();
qw.like(User::getName,"j");
List<User> users = userdao.selectList(qw);
System.out.println(users);
}
4.排序查询
orderBy排序
condition:条件,true则添加排序,false则不添加排序
isAsc:是否为升序,true升序,false降序
columns:排序字段,可以有多个
orderByAsc/Desc(单个column):按照指定字段进行升序/降序
orderByAsc/Desc(多个column):按照多个字段进行升序/降序
orderByAsc/Desc
condition:条件,true添加排序,false不添加排序
多个columns:按照多个字段进行排序
创建测试类
五.映射匹配兼容性
步骤1:如果表名与dao类名不同
添加@TavleName注解
@Data
@TableName("user")
public class User {
private Long id;
private String name;
private Integer age;
private String email;
}
步骤二:需要隐藏passwrod密码,且字段名不同
添加@TableFiled注解
@Data
@TableName("user")
public class User {
private Long id;
private String name;
private Integer age;
private String email;
@TableField(value = "password",select = false)
private String pwd;
}
步骤三.添加数据库中不存在字段
@Data
@TableName("user")
public class User {
private Long id;
private String name;
private Integer age;
private String email;
@TableField(value = "password",select = false)
private String pwd;
@TableField(exist = false)
private String phone;
}
六.DML编程控制
1.id自增策略
@Tableid当不设置时会默认(type = IdType.ASSIGN_ID)
类型:属性注解
相关属性:value(默认):设置数据库表主键名称
type:设置主键属性的生成策略,值查照IdType的枚举值
1.AUTO策略
同时数据库需要开启自增
@Data
@TableName("user")
public class User {
@TableId(type = IdType.AUTO)
private Long id;
private String name;
private Integer age;
private String email;
@TableField(value = "password",select = false)
private String pwd;
@TableField(exist = false)
private String phone;
}
2.Input策略
在测试类中需要设置id
@Data
@TableName("user")
public class User {
@TableId(type = IdType.INPUT)
private Long id;
private String name;
private Integer age;
private String email;
@TableField(value = "password",select = false)
private String pwd;
@TableField(exist = false)
private String phone;
}
2.简化配置
1.模型类主键策略设置
当每个模型上都需要同样的策略,如图所示:
解决方法:添加配置
global-config:
banner: false #关闭mybatis启动logo
db-config:
id-type: assign_id
2.数据库表与模型类的映射关系
如果数据库表都是以"tb_"开头,如图所示:
添加到yml配置中
global-config:
banner: false #关闭mybatis启动logo
db-config:
id-type: assign_id
table-prefix: tb_
3.多记录操作
1.多条删除
@Test
void test13() {
List<Long> lists = new ArrayList<>();
lists.add(6L);
lists.add(921L);
userdao.deleteBatchIds(lists);
}
2.多条查询
@Test
void test13() {
List<Long> lists = new ArrayList<>();
lists.add(6L);
lists.add(921L);
//多条删除
// userdao.deleteBatchIds(lists);
//多条查询
userdao.selectBatchIds(lists);
}
4.逻辑删除
场景:一对多,一个员工对应多张表,当删除后会对应删除全部
策略:在员工表中添加一列数据 deleted ,如果为0说明在职员工,如果离职则将其改
完1,(0和1所代表的含义是可以自定义的)
所以对于删除操作业务问题来说有:
物理删除:业务数据从数据库中丢弃,执行的是delete操作
逻辑删除:为数据设置是否可用状态字段,删除时设置状态字段为不可用状态,数据保留在数据库
中,执行的是update操作
步骤一:修改数据库表添加 deleted 列
步骤二:在实体类中:
@Data
@TableName("user")
public class User {
@TableId(type = IdType.ASSIGN_ID)
private Long id;
private String name;
private Integer age;
private String email;
@TableField(value = "password",select = false)
private String pwd;
@TableField(exist = false)
private String phone;
@TableLogic(value = "0",delval = "1")
private int deleted;
}
步骤三:运行测试类
删除数据可见原本的0改为了1
5.乐观锁
乐观锁主要解决的问题是当要更新一条记录的时候,希望这条记录没有被别人更新。
步骤一:数据库表添加列
列名可以任意比如version,默认值设置为1
步骤二:在模型类中添加对应的属性
根据添加的字段列名,在模型类中添加对应的属性值
步骤三:添加乐观锁拦截器
@Configuration
public class MPconfig {
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
interceptor.addInnerInterceptor(new PaginationInnerInterceptor());
interceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());
return interceptor;
}
}
步骤四:执行更新操作
@Test
void test14(){
User user = userdao.selectById(3l);
user.setName("hubayi");
userdao.updateById(user);
}
七:代码生成器
代码生成器实现
1.导入对应pom坐标
<dependencies>
<!--spring webmvc-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--mybatisplus-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.4.1</version>
</dependency>
<!--druid-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.16</version>
</dependency>
<!--mysql-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<!--test-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!--lombok-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.12</version>
</dependency>
<!--代码生成器-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-generator</artifactId>
<version>3.4.1</version>
</dependency>
<!--velocity模板引擎-->
<dependency>
<groupId>org.apache.velocity</groupId>
<artifactId>velocity-engine-core</artifactId>
<version>2.3</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
2.创建代码生成器类
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();
}
}