二、通用Mapper实现基本增删改查-BaseMapper
2.5 insert 相关方法
// 保存一个实体,null的属性也会保存,不会使用数据库默认值 int insert(T record); // 保存一个实体,null的属性不会保存,会使用数据库默认值 int insertSelective(T record); 复制代码
2.5.1 insert 方法
在PorscheService中增加save方法
void save(Porsche porsche); 复制代码
在PorscheServiceImpl中实现save方法的实现
@Override public void save(Porsche porsche) { porscheMapper.insert(porsche); } 复制代码
在PorscheServiceTest中对save方法进行测试
@Test public void save(){ // 构造插入的实体类 Porsche porsche = new Porsche(); porsche.setPorName("Panamera 4S 2022"); porsche.setPorPrice(880000d); porsche.setPorStock(10); porscheService.save(porsche); } 复制代码
执行save测试方法
数据库更新了一行,插入成功。增加测试代码,输出自增的主键,再次执行测试
输出主键为null,实际插入数据库后已经生成了自增主键,只是程序没有获取到插入成功后生成的主键。 要获取生成的主键Value需要在Porsche实体类与数据主主键对应的属性上增加@GeneratedValue(strategy = GenerationType.IDENTITY) 再次执行测试
执行了两条SQL语句,一条插入语句,一条是查询最新的主键的Value,控制台成功输出插入成功后生成的自增主键的Value。
@GeneratedValue注解可以让通用Mapper在执行insert操作之后将数据库自动生成的自增主键的值回写到实体类中
2.5.2 insertSelective 方法
在PorscheService中增加savePorscheSelective方法
void savePorscheSelective(Porsche porsche); 复制代码
在PorscheServiceImpl中增加savePorscheSelective方法的实现
@Override public void savePorscheSelective(Porsche porsche) { porscheMapper.insertSelective(porsche); } 复制代码
增加savePorscheSelective测试方法
@Test public void savePorscheSelective(){ Porsche porsche = new Porsche(); porsche.setPorName("Porsche 911 2022"); porscheService.savePorscheSelective(porsche); } 复制代码
非主键字段如果为null,就不会被加入到SQL语句中
适合实体类属性较多,但是执行插入时插入属性部位NULL的数据比较少的情况
2.6 update 相关方法
// 根据主键更新实体全部字段,null值会被更新 int updateByPrimaryKey(T record); // 根据主键更新属性不为null的值 int updateByPrimaryKeySelective(T record); 复制代码
2.6.1 updateByPrimaryKeySelective
在PorscheService中增加updatePorscheSelective方法
void updatePorscheSelective(Porsche porsche); 复制代码
在PorscheServiceImpl中增加updatePorscheSelective方法的实现
@Override public void updatePorscheSelective(Porsche porsche) { porscheMapper.updateByPrimaryKeySelective(porsche); } 复制代码
增加updatePorscheSelective测试方法
@Test public void updatePorscheSelective(){ Porsche porsche = new Porsche(); porsche.setPorId(1); porsche.setPorPrice(900000d); porscheService.updatePorscheSelective(porsche); } 复制代码
执行测试
针对部分字段更新的实体类使用该方法 针对有值的字段进行更新,没有值的字段保持不变
2.7 delete 相关方法
// 根据实体属性作为条件进行删除,查询条件使用等号 int delete(T record); // 根据主键字段进行删除,方法参数必须包含完整的主键属性 int deleteByPrimaryKey(Object key); 复制代码
2.7.1 delete
在PorscheService中增加removePorsche方法
void removePorsche(Porsche porsche); 复制代码
在PorscheServiceImpl中增加removePorsche方法的实现
@Override public void removePorsche(Porsche porsche) { porscheMapper.delete(porsche); } 复制代码
增加removePorsche的测试方法
@Test public void removePorsche(){ // 构造要删除的实体类 Porsche porsche = new Porsche(); porsche.setPorName("Panamera 4S 2022"); porsche.setPorPrice(880000d); porsche.setPorStock(10); porscheService.removePorsche(porsche); } 复制代码
执行测试
如果传入的对象为null,注释掉对象的setter方法后再次执行测试
数据被全部删除,使用这个方法一定要慎重,要进行条件判断
2.7.2 deleteByPrimaryKey
在PorscheService中增加removePorscheById方法
void removePorscheById(Integer id); 复制代码
在PorscheServiceImpl中增加removePorscheById方法的实现
@Override public void removePorscheById(Integer id) { porscheMapper.deleteByPrimaryKey(id); } 复制代码
增加removePorscheById测试方法
@Test public void removePorscheById(){ // 删除记录的主键 Integer id = 1; porscheService.removePorscheById(id); } 复制代码
执行测试
deleteByPrimaryKey最常用的删除的方法