首页 > 编程知识 正文

mybatisplus官网,修改用户自定义的函数用什么来实现

时间:2023-05-06 12:08:55 阅读:107337 作者:2845

因为我想用QueryMapper而不是xml,所以为了实现那样的东西,我自己重写了QueryMapper

传统的mybatis查询方法,例如对一个用户进行查询时,查询方法会传递给一个用户,通过在mapper.xml中确定用户的每个属性,并连接相应的sql语句,可以一次实现查询。 虽然有mybatisX代码生成器,或者自己编写代码生成器,但是如果是多个表的话,感觉有点不好用。 因此,我使用反射写了QueryWrapper的myAllEq方法。 这样就可以传递给一个实体类,直接实现所有属性查询

声明种子:

package com.thd xd.quick develop.com mon.core.domain; import com.Bao midou.mybatisplus.annotation.table field; import com.Bao midou.mybatisplus.annotation.table id; import com.Bao midou.mybatisplus.annotation.tablename; import com.faster XML.fnd zm.annotation.JSON format; import com.thd xd.quick develop.com mon.core.domain.dq abstract.dqstatusdispose; import lombok.allargsconstructor; import lombok.Data; import lombok.NoArgsConstructor; import javax.validation.constraints.email; import javax.validation.constraints.size; import java.io.Serializable; import java.util.Date; /** * @author猫脸* @date 2021/5/27 21:28 *用户实体类*/@ data @ noargsconstructor @ allargsconstructor @ tablename (valuuthor publicclassdquserextendsdqstatusdisposeimplementssserialementsssssserialerialetoriale /**用户ID *//** *主键使用TableId注释。 否则,MybatisPlus缺省使用id创建*/@tableid(value='user_id ' ) private Long userId; /**用户帐户*/@tablefield(value='user_name ' ) ) private String userName; /**用户昵称*/@tablefield(value='nick_name ' ) private String nickName; /**用户邮箱*/@email(message='邮箱格式不正确) ) tablefield ) value='email ' )权限字符串电子邮件; /**移动电话号码*/@size(min=0,max=11,message='移动电话号码长度不能超过11个字符') tablefield(value='phone_number ' ) privates tes ttte /**用户脸部照片*/@tablefield(value='avatar ' ) private String avatar; /**密码*/@tablefield(value='password ' ) ) private String password; /**帐户状态(0正常1无效) (/@tablefield ) value='status ' ) private String status; /**删除标志(0表示存在,1表示删除,暂时不打算使用()/@tablefield ) value='delflag ' ) private String delFlag; /**最后IP*/@tablefield(value='loginip ' ) ) private String loginIp; /**上次登录时间*/@tablefield(value='logindate ' ) ) private Date loginDate; /**用户角色id*/@tablefield(value='role”) private String role; /**个性签名* */@ table field (value=' signature ' ) ) ) ) ) )。

private String signature; /** 创建时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") private Date createTime; /** 更新时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") private Date updateTime;} 我的用户实体类中,使用lombak,里面有serialVersionUID。使用的是注解来映射数据库字段名

核心代码

/** * TODO 自定义遍历查询方法 * * @param object * @return com.baomidou.mybatisplus.core.conditions.query.QueryWrapper<T> * @author 猫颜 * @date 下午9:20 */ public QueryWrapper<T> myAllEq(T object) throws IllegalAccessException, NoSuchMethodException, InvocationTargetException { String getMethodName = ""; Field field = null; Class<?> aClass = object.getClass(); Field[] declaredFields = aClass.getDeclaredFields();// QueryWrapper<T> queryWrapper = new QueryWrapper<>(); //第一个为serialVersionUID(舍去) i为1 绕过 //获取object的所有字段 for (int i = 1; i < declaredFields.length; i++) { field = declaredFields[i]; //类中的成员变量为private,故必须进行此操 field.setAccessible(true);// 不能直接获取到值,可以通过构造get方法,或者调用类的get方法来获取值// 通过StringUtils的containsIgnoreCase方法来获取方法名称// 通过上面那种方法,有循环嵌套,性能需要优化// 所以采取拼接get方法名/** * * @author 猫颜 * @date //获取属性名称 * for (Field field: * declaredFields) { * System.out.println(field.getName()); * methodNameFirst = field.getName().substring(0,1).toUpperCase(); * methodName = field.getName(); * methodName = "get"+methodNameFirst+methodName.substring(1); * System.out.println("方法名称为:"+methodName); * * // 优化 * System.out.println("优化:"+"get"+field.getName().substring(0,1).toUpperCase()+field.getName().substring(1)); * } 下午5:18 * @param object * @return com.baomidou.mybatisplus.core.conditions.query.QueryWrapper<T> *///获取get方法名称 getMethodName = "get" + declaredFields[i].getName().substring(0, 1).toUpperCase() + declaredFields[i].getName().substring(1); System.out.println(getMethodName);// 执行get方法获取属性值 //执行方法 Method method = aClass.getMethod(getMethodName, null); Object getValue = method.invoke(object, null); //System.out.println("输出为:"+invoke);// System.out.println("优化:"+"get"+declaredFields[i].getName().substring(0,1).toUpperCase()+declaredFields[i].getName().substring(1));// 如果值不为空,则添加到eq中 if (getValue != null) { //映射关系// return super.eq(,field.get(object)); //获取其注解的值// 后面可以采用查询方法注释来解决,不同的查询所需的问题 System.out.println("表的值:" + field.getAnnotation(TableField.class).value()); System.out.println("get获取值:" + getValue.toString()); MyQueryWrapper.this.eq(field.getAnnotation(TableField.class).value(), getValue.toString()); } } return MyQueryWrapper.this; } 可以使用 //获取所有的方法名称 //但是顺序是与类中的一样,所以可以构建get方法 //属性名称第一个大写,然后加上get就是,get方法名称 Method[] methods = aClass.getMethods(); for (Method method: methods) { System.out.println(method.getName()); if (StringUtils.containsIgnoreCase(method.getName(),"get")&& StringUtils.containsIgnoreCase(method.getName(),"username")){ System.out.println("值为:"+method.getName()); } }

StringUtils.containsIgnoreCase方法来获取get方法,但是会造成循环嵌套,对性能有一定的影响。
所以,我采用拼接get方法名称的方法,减少无用循环带来的影响。

根据上面的要点提示,for是从1开始,因为第一个是serialVersionUID,所以为了跳过他。从1开始对于xml中,可以使用like等查询,我这个是适用于=查询,所以后续会通过在用户类的属性上加上自定义注解,来判断这个字段所用的查询方式,对于一个字段,有些地方想用=来查,有些地方想用like来查,那可以设定注解有优先等级来解决。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。