先说一些注意事项:
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.如何设计支持大接口的指定返回值?-----暂未找到好的方案