您当前的位置: 首页 >  mybatis

zmc@

暂无认证

  • 2浏览

    0关注

    142博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

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

zmc@ 发布时间:2020-10-30 14:25:28 ,浏览量:2

先说一些注意事项:

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 fieldsReturn;

  @JsonProperty("limit")
  private Integer limit;

  @JsonProperty("start")
  private Integer start;

  @JsonProperty("order")
  private String order;

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

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

public interface DbService {
    /**
     * 获取表中数据
     * @param req
     * @return
     */
    List 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 paas_host
    
      
        ${key} =  #{item}
      
    
    
      
    
  


Java:

/**
     * 自定义update方法
     * 实现更新字段可选
     * 可set列为null
     * update的查询条件为所有字段且可为null
     * @param map
     * @param example
     * @return
     */
    void updateColumnByExampleSelective(@Param("map") Map 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 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.如何设计支持大接口的指定返回值?-----暂未找到好的方案

 

 

 

关注
打赏
1643271353
查看更多评论
立即登录/注册

微信扫码登录

0.0369s