`
raymond.chen
  • 浏览: 1426036 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

基于JDK动态代理实现Mybatis的Mapper功能

    博客分类:
  • Java
 
阅读更多

Mybatis通过定义Mapper接口类,类中的方法与mapper的xml文件对应起来,然后在Service类自动注入Mapper接口类即可调用其方法。

 

我们可以使用JDK的动态代理机制自己实现这样的Mapper功能。

 

先自定义两个注解类:

@Target(ElementType.TYPE) //在接口和类上使用
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
public @interface MapperEnable {
	boolean enable() default true;
}


@Target(ElementType.METHOD) //在方法上使用
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
public @interface MethodEnable {
	boolean enable() default true;
}

 

定义Mapper接口类:

     接口上和方法上添加自定义注解,用于后续做特殊业务处理

@MapperEnable(enable=true)
public interface UserMapper {
	@MethodEnable(enable=true)
	public User getUserById(Long id);
	
	@MethodEnable(enable=false)
	public void print();
}

 

定义Mapper接口的代理类,代理类需要实现InvocationHandler接口

/**
 * 代理类
 */
public class MapperProxy implements InvocationHandler {
	@Override
	public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
		System.out.println("接口类名:" + method.getDeclaringClass().getName());
		
		System.out.println("接口上的注解类: " + Arrays.toString(method.getDeclaringClass().getAnnotations()));
		
		System.out.println("接口方法名:" + method.getName());
		System.out.println("输入参数:" + Arrays.toString(args));

		System.out.println("方法上的注解类: " + Arrays.toString(method.getAnnotations()));
		
		if(method.isAnnotationPresent(MethodEnable.class)){ //方法上有指定注解
			MethodEnable methodEnable = method.getAnnotation(MethodEnable.class); //获取该注解类
			boolean b = methodEnable.enable();
			if(b){
				//此处根据接口类名、方法名和参数值等信息构造对应的sql语句并获取数据
				return new User(100L, "cjm", "123", null);
			}else{
				System.out.println("no permission");
				return null;
			}
		}
		
		return null;
	}
}

 

通过动态代理获取接口类的代理对象,并调用其方法

public class ProxyTest {
	public static void main(String[] args) {
		//通过动态代理获取接口的代理对象
		UserMapper mapper = getMapper(UserMapper.class);
		System.out.println(mapper.getClass().getName());
		
		//调用接口方法
		User user = mapper.getUserById(1L);
		String username = Optional.ofNullable(user).map(u -> u.getUsername()).orElse("");
		System.out.println(username);
		
		mapper.print();
	}
	
	/**
	 * 利用Proxy类的newProxyInstance方法创建一个动态代理对象
	 * @param clazz 接口类
	 */
	@SuppressWarnings("unchecked")
	private static <T> T getMapper(Class<T> clazz){
		return (T)Proxy
				.newProxyInstance(clazz.getClassLoader(), new Class[]{clazz}, new MapperProxy());
	}
}

 

执行后的结果如下:

接口的代理对象:com.sun.proxy.$Proxy0

接口类名:com.seasy.jdk8.proxy.UserMapper
接口上的注解类: [@com.seasy.jdk8.proxy.MapperEnable(enable=true)]
接口方法名:getUserById
输入参数:[1]
方法上的注解类: [@com.seasy.jdk8.proxy.MethodEnable(enable=true)]
cjm

接口类名:com.seasy.jdk8.proxy.UserMapper
接口上的注解类: [@com.seasy.jdk8.proxy.MapperEnable(enable=true)]
接口方法名:print
输入参数:null
方法上的注解类: [@com.seasy.jdk8.proxy.MethodEnable(enable=false)]
no permission

 

分享到:
评论

相关推荐

    mybatis-3-config.dtd mybatis-3-mapper.dtd

    总的来说,`mybatis-3-config.dtd`和`mybatis-3-mapper.dtd`是MyBatis框架的基石,它们定义了MyBatis配置文件的语法规则,帮助开发者构建出结构清晰、功能完备的持久层解决方案。通过对这两个DTD的深入理解和应用,...

    springboot+mybatis+jdk1.7

    标题 "springboot+mybatis+jdk1.7" 指的是一个基于Spring Boot、MyBatis框架,并使用Java Development Kit 1.7版本构建的Web应用项目。这个项目已经搭建完成,具备基本的结构,方便开发者快速启动一个新的Java Web...

    MyBatis动态代理

    MyBatis通过Java的反射和JDK动态代理技术来实现这一功能,使得我们可以在不编写任何具体DAO实现类的情况下,就能够调用SQL映射文件中的SQL语句。 在MyBatis中,Mapper接口是业务层与数据访问层之间的桥梁,它定义了...

    MyBatis知识点总结.ppt

    Dao接口,就是人们常说的Mapper接口,接口的全限名,就是映射文件中的namespace的值,接口的方法名,就是...Dao接口的工作原理是JDK动态代理,Mybatis运行时会使用JDK动态代理为Dao接口生成代理proxy对象,代理对象pro

    使用ImportBeanDefinitionRegistrar、JDK代理、FactoryBean模拟mybatis原理.zip

    在模拟MyBatis时,我们可以创建一个JDK代理类,它代理Mapper接口,当调用Mapper的方法时,实现代理逻辑,如SQL的编译、执行以及结果的映射。 然后,`FactoryBean`是Spring中的一个接口,它允许我们创建和管理自定义...

    基于springboot,采用mybatis和mapper3插件,基于shiro的sso cookies单机实现+源代码+文档说

    10. 基于 shiro 改造的 sso 单机实现,登录生成 token 存储在用户 cookies 中,请求解析 cookies,以解析成功作为标识。 11. 交互上使用 layui,使用第三方功能。 12. 热刷新实体 mapper.xml文件 MapperRefresh.java...

    mybatis_plus-17版本.zip

    mybatis_plus插件,idea快速从mapper.java文件进入mapper.xml文件,通用版。使用起来开发更快捷,mybatis一键跳转工具,安装可参考“我的博客-&gt;idea开发相关-&gt;idea快速从mapper.java跳转到mapper.xml文件的插件”。

    mybatis-hand-writing:mybatis手写迷你版源码,jdk动态代理的运用,手写mybatis的迷你版本源码,自己实现mybatis

    在MyBatis中,JDK动态代理通常用于创建Mapper接口的代理对象,这些代理对象在执行SQL语句时起到关键作用。当调用Mapper接口的方法时,实际上是调用了代理对象的方法,这个过程会触发动态生成的InvocationHandler,...

    mybatis增删改查小例子(包括Dao开发和Mapper代理开发)

    在本示例中,我们将探讨如何使用MyBatis进行基本的增删改查操作,包括Dao开发和Mapper代理开发,同时配合MySQL数据库的使用。 **1. MyBatis概述** MyBatis是一个轻量级的ORM(Object-Relational Mapping)框架,它的...

    Mybatis代理开发

    Mybatis通过动态代理(JDK Proxy或CGLIB)创建Mapper接口的实现类,这个实现类在运行时动态生成,包含了执行SQL的方法。当我们调用Mapper接口的方法时,实际上是在调用这个动态生成的实现类的方法,从而完成SQL的...

    spring boot+mvc+mybatis(通用mapper)+druid+jsp+bootstrap实现后台权限管理系统源码

    项目基于jdk1.8整合了springboot+mvc+mybatis(通用mapper)+druid+jsp+bootstrap等技术,springboot+Listener(监听器),Filter(过滤器),Interceptor(拦截器),Servlet,springmvc静态资源,文件上传下载,多数据源切换,缓存...

    整合springboot+mvc+mybatis(通用mapper)+druid+jsp+bootstrap实现权限管理文件上传下载多数据源切换等功能

    项目基于jdk1.8整合了springboot+mvc+mybatis(通用mapper)+druid+jsp+bootstrap等技术,springboot+Listener(监听器),Filter(过滤器),Interceptor(拦截器),Servlet,springmvc静态资源,文件上传下载,多数据源切换,缓存...

    Mybatis面试题(含答案).pdf

    Mybatis 使用 JDK 的动态代理,为需要拦截的接口生成代理对象以实现接口方法拦截功能。 7. 一级、二级缓存 Mybatis 的一级缓存基于 PerpetualCache 的 HashMap 本地缓存,其存储作用域为 Session。二级缓存基于 ...

    SpringBoot整合MyBatis Plus实现增删改查教程

    MyBatis Plus 是一个基于 MyBatis 的 ORM 框架,它提供了许多实用的功能来简化数据库交互。 首先,MyBatis Plus 是什么?MyBatis Plus 是一个基于 MyBatis 的强大 ORM 框架,提供了许多实用的功能来简化数据库交互...

    mybatis_jdk_proxy.zip

    总的来说,"mybatis_jdk_proxy.zip"可能包含的是关于如何在MyBatis中利用JDK Proxy实现Mapper接口动态代理的教程或示例代码。通过学习这部分内容,你可以掌握如何在MyBatis中优雅地处理数据库操作,并理解Java内存...

    详解Mybatis(五)Mapper接口

    Mapper接口的原理是基于动态代理的技术,Mybatis使用JDK的代理机制或CGLib来生成代理对象,从而实现Mapper接口的方法调用。这种机制使得开发者可以使用接口来编写数据库操作的代码,而不需要关心底层的实现细节。 ...

    Spring4.2.9+mybatis3.4.4集成(精简版)支持JDK1.6、Tomcat6

    同时,编写Mapper接口和对应的XML映射文件,实现SQL的定义。 7. **编写业务逻辑**:在Java类中定义Service接口和实现类,通过Spring的@Autowired注解注入所需的Dao。 8. **部署运行**:将项目打包成WAR文件,放入...

    深入浅出MyBatis技术原理与实战 第六章 源代码

    MyBatis使用JDK的动态代理或者CGLIB来实现Mapper接口的代理类,这样在调用Mapper方法时,实际上执行的是动态生成的代理类的方法,从而实现了SQL的动态编织。动态代理是MyBatis实现方法拦截、事务管理和结果映射的...

    MyBatis-CMEU2.0各平台通用版要求JDK1.8.66以上

    MyBatis逆向工程是MyBatis框架的一个重要特性,它能够自动生成基于数据库表结构的Java实体类、Mapper接口和XML配置文件,极大地减少了手动编写这些代码的工作量。通过逆向工程,开发者可以快速搭建数据访问层,使...

Global site tag (gtag.js) - Google Analytics