文章目录
一、Lombok工具
实体类的开发可以自动通过工具手工生成get/set方法,然后覆盖toString()方法,方便调试,等等。不过这一套操作书写很繁琐,有对应的工具可以帮助我们简化开发,介绍一个小工具,lombok。 Lombok,一个Java类库,提供了一组注解,简化POJO实体类开发,SpringBoot目前默认集成了lombok技术,并提供了对应的版本控制,所以只需要提供对应的坐标即可,在pom.xml中添加lombok的坐标。
<dependencies>
<!--lombok-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
</dependencies>
使用lombok可以通过一个注解@Data完成一个实体类对应的getter,setter,toString,equals,hashCode等操作的快速添加,无需在实体类中去添加get、set、toString等方法。
package com.itheima.domain;
//lombok
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
@Data
@TableName(value = "lib")
public class Book {
// @TableId(type = IdType.AUTO)
private Integer id;
private String type;
private String name;
private String description;
}
二、数据层开发——基础CRUD
1、数据层开发使用MyBatisPlus技术,数据源使用Druid
导入对于的坐标
<dependencies>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.4.3</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.2.6</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
</dependencies>
2、配置数据库连接相关的数据源配置
server:
port: 80
spring:
datasource:
druid:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/test?serverTimezone=UTC
username: root
password: root
mybatis-plus:
global-config:
db-config:
id-type: auto
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
3、使用MP的标准通用接口BaseMapper加速开发,@Mapper和泛型的指定
package com.itheima.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.itheima.domain.Book;
import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface BookMapper extends BaseMapper<Book> {
}
4、测试CRUD
package com.itheima.dao;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.itheima.domain.Book;
import com.itheima.mapper.BookMapper;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import java.util.Arrays;
import java.util.List;
@SpringBootTest
public class BookDaoTest {
@Autowired
private BookMapper bookMapper;
//查询数据
@Test
void testGetById(){
System.out.println(bookMapper.selectById(1));
}
//查询所有
@Test
void testSelectAll(){
bookMapper.selectList(null);
}
//按条件查询
@Test
void testSelectBy(){
QueryWrapper<Book> wrapper=new QueryWrapper<>();
wrapper.eq("type","四大名著");
bookMapper.selectList(wrapper);
}
//按条件查询方法2:lambda
@Test
void testSelectBy2(){
String type="四大名著";
LambdaQueryWrapper<Book> lambdaQueryWrapper=new LambdaQueryWrapper<>();
lambdaQueryWrapper.eq((type != null),Book::getType,type);
bookMapper.selectList(lambdaQueryWrapper);
}
//插入数据
@Test
void testSave(){
Book book=new Book();
book.setName("西游记");
book.setType("神话小说");
book.setDescription("师徒四人去西天取经的故事!");
bookMapper.insert(book);
}
//修改数据
@Test
void testUpDate(){
Book book=new Book();
book.setType("四大名著");
QueryWrapper<Book> wrapper=new QueryWrapper<>();
wrapper.eq("name","西游记");
bookMapper.update(book,wrapper);
}
//修改数据
@Test
void testUpDateById(){
Book book=new Book();
book.setId(1);
book.setType("四大名著");
bookMapper.updateById(book);
}
//根据id删除
@Test
void testDelete(){
bookMapper.deleteById(14);
}
//查询多条数据
@Test
void testSelectBatchIds(){
List<Book> bookList=bookMapper.selectBatchIds(Arrays.asList(1,2,3));
System.out.println(bookList);
}
//分页
@Test
void testSelectPage(){
IPage iPage=new Page(2,5);
bookMapper.selectPage(iPage,null);
System.out.println("当前页数:"+iPage.getCurrent());
System.out.println("当前页数的条数:"+iPage.getSize());
System.out.println("数据总条数:"+iPage.getTotal());
System.out.println("数据总页数:"+iPage.getPages());
System.out.println("查询数据:"+iPage.getRecords());
}
}
整合MP之后不用再自己去书写sql语句,直接调用BaseMapper中的方法即可
三、业务层快速开发
其实MP技术不仅提供了数据层快速开发方案,业务层MP也给了一个通用接口
业务层接口快速开发:
业务层接口继承了Iservice
package com.itheima.service;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
import com.itheima.domain.Book;
public interface IBookService extends IService<Book> {
IPage<Book> getPage(int currentPage,int pageSize);
}
业务层接口实现类快速开发,关注继承的类需要传入两个泛型,一个是数据层接口,另一个是实体类
package com.itheima.service.impl;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.itheima.domain.Book;
import com.itheima.mapper.BookMapper;
import com.itheima.service.IBookService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class BookServiceImpl02 extends ServiceImpl<BookMapper,Book> implements IBookService {
@Autowired
private BookMapper bookMapper;
@Override
public IPage<Book> getPage(int currentPage, int pageSize) {
IPage page=new Page(currentPage,pageSize);
bookMapper.selectPage(page,null);
return page;
}
}
业务层测试:
package com.itheima.service;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.itheima.domain.Book;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
public class BookServiceTestCase {
@Autowired
private IBookService bookService;
@Test
void testSelectById(){
System.out.println(bookService.getById(1));
}
@Test
void testSave(){
Book book=new Book();
book.setType("古诗");
book.setName("蜀道难");
book.setDescription("蜀道难,难于上青天!");
bookService.save(book);
}
@Test
void testUpdateById(){
Book book=new Book();
book.setId(7);
book.setType("兵法书");
bookService.updateById(book);
}
@Test
void testDeleteById(){
bookService.removeById(16);
}
@Test
void testSelectAll(){
bookService.list();
}
@Test
void testSelectPage(){
IPage<Book> page=new Page<>(2,5);
bookService.page(page);
System.out.println("当前页数:"+page.getCurrent());
System.out.println("当前页数的条数:"+page.getSize());
System.out.println("数据总条数:"+page.getTotal());
System.out.println("数据总页数:"+page.getPages());
System.out.println("查询数据:"+page.getRecords());
}
}
业务层快速开发总结
- 接口继承(ISerivce)快速开发Service
- 实现类继承(ServiceImpl<M,T>)快速开发ServiceImpl
- 可以在通用接口基础上做功能重载或功能追加
- 注意重载时不要覆盖原始操作,避免原始提供的功能丢失