SpringBoot + MyBatis 动态查询支持的通用方法

2018国庆, 已经提前预知会阴雨绵绵, 再说大家都能够想像得到的场景, 还是在家学习吧.

人人人人人人人人人人人人人人人
人人人人人人人人人人人人人人人
人人人人人人人人人人人人人人人
人人人人人人人人人人人人人人人
人人人人人人人人人人人人人人人
人人人人人人人人人人人人人人人
人人人人人人人我人人人人人人人
人人人人人人人人人人人人人人人
人人人人人人人人人人人人人人人
人人人人人人人人人人人人人人人
人人人人人人人人人人人人人人人
人人人人人人人人人人人人人人人
人人人人人人人人人人人人人人人

这几天除了买菜,做饭,再看看别人的堵, 其实我也还是蛮开心的, 你所拥有的一切, 除了知识好像其他都可能会被小偷偷掉或者遗落. 

跑偏了, 回归正题吧.

这几天研究使用了一下 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. 希望对各位看官有帮助.

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蜜友

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值