mybatis 基础1(动态代理)
我目前使用的是mybatis 3.3.0版本。
可使用
1.xml文本,
2.dao类,
3.sqlSession.getMapper(Class<T> type),
生成sql类,
原理:动态代理。
动态代理展示:
@1:接口:ProxyInterface
public interface ProxyInterface {
public void sayHA();
}
@2:接口实现类ProxyImp
public class ProxyImp implements ProxyInterface {
@Override
public void sayHA() {
System.out.println("继承类继承类继承类继承类继承类!");
}
}
@3:代理类:ProxyService
public class ProxyService implements InvocationHandler{
Object target;
Object proxyLei;
ProxyService(Object target,Class[] interfaces){
this.target=target;
this.proxyLei= Proxy.newProxyInstance(target.getClass().getClassLoader(),interfaces,this);
}
ProxyService(){}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("invokeinvokeinvokeinvokeinvokeinvoke");
return "111";
}
}
@4:测试类:Test
public class Test {
public static void main(String []args){
ProxyInterface proxyImp=new ProxyImp();
System.out.println(proxyImp.getClass());
proxyImp.sayHA();
ProxyService proxy=new ProxyService(proxyImp,proxyImp.getClass().getInterfaces());
System.out.println(proxy.proxyLei); proxyImp=(ProxyInterface)proxy.proxyLei;
System.out.println(proxyImp.getClass());
proxyImp.sayHA();
}
}
输出值:
class com.proxy1.ProxyImp
继承类继承类继承类继承类继承类!
invokeinvokeinvokeinvokeinvokeinvoke
111
class com.sun.proxy.$Proxy0
解析:
第一个System.out.println(proxyImp.getClass());输出的是:class com.proxy1.ProxyImp,这是一个类;
第二个System.out.println(proxyImp.getClass());输出的是:class com.sun.proxy.$Proxy0,这是一个代理类;
第一个proxyImp.sayHA();输出的是:继承类继承类继承类继承类继承类!,这是原方法的正确输出;
第一个proxyImp.sayHA();输出的是:
invokeinvokeinvokeinvokeinvokeinvoke
111
这是代理类ProxyService的invoke方法的正确输出。
以上是一个简单的完整的代理类示例。
小结: 点1:动态代理的代理类(ProxyService)需要继承类InvocationHandler,根据jdk的英文解释,当调用代理类的方法时,ProxyService的invoke方法将会被调用。而
ProxyService所代理的类的方法将不会被调用,但可在ProxyService的invoke方法中被调用。使用方法:method.invoke(target,args);
点2:方法:
Proxy.newProxyInstance(target.getClass().getClassLoader(),interfaces,this);返回一个动态代理类。
参数解析:
- //得到代理对象..注意这里的第一个参数 要和Dao是同一个类加载器
- //第二个参数是实现哪个接口,要和被代理实现同样的接口
- //第三个参数是织入的类,该类实现了InvocationHandle接口
以上,为mybatis的基础之一:动态代理。
mybatis 基础1(动态代理)的更多相关文章
- JavaWeb_(Mybatis框架)Mapper动态代理开发_三
系列博文: JavaWeb_(Mybatis框架)JDBC操作数据库和Mybatis框架操作数据库区别_一 传送门 JavaWeb_(Mybatis框架)使用Mybatis对表进行增.删.改.查操作_ ...
- mybatis 05: mybatis中的动态代理
mybatis中动态代理存在的意义 图示 图示分析 分层说明:界面层为第一层,业务逻辑层(接口层 + 实现层)为第二层,数据访问层(接口层 + 实现层)为第三层 业务逻辑层和数据访问层:分别分两层来开 ...
- Mybatis之Mapper动态代理
一.什么是Mapper的动态代理 采用Mapper动态代理方法只需要编写相应的Mapper接口(相当于Dao接口),那么Mybatis框架根据接口定义创建接口的动态代理对象,代理对象的方法体同Dao接 ...
- Mybatis笔记 - Mapper动态代理
使用Mybatis开发Dao,通常有两个方法,即原始Dao开发方法和Mapper接口开发方法. Mapper接口开发方式是基于入门程序的基础上,对 控制程序 进行分层开发,程序员只需要 编写mappe ...
- MyBatis笔记——Mapper动态代理
前提概要 Mapper接口开发方法只需要程序员编写Mapper接口(相当于Dao接口),由Mybatis框架根据接口定义创建接口的动态代理对象,代理对象的方法体同上边Dao接口实现类方法. Mappe ...
- MyBatis通过Mapper动态代理来实现curd操作
MyBatis官方推荐使用mapper代理方法开发mapper接口,程序员不需要编写mapper实现类,使用mapper代理方法时,输入参数可以使用pojo包装对象或者map对象,保证dao的通用性 ...
- java框架之MyBatis(1)-入门&动态代理开发
前言 学MyBatis的原因 1.目前最主流的持久层框架为 Hibernate 与 MyBatis,而且国内公司目前使用 Mybatis 的要比 Hibernate 要多. 2.Hibernate 学 ...
- 【Mybatis】-- Mapper动态代理开发注意事项
1.1. Mapper动态代理方式 1.1.1. 开发规范 Mapper接口开发方法只需要程序员编写Mapper接口(相当于Dao接口),由Mybatis框架根据接口定义创建接口的动态代理对象,代理对 ...
- Mybatis学习3——动态代理
动态代理只需要接口和mapper映射文件不需要实现类 动态代理规范 1.namespace必须是接口的全路径 2.接口的方法必须与sql的id一致 3.接口的入参与parameterType类型一致 ...
- MyBatis使用Mapper动态代理开发Dao层
开发规范 Mapper接口开发方法只需要程序员编写Mapper接口(相当于Dao接口),由Mybatis框架根据接口定义创建接口的动态代理对象,代理对象的方法体同原始Dao接口实现类方法. Mappe ...
随机推荐
- vi编辑文件出现Can't open file for writing错误
可以用 ll 命令查看一下文件的权限,很有可能是没有权限,用chmod命令修改一下权限就可以了(当然是文件所有者或者root用户才能修改),或者切换成root用户(不推荐)
- javascript之标识(zhi)符、关键字与保留字
正确区分标识(zhi)符.关键字与保留字 我发现很多初学者往往弄不清楚这三者的区别,甚至会把标识符的“识(zhi)”读作识(shi),真是愧对小学的语文老师啊!!! 注意:在JavaScript中,所 ...
- MongoDb学习1
目标框架必须是 4.5以上,最新MongoDb.Driver 是 2.2.4(与MongoDb.Driver 的1.x版本差别较大) 官方文档 http://mongodb.github.io/mon ...
- MySQL------如何将SQLServer文件数据迁移到MySQL
转载: http://blog.csdn.net/zhangdaiscott/article/details/46412453
- php比较时间戳与时间差计算函数( 实用)
PHP时间比较和时间差如何计算 <?php $zero1=date(“y-m-d h:i:s”); $zero2=”-- ::′; echo “zero1的时间为:”.$zero1.”<b ...
- Java之强引用、 软引用、 弱引用、虚引用
1.强引用 平时我们编程的时候例如:Object object=new Object();那object就是一个强引用了.如果一个对象具有强引用,那就类似于必不可少的生活用品,垃圾回收器绝不会回收它. ...
- 基础SQL语句
SQL语句: 1.插入 方法一: "INSERT INTO [DB].[dbo].[T_Table] ([ID],[Name],[Amount],[Creater],[CreatedOn], ...
- 9月8日HTML表单元素(form、文本、按钮、选择)
表单元素 一.form form代表表单,功能:用于申明表单,定义采集数据的范围,也就是<form>和</form>里面包含的数据将被提交到服务器或者电子邮件里.<for ...
- HTML学习笔记——块级标签、行级标签、图片标签
1>块级标签.行级标签 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "htt ...
- os模块之popen
想查看当前目录下有哪些东西,可以使用os.popen()方法,代码如下: t = (os.popen("dir")) print(t.read()) #运行结果 C:\python ...