得到某个method所在类
JDBC主要业务与次要业务分析
1. 加载驱动
2. 建立连接
3. 创建preparestatement
4. 执行sql命令
5. 关闭连接,preparestatement
主要业务是4,其他全是次要业务
(1)定义接口
public interface SqlSession {
     public int save(String sql)throws Exception;
}
(2)接口实现类
public class DeptMapper implements SqlSession {
    PreparedStatement ps;
    @Override
    public int save(String sql) throws SQLException {//JDBC主要业务 输送sql
           int num= ps.executeUpdate(sql);
        return num;
    }
}
(3)通知类
public class Invaction implements InvocationHandler {
        private SqlSession    obj;//具体被监控对象
        Connection connection ;
        PreparedStatement pStatement;
        public Invaction(SqlSession param){
            this.obj =param;
        }
    @Override
    public Object invoke(Object porxy, Method method, Object[] params) throws Throwable {
                 Object value;
                //1.执行JDBC初始次要业务
                    init();
                //2.执行JDBC主要业务
                   Field psField = obj.getClass().getDeclaredField("ps");
                   psField.setAccessible(true);
                   psField.set(obj, pStatement);
                  value= method.invoke(obj, params);
                //3.执行JDBC结束次要业务
                   close();
                   return value; //返回被拦截方法,需要调用地方
    }
    //次要业务
    private void init()throws Exception{
        Class.forName("com.mysql.jdbc.Driver");
         connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/passbook", "root", "123456");
         pStatement = connection.prepareStatement("");
    }
    private void close() throws SQLException{
        if(pStatement!=null){
            pStatement.close();
        }
        if(connection!=null){
            connection.close();
        }
    }
}
(4)代理对象
public class SqlSessionFactory {
    /*
     *
     *  JDK动态代理模式下,代理对象的数据类型
     *  应该由监控行为来描述
     *  参数: Class文件,监控类
     */
    public static  SqlSession Builder(Class classFile)throws Exception {
        //1.创建被监控实例对象
         SqlSession obj=  (SqlSession) classFile.newInstance();
        //2.创建一个通知对象
         InvocationHandler adviser= new Invaction(obj);
         //3.向JVM申请负责监控obj对象指定行为的监控对象(代理对象)
         /*
          *  loader:被监控对象隶属的类文件在内存中真实地址
          *  interfaces:被监控对象隶属的类文件实现接口
          *  h:监控对象发现小明要执行被监控行为,应该有哪一个通知对象进行辅助
          */
         SqlSession $proxy= (SqlSession) Proxy.newProxyInstance(obj.getClass().getClassLoader(), obj.getClass().getInterfaces(), adviser);
         return $proxy;
    }
}
(5)测试类
public class TestMain {
    public static void main(String[] args) throws Exception {
        Map StatementMapper = new HashMap();
        StatementMapper.put("dept.save", "insert into dept(dname,location) values('java','BEIJING')");
        SqlSession dao =   SqlSessionFactory.Builder(DeptMapper.class);
        dao.save((String)StatementMapper.get("dept.save"));
    }
}
得到某个method所在类的更多相关文章
- 设计模式 ( 十九 ) 模板方法模式Template method(类行为型)
		设计模式 ( 十九 ) 模板方法模式Template method(类行为型) 1.概述 在面向对象开发过程中,通常我们会遇到这样的一个问题:我们知道一个算法所需的关键步骤,并确定了这些步骤的执行 ... 
- jquery点击li 获取当前父节点所在类的索引
		jquery点击li 获取当前父节点所在类的索引 $('.jbcz').find('.content li').click(function(){ //alert($('.jbcz').find('. ... 
- Unity 游戏框架搭建 2019 (二十九) 方法所在类命名问题诞生的原因
		我们在整理阶段解决了一些意外的问题.但是这些问题仅仅只是被解决而已,我们并没有去思考过这些问题是为什么产生的?以及在以后我们如何去避免这些问题的产生? 方法所在类的命名问题,最后我们通过方法分类解决了 ... 
- Maven-打包jar指定main函数所在类的一个例子
		问题描述:maven打包jar时,由于带main方法的类没有被加入manifest中,导致执行java -jar mvn-jar-1.0-SNAPSHOT.jar时,会提示没有主清单属性. 解决办法: ... 
- Python的程序结构[1] -> 方法/Method[0] -> 类实例方法、私有方法和抽象方法
		类实例方法.私有方法和抽象方法 Python中最常用的就是类实例方法,类似于属性中的类实例属性,同时,也存在与私有属性类似方法,即私有方法,下面介绍这两种常见的方法,以及一种特殊意义的类实例方法 -- ... 
- 深入理解xLua基于IL代码注入的热更新原理
		目前大部分手游都会采用热更新来解决应用商店审核周期长,无法满足快节奏迭代的问题.另外热更新能够有效降低版本升级所需的资源大小,节省玩家的时间和流量,这也使其成为移动游戏的主流更新方式之一. 热更新可以 ... 
- Java编程里类的继承
		今天,我们将要讨论的内容是Java里面类的继承的相关概念. 说到继承,我相信大家都不陌生.生活中,子承父业,子女继承父母的财产,这就是继承.实际上,Java里的继承也是如此.对于一个类来说,它的数据成 ... 
- C#基础-事件 继承类无法直接引发基类的事件
		An event can be raised only from the declaration space in which it is declared. Therefore, a class c ... 
- JAVA深入研究——Method的Invoke方法。
		在写代码的时候,发现Method可以调用子类的对象,但子类即使是改写了的Method,方法名一样,去调用父类的对象也会报错,虽然这是很符合多态的现象,也符合java的动态绑定规范,但还是想弄懂java ... 
随机推荐
- 在CentOS6.8系统上安装MySQL5.7(转)
			mysql-57">如何在CentOS 6.8系统上安装MySQL 5.7? 一.检查系统上是否已经安装MySQL 命令: ? 1 2 3 4 5 [root@localhost ~] ... 
- ASP.NET AJAX入门系列(4):使用UpdatePanel控件(一)
			UpdatePanel可以用来创建丰富的局部更新Web应用程序,它是ASP.NET 2.0 AJAX Extensions中很重要的一个控件,其强大之处在于不用编写任何客户端脚本,只要在一个页面上添加 ... 
- angularjs 外部调用controller中的方法
			angular.element(document.querySelector('[ng-controller=mainCtrl]')).scope().viewGo('tab.VIPPay_Succe ... 
- openwrt挂载摄像头及视频保存
			一.编译选项的选择: -> Utilities ->usbutils (这个里面包含lsusb的命令,是查看你的摄像头型号的) -> Kernel modules -> I2C ... 
- GTP+SDI工程播出部分思路整理(3)
			GTP+SDI工程播出部分思路整理(3) 1.本文的目的主要分析video_out_to_sdi模块中输入信号 tx_usrclk, rst, tx_mode, tx_level_b的使用 Tx_us ... 
- redmine一键安装(项目管理、Bug管理、任务跟踪、代码管理、日报等等)
			1,下载一键安装包(64位系统) https://bitnami.com/stack/redmine 2,帮助文档(安装引导) http://www.360doc.com/content/15/033 ... 
- JAVA的debug入门和多断电调试
			调试的一般都是逻辑 第一步的错误双击数字旁边的蓝色地方,或者点击右键如图 断点的意思就是程序执行在哪里就停止 当找不到DEBUG中的Variables是在位置输入Variables就可以了: 再按下F ... 
- Azure SQL 数据库仓库Data Warehouse (3) DWU
			<Windows Azure Platform 系列文章目录> 在笔者的上一篇文章中:Azure SQL 数据库仓库Data Warehouse (2) 架构 介绍了SQL DW的工作节点 ... 
- Apache Solr 介绍
			Apache Solr 介绍 Solr 是什么? Solr 是一个开源的企业级搜索服务器,底层使用易于扩展和修改的Java 来实现.服务器通信使用标准的HTTP 和XML,所以如果使用Solr 了解J ... 
- C/C++基础----动态内存
			why 管理较难,忘记释放会内存泄漏,提早释放可能非法引用,重复释放. 为了更容易,更安全的使用动态内存,提供智能指针,其默认初始化保存一个空指针. what shared_ptr允许多个指针指向同一 ... 
