概要
在jpaas 平台中,数据库访问类继承了 com.baomidou.mybatisplus.core.mapper.BaseMapper 类。这篇文章将介绍下这个基础类的方法如何使用。
测试用例
本次测试操作的数据表为: FORM_PC
实体类为
deleteById 测试
@Test
public void deleteById(){
Integer rtn= formPcMapper.deleteById("1224254131571535874");
Assert.assertTrue(rtn>0);
}
执行结果
==> Preparing: DELETE FROM form_pc WHERE ID_=?
==> Parameters: 1224254131571535874(String)
<== Updates: 1
delete 构造条件进行删除
这个方法支持我们使用 QueryWrapper 构造删除条件进行删除。
@Test
public void delete(){
QueryWrapper<FormPc> pcQueryWrapper=new QueryWrapper<>();
pcQueryWrapper.eq("ALIAS_","demo");
Integer rtn= formPcMapper.delete(pcQueryWrapper);
Assert.assertTrue(rtn>0);
}
执行结果
==> Preparing: DELETE FROM form_pc WHERE ALIAS_ = ?
==> Parameters: demo(String)
可以看到它构建了根据列名删除的条件语句,注意:
pcQueryWrapper.eq(“ALIAS_”,”demo”);
在构造条件时,这里使用的是数据库的列名。
updateById 根据ID更新对象
这个方法就是给定实体,根据id来更新对象。
测试方法:
FormPc formPc=new FormPc();
formPc.setId("1224254131571535874");
formPc.setCategoryId("0001");
formPc.setUpdateBy("1");
Integer rtn= formPcMapper.updateById(formPc);
Assert.assertTrue(rtn>0);
执行结果:
==> Preparing: UPDATE form_pc SET CATEGORY_ID_=?, UPDATE_TIME_=?, UPDATE_BY_=? WHERE ID_=?
==> Parameters: 0001(String), 2020-02-04 15:56:34.439(Timestamp), 1(String), 1224254131571535874(String)
根据执行结果可以看到,只有赋值了的属性才进行了更新,而不是执行所有字段的更新,效率更高。
update 方法
int update(@Param(“et”) T entity, @Param(“ew”) Wrapper updateWrapper); 这个方法的作用是可以不根据 主键,更新相关字段的数据。
测试方法:
UpdateWrapper wrapper=new UpdateWrapper();
wrapper.set("CATEGORY_ID_","-1");
wrapper.set("BODEF_ID_","-1");
wrapper.eq("ALIAS_","demo2");
FormPc formPc=new FormPc();
formPc.setId("1224249401688469506");
formPc.setCategoryId("0001");
formPc.setUpdateBy("1");
formPcMapper.update(formPc,wrapper);
这里设置了需要更改的列, 使用 eq 设置 where 条件。 执行结果是:
==> Preparing: UPDATE form_pc SET CATEGORY_ID_=?, UPDATE_TIME_=?, UPDATE_BY_=?, CATEGORY_ID_=?,BODEF_ID_=? WHERE ALIAS_ = ?
==> Parameters: 0001(String), 2020-02-04 16:12:46.072(Timestamp), 1(String), -1(String), -1(String), demo2(String)
方法根据别名更新 数据库表,并更新了用户指定的列,当然对象的属性如果为空将不进行更新。
其他的方法 都类似 这里就不一一测试了。
注意 查询删除的时候使用 QueryWrapper 构建条件,更新时使用 UpdateWrapper ,另外这个wrapper 对象还支持链式写法
根据条件查询指定的列数据
有时候我们在查询的时候,我们希望 不是查询 所有的列,希望只查指定的列。
编写代码如下:
public void getByAlias(){
QueryWrapper wrapper=new QueryWrapper();
wrapper.select(new String[]{"ID_","NAME_","ALIAS_","BODEF_ID_"});
wrapper.eq("ALIAS_","contract");
wrapper.eq("MAIN_",1);
FormPc formPc= formPcMapper.selectOne(wrapper);
System.err.println("ok");
}
这里是根据别名和是否主版本查询 指定列进行查询,后台执行的SQL脚本。
==> Preparing: SELECT ID_,NAME_,ALIAS_,BODEF_ID_ FROM form_pc WHERE ALIAS_ = ? AND MAIN_ = ?
==> Parameters: contract(String), 1(Integer)
在map文件中增加自定义SQL
上面提到的基类的方法能解决单表操作的大部分问题,如果用户希望自己编写sql如何处理呢?
示例1
<select id="isExist" resultType="java.lang.Integer" parameterType="java.util.Map">
select count(*) from form_pc where ALIAS_=#{alias} and MAIN_ =1
<if test="@rx.Ognl@isNotEmpty(id)">
and ID_!=#{id}
</if>
</select>
比如这里根据别名查询数据记录数。
编写 mapper 方法如下:
Integer isExist(Map<String,Object> params);
service 调用方法
public boolean isExist(String alias,String id){
Map<String,Object> params=new HashMap<>();
params.put("alias",alias);
if(StringUtils.isNotEmpty(id)){
params.put("id",id);
}
Integer rtn=formPcMapper.isExist(params);
return rtn>0;
}
示例2
多表关联查询:
<select id="getByDefId" resultType="java.util.HashMap" parameterType="java.util.Map">
select pc.ID_,pc.NAME_,pc.CATEGORY_ID_,pc.ALIAS_ from form_pc pc,form_bo_def def where pc.BODEF_ID_=def.ID_ and def.ID_=#{id}
</select>
编写方法:
List<Map<String,Object>> getByDefId(String id);
执行结果
==> Preparing: select pc.ID_,pc.NAME_,pc.CATEGORY_ID_,pc.ALIAS_ from form_pc pc,form_bo_def def where pc.BODEF_ID_=def.ID_ and def.ID_=?
==> Parameters: 11(String)
<== Columns: ID_, NAME_, CATEGORY_ID_, ALIAS_
<== Row: 1224249401688469506, demo2, -1, demo2
<== Total: 1
当传入一个参数的时候,会自动的注入进去,多个参数就使用map 这里就不再做例子说明了。
mybatisplus 比较智能,一般情况下,都不需要写 mapping语句了和map方法,代码更简洁了