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
相关推荐
标题 "springboot+mybatis+jdk1.7" 指的是一个基于Spring Boot、MyBatis框架,并使用Java Development Kit 1.7版本构建的Web应用项目。这个项目已经搭建完成,具备基本的结构,方便开发者快速启动一个新的Java Web...
总的来说,`mybatis-3-config.dtd`和`mybatis-3-mapper.dtd`是MyBatis框架的基石,它们定义了MyBatis配置文件的语法规则,帮助开发者构建出结构清晰、功能完备的持久层解决方案。通过对这两个DTD的深入理解和应用,...
- 使用代理模式实现接口调用,包括静态代理和动态代理(JDK接口动态代理和CGLB生成子类代理)。 - **注解+反射**: - 通过自定义注解和反射技术,实现SQL语句的查找和执行。 - **JDBC操作数据库**: - 整合手写...
MyBatis通过Java的反射和JDK动态代理技术来实现这一功能,使得我们可以在不编写任何具体DAO实现类的情况下,就能够调用SQL映射文件中的SQL语句。 在MyBatis中,Mapper接口是业务层与数据访问层之间的桥梁,它定义了...
Dao接口,就是人们常说的Mapper接口,接口的全限名,就是映射文件中的namespace的值,接口的方法名,就是...Dao接口的工作原理是JDK动态代理,Mybatis运行时会使用JDK动态代理为Dao接口生成代理proxy对象,代理对象pro
在模拟MyBatis时,我们可以创建一个JDK代理类,它代理Mapper接口,当调用Mapper的方法时,实现代理逻辑,如SQL的编译、执行以及结果的映射。 然后,`FactoryBean`是Spring中的一个接口,它允许我们创建和管理自定义...
10. 基于 shiro 改造的 sso 单机实现,登录生成 token 存储在用户 cookies 中,请求解析 cookies,以解析成功作为标识。 11. 交互上使用 layui,使用第三方功能。 12. 热刷新实体 mapper.xml文件 MapperRefresh.java...
在MyBatis中,JDK动态代理通常用于创建Mapper接口的代理对象,这些代理对象在执行SQL语句时起到关键作用。当调用Mapper接口的方法时,实际上是调用了代理对象的方法,这个过程会触发动态生成的InvocationHandler,...
mybatis_plus插件,idea快速从mapper.java文件进入mapper.xml文件,通用版。使用起来开发更快捷,mybatis一键跳转工具,安装可参考“我的博客->idea开发相关->idea快速从mapper.java跳转到mapper.xml文件的插件”。
Mybatis 使用 JDK 的动态代理,为需要拦截的接口生成代理对象以实现接口方法拦截功能。 7. 一级、二级缓存 Mybatis 的一级缓存基于 PerpetualCache 的 HashMap 本地缓存,其存储作用域为 Session。二级缓存基于 ...
在本示例中,我们将探讨如何使用MyBatis进行基本的增删改查操作,包括Dao开发和Mapper代理开发,同时配合MySQL数据库的使用。 **1. MyBatis概述** MyBatis是一个轻量级的ORM(Object-Relational Mapping)框架,它的...
Mybatis通过动态代理(JDK Proxy或CGLIB)创建Mapper接口的实现类,这个实现类在运行时动态生成,包含了执行SQL的方法。当我们调用Mapper接口的方法时,实际上是在调用这个动态生成的实现类的方法,从而完成SQL的...
项目基于jdk1.8整合了springboot+mvc+mybatis(通用mapper)+druid+jsp+bootstrap等技术,springboot+Listener(监听器),Filter(过滤器),Interceptor(拦截器),Servlet,springmvc静态资源,文件上传下载,多数据源切换,缓存...
项目基于jdk1.8整合了springboot+mvc+mybatis(通用mapper)+druid+jsp+bootstrap等技术,springboot+Listener(监听器),Filter(过滤器),Interceptor(拦截器),Servlet,springmvc静态资源,文件上传下载,多数据源切换,缓存...
MyBatis Plus 是一个基于 MyBatis 的 ORM 框架,它提供了许多实用的功能来简化数据库交互。 首先,MyBatis Plus 是什么?MyBatis Plus 是一个基于 MyBatis 的强大 ORM 框架,提供了许多实用的功能来简化数据库交互...
《基于Spring+SpringMVC+Mybatis的房屋租赁系统开发详解》 在现代信息技术的推动下,房屋租赁行业的数字化进程不断加快,而基于Java技术栈的Web应用开发框架,如Spring、SpringMVC和Mybatis,成为了构建高效、稳定...
JDK动态代理基于接口,当目标对象实现了至少一个接口时,Java反射API可以动态生成实现了这些接口的代理类。而CGLIB(Code Generation Library)是在运行期通过字节码技术动态生成子类来实现代理,即使目标对象没有...
总的来说,"mybatis_jdk_proxy.zip"可能包含的是关于如何在MyBatis中利用JDK Proxy实现Mapper接口动态代理的教程或示例代码。通过学习这部分内容,你可以掌握如何在MyBatis中优雅地处理数据库操作,并理解Java内存...
Mapper接口的原理是基于动态代理的技术,Mybatis使用JDK的代理机制或CGLib来生成代理对象,从而实现Mapper接口的方法调用。这种机制使得开发者可以使用接口来编写数据库操作的代码,而不需要关心底层的实现细节。 ...