mybatis设计大接口的坑以及做法

本文介绍了MyBatis使用中的注意事项,包括mapper.java与mapper.xml的一对一关系,处理text类型字段的方法,updateByExampleWithBLOBs的使用细节,以及自定义mapper方法的注解规则。此外,提出了一种大查询接口设计方案,支持动态查询、返回值过滤null,并提供了更新时设置字段为null的解决办法。同时,讨论了查询特定列值为null的实现方式。
摘要由CSDN通过智能技术生成

先说一些注意事项:

1.注:mybatis一个mapper.java文件只能对应一个mapper.xml文件,所以不能一个mapper.java对应两个xml(一个默认的,一个自己拓展的)

2.注:如果表中有字段是text,selectByExample是不能返回该字段的,最终结果该字段为null;如需返回,则使用selectByExampleWithBLOBs方法

3.注:updateByExampleWithBLOBs使用的时候需要注意,需要传入全部的字段进行替换,否则会覆盖成null

4.注:自定义的mapper方法,如果参数一个可以不写 @Param,如果多个参数,则参数名前必须写上,如果是example也需要写上@Param

 

一个大查询接口的设计:

1.一个查询接口要能够支持所有的表

传入的参数定义:

//指定表
  @JsonProperty("table")
  private String table;

//指定查询条件
  @JsonProperty("query")
  private JSONObject query;

//指定返回属性
  @JsonProperty("fields_return")
  private List<String> fieldsReturn;

  @JsonProperty("limit")
  private Integer limit;

  @JsonProperty("start")
  private Integer start;

  @JsonProperty("order")
  private String order;

注:更新与查询设计类似,不再赘述

设计接口如下:所有impl实现该接口(类似于责任链)

public interface DbService<TRes> {
    /**
     * 获取表中数据
     * @param req
     * @return
     */
    List<TRes> get(DbQueryReq req);

    /**
     * 更新表中数据
     * @param req
     * @return
     */
    void update(DbUpdateReq req);

    /**
     * 新增表中数据
     * @param req
     * @return
     */
    void add(DbAddReq req);

    /**
     * 删除后表中数据
     * @param req
     * @return
     */
    void delete(DbDeleteReq req);
}

 

2.传入/返回 的json为下划线,接收的对象为驼峰

接收和返回的类字段全部加上注解:

@JsonProperty("id")
private String id;

 

3.返回值必须设计成Object,返回的时候fastjson会将值为null的key直接屏蔽,不返回,需要做到支持返回null

/**
     * 该配置将驼峰转化为下划线
     *
     * SerializerFeature.WriteMapNullValue 将NULL值返回
     */
    static SerializeConfig serializeConfig = new SerializeConfig();
    static {
        serializeConfig.propertyNamingStrategy = PropertyNamingStrategy.SnakeCase;
    }


返回的时候使用以上两个配置:

jsons = NotNull.getList(Res).stream().map(r -> JSONObject.parseObject(JSON.toJSONString(r, serializeConfig, SerializerFeature.WriteMapNullValue))).collect(Collectors.toList());

4.更新的时候只传入要更新的字段可以使用updateByExampleSelective,如果需要set 属性 为null,则无法支持了,该如何支持?

xml:

<update id="updateColumnByExampleSelective" parameterType="map">
    update paas_host
    <set>
      <foreach collection="map.entrySet()"  item="item" index="key" separator=",">
        ${key} =  #{item}
      </foreach>
    </set>
    <if test="_parameter != null">
      <include refid="Update_By_Example_Where_Clause" />
    </if>
  </update>


Java:

/**
     * 自定义update方法
     * 实现更新字段可选
     * 可set列为null
     * update的查询条件为所有字段且可为null
     * @param map
     * @param example
     * @return
     */
    void updateColumnByExampleSelective(@Param("map") Map<String, Object> map, @Param("example") DbExample example);

 

5.查询的时候需要查询某列为null,需要如何支持?

// get\update\delete的查询复用以下方法:


    private boolean setSearchExample(JSONObject query, DbExample.Criteria criteria) {

        boolean hasValidQuery = false;
        if(query != null){
            if(query.containsKey("ids")){
                hasValidQuery = true;
                if(query.getJSONArray("ids") != null){
                    List<Integer> ids = JSONObject.parseArray(query.getJSONArray("ids").toJSONString(), Integer.class);
                    criteria.andIdIn(ids);
                } else {
                    criteria.andIdIsNull();
                }
            }
            if(query.containsKey("id")){
                hasValidQuery = true;
                if(query.getInteger("id") != null){
                    criteria.andIdEqualTo(query.getInteger("id"));
                } else {
                    criteria.andIdIsNull();
                }
            }          

        }
        return hasValidQuery;
    }

6.如何设计支持大接口的指定返回值?-----暂未找到好的方案

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值