mybatis動態查詢條件
阿新 • • 發佈:2019-02-03
1. 需求:動態傳遞表名,列名以及條件,然後根據傳遞的資料返回資料
2.專案結構:
3. 實現:
3.1. 加入配置檔案mybatis-config.xml以及CommonMapper.xml
CommonMapper.xml:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.xk.mybatis.mapper.CommonMapper"> <select id="getData" resultType="java.util.Map" parameterType="java.util.Map"> SELECT <if test="property==null"> * </if> <if test="property!=null"> ${property} </if> FROM ${tableName} <where> <if test="conds!=null"> <foreach collection="conds" item="cond" separator="and" > ${cond.column} ${cond.oper} ${cond.value} </foreach> </if> </where> <if test="sorts!=null "> order by <foreach collection="sorts" item="sort" separator="," > ${sort.property} ${sort.direction} </foreach> </if> </select> </mapper>
3.2 控制層
@Controller @RequestMapping("/api/base/common") public class NormalController { @Autowired private CommonService commonService ; @RequestMapping(value = "/", method = {RequestMethod.GET}) @ResponseBody public APIResponse<List<Map<String,String>>> getData(QueryDto queryDto){ return new APIResponse<List<Map<String,String>>>(commonService.getData(queryDto)); } }
3.3 service層
@Service public class CommonService { @Autowired private CommonMapper commonMapper; @Transactional(readOnly=true) public List<Map<String,String>> getData(QueryDto queryDto){ Map<String,Object> map = new HashMap<>(); if(queryDto==null){ return null; } // 設定表名 map.put("tableName",queryDto.getTname()); // 設定獲取的屬性名 String[] properties = queryDto.getProperty() ; String property = null; if(properties!=null){ property = String.join(",",queryDto.getProperty()); } map.put("property",property); // 設定條件 map.put("conds",queryDto.generatorConds()); // 設定排序 map.put("sorts",queryDto.generatorSort()); return commonMapper.getData(map); } }
3.4 通用查詢類:
public class QueryDto implements Serializable {
private String tname;
private String[] property;
private String searchConds;
/**
* 排序欄位_排序規則
*/
private String[] sorts;
public String getTname() {
return tname;
}
public void setTname(String tname) {
this.tname = tname;
}
public String[] getProperty() {
return property;
}
public void setProperty(String[] property) {
this.property = property;
}
public String getSearchConds() {
return searchConds;
}
public void setSearchConds(String searchConds) {
this.searchConds = searchConds;
}
public String[] getSorts() {
return sorts;
}
public void setSorts(String[] sorts) {
this.sorts = sorts;
}
/**
* 生成排序
*
* @return List<Sort>
*/
public List<Sort> generatorSort() {
List<Sort> list = new ArrayList<Sort>();
if (sorts != null && sorts.length > 0) {
for (String sort : sorts) {
String[] sortArr = sort.split("_");
if (sortArr.length == 1) { //預設升序
list.add(new Sort(sort, Direction.ASC));
}
// 排序
if (sortArr.length > 1) {
if (Direction.ASC.equalsIgnoreCase(sortArr[1]) || Direction.DESC.equalsIgnoreCase(sortArr[1])) {
list.add(new Sort(sortArr[0], sortArr[1]));
}
}
}
return list;
}
return null;
}
/**
* 將條件返回封裝成list
*
* @return
*/
public List<Conds> generatorConds() {
// 獲取條件,儲存Map
List<Conds> list = new ArrayList<>();
if (!StringUtils.isEmpty(this.searchConds)) {
JSONArray json = JSONArray.fromObject(this.searchConds);
for (int i = 0; i < json.size(); i++) {
JSONObject jsonOne = json.getJSONObject(i);
// 獲取屬性
String fieldName = (String) jsonOne.get("name");
// 獲取值
String value = (String) jsonOne.get("value");
if (!StringUtils.isEmpty(value)) {
String[] fieldArr = fieldName.split("_");
// 如果長度為1,預設為精確查詢
if (fieldArr.length == 1) {
// ssb.add(fieldName, "=", (String) jsonOne.get("value"));
list.add(new Conds(fieldName, "=", value));
}
// 如果長度超過1
if (fieldArr.length > 1) {
list.add(new Conds(fieldArr[1], CondOper.getCond(fieldArr[0]), value));
}
}
}
return list;
}
return null;
}
}
**
* Created by Administrator on 2017/11/30.
* 條件封裝類
*/
public class Conds {
/**
* 屬性
*/
private String column;
/**
* 操作符
*/
private String oper;
/**
* 條件值
*/
private String value;
public Conds() {
}
public Conds(String column, String oper, String value) {
this.column = column;
this.oper = oper;
this.value = value;
}
public String getOper() {
if ("like".equalsIgnoreCase(oper)){
this.value = "'%"+value+"%'";
}
if ("llike".equalsIgnoreCase(oper)){
this.oper ="like";
this.value = "'%"+value+"'";
}
if ("rlike".equalsIgnoreCase(oper)){
this.oper ="like";
this.value = "'"+value+"%'";
}
return oper;
}
public void setOper(String oper) {
this.oper = oper;
}
public String getValue() {
if ("like".equalsIgnoreCase(oper)){
return this.value;
}
return "'"+value+"'";
}
public void setValue(String value) {
this.value = value;
}
public String getColumn() {
return column;
}
public void setColumn(String column) {
this.column = column;
}
@Override
public String toString() {
return "Conds{" +
"column='" + column + '\'' +
", oper='" + oper + '\'' +
", value='" + value + '\'' +
'}';
}
}
其餘的未列出...
3.4 測試
3.5 注意:
get請求傳遞JSON需要進行編碼
用js預設的encodeURI即可。