概要

在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方法,代码更简洁了

文档更新时间: 2021-09-13 16:22   作者:zyg