整合第三方技术
文章目录
整合JUnit
-
导入测试对应的starter
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency>
-
测试类使用**@SpringBootTest**修饰
-
使用自动装配的形式添加要测试的对象
- 名称:@SpringBootTest - 类型:测试类注解 - 位置:测试类定义上方 - 作用:设置JUnit加载的SpringBoot启动类 - 范例: @SpringBootTest class Springboot05JUnitApplicationTests { @Test void test(){ } }
- 名称: @SpringBootTest - 类型:测试类注解 - 位置:测试类定义上方 - 作用:设置JUnit加载的SpringBoot启动类 - 范例: @SpringBootTest(classes = Springboot05JUnitApplication.class) class Springboot07JUnitMpplicationTests {} - 相关属性 classes: 设置SpringBoot启动类 - 注意事项 如果测试类在Springoot启动类的包或子包中,可以省略启动类的设置,也就是省略classes的设定
-
测试类如果存在于引导类所在包或子包中无需指定引导类
-
测试类如果不存在于引导类所在的包或子包中需要通过classes属性指定引导类
整合MyBatis
1. 勾选MyBatis技术,也就是导入MyBatis对应的starter
2. 数据库连接相关信息转换成配置
3. 数据库SQL映射需要添加@Mapper被容器识别到
- 选择当前模块需要使用的技术集 (MyBatis、MySQL)
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.2.</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
-
application.yml设置数据源参数
spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://localhost:3306/ssm_db username: root password: root
-
定义数据层接口(@Mapping)与映射配置
@Mapper public interface UserDao { @Select("select * from user") public List<User>getA11(); }
-
测试类中注入dao接口,测试功能
@SpringBootTestclass Springboot08MybatisApplicationTests { @Autowired private BookDao bookDao; @Test public void testGetById() { Book book = bookDao.getById(1); System.out.println(book); }
- MySQL8.X驱动强制要求设置时区
- 修改url,添加serverTimezone=UTC设定
- 修改MySQL数据库配置 (略)
- 驱动类过时,提醒更换为com.mysgl.cj.jdbc.Driver
- MySQL8.X驱动强制要求设置时区
整合MyBatis-Plus
- MyBatis-Plus与MyBatis区别
-
导入坐标不同
-
手动添加SpringBoot整合MyBatis-plus的坐标,可以通过mvnrepository获取
<dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.4.3</version> </dependency>
-
注意事项
由于SpringBoot中未收录MyBatis-plus的坐标版本,需要指定对应的Version
-
-
数据层实现简化
-
定义数据层接口与映射配置,继承BaseMapper
@Mapper public interface UserDao extends BaseMapper<User> { }
-
其他同SpringBoot整合MyBatis
#设置Mp相关的配置 mybatis-plus: global-config: db-config: table-prefix: tb_ id-type: auto(数据库ID自增) assign_id (分配ID (主键类型为number或string),默认实现类) fassign_uuid (分配UUID (主键类型为 string) input (用户输入ID该类型可以通过自己注册自动填) none(该类型为未设置主键类型)
-
-
整合Druid
-
导入Druid对应的starter
<dependency> <groupId>com.alibaba</groupId> <artifactId>druid-spring-bopt-starter</artifactId> <version>1.2.6</version> </dependency>
-
根据Druid提供的配置方式进行配置
#配置相关信息(指定数据源类型) #第一种(通用性的指定数据源方式): spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://ocalhost:336/ssm db?serverTimezone=UTC username: root password: root type: com.alibaba.druid.pool.DruidDataSource #第二种(变更Druid的配置方式): spring: datasource: druid: driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://localhost:3306/ssm_db?serverTimezone=UTC username: root password: root
整合第三方技术通用方式
- 导入对应的starter
- 根据提供的配置格式,配置非默认值对应的配置项
案例实现方案分析
1. pom.xml
配置起步依赖
2. application.yml
设置数据源、端口、框架技术相关配置等
3. dao
继承BaseMapper、设置@Mapper
4. dao测试类
5. service
调用数据层接口或MyBatis-Plus提供的接口快速开发
6. service测试类
7. controller
基于Restful开发,使用Postman测试跑通功能
8. 页面
放置在resources目录下的static目录中
初步:
- 勾选SpringMVC与MySQL坐标
- 修改配置文件为yml格式
- 设置端口为8081方便访问
实体类开发——用Lombok快速制作实体类
-
Lombok,一个Java类库,提供了一组注解,简化POJO实体类开发
-
lombok版本由SpringBoot提供,无需指定版本
<!--Lombok坐标--> <dependency> <groupId>org.project.lombok</groupId> <artifactId>lombok</artifactId> </dependency>
-
常用注解: @Data
@Data public class Book { private Integer id; private String type; private String name; private String description; }
-
为当前实体类在编译期设置对应的get/set方法,toString方法,hashCode方法,equals方法等
Dao开发——整合MyBatisplus,制作数据层测试类
-
手工导入starter坐标 (2个)
-
配置数据源与MyBatisPlus对应的配置
-
开发Dao接口 (继承BaseMapper )
-
制作测试类测试Dao功能是否有效
为方便调试可以开启MyBatisplus的日志
mybatis-plus:
configuration:log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
Service开发——基于MyBatisplus进行增量开发,制作业务层测试类
Service接口名称定义成业务名称,并与Dao接口名称进行区分
制作测试类测试Service功能是否有效
-
标准开发方案
-
接口定义
public interface BookService { boolean save(Book book); boolean delete(Integer id); }
-
实现类定义
@Service public class BookServiceImpl implements BookService { @Autowired private BookDao bookDao; public Boolean save(Book book) {return bookDao.insert(book) > 0;} public Boolean delete(Integer id) {return bookDao.deleteById(id) > ;}
-
-
快速开发方案
使用通用接口 (ISerivce<T>) 快速开发Service 使用通用实现类 (ServiceImpl<M,T>) 快速开发ServiceImp] 可以在通用接口基础上做功能重载或功能追加 注意重载时不要覆盖原始操作,避免原始提供的功能丢失
-
使用MyBatisPlus提供有业务层通用接口 (ISerivce) 与业务层通用实现类 (ServiceImpl<M(数据层),T(实体类)>)
-
接口定义
public interface IBookService extends IService<Book>{ }
-
实现类定义
@Service public class BookServiceImpl extends ServiceImpl<BookDao,Book> implements IBookService { }
-
-
在通用类基础上做功能重载或功能追加
-
注意重载时不要覆盖原始操作,避免原始提供的功能丢失
-
Controller开发——基于Restfu1开发,使用PostMan测试接口功能
-
基于Restful制作表现层接口
新增:POST 删除:DELETE 修改:PUT 查询:GET
-
接收参数
实体数据:@RequestBody 路径变量:@PathVariable
Controller开发——前后端开发协议制作
1. 设计统一的返回值结果类型便于前端开发读取数据
2. 返回值结果类型可以根据需求自行设定,没有固定格式
3. 返回值结果模型类用于后端与前端进行数据格式统一,也称为前后端数据协议
-
表现层消息一致性处理
-
设计表现层返回结果的模型类,用于后端与前端进行数据格式统一,也称为前后端数据协议。
-
修改表现层返回结果的模型类,封装出现异常后对应的信息
-
int:code
-
Data: null
-
消息(msg):要显示信息
@Data public class R{ private int code; private 0bject data; private String msg; public R(int code,0bject data,String msg){ this.code = code; this.data = data; this.msg = msg; } }
-
-
-
前后端分离结构设计中页面归属前端服务器
-
单体工程中页面放置在resources目录下的static目录中(建议执行clean)
页面开发——基于VUE+ElementUI制作,前后端联调,页面数据处理,页面消息处理
-
列表、新增、修改、删除、分页、查询
-
数据层开发一分页功能
使用IPage封装分页数据 分页操作依赖MyBatisPlus分页拦截器实现功能 借助MyBatisPlus日志查阅执行SOL语句
-
分页操作需要设定分页对象IPage
@Test void testGetPage(){ IPage page = new Page(1,5); bookDao.selectPage(page,nul1); }
-
IPage对象中封装了分页操作中的所有数据
数据 当前页码值 每页数据总量 最大页码值 数据总量
-
分页操作是在MyBatisPlus的常规操作基础上增强得到,内部是动态的拼写SQL语句,因此需要增强对应的功能,使用MyBatisPlus拦截器实现
@Configuration public class MpConfig { @Bean public MybatisPlusInterceptor mpInterceptor() {//1.定义Mp拦截器 MybatislusInterceptor mpInterceptor = new MybatisplusInterceptor();//2.添加具体的拦截器 mpInterceptor.addInnerInterceptor(new PaginationInnerInterceptor()); return mpInterceptor; }
-
-
数据层开发——条件查询功能
使用Querywrapper对象封装查询条件 推荐使用LambdaQueryWrapper对象 所有查询操作封装成方法调用 查询条件支持动态条件拼装
-
使用Querywrapper对象封装查询条件,推荐使用LambdaQuerywrapper对象,所有查询操作封装成方法调用
@Test void testGetByCondition(){ IPage page = new Page(1,10); LambdaQueryWrapper<Book> lqw = new LambdaQuerywrapper<Book(); lqw.like(Book::getName,"Spring"); bookDao.selectPage(page,lqw); } @Test void testGetByCondition(){ QueryWrapper<Book> qw = new QueryWrapper<Book>(); qw.like("name","Spring"); bookDao.selectList(qw); }
-
支持动态拼写查询条件
@Test void testGetByCondition(){ String name ="Spring"; IPage page = new Page(1,10); LambdaQuerywrapper<Book> lqw = new LambdaQuerywrapper<Book(); lqw.like(strings.isNotEmpty(name),Book::getName,"Spring"); bookDao.selectPage(page,lqw); }
-
-
项目异常处理
1. 使用注解@RestControllerAdvice定义SpringMVC异常处理器用来处理异常的
2. 异常处理器必须被扫描加载,否则无法生效
3. 表现层返回结果的模型类中添加消息属性用来传递消息到页面
-
对异常进行统一处理,出现异常后,返回指定信息
@RestControllerAdvice public class ProjectExceptionAdvice{ @ExceptionHandler(Exception.class) public R do0therException(Exception ex){ //记录日志 //发送消息给运维 //发送邮件给开发人员,ex对象发送给开发人员 ex.printStackTrace(); return new R(20001,null,"系统错误,请稍后再试!"); }