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所在类的更多相关文章

  1. 设计模式 ( 十九 ) 模板方法模式Template method(类行为型)

      设计模式 ( 十九 ) 模板方法模式Template method(类行为型) 1.概述 在面向对象开发过程中,通常我们会遇到这样的一个问题:我们知道一个算法所需的关键步骤,并确定了这些步骤的执行 ...

  2. jquery点击li 获取当前父节点所在类的索引

    jquery点击li 获取当前父节点所在类的索引 $('.jbcz').find('.content li').click(function(){ //alert($('.jbcz').find('. ...

  3. Unity 游戏框架搭建 2019 (二十九) 方法所在类命名问题诞生的原因

    我们在整理阶段解决了一些意外的问题.但是这些问题仅仅只是被解决而已,我们并没有去思考过这些问题是为什么产生的?以及在以后我们如何去避免这些问题的产生? 方法所在类的命名问题,最后我们通过方法分类解决了 ...

  4. Maven-打包jar指定main函数所在类的一个例子

    问题描述:maven打包jar时,由于带main方法的类没有被加入manifest中,导致执行java -jar mvn-jar-1.0-SNAPSHOT.jar时,会提示没有主清单属性. 解决办法: ...

  5. Python的程序结构[1] -> 方法/Method[0] -> 类实例方法、私有方法和抽象方法

    类实例方法.私有方法和抽象方法 Python中最常用的就是类实例方法,类似于属性中的类实例属性,同时,也存在与私有属性类似方法,即私有方法,下面介绍这两种常见的方法,以及一种特殊意义的类实例方法 -- ...

  6. 深入理解xLua基于IL代码注入的热更新原理

    目前大部分手游都会采用热更新来解决应用商店审核周期长,无法满足快节奏迭代的问题.另外热更新能够有效降低版本升级所需的资源大小,节省玩家的时间和流量,这也使其成为移动游戏的主流更新方式之一. 热更新可以 ...

  7. Java编程里类的继承

    今天,我们将要讨论的内容是Java里面类的继承的相关概念. 说到继承,我相信大家都不陌生.生活中,子承父业,子女继承父母的财产,这就是继承.实际上,Java里的继承也是如此.对于一个类来说,它的数据成 ...

  8. C#基础-事件 继承类无法直接引发基类的事件

    An event can be raised only from the declaration space in which it is declared. Therefore, a class c ...

  9. JAVA深入研究——Method的Invoke方法。

    在写代码的时候,发现Method可以调用子类的对象,但子类即使是改写了的Method,方法名一样,去调用父类的对象也会报错,虽然这是很符合多态的现象,也符合java的动态绑定规范,但还是想弄懂java ...

随机推荐

  1. jmeter --响应断言详解

    jmeter --响应断言详解 响应断言 :对服务器的响应进行断言校验 (1)应用范围: main sample and sub sample, main sample only , sub-samp ...

  2. Spring Cloud Eureka Server使用(注册中心)

    一.Spring Cloud Eureka 基于Netflix Eureka做了二次封装 由两个组件组成 Eureka Server 注册中心, 供服务注册的服务器 Eureka Client 服务注 ...

  3. Zookeeper 重连机制

    Zookeeper 重连机制 public class ZKConnectSessionWatcher implements Watcher { public final static String ...

  4. app崩溃后自动重启

    android 引用:http://blog.csdn.net/caiwenfeng_for_23/article/details/41184353 package com.tan.abnormalr ...

  5. 基于select类型多路IO复用,实现简单socket并发

    还有很多缺限,如客户断开无限重复 以下转至老师博客: server: #!/usr/bin/env python # -*- coding: utf-8 -*- __author__ = " ...

  6. <亲测>window+iis+letsencrypt+ssl 手动续期(通配符域名)

    之前提到过 window环境下 生成ssl通配符域名证方法为:https://www.cnblogs.com/duanweishi/p/9491209.html    下文为在window环境下手动续 ...

  7. 同台同时多开DELPHI2007的解决办法

    Cannot create file "C:\Users\Administrator\AppData\Local\Temp\EditorLineEnds.ttr"这个问题的产生根据 ...

  8. Unity3d- 资源

    Data与Resources文件夹一般只读文件放到Resources目录Data用于新建的文件或者要修改的文件============================================= ...

  9. Redis单线程单进程为什么效率那么高

    1.完全基于内存,绝大部分请求是纯粹的内存操作,非常快速.数据存在内存中,类似于HashMap,HashMap的优势就是查找和操作的时间复杂度都是O(1): 2.数据结构简单,对数据操作也简单,Red ...

  10. java1.8新特性(一)

    一直在更新java 版本,原来也没有关注java版本的变化 引入的一些新的api  引起注意的还是  关于一些并发包的使用,那时候才对每个版本的特性 去了解了一下,虽然 不一定都用上了,但是不管学习什 ...