Data Access 之 MyBatis(八)- MyBatis 通用 Mapper(Part B)(上)

简介: Data Access 之 MyBatis(八)- MyBatis 通用 Mapper(Part B)

二、通用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测试方法

7ce00a1f86224080a3be1723417ef9d9_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.png

数据库更新了一行,插入成功。增加测试代码,输出自增的主键,再次执行测试

fef96e954ab7492596479a3f9285468f_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.png

输出主键为null,实际插入数据库后已经生成了自增主键,只是程序没有获取到插入成功后生成的主键。 要获取生成的主键Value需要在Porsche实体类与数据主主键对应的属性上增加@GeneratedValue(strategy = GenerationType.IDENTITY) 再次执行测试

2dc29ff204e44b98a318f5cf2ebedc81_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.png

执行了两条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语句中

24c94e42707c41db8fdbe8a9a142bbc9_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.png

适合实体类属性较多,但是执行插入时插入属性部位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);
}
复制代码

执行测试

90baaaaacff942fbbb0b04783a355ea2_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.png

针对部分字段更新的实体类使用该方法 针对有值的字段进行更新,没有值的字段保持不变

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);
}
复制代码

执行测试

91a7aa16b6de4906a318cd3091ecbe53_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.png

如果传入的对象为null,注释掉对象的setter方法后再次执行测试

c69f376d78144106bc241bfc8f702354_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.png

数据被全部删除,使用这个方法一定要慎重,要进行条件判断

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);
}
复制代码

执行测试

0f4823e7705748f4b6583d0ca0e8f4dd_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.png

deleteByPrimaryKey最常用的删除的方法

相关文章
|
19天前
|
SQL Java 数据库连接
mybatis使用四:dao接口参数与mapper 接口中SQL的对应和对应方式的总结,MyBatis的parameterType传入参数类型
这篇文章是关于MyBatis中DAO接口参数与Mapper接口中SQL的对应关系,以及如何使用parameterType传入参数类型的详细总结。
27 10
|
3月前
|
SQL Java 数据库连接
Mybatis系列之 Error parsing SQL Mapper Configuration. Could not find resource com/zyz/mybatis/mapper/
文章讲述了在使用Mybatis时遇到的资源文件找不到的问题,并提供了通过修改Maven配置来解决资源文件编译到target目录下的方法。
Mybatis系列之 Error parsing SQL Mapper Configuration. Could not find resource com/zyz/mybatis/mapper/
|
2月前
|
SQL XML Java
mybatis :sqlmapconfig.xml配置 ++++Mapper XML 文件(sql/insert/delete/update/select)(增删改查)用法
当然,这些仅是MyBatis功能的初步介绍。MyBatis还提供了高级特性,如动态SQL、类型处理器、插件等,可以进一步提供对数据库交互的强大支持和灵活性。希望上述内容对您理解MyBatis的基本操作有所帮助。在实际使用中,您可能还需要根据具体的业务要求调整和优化SQL语句和配置。
43 1
|
3月前
|
XML Java 数据库连接
Mybatis 模块拆份带来的 Mapper 扫描问题
Mybatis 模块拆份带来的 Mapper 扫描问题
43 0
|
4月前
|
SQL
自定义SQL,可以利用MyBatisPlus的Wrapper来构建复杂的Where条件,如何自定义SQL呢?利用MyBatisPlus的Wrapper来构建Wh,在mapper方法参数中用Param注
自定义SQL,可以利用MyBatisPlus的Wrapper来构建复杂的Where条件,如何自定义SQL呢?利用MyBatisPlus的Wrapper来构建Wh,在mapper方法参数中用Param注
|
4月前
|
Java 数据库连接 Maven
Private method ‘getVideoList()‘ is never used,mybatis必须指定Mapper文件和实体目录,在参考其他人写的代码,要认真分析别人的代码,不要丢失
Private method ‘getVideoList()‘ is never used,mybatis必须指定Mapper文件和实体目录,在参考其他人写的代码,要认真分析别人的代码,不要丢失
|
5月前
|
SQL Java 数据库连接
Mybatis如何使用mapper代理开发
Mybatis如何使用mapper代理开发
|
5月前
|
XML 关系型数据库 数据库
使用mybatis-generator插件生成postgresql数据库model、mapper、xml
使用mybatis-generator插件生成postgresql数据库model、mapper、xml
453 0
|
5月前
|
SQL Java 数据库连接
Mybatis中一对多mapper配置
Mybatis中一对多mapper配置
|
5月前
|
Java 数据库连接 mybatis
Mybatis mapper动态代理解决方案
该文介绍了Mybatis中使用Mapper接口的方式代替XML配置执行SQL。Mapper接口规范包括:namespace与接口类路径相同,select ID与接口方法名一致,parameterType和方法参数类型匹配,resultType与返回值类型一致。实现过程中,需配置Mapper.xml,编写Mapper.java接口,并在Mybatis-config.xml中设置。测试类中,通过SqlSession的getMapper方法获取接口的动态代理对象,调用方法执行SQL。