整合SSMP遇到的问题
插入操作的id自增策略
- 错误
Could not set property ‘id’ of ‘class com.ssc.springboot_04_ssmp.domain.Book’ with value ‘1544949725480325121’ Cause: java.lang.IllegalArgumentException: argument type mismatch
- 解决
id-type: auto
mybatis-plus:
global-config:
db-config:
table-prefix: t_
id-type: auto
MP开启调试日志
StdOutImpl
标准输出
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
MP开启分页
- 开启MP拦截器
@Configuration
public class MPConfig {
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor(){
MybatisPlusInterceptor mybatisPlusInterceptor = new MybatisPlusInterceptor();
// 配置拦截器,拦截器需要增加都配置在这儿
mybatisPlusInterceptor.addInnerInterceptor(new PaginationInnerInterceptor());
return mybatisPlusInterceptor;
}
}
- 测试
@Test
void testGetAllPage(){
IPage page = new Page(1,2);
bookDao.selectPage(page, null);
}
- 结果
==> Preparing: SELECT COUNT(*) FROM t_book
==> Parameters:
<== Columns: COUNT(*)
<== Row: 7
<== Total: 1
==> Preparing: SELECT id,type,name,description FROM t_book LIMIT ?
==> Parameters: 2(Long)
<== Columns: id, type, name, description
<== Row: 1, 科学, 科学有故事, 启发科学探索精神
<== Row: 2, 语文, 大学语文, 语文学习
<== Total: 2
条件查询LambdaQueryWrapper语法检查
@Test
void testGetBy(){
LambdaQueryWrapper<Book> queryWrapper = new LambdaQueryWrapper();
queryWrapper.like(Book::getName,"学");
bookDao.selectList(queryWrapper);
}
- 查询条件是否为null(
第一个参数false为null就不连
) - 第一个参数可以是一个函数的返回值为Boolean
queryWrapper.like(false,Book::getName,"学");
快速开发业务层
- service接口
public interface IBookService extends IService<Book> {
}
- service实现层
@Service
public class IBookServiceImpl extends ServiceImpl<BookDao, Book> implements IBookService{
}
自己新增的方法最好不要覆盖原始的基本操作
后端表现层一致性处理(前后端数据协议
)
- 创建工具类统一格式
@Data
public class R {
private Boolean flag;
private Object data;
private String message;
public R(Boolean flag) {
this.flag = flag;
}
public R(Boolean flag, Object data) {
this.flag = flag;
this.data = data;
}
public R(Boolean flag, String message) {
this.flag = flag;
this.message = message;
}
public R() {
}
}
- controller返回值统一
@RestController
@RequestMapping("/books")
public class BookController2 {
@Autowired
private IBookService iBookService;
@GetMapping
public R getAll(){
return new R(true,iBookService.list());
}
@PostMapping
public R save(@RequestBody Book book) throws IOException {
if(book.getName() == "123") throw new IOException();
Boolean flag = iBookService.save(book);
return new R(flag,flag?"添加成功^_^":"添加失败-_-||");
}
@PutMapping
public R update(@RequestBody Book book){
Boolean flag = iBookService.updateById(book);
return new R(flag,flag?"修改成功^_^":"修改失败-_-||");
}
@DeleteMapping("/{id}")
public R delete(@PathVariable Integer id){
Boolean flag = iBookService.removeById(id);
return new R(flag,flag?"删除成功^_^":"删除失败-_-||");
}
@GetMapping("/{id}")
public R getOne(@PathVariable Integer id){
return new R(true,iBookService.getById(id));
}
@GetMapping("/{currentPage}/{pageSize}")
public R getPage(@PathVariable Integer currentPage,@PathVariable Integer pageSize){
return new R(true,iBookService.getPage(currentPage,pageSize));
}
}
后台异常消息统一处理
- 异常处理类
@RestControllerAdvice
public class ProjectExceptionAdvice {
// 拦截所有异常消息
@ExceptionHandler
public R doException(Exception ex){
// 记录日志
// 通知运维
// 通知开发
ex.printStackTrace();
return new R(false,"服务器故障请稍后再试");
}
}
删除最后一页的最后一条数据后页面为空
- 删除之后直接将currentPage修改为最后一页,再请求一次就可以了。
@GetMapping("/{id}")
public R getOne(@PathVariable Integer id){
return new R(true,iBookService.getById(id));
}
@GetMapping("/{currentPage}/{pageSize}")
public R getPage(@PathVariable Integer currentPage,@PathVariable Integer pageSize){
IPage<Book> page = iBookService.getPage(currentPage,pageSize);
if(currentPage > page.getPages()){
page = iBookService.getPage((int)page.getPages(),pageSize);
}
return new R(true,page);
}
条件查询
- 业务层实现类
@Override
public IPage<Book> getPage(Integer currentPage, Integer pageSize, Book book) {
IPage<Book> page = new Page<Book>(currentPage,pageSize);
LambdaQueryWrapper<Book> queryWrapper = new LambdaQueryWrapper<Book>();
queryWrapper.like(Strings.isNotEmpty(book.getType()),Book::getType,book.getType());
queryWrapper.like(Strings.isNotEmpty(book.getName()),Book::getName,book.getName());
queryWrapper.like(Strings.isNotEmpty(book.getDescription()),Book::getDescription,book.getDescription());
return bookDao.selectPage(page,queryWrapper);
}
总结
- pom.xml
配置起步依赖
- application.yml
设置数据源,端口,框架技术相关配置
- dao
继承BaseMapper、添加@Mapper
- dao测试
- Service
调用数据层接口或MyBatis-Plus提供的接口快速开发
- Service测试类
- Controller
基于Restful开发
- 页面
存放于resources目录下的static目录中