当前位置: 代码网 > it编程>编程语言>Java > mybatis-plus @select动态查询方式

mybatis-plus @select动态查询方式

2024年05月28日 Java 我要评论
mybatis-plus @select 动态查询@select({"<script> select cor.risk_id,cor.create_by as leader,cor.cre

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.

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com