-
2022-05-06 08:14:16更多相关内容
-
mybatis-plus QueryWrapper自定义查询条件的实现
2020-08-24 19:51:05主要介绍了mybatis-plus QueryWrapper自定义查询条件的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧 -
记录querywrapper多表联查
2022-03-30 16:37:51多参数时可以在业务层进行参数判断: ... queryWrapper.like(true, "engine", servicesInfoParam.getEngine()); } if (StringUtils.isNotBlank(servicesInfoParam.getCrtTime())) { String[] timeSplit =多参数时可以在业务层进行参数判断:
if (servicesInfoParam.getEngine() != null) { queryWrapper.like(true, "engine", servicesInfoParam.getEngine()); } if (StringUtils.isNotBlank(servicesInfoParam.getCrtTime())) { String[] timeSplit = servicesInfoParam.getCrtTime().split("~"); queryWrapper.between(true, "create_time", timeSplit[0].concat(" 00:00:00"), timeSplit[1].concat(" 23:59:59")); } if (StringUtils.isNotBlank(servicesInfoParam.getName())) { queryWrapper.like(true, "name", servicesInfoParam.getName()); } if (servicesInfoParam.getType() != null) { queryWrapper.like(true, "type", servicesInfoParam.getType()); } if (StringUtils.isNotBlank(servicesInfoParam.getStatus())) { queryWrapper.like(true, "status", servicesInfoParam.getStatus()); } if (servicesInfoParam.getIsRelease() != null) { queryWrapper.like(true, "is_release", servicesInfoParam.getIsRelease()); } if (ServicesOrderByEnum.CREATE_ASC.getValue().equals(servicesInfoParam.getSort())) { queryWrapper.orderByAsc("create_time"); } else if (ServicesOrderByEnum.PRE_ASC.getValue().equals(servicesInfoParam.getSort())) { queryWrapper.orderByAsc("previewTimes"); } else if (ServicesOrderByEnum.PRE_DESC.getValue().equals(servicesInfoParam.getSort())) { queryWrapper.orderByDesc("previewTimes"); } else { queryWrapper.orderByDesc("create_time"); }
其中,如果参数是数据库表结构中字段,判断时写法需与数据库字段一致,如上图status、name、creat_time等,如参数是经过查询后处理重命名的(select......from AS previewTimes),需与重命名后一致,如previewTimes。
DAO层中需加入“ew”参数,如下:
Page<ServicesInfoVo> queryByCondition(@Param("page") Page page, @Param("ew") QueryWrapper queryWrapper);
Mapper.xml文件中查询语句后加上:${ew.customSqlSegment}
-
基于QueryWrapper,实现MybatisPlus多表关联查询
2021-11-16 15:21:58重点:@Param("ew") Wrapper参数是必须,因为${ew.customSqlSegment} 底层其实就是where 条件,所以为了保证Wrapper不为空,service层代码中的Wrapper至少需要有一个条件:1 = 1 @Override @Select("select a....版权声明:请勿用于任何商业用途的文章转载,转载请说明出处!
1.dao层接口使用Select注解写SQL:
重点:@Param("ew") Wrapper参数是必须,因为${ew.customSqlSegment} 底层其实就是where 条件,所以为了保证Wrapper不为空,service层代码中的Wrapper至少需要有一个条件:1 = 1
@Override @Select("select a.code as code , b.name as name , b.barcode as barcode , a.ware_code as wareCode , c.name as wareName , a.qty as qty , a.oprice as oprice , a.total as total , " + " a.id as id , a.create_by as createBy , a.create_date as createDate , a.update_by as updateBy , a.update_date as updateDate , a.status as status , a.remarks as remarks " + "from sku_stock a , goods b , warehouse c " + "${ew.customSqlSegment} and a.code = b.code and a.ware_code = c.code") IPage<SkuStock> selectPage(IPage<SkuStock> page, @Param("ew")Wrapper<SkuStock> queryWrapper);
2.service层代码示例:
service父类封装的findPage方法:
/** * 封装findPage * @param entity * @param search Map中的key:";"为保留关键字,拆分数组,仅支持最大长度2的数组, * 下标0:QueryWrapper查询条件中的列名(支持多表关联查询的表别名 + 列名方式,需要dao层接口支持) * 下标1: QueryWrapper中不同的查询条件,eq:等于,ge:大于等..... todo:请自行完善Mybatis eq、ne、gt、lt、ge、le等 * Map中的value:QueryWrapper需要查询的值 * @param args QueryWrapper中order by 排序数组 * @return */ public IPage<T> findPage(T entity , Map<String , Object> search , String... args){ long current = 1L; long size = 10L; if (EmptyUtil.isNoEmpty(ReflexUtil.getFieldValue(entity , "page")) && (long) ReflexUtil.getFieldValue(entity , "page") != 0){ current = (long) ReflexUtil.getFieldValue(entity , "page"); } if (EmptyUtil.isNoEmpty(ReflexUtil.getFieldValue(entity , "limit")) && (long) ReflexUtil.getFieldValue(entity , "limit") != 0){ size = (long) ReflexUtil.getFieldValue(entity , "limit"); } QueryWrapper<T> queryWrapper; if (EmptyUtil.isNoEmpty(search)){ queryWrapper = new QueryWrapper<>(); for (Map.Entry<String , Object> entry:search.entrySet() ) { String[] key = entry.getKey().split(";"); if (key.length > 1){ if (key[1].equals("eq")){ queryWrapper.eq(key[0] , entry.getValue()); }else if (key[1].equals("ge")){ queryWrapper.ge(key[0] , entry.getValue()); }else if (key[1].equals("lt")){ queryWrapper.lt(key[0] , entry.getValue()); } }else { queryWrapper.like(entry.getKey() , entry.getValue()); } } }else { queryWrapper = new QueryWrapper<>(entity); } queryWrapper.orderByAsc(args); return super.page(new Page<T>(current , size) , queryWrapper); }
service实现类方法:
public IPage<SkuStock> findPage(SkuStock entity, String... args) { Map<String , Object> search = null; search = new HashedMap(); search.put("1;eq" , "1"); if (EmptyUtil.isNoEmpty(entity.getCode()) || EmptyUtil.isNoEmpty(entity.getWareCode()) ){ if (EmptyUtil.isNoEmpty(entity.getCode())){ search.put("code" , entity.getCode()); } if (EmptyUtil.isNoEmpty(entity.getWareCode())){ search.put("ware_code" , entity.getWareCode()); } }else { long limit = entity.getLimit(); long page = entity.getPage(); entity = new SkuStock(); entity.setLimit(limit); entity.setPage(page); } return super.findPage(entity , search , args); }
3.反射工具类:
package org.bluedream.comm.utils; import java.lang.reflect.Field; import java.lang.reflect.Method; import java.util.ArrayList; import java.util.Arrays; import java.util.List; /** * @ClassName ReflexUtil * @Description TODO * @Author foxsand * @Data 2021-06-09 15:17 * @Version */ public class ReflexUtil { /** * 返回 entity 对象的所有属性,包含父类 * @param obj * @return */ public static List<Field> getObjectFields(Object obj){ Class clazz = obj.getClass(); List<Field> fieldList = new ArrayList<>() ; while (clazz != null) {//当父类为null的时候说明到达了最上层的父类(Object类). fieldList.addAll(Arrays.asList(clazz .getDeclaredFields())); clazz = clazz.getSuperclass(); //得到父类,然后赋给自己 } return fieldList; } public static List<Field> getObjectFields(Class<?> clazz){ List<Field> fieldList = new ArrayList<>() ; while (clazz != null){ fieldList.addAll(Arrays.asList(clazz .getDeclaredFields())); clazz = clazz.getSuperclass(); //得到父类,然后赋给自己 } return fieldList; } /** * 判断 Class entity 是否存在名称为 fieldName 的属性 * @param fieldName * @param entity * @return */ public static Boolean isField(String fieldName , Object entity){ List<Field> fieldList = getObjectFields(entity); for (Field f1:fieldList ) { if (fieldName.equals(f1.getName())) return true; } return false; } /** * 返回 entity 对象中的所有方法,包含父类 * @param entity * @return */ public static List<Method> getObjectMethods(Object entity){ Class<?> clazz = entity.getClass(); List<Method> methods = new ArrayList<>(); while (clazz != null && clazz != Object.class) {//当父类为null的时候说明到达了最上层的父类(Object类). methods.addAll(Arrays.asList(clazz .getDeclaredMethods())); clazz = clazz.getSuperclass(); //得到父类,然后赋给自己 } return methods; } public static List<Method> getObjectMethods(Class<?> clazz){ List<Method> methods = new ArrayList<>(); while (clazz != null && clazz != Object.class) {//当父类为null的时候说明到达了最上层的父类(Object类). methods.addAll(Arrays.asList(clazz .getDeclaredMethods())); clazz = clazz.getSuperclass(); //得到父类,然后赋给自己 } return methods; } /** * 判断 Class entity 是否存在名称为 methodName 的方法 * @param methodName * @param entity * @return */ public static Boolean isMethod(String methodName , Object entity){ List<Method> methods = getObjectMethods(entity); for (Method m1:methods ) { if (methodName.equals(m1.getName())) return true; } return false; } /** * 循环向上转型, 获取对象的 DeclaredMethod * @param obj * @param methodName * @param parameterTypes 方法参数类型 * @return */ public static Method getDeclaredMethod(Object obj , String methodName , Class<?>...parameterTypes) { for (Class<?> clazz = obj.getClass(); clazz != Object.class && clazz != null; clazz = clazz.getSuperclass()) { try { return clazz.getDeclaredMethod(methodName, parameterTypes); } catch (Exception e) { // 这里甚么都不要做!并且这里的异常必须这样写,不能抛出去。 // 如果这里的异常打印或者往外抛,则就不会执行clazz=clazz.getSuperclass(),最后就不会进入到父类中了 } } return null; } public static Object invoke(Object object, String methodName, Class<?>[] parameterTypes, Object[] parameters){ Method method = getDeclaredMethod(object, methodName, parameterTypes); try { if (method != null){ method.setAccessible(true); // 调用object 的 method 所代表的方法,其方法的参数是 parameters return method.invoke(object, parameters); } }catch (Exception e1){ e1.printStackTrace(); } return null; } /** * 循环向上转型, 获取对象的 DeclaredField * * @param object * : 子类对象 * @param fieldName * : 父类中的属性名 * @return 父类中的属性对象 */ public static Field getDeclaredField(Object object, String fieldName) { Field field = null; Class<?> clazz = object.getClass(); for (; clazz != Object.class && clazz != null; clazz = clazz.getSuperclass()) { try { field = clazz.getDeclaredField(fieldName); return field; } catch (Exception e) { // 这里甚么都不要做!并且这里的异常必须这样写,不能抛出去。 // 如果这里的异常打印或者往外抛,则就不会执行clazz = clazz.getSuperclass(),最后就不会进入到父类中了 } } return null; } /** * 直接设置对象属性值, 忽略 private/protected 修饰符, 也不经过 setter * * @param object * : 子类对象 * @param fieldName * : 父类中的属性名 * @param value * : 将要设置的值 */ public static void setFieldValue(Object object, String fieldName, Object value) { // 根据 对象和属性名通过反射 调用上面的方法获取 Field对象 Field field = getDeclaredField(object, fieldName); if (field != null){ // 抑制Java对其的检查 field.setAccessible(true); try { // 将 object 中 field 所代表的值 设置为 value field.set(object, value); } catch (IllegalArgumentException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } } } /** * 直接读取对象的属性值, 忽略 private/protected 修饰符, 也不经过 getter * * @param object * : 子类对象 * @param fieldName * : 父类中的属性名 * @return : 父类中的属性值 */ public static Object getFieldValue(Object object, String fieldName) { // 根据 对象和属性名通过反射 调用上面的方法获取 Field对象 Field field = getDeclaredField(object, fieldName); if (field != null){ // 抑制Java对其的检查 field.setAccessible(true); try { // 获取 object 中 field 所代表的属性值 return field.get(object); } catch (Exception e) { e.printStackTrace(); } } return null; } }
4.判空工具类:
package org.bluedream.comm.utils; import java.util.Collection; import java.util.Map; public class EmptyUtil { //Suppress default constructor for noninstantiability private EmptyUtil(){ throw new AssertionError(); } public static boolean isEmpty(Object object){ if (object == null){ return true; } if (object instanceof int[]){ return ((int[]) object).length == 0; } if (object instanceof double[]){ return ((double[]) object).length == 0; } if (object instanceof long[]){ return ((long[]) object).length == 0; } if (object instanceof byte[]){ return ((byte[]) object).length == 0; } if (object instanceof short[]){ return ((short[]) object).length == 0; } if (object instanceof float[]){ return ((float[]) object).length == 0; } if (object instanceof char[]){ return ((char[]) object).length == 0; } if (object instanceof Object[]){ return ((Object[]) object).length == 0; } if (object instanceof CharSequence) { return ((CharSequence) object).length() == 0; } if (object instanceof Collection ){ return ((Collection) object).isEmpty(); } if (object instanceof Map){ return ((Map) object).isEmpty(); } return false; } public static boolean isNoEmpty(Object object){ return !isEmpty(object); } }
-
QueryWrapper多表联查分页、IPage分页(解决IPage+ QueryWrapper 多表联查、条件搜素、模糊匹配的分页问题...
2021-12-30 16:44:11QueryWrapper多表联查分页、IPage分页解决IPage+ QueryWrapper 多表联查、条件搜素、模糊匹配的分页问题实体类controllerserviceImpl重写的mapperxml最终sql点击可参考[QueryWrapperLambdaQueryWrapper-(条件查询)...QueryWrapper多表联查分页、IPage分页
解决IPage+ QueryWrapper 多表联查、条件搜素、模糊匹配的分页问题
- 假如我们有一张user表,和一张department表 (关联关系表)
- 要通过department(模糊匹配)到所有的user并且分页
实体类
@ApiModel(description = "用户") public class User { @ApiModelProperty(value = "主键") private Integer id; @ApiModelProperty(value = "用户名") private String username; @ApiModelProperty(value = "外键") private Integer departmentId; }
@ApiModel(description = "部门") public class User { @ApiModelProperty(value = "主键") private Integer id; @ApiModelProperty(value = "部门名称") private String departmentName;
controller
@PostMapping("/user") @ApiOperation("用户条件查询") public ApiResponse<User> selectUser(@RequestBody Map<String, Object> queryMap) { try { return ApiResponse.ofSuccess(UserService.selectUser(queryMap)); } catch (Exception e) { log.error("查询失败", e); return ApiResponse.ofError("查询查询失败"); } }
service
- 注意 返回值为IPage
IPage<User> selectUser(Map<String, Object> queryMap);
Impl
- user 为主表,正常使用QueryWrapper 查询即可
- department 为关联表,字段名必须和xml中对应
@Override public IPage<TcmcAlarm> eqAllAlarm(Map<String, Object> params) { // size 每页多少条 long size = Long.parseLong(StringUtils.defaultIfBlank(String.valueOf(params.get("limit")), "10")); // 当前页 long current = Long.parseLong(StringUtils.defaultIfBlank(String.valueOf(params.get("page")), "1")); } // 定义 QueryWrapper QueryWrapper<TcmcAlarm> q = new QueryWrapper<>(); // 用户名(主表) Object userName = params.get("userName"); // 部门名称 Object alarmType = params.get("departmentName"); // 用户名模糊查询(常规查询) if (null != userName && userName.toString().trim().length() > 0) { q.lambda().like(User::getUserName(), userName); } // 联接表 if(null != departmentName && departmentName.toString().trim().length() > 0){ q.eq("dt.department_name", departmentName); } IPage<TcmcAlarm> page = baseMapper.selectUserpage( new Page<>(current, size), q); return page;
department.department_name
- dt 表名,department_name 表字段
- 重写selectUserpage
常规操作中ServiceImpl
封装了很多方法我们可以直接使用,其中就有分页,但是牵扯到复杂查询时我们尽量选择重写(如下) - Impl
- mapper
重写的mapper
IPage<User> selectUserpage(IPage<T> page, @Param(Constants.WRAPPER) Wrapper<User> queryWrapper);
xml
<select id="selectUserpage" resultType="XXX.user"> SELECT us.id id, us.username username dt.department_name departmentName FROM user us LEFT JOIN department dt ON dt .id = us.departmentId ${ew.customSqlSegment} </select>
${ew.customSqlSegment}
相当于一个占位符,后续当你在mp的条件构造器中加入条件,mp的底层就会根据条件自动的在这个占位符处进行条件的拼接
最终sql
SELECT us.id id, us.username username dt.department_name departmentName FROM user us LEFT JOIN department dt ON dt .id = us.departmentId where dt.dt.department_name = "XX"
QueryWrapper条件查询
QueryWrapperLambdaQueryWrapper-(条件查询)
总结
本片文章例子较为简单,只说明用法,谢谢点赞和指正。
-
MyBatisPlus实现自定义分页查询数据结合QueryWrapper实现自定义的多表连接查询
2022-04-22 22:13:26在MyBatisPlus中,虽然框架自带的BaseMapper具有各种CRUD操作,但有时需要进行自定义的查询,如多表的连接查询: 首先准备实体类: @Data public class Dish implements Serializable { private static final long... -
QueryWrapper多条件嵌套查询
2021-03-22 10:54:211.Mybatis-Plus自带分页 IPage<Product> page=new Page<>(); page.setCurrent(current); page.setSize(size);... productIPage = productMapper.selectPage(page, queryWrapper); pageBean.s -
mybitsPlus QueryWrapper表关联分页查询
2022-06-15 16:09:49mybitsPlus QueryWrapper多表关联分页查询 -
MP + QueryWrapper + 自定义SQL完成连表查询
2021-11-21 18:16:45userMapper.selectPage(page, queryWrapper); 上面这个分页查询方法,只能针对当前自己的实体,他很好的支持与解决,但是关联查询就不行了。 上面代码的底层,会通过拦截器PageInterceptor会进行拦截处理,会把... -
MyBatisPlus-QueryWrapper多条件查询以及修改
2022-04-26 18:17:39} 指定要查询的列 @Test public void queryWrapperEleven() { QueryWrapper<User> queryWrapper = new QueryWrapper(); queryWrapper.select("id", "name", "age"); List<User> users = userMapper.selectList... -
mybatis plus QueryWrapper 条件构造器 从前端输入框带多参条件查询
2019-08-15 21:15:01我在做一个单表的curd 真的感觉还有很长一段路,mybatis plus我还没学,项目就是这个,我一个单表的增删改查做了四天,还好碰到了公司带我的肯教点东西 先看一下前端吧, 带参的条件查询和查询所有信息我都是在一个... -
entity framework 多表查询方式
2013-12-27 15:31:30文件全面的提供了多表查询的方式,相信会帮倒大家的。 -
QueryWrapper中查询的坑
2021-03-01 16:05:38首先,先看代码示例: List<Entity> list = testService.list( new LambdaQueryWrapper<Entity>() .eq(ObjectUtils.isNotEmpty(req.getParam()),Entity::getParam, req.getParam(). -
QueryWrapper模糊查询
2021-12-31 10:21:21如图一 QueryWrapper表达式 like 没有进行%%模糊查询 想要图二效果 代码是有什么问题吗 麻烦指正 谢过了~ -
mybatis-plus 通过QueryWrapper进行多条件查询
2021-02-23 20:15:17标题mybatis-plus QueryWrapper pojo: @Data @EqualsAndHashCode(callSuper = false) @Accessors(chain = true) @TableName("m_goods") @ApiModel(value="Goods对象", description="") public class Goods ... -
lambdaquerywrapper不写sql能联表查询吗
2022-04-27 10:11:05纯属用.eq(""::"","").eq.. 如果不写sql能通过lambdaquerywrapper联表查询吗 -
自定义的QueryWrapper实现查询
2021-07-14 18:30:55想要用QueryMapper,而不用xml,所以为了实现若依那样的,自己重写了QueryMapper ...所以,自己使用反射写了一个QueryWrapper的myAllEq方法,可以实现传入一个实体类,直接实现全部属性查询 声明提要: pac -
Java学习:使用MyBatis Plus的分页插件和QueryWrapper结合自定义mapper xml实现多表关联查询
2020-11-12 15:52:28FROM <include refid="tables" /> ${ew.customSqlSegment} select> mapper> 重点: MybatisPlus会将查询参数构成的条件和分页的page及limit自动组装到Sql中 以后进行多表联合查询时,可以使用以下方法来进行数据的... -
【MySQL】多表查询的使用
2022-03-24 13:01:321. 熟悉常见的表 DESC employees; DESC departments; DESC locations; 引入:查询一个员工(ABEL)在哪个城市工作 SELECT * FROM employees WHERE last_name = 'Abel'; SELECT * FROM departments WHERE department... -
mybatisPlus 使用mapper多表多连接查询
2018-11-27 22:41:47这个问题花了我3个小时,。先上图,以后再解释 ... QueryWrapper<ComJob> wrapper = new QueryWrapper(); wrapper.eq("job.id",jobid); List<ComJob> comJob = jobService.getComJob(wrapper); -
mybatisplus怎样在xml的连表查询中使用queryWrapper?
2021-07-13 17:35:29List<Map<String,Object>... wrapper1, @Param("ew2") Wrapper<Dept> wrapper2); <select id="linkUserAndDept" resultType="java.util.Map"> select u.name,u.age,u.address,d.*... -
基于Mybatis Plus实现多表分页查询
2019-07-29 17:03:43注意:Mybatis Plus 3.0.7 版本才开始用【自定义sql】+【QueryWrapper】,低版本不能使用,还是老实写SQL进行条件拼接 2.0、源码分析 在Wrapper<T>接口中就有如下方法 /** * 获取自定义SQL 简化自定义XML... -
mybatis-plus QueryWrapper查询条件组装
2022-05-12 12:01:10条件查询首先使用QueryWrapper创建一个wrapper对象存放条件。例如: //创建一个QueryWrapper的对象 QueryWrapper<User> wrapper = new QueryWrapper<>(); //通过QueryWrapper设置条件 //ge gt le lt -
特殊QueryWrapper查询解决所有问题
2021-07-15 20:58:24可以先看以前的自定义查询 自定义的QueryMapper查询 现在我添加了注解查询,通过使用 /** 用户账号 */ @TableField(value = "user_name") @MapperQuery(queryType = QueryType.EQ) private String userName; /... -
Mybatis-plus工具类 自动填充QueryWrapper进行高级查询
2021-06-25 10:26:39现在只支持QueryWrapper的eq和like功能 后续拓展SqlAnnotation的注解值 可以进行其他匹配 先看实体类 public class EnrollmentRecord implements Serializable { private static final long serialVersionUID = 1L... -
Mybatis plus+QueryWrapper+Swagger2实现所有类超级查询 后台解放
2022-05-17 16:07:39Mybatis plus+QueryWrapper+Swagger2实现所有类超级查询 后台解放 对象获取注解 获取表名 获取列名 自定义查询