本示例支持动态字段查询,动态条件查询,支持in等操作,反正简单的重复的事情都帮你做了,直接写好service接口就OK了(建议条件字段等都在service中定义)
网上各种从java类里面实现重用,我也是有点蒙...
个人不太喜欢,还是喜欢玩配置文件的重用...
找了半天没找到mybatis怎么继承配置文件(第一次用mybatis),还望知道的兄弟告知...
看了下官方文档,于是有了以下重用方案,喜欢这种方式的可以拿起去嫖...
先演示演示使用方式:
如此就可以实现查询ORG_PK=orgPk and LOGIN_NAME=loginName
有喜欢用的,有不喜欢用的,反正我目前挺喜欢用这种方式的
PS:(请勿使用前端传递字段和操作符参数,否则可能存在sql注入)
@Override
public Page<SysUser> findByLoginName(String orgPk,String loginName) {
List<Model> conditions = MyBatisUtil.parseBase("ORG_PK,=,"+orgPk,"LOGIN_NAME,=,"+loginName);
Page<SysUser> page = getBaseMapper().selectExtend(conditions, null, null);
return page;
}
好了,屁话不多说,上xml配置文件代码,每次只需修改表名
<select id="selectExtend" resultMap="BaseResultMap">
select
<if test="columns==null">
<include refid="Base_Column_List" />
</if>
<if test="columns!=null">
<foreach collection="columns" index="index" item="c" open=""
separator="," close="">
${c}
</foreach>
</if>
from sys_user
<where>
<foreach collection="conditions" index="index" item="c" open=""
separator="and" close="">
${c.column} ${c.operate}
<if test="c.value!=null">#{c.value}</if>
<if test="c.value==null">
<foreach collection="c.values" index="index" item="v" open="("
separator="," close=")">
#{v}
</foreach>
</if>
<if test="order!=null">
ORDER BY ${order}
</if>
</foreach>
</where>
</select>
附上MybatisUtil代码,携带此工具类,才可使用上述方式,装逼利器.需者带走......初次使用mybatis,该工具未经时间验证,不保证不存在bug,代码其实很简单,有bug自己改...
package com.cykj.base.common.util;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import org.apache.commons.lang3.StringUtils;
import com.cykj.base.common.model.Model;
/**
* MyBatis工具类
* @author LeiYong
*
*/
public class MyBatisUtil {
private static final String splitCharacter = ",";
/**
* 解析String为Model,切割符默认为","
* @param texts 如"pk,=,111","age,>,15"
* @return
*/
public static List<Model> parseBase(String... texts){
List<Model> list = new ArrayList<>();
if (texts!=null&&texts.length>0) {
for (String text : texts) {
if (StringUtils.isNotBlank(text)) {
String[] arr = StringUtil.indexOf(text, splitCharacter, 0);
String[] arr2 = StringUtil.indexOf(arr[1], splitCharacter, 0);
list.add(new Model(arr[0],arr2[0], arr2[1]));
}
}
}
return list;
}
/**
* 解析String为Model,默认使用,分割
* 例如:"name","in","张三,李四,王五"
* @param column 列
* @param operator 操作符
* @param values 值集
* @return
*/
public static Model parseList(String column,String operator,String values){
return parseList(column, operator, values, splitCharacter);
}
/**
* 解析String为Model
* 例如:"name","in","张三#李四#王五","#"
* @param column 列
* @param operator 操作符
* @param values 值集
* @param split 切割符,支持正则
* @return
*/
public static Model parseList(String column,String operator,String values,String split){
if (StringUtils.isNotBlank(values)) {
List<String> list = Arrays.asList(values.split(split));
return new Model(column,operator,list);
}
return null;
}
}
最后附上Model类:
package com.cykj.base.common.model;
import java.util.List;
/**
* 操作类
* 考虑添加一组columns列来自定义查询的列
* @author LeiYong
*
*/
public class Model {
private String column;
private String operate;
private Object value;
private List<Object> values;
public Model(String column, String operate, List<Object> values) {
super();
this.column = column;
this.operate = operate;
this.values = values;
}
public Model(String column, String operate, Object value) {
super();
this.column = column;
this.operate = operate;
this.value = value;
}
public String getColumn() {
return column;
}
public void setColumn(String column) {
this.column = column;
}
public String getOperate() {
return operate;
}
public void setOperate(String operate) {
this.operate = operate;
}
public Object getValue() {
return value;
}
public void setValue(Object value) {
this.value = value;
}
public List<Object> getValues() {
return values;
}
public void setValues(List<Object> values) {
this.values = values;
}
@Override
public String toString() {
StringBuffer sb = new StringBuffer();
sb.append(column);
sb.append(operate);
sb.append(value==null?values.toString():value);
return sb.toString();
}
}