mybatis實現動態語句查詢
阿新 • • 發佈:2018-11-03
前幾天和朋友忽然聊到怎麼可以動態查詢sql,也就是不管傳遞過來多少欄位,以及欄位對應的值,都可以使用這種通用的查詢方法;也許很多部落格上面都有這種查詢的方式,其實我也是參照了其他人的部落格之後,使用springboot+ssm自己建立了一個Demo;
1.首先看一下目錄結構:
2.建立相應的封裝引數的類:
package com.yqwoe.codegenerator.model.param; import java.io.Serializable; public class Item implements Serializable { final String IN = "in"; String fieldName; String value; String type; String[] values = null; public Item() { } public Item(String fieldName, String value, String type) { this.fieldName = fieldName; this.value = value; this.type = type; } public void setFieldName(String fieldName) { this.fieldName = fieldName; } public void setValue(String value) { this.value = value; } public void setType(String type) { this.type = type; } public String getFieldName() { return fieldName; } public String getValue() { return value; } public String getType() { return type; } public String[] getValues() { if (IN.equals(this.type)) { return value.split(","); } return values; } }
package com.yqwoe.codegenerator.model.param; public class Order { String fieldName; String type="asc"; public String getFieldName() { return fieldName; } public void setFieldName(String fieldName) { this.fieldName = fieldName; } public String getType() { return type; } public void setType(String type) { this.type = type; } public Order() { } public Order(String fieldName, String type) { this.fieldName = fieldName; this.type = type; } }
package com.yqwoe.codegenerator.model.param;
import java.io.Serializable;
import java.util.List;
public class QueryParam implements Serializable {
List<Item> items = null;
List<Order> orders = null;
int pageNum = 1;
int pageSize = 10;
public QueryParam() {
}
public List<Item> getItems() {
return items;
}
public void setItems(List<Item> items) {
this.items = items;
}
public List<Order> getOrders() {
return orders;
}
public void setOrders(List<Order> orders) {
this.orders = orders;
}
public int getPageNum() {
return pageNum;
}
public void setPageNum(int pageNum) {
this.pageNum = pageNum;
}
public int getPageSize() {
return pageSize;
}
public void setPageSize(int pageSize) {
this.pageSize = pageSize;
}
}
<?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="BaseMapper">
<sql id="BaseQuery">
<if test="items != null ">
where 1 = 1
<foreach collection="items" item="item" index="index"
separator=" ">
<if test="item.type == 'eq' ">
AND ${item.fieldName} = #{item.value}
</if>
<if test="item.type == 'lt' ">
<![CDATA[ AND ${item.fieldName} < #{item.value} ]]>
</if>
<if test="item.type == 'lte' ">
<![CDATA[ AND ${item.fieldName} <= #{item.value} ]]>
</if>
<if test="item.type == 'gt' ">
<![CDATA[ AND ${item.fieldName} > #{item.value} ]]>
</if>
<if test="item.type == 'gte' ">
<![CDATA[ AND ${item.fieldName} >= #{item.value} ]]>
</if>
<if test="item.type == 'slike' ">
<![CDATA[ AND ${item.fieldName} like '${item.value}%' ]]>
</if>
<if test="item.type == 'elike' ">
<![CDATA[ AND ${item.fieldName} like '%${item.value}' ]]>
</if>
<if test="item.type == 'like' ">
<![CDATA[ AND ${item.fieldName} like '%${item.value}%' ]]>
</if>
<if test="item.type == 'in' ">
AND ${item.fieldName} in
<foreach collection="item.values" item="value" index="index" open="(" close=")" separator=",">
#{value}
</foreach>
</if>
</foreach>
</if>
</sql>
<sql id="BaseOrder">
<if test="orders != null ">
ORDER BY
<foreach collection="orders" item="order" index="index" separator=",">
${order.fieldName} ${order.type}
</foreach>
</if>
</sql>
</mapper>
<select id="selectAll" resultMap="BaseResultMap" parameterType="com.yqwoe.codegenerator.model.param.QueryParam">
select
<include refid="Base_Column_List" />
from s_user
<include refid="BaseMapper.BaseQuery" />
<include refid="BaseMapper.BaseOrder" />
</select>
好了,現在的程式碼都給大家看了,so,GG現在要下班了,明天再給你們寫上註釋!!!!!!!!!