mybatis-plus @select 动态查询
@select({"<script> select cor.risk_id,cor.create_by as leader,cor.create_time as put_forward_time," + "cor.correct_user_name as handle,cor.update_time as handle_time," + "cor.correct_end_time,cor.correct_status,risk.risk_name,rt.risk_name as risk_type,pro.pro_code," + "pro.pro_name,pro.pro_leader_name as pro_leader,pt.type_name as pro_type from data_risk_correct cor " + "left join data_project_risk risk on cor.risk_id=risk.risk_id " + "left join data_risk_type rt on risk.risk_type_id=rt.risk_id " + "left join data_project pro on risk.pro_id=pro.pro_id " + "left join data_project_type pt on pro.pro_type_id=pt.type_id " + "<where>"+ "<if test='riskcentervo.riskname != null and riskcentervo.riskname !=\"\"'>" + " and risk.risk_name like concat('%',#{riskcentervo.riskname},'%') " + "</if>" + "<if test='riskcentervo.proname != null and riskcentervo.proname !=\"\"'>" + " and pro.pro_name like concat('%',#{riskcentervo.proname},'%') " + "</if>" + "<if test='riskcentervo.procode != null and riskcentervo.procode !=\"\"'>" + " and pro.pro_code =#{riskcentervo.procode} " + "</if>" + "<if test='riskcentervo.correctstatus != null '>" + " and cor.correct_status=#{riskcentervo.correctstatus} " + "</if>" + "</where>" + "and cor.is_delete=0 and cor.correct_user_id=#{userid}" + "</script>"}) list<riskcentervo> selectriskcenterlist(@param("riskcentervo") riskcentervo riskcentervo,@param("userid") string userid);
springboot+mybatis动态查询支持的通用方法
这几天研究使用了一下 springboot + mybatis动态注解.
看了好多人说mybatis不支持动态,其实不然, 我个人不喜欢太多配置, 所以一惯喜欢使用注解模式, 但spring体系当中注解实在太多了, 其实常用的也就那么几个.
呵呵又跑题了.回来
package cn.miw.rpc.batis.comm; import java.util.list; import org.apache.ibatis.annotations.deleteprovider; import org.apache.ibatis.annotations.insertprovider; import org.apache.ibatis.annotations.options; import org.apache.ibatis.annotations.selectprovider; import org.apache.ibatis.annotations.updateprovider; /** * 通用mapper基础接口,使用范型,其他mapper继承即可 * @author mrzhou * * @param <t> */ public interface generalmapper<t> { @insertprovider(method="insert",type=sqlgen.class) @options(usegeneratedkeys=true,keyproperty="id") int save(t t); @deleteprovider(method="del",type=sqlgen.class) int del(t t); @updateprovider(method="update",type=sqlgen.class) int update(t t); @selectprovider(method="select",type=sqlgen.class) list<t> list(t t); }
我个常用的也就是crud这4个方法, 其他的mapper方法你可以在继承中再继续写吧, 那些就是大家常用的可以写在继承接口当中.
这里我写了一个通用的sqlprovider类sqlgen.java
package cn.miw.rpc.batis.comm; import java.lang.reflect.field; import org.apache.ibatis.jdbc.sql; /** * 常规crud四个方法 * @author mrzhou * * @param <t> */ public class sqlgen<t> { public string select(t object) { return new sql() { { select("*"); from(object.getclass().getsimplename()); try { field[] fields = object.getclass().getdeclaredfields(); for (field field : fields) { field.setaccessible(true); object v = field.get(object); if (v != null) { string fieldname = field.getname(); if (v instanceof string && ((string)v).contains("%")) { where(fieldname + " like '"+v+"'" ); } else { where(fieldname + "=#{" + fieldname + "}"); } } } } catch (exception e) { } } }.tostring(); } public string update(t object) { return new sql() { { update(object.getclass().getsimplename()); try { field[] fields = object.getclass().getdeclaredfields(); for (field field : fields) { field.setaccessible(true); object v = field.get(object); if (v != null) { string fieldname = field.getname(); set(fieldname + "=#{" + fieldname + "}"); } } } catch (exception e) { } where("id=#{id}"); } }.tostring(); } public string insert(t object) { return new sql() { { insert_into(object.getclass().getsimplename()); try { field[] fields = object.getclass().getdeclaredfields(); for (field field : fields) { field.setaccessible(true); object v = field.get(object); if (v != null) { string fieldname = field.getname(); values(fieldname,"#{"+fieldname+"}"); } } } catch (exception e) { } } }.tostring(); } public string del(t object) { return new sql() { { delete_from(object.getclass().getsimplename()); try { field[] fields = object.getclass().getdeclaredfields(); for (field field : fields) { field.setaccessible(true); object v = field.get(object); if (v != null) { string fieldname = field.getname(); if (v instanceof string && ((string)v).contains("%")) { where(fieldname + " like '"+v+"'" ); } else { where(fieldname + "=#{" + fieldname + "}"); } } } } catch (exception e) { } } }.tostring(); } }
在调用mapper方法时传入相应的实体, 如果字段类型为string且包含%, 将使用like 进行查询, 该操作仅对select和delete操作有效. insert,update则不受此限制, '%'百分号将作为内容被保存进数据库
在对应的service中我们只需要这样使用
user user = new user(); user.setname("张%");// 或者user.setname("%赵%"); list<user> list = usermapper.list(user);
是不是很方便呢?
当然你的其他方法可以继续在相应的mapper中继续描述
package cn.miw.rpc.batis.mapper; import org.apache.ibatis.annotations.delete; import org.apache.ibatis.annotations.insert; import org.apache.ibatis.annotations.mapper; import org.apache.ibatis.annotations.param; import org.apache.ibatis.annotations.select; import org.apache.ibatis.annotations.update; import cn.miw.rpc.batis.comm.generalmapper; import cn.miw.rpc.model.user; /** * 用户mapper,定义其他常规的方便方法 * @author mrzhou * */ @mapper public interface usermapper extends generalmapper<user> { @insert("insert into user(name,age) values(#{name},#{age})") int adduser(@param("name") string name, @param("age") int age); @select("select * from user where id =#{id}") user findbyid(@param("id") int id); @update("update user set name=#{name} where id=#{id}") void updatabyid(@param("id") int id, @param("name") string name); @delete("delete from user where id=#{id}") void deletebyid(@param("id") int id); }
各位看包名, 其实我这个假期是在研究一些rpc的东西, 顺带折腾了一下mybatis.
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。
发表评论