整合第三方技术
整合JUnit
@SpringBootTest
class Springboot04JunitApplicationTests {
//1.注入你要测试的对象
@Autowired
private BookDao bookDao;
@Test
void contextLoads() {
//2.执行要测试的对象对应的方法
bookDao.save();
}
}
1.导入测试对应的starter spring-boot-starter-test
2.测试类使用@SpringBootTest修饰
3.使用自动装配的形式添加要测试的对象
整合MyBatis
1.导入Mybatis对应的starter
2.数据库连接相关信息转换成配置
3.数据库SQL映射需要添加@Mapper被容器识别到
问题:
1.MySQL8.x驱动强制要求设置时区
- 修改URL,添加serverTimezone设定
- 修改MySQL数据库配置
2.驱动类过时,提醒更换为com.mysql.cj.jdbc.Driver
整合MyBatis-Plus
1.添加MyBatis-Plus对应的starter
2.数据层接口继承BaseMapper简化开发
基于SpringBoot的SSMP整合案例
流程:
- 先开发基础CRUD功能,做一层测一层
- 调通页面,确认异步提交成功后,制作所有功能
- 添加分页功能与查询功能
企业级开发:
本次案例:
不做前端服务器和后端服务器的区分
步骤:
1.实体类开发
Lombok,一个Java类库,提供了一组注解,简化POJO实体类开发,导入lombok无需指定版本,由SpringBoot提供版本。
常用注解:@Data
// ctrl + F12 可以查看一个类的所有方法
@Data
public class Book {
private Integer id;
private String type;
private String name;
private String description;
}
为当前实体类在编译器设置对应的get/set方法,toString方法,hashCode方法,equals方法等。
2.数据层开发
技术实现方案:
- MyBatisPlus
- Druid
1.导入MyBatisPlus 与Druid对应的starter
2.配置数据源与MyBatisPlus对应的基础配置(id生成策略使用数据库自增策略)
3. 开发Dao接口,继承BaseMapper并指定泛型
4.制作测试类测试Dao功能是否有效,同时可以测试配置是否正确
1.导入MyBatisPlus 与Druid对应的starter
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.5.1</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.alibaba/druid -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.2.8</version>
</dependency>
2.配置数据源与MyBatisPlus对应的基础配置(id生成策略使用数据库自增策略)
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/testdb?serverTimezone=UTC
username: root
password: root123
type: com.alibaba.druid.pool.DruidDataSource
mybatis-plus:
global-config:
db-config:
# 配置数据库表前缀
table-prefix: tbl_
# 设置数据库自增策略,其默认是分配策略
id-type: auto
3. 开发Dao接口,继承BaseMapper并指定泛型
@Mapper
public interface BookDao extends BaseMapper<Book> {
}
4.制作测试类测试Dao功能是否有效,同时可以测试配置是否正确
@SpringBootTest
public class BookDaoTestCase {
@Autowired
BookDao bookDao;
@Test
void testGetById(){
System.out.println(bookDao.selectById(2));
}
@Test
void testSave(){
Book book = new Book();
book.setType("测试数据123");
book.setName("测试数据");
book.setDescription("ceshishuju");
bookDao.insert(book);
}
...
}
3.数据层开发——分页功能
1.分页操作需要设定分页对象IPage
@Test
void testGetPage(){
IPage page = new Page(1,2);
bookDao.selectPage(page,null);
}
IPage对象中封装了分页操作中的所有数据
- 数据
- 当前页码值
- 每页数据总量
- 最大页码值
- 数据总量
2.分页操作是在MyBatisPlus的常规操作基础上增强得到,内部是动态的拼写SQL语句,因此需要增强对应的功能,使用MyBatisPlus拦截器实现
新建一个配置类:
@Configuration
public class MPConfig {
@Bean
public MybatisPlusInterceptor mpInterceptor(){
// 1.定义Mp拦截器
MybatisPlusInterceptor mpInterceptor = new MybatisPlusInterceptor();
// 2.添加具体的拦截器
mpInterceptor.addInnerInterceptor(new PaginationInnerInterceptor());
return mpInterceptor;
}
}
开启MP的运行日志(供开发调试,上线运行时不要开):
mybatis-plus:
configuration:
# 开启MyBatisPlus运行日志
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
4.数据层开发——条件查询
- 使用QueryWrapper对象封装查询条件,推荐使用LambdaQueryWrapper对象,所有查询操作封装成方法调用
- 支持动态拼写查询条件
// 条件查询
@Test
void testGetBy(){
QueryWrapper<Book> qw = new QueryWrapper<>();
qw.like("name","Spring"); // 查询书名中包含"Spring"的书
bookDao.selectList(qw);
}
@Test
void testGetBy2(){
String name = null; // 这是需要注意外界传过来的参数name=null的情况
LambdaQueryWrapper<Book> lqw = new LambdaQueryWrapper<>();
// if (name != null){
// lqw.like(Book::getName,name);
// bookDao.selectList(lqw);
// }
// 直接使用Book::getName获取属性,防止手工写入属性出错
lqw.like(name != null,Book::getName,name);
bookDao.selectList(lqw);
}