update MyBatisPlus条件构造器AutoQueryWrapper
This commit is contained in:
parent
7ecf4bbf1c
commit
9ef691439b
@ -0,0 +1,54 @@
|
|||||||
|
package org.dromara.test;
|
||||||
|
|
||||||
|
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||||
|
import jakarta.annotation.Resource;
|
||||||
|
import org.dromara.common.mybatis.wrapper.AutoQueryWrapper;
|
||||||
|
import org.dromara.demo.domain.TestDemo;
|
||||||
|
import org.dromara.demo.mapper.TestDemoMapper;
|
||||||
|
import org.junit.jupiter.api.DisplayName;
|
||||||
|
import org.junit.jupiter.api.Test;
|
||||||
|
import org.springframework.boot.test.context.SpringBootTest;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 单元测试案例
|
||||||
|
*
|
||||||
|
* @author Lion Li
|
||||||
|
*/
|
||||||
|
@SpringBootTest // 此注解只能在 springboot 主包下使用 需包含 main 方法与 yml 配置文件
|
||||||
|
@DisplayName("条件构造器测试")
|
||||||
|
public class MyBatisPlusTest {
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
TestDemoMapper testDemoMapper;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 没有TableName注解的类或@TableField(exist = false)的注解不能使用LambdaQueryWrapper
|
||||||
|
*/
|
||||||
|
@Test
|
||||||
|
public void test01() {
|
||||||
|
try {
|
||||||
|
testDemoMapper.selectOne(new LambdaQueryWrapper<TestDemo>()
|
||||||
|
.like(TestDemo::getNickName, "狮子")
|
||||||
|
);
|
||||||
|
} catch (Exception e) {
|
||||||
|
System.out.println("can not find lambda cache for this property [nickName] of entity [org.dromara.demo" +
|
||||||
|
".domain.TestDemo]");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void test02() {
|
||||||
|
AutoQueryWrapper<TestDemo> wrapper = new AutoQueryWrapper<TestDemo>()
|
||||||
|
.like(TestDemo::getNickName, "狮子")
|
||||||
|
.eq(TestDemo::getValue, "")// 自动判空
|
||||||
|
.singleResult();// 保证结果只有一个
|
||||||
|
|
||||||
|
// 如果子查询条件需要参数,可以这样设置,不需要再额外传递一个param
|
||||||
|
wrapper.setParam(TestDemo::getUserName, "admin");
|
||||||
|
|
||||||
|
System.out.println(testDemoMapper.queryOne(wrapper));
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,230 @@
|
|||||||
|
package org.dromara.common.mybatis.wrapper;
|
||||||
|
|
||||||
|
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
||||||
|
import com.baomidou.mybatisplus.core.toolkit.LambdaUtils;
|
||||||
|
import com.baomidou.mybatisplus.core.toolkit.support.SFunction;
|
||||||
|
|
||||||
|
import java.lang.reflect.Array;
|
||||||
|
import java.util.Collection;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Iterator;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author qixia
|
||||||
|
*/
|
||||||
|
public class AutoQueryWrapper<T> extends QueryWrapper<T> {
|
||||||
|
|
||||||
|
private final Map<String, Object> entity = new HashMap<>();
|
||||||
|
|
||||||
|
public Object getParam(String key) {
|
||||||
|
return entity.get(key);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Object getParam(SFunction<T, ?> key) {
|
||||||
|
return entity.get(getFieldName(key));
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setParam(String key, Object value) {
|
||||||
|
entity.put(key, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setParam(SFunction<T, ?> key, Object value) {
|
||||||
|
entity.put(getFieldName(key), value);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Boolean isNotEmpty(String key) {
|
||||||
|
return entity.get(key) != null && entity.get(key) != "";
|
||||||
|
}
|
||||||
|
|
||||||
|
public AutoQueryWrapper<T> eq(boolean condition, SFunction<T, ?> column, Object val) {
|
||||||
|
super.eq(condition, toUnderline(column), val);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public AutoQueryWrapper<T> eq(SFunction<T, ?> column, Object val) {
|
||||||
|
super.eq(isNotEmpty(val), toUnderline(column), val);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public AutoQueryWrapper<T> ne(boolean condition, SFunction<T, ?> column, Object val) {
|
||||||
|
super.ne(condition, toUnderline(column), val);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public AutoQueryWrapper<T> ne(SFunction<T, ?> column, Object val) {
|
||||||
|
super.ne(isNotEmpty(val), toUnderline(column), val);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public AutoQueryWrapper<T> gt(SFunction<T, ?> column, Object val) {
|
||||||
|
super.gt(isNotEmpty(val), toUnderline(column), val);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public AutoQueryWrapper<T> ge(SFunction<T, ?> column, Object val) {
|
||||||
|
super.ge(isNotEmpty(val), toUnderline(column), val);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public AutoQueryWrapper<T> lt(SFunction<T, ?> column, Object val) {
|
||||||
|
super.lt(isNotEmpty(val), toUnderline(column), val);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public AutoQueryWrapper<T> le(SFunction<T, ?> column, Object val) {
|
||||||
|
super.le(isNotEmpty(val), toUnderline(column), val);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public AutoQueryWrapper<T> like(Boolean condition, SFunction<T, ?> column, Object val) {
|
||||||
|
if (val instanceof String) {
|
||||||
|
super.like(condition, toUnderline(column), escapeStr((String) val));
|
||||||
|
} else {
|
||||||
|
super.like(condition, toUnderline(column), val);
|
||||||
|
}
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public AutoQueryWrapper<T> like(SFunction<T, ?> column, Object val) {
|
||||||
|
if (val instanceof String) {
|
||||||
|
super.like(toUnderline(column), escapeStr((String) val));
|
||||||
|
} else {
|
||||||
|
super.like(toUnderline(column), val);
|
||||||
|
}
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public AutoQueryWrapper<T> between(SFunction<T, ?> column, Object val1, Object val2) {
|
||||||
|
super.between(isNotEmpty(val1) && isNotEmpty(val1), toUnderline(column), val1, val2);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public AutoQueryWrapper<T> in(SFunction<T, ?> column, Collection<?> coll) {
|
||||||
|
super.in(isNotEmpty(coll), toUnderline(column), coll);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public AutoQueryWrapper<T> inSql(SFunction<T, ?> column, String sql) {
|
||||||
|
super.inSql(toUnderline(column), sql);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public AutoQueryWrapper<T> isNotNull(SFunction<T, ?> column) {
|
||||||
|
super.isNotNull(toUnderline(column));
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public AutoQueryWrapper<T> isNull(SFunction<T, ?> column) {
|
||||||
|
super.isNull(toUnderline(column));
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public AutoQueryWrapper<T> singleResult() {
|
||||||
|
super.last("limit 1");
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public AutoQueryWrapper<T> orderByAsc(SFunction<T, ?> column) {
|
||||||
|
super.orderByAsc(toUnderline(column));
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public AutoQueryWrapper<T> orderByDesc(SFunction<T, ?> column) {
|
||||||
|
super.orderByDesc(toUnderline(column));
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取字段名
|
||||||
|
*
|
||||||
|
* @param column
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
private String getFieldName(SFunction<T, ?> column) {
|
||||||
|
String result = LambdaUtils.extract(column).getImplMethodName().replaceAll("get", "");
|
||||||
|
return Character.toLowerCase(result.charAt(0)) + result.substring(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 方法名转下划线命名
|
||||||
|
*
|
||||||
|
* @param str
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
private String toUnderline(String str) {
|
||||||
|
if (str == null || str.isEmpty()) {
|
||||||
|
return str;
|
||||||
|
}
|
||||||
|
StringBuilder result = new StringBuilder();
|
||||||
|
for (char c : str.toCharArray()) {
|
||||||
|
if (Character.isUpperCase(c)) {
|
||||||
|
result.append('_');
|
||||||
|
}
|
||||||
|
result.append(Character.toLowerCase(c));
|
||||||
|
}
|
||||||
|
return result.toString().replace("get_", "");
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 方法名转下划线命名
|
||||||
|
*
|
||||||
|
* @param column
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
private <R> String toUnderline(SFunction<R, ?> column) {
|
||||||
|
return toUnderline((LambdaUtils.extract(column).getImplMethodName()));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 特殊字符转义
|
||||||
|
*
|
||||||
|
* @param str
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
private static String escapeStr(String str) {
|
||||||
|
if (str != null && !str.isEmpty()) {
|
||||||
|
str = str.replaceAll("\\\\", "\\\\\\\\");
|
||||||
|
str = str.replaceAll("_", "\\\\_");
|
||||||
|
str = str.replaceAll("%", "\\\\%");
|
||||||
|
}
|
||||||
|
return str;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 判断是否不为空
|
||||||
|
*
|
||||||
|
* @param obj
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
private static boolean isNotEmpty(Object obj) {
|
||||||
|
return !isEmpty(obj);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 判断是否为空
|
||||||
|
*
|
||||||
|
* @param obj
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
private static boolean isEmpty(Object obj) {
|
||||||
|
if (null == obj) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (obj instanceof CharSequence) {
|
||||||
|
return ((CharSequence) obj).length() == 0;
|
||||||
|
} else if (obj instanceof Map) {
|
||||||
|
return ((Map<?, ?>) obj).isEmpty();
|
||||||
|
} else if (obj instanceof Iterable) {
|
||||||
|
return !((Iterable<?>) obj).iterator().hasNext();
|
||||||
|
} else if (obj instanceof Iterator) {
|
||||||
|
return !((Iterator<?>) obj).hasNext();
|
||||||
|
} else if (obj.getClass().isArray()) {
|
||||||
|
return 0 == Array.getLength(obj);
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -65,4 +65,16 @@ public class TestDemo extends TenantEntity {
|
|||||||
@TableLogic
|
@TableLogic
|
||||||
private Long delFlag;
|
private Long delFlag;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 用户名
|
||||||
|
*/
|
||||||
|
@TableField(exist = false)
|
||||||
|
private String userName;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 昵称
|
||||||
|
*/
|
||||||
|
@TableField(exist = false)
|
||||||
|
private String nickName;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -61,4 +61,5 @@ public interface TestDemoMapper extends BaseMapperPlus<TestDemo, TestDemoVo> {
|
|||||||
})
|
})
|
||||||
int updateById(@Param(Constants.ENTITY) TestDemo entity);
|
int updateById(@Param(Constants.ENTITY) TestDemo entity);
|
||||||
|
|
||||||
|
TestDemo queryOne(@Param(Constants.WRAPPER) Wrapper<TestDemo> ew);
|
||||||
}
|
}
|
||||||
|
@ -8,4 +8,32 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
|||||||
SELECT * FROM test_demo ${ew.customSqlSegment}
|
SELECT * FROM test_demo ${ew.customSqlSegment}
|
||||||
</select>
|
</select>
|
||||||
|
|
||||||
|
<select id="queryOne" resultType="org.dromara.demo.domain.TestDemo">
|
||||||
|
select td.id,
|
||||||
|
td.tenant_id,
|
||||||
|
td.dept_id,
|
||||||
|
td.user_id,
|
||||||
|
su.user_name,
|
||||||
|
su.nick_name,
|
||||||
|
td.order_num,
|
||||||
|
td.test_key,
|
||||||
|
td.value,
|
||||||
|
td.version,
|
||||||
|
td.create_dept,
|
||||||
|
td.create_time,
|
||||||
|
td.create_by,
|
||||||
|
td.update_time,
|
||||||
|
td.update_by,
|
||||||
|
td.del_flag
|
||||||
|
from test_demo td
|
||||||
|
left join (
|
||||||
|
select * from sys_user
|
||||||
|
<where>
|
||||||
|
<if test="ew.isNotEmpty('userName')">
|
||||||
|
user_name = '${ew.getParam('userName')}'
|
||||||
|
</if>
|
||||||
|
</where> ) su on su.user_id = td.user_id
|
||||||
|
${ew.getCustomSqlSegment}
|
||||||
|
</select>
|
||||||
|
|
||||||
</mapper>
|
</mapper>
|
||||||
|
Loading…
x
Reference in New Issue
Block a user