一、Mybatis plus
让mapper类继承basemapper,然后泛型那里填要操作的实体类对象,就可以在代码中调用basemapper提供的方法对实体类对象增删查改
例如:
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.example.demo.entity.User;
public interface UserMapper extends BaseMapper<User> {
// 可以在这里添加自定义的方法,除了BaseMapper提供的通用方法之外
}
如果数据库中的表名、字段名和实体类中的不一致,可以通过注解指定
@TableName:用来指定表名
@Tableld:用来指定表中的主键字段信息
@TableField:用来指定表中的普通字段信息
例如:
@TableName("tb_user")
public class User {
@TableId(value="id")
private Long id;
private String name;
}
Wapper条件构造器
专门用来生成复杂的增删改查条件,我们常用链式编程构造条件对象
QueryWapper
举例学习:
//创建一个基于User实体类的条件对象
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("status", "active") // 添加WHERE status = 'active'
.lt("age", 30) // 添加AND age < 30
.like("username", "john"); // 添加AND username LIKE '%john%'
//把条件传进去让他执行
List<User> users = userMapper.selectList(queryWrapper);
相当于:
select * from user
where status = 'active'
and age<30
and username like '%john%'
赋值的update(第一个是更新的内容,第二个是更新的条件)
//1.要更新的数据
User user =new User():
user.setBalance(2000);
//2.更新的条件
QueryWrapper<User> wrapper = new QueryWrapper<User>()
.eq("username","jack")
//3.执行更新
userMapper.update(user,wrapper);
修改的update(因为修改的东西直接在条件写了,所以不需要更新的内容,填null即可)
List<Long>ids = List.of(1L,2L,4L);
UpdateWrapper<User>wrapper =new UpdateWrapper<User>()
.setSql("balance =balance-200")
.in( column: "id", ids);
userMapper.update(null, wrapper);
自定义sql(先存一波,慢慢消化)
IService
MyBatis Plus 框架提供的一个接口,位于业务逻辑层(Service 层),主要用于定义一些通用的业务方法,简单的业务逻辑可以不需要编写impl层,调用IService的方法直接完成。
import com.baomidou.mybatisplus.extension.service.IService;
import com.example.demo.entity.User;
public interface UserService extends IService<User> {
// 可以在这里添加自定义的业务方法,除了IService提供的通用方法之外
}
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.example.demo.entity.User;
import com.example.demo.mapper.UserMapper;
import com.example.demo.service.UserService;
import org.springframework.stereotype.Service;
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {
// 可以在这里实现自定义的业务方法,或者重写IService中的方法来添加业务逻辑
}
二、Apache POI
①写入操作(在内存写入,传到流传给本地保存)
1. 创建文件
//在内存中创建一个空的excel文件
XSSFWorkbook workbook = new XSSFWorkbook();
//创建一个新标签页(用POI创建的文件默认没有标签页)
XSSFSheet sheet = workbook.createSheet("New Sheet"); //括号内指定标签页名称
2. 创建行、创建单元格、写入数据
// 创建第一行(索引从0开始)
Row row = sheet.createRow(0);
// 创建第一个单元格并写入数据
Cell cell = row.createCell(0);
cell.setCellValue("Hello, World!");
3. 保存文件
首先创建一个文本流管道,连接xlsx文件,然后把内存中的excel表格写入流,流会写入xlsx,最后依次关闭管道流和内存的临时文件
try {
FileOutputStream outputStream = new FileOutputStream("new_excel_file.xlsx");
workbook.write(outputStream);
outputStream.close();
workbook.close();
} catch (IOException e) {
e.printStackTrace();
}
②读取操作(从本地传入流,传到内存中,读取数据)
1. 读取文件
//创建流连接对应的文件
FileInputStream file = new FileInputStream(new File("your_excel_file.xlsx"));
//创建工作簿对象,通过流读取已有的文件到内存中
XSSFWorkbook workbook = new XSSFWorkbook(file);
2. 提取具体的内容
//读取Excel文件中的标签页,用索引可以,用name也行(getSheet方法)
XssFSheet sheet=excel.getSheetAt(0);
//获取标签页中最后一行的行号,从上而下,直到最后一行有数据的行
int lastRowNum= sheet.getLastRowNum();
for(int i=1;i<=lastRowNum ; i++){
//获得第i行
XSSFRow row=sheet.getRow(i);
//getcell获得单元格对象,getstringCellValue获取单元格中的值
String cellValue1 =row.getcell(1).getStringCellValue();
String cellValue2 =row.getcell(2).getStringcellValue();
System.out.println(cellValue1 +" "+ cellValue2);
}
3. 具体项目中的excel表读写操作通常不会再从内存中创建临时文件,而是调用模板excel文件,如果把数据库数据转成excel下载到本地,就把具体的数据写到对应的单元格中;如果把本地的excel导入到项目中,那就解析对应的单元格,取值写到数据库中即可
模板文件一般放在/resource/template文件夹下
//通过POI将数据写入到Excel文件中,用类加载器获取类路径下的excel文件
//this可改为显式的类名
Inputstream in = this.getClass().getClassLoader().getResourceAsstream("模板excel");
//放到内存中
XSSFWorkbook excel = new XSSFWorkbook(in);
//获取当前标签页
XSSFSheet sheet = excel.getsheet("sheet1");
//填充数据,获得第m行
XSSFRow row=sheet.getRow(m);
//m行n列修改值
row.getCell(n).setCellValue(businessDatav0.getTurnover());
row.getCell(n).setCellValue(businessDatavo.getOrderCompletionRate());
row.getcell(n).setcellValue(businessDatavo.getNewUsers());
如何返回浏览器请求下载:
导包,在方法上添加HttpServletResponse response作为参数
//通过输出流将Excel文件下载到客户端浏览器
ServletOutputstream out=response.getOutputstream();
excel.write(out);
三、杂七杂八
1. 特别的注入方法
用构造函数注入比@Autowired要好,但是如果注入要的参数很多,构造函数很长不好看,可以用Lombok注解,在controller类上加@RequiredArgsConstructor注解,注入部分用final修饰,比如private final ItesmService itemservice
2. User user =BeanUtil.copyProperties(userDTO,User.class);
↑ 这种是通过反射生成一个全新的类并复制
BeanUtil.copyProperties(userDTO,user)
↑ 这个是复制到已有的类
3. SendSmsRequest是一个用于发送短信请求的类
常用参数:
PhoneNumbers:
存储接收短信的手机号码
SignName
:短信签名属性,短信内容开头显示的、用于标识短信发送方身份的一段文字
TemplateCode
:短信模板id
TemplateParam
:用于存储短信模板参数,通常是json格式