JDBC连接池类与使用装饰设计模式只覆盖类中个别方法

1.编写连接池类

public class DDDatasource implements DataSource {
    //存放连接
    private LinkedList<Connection> connections = new LinkedList<>();
    //读取properties文件内容加载到properties对象中
    private static Properties config = new Properties();

    //这里只想要重写connection对象中的close方法,使用户调用close方法时,是将用户得到的连接对象返还给LinkedList链表,使用装饰设计模式即可解决
    //步骤1.编写内部类实现与被增强对象相同接口,被增强对象指想进行方法覆盖的对象
    class DDConnection implements  Connection{
        //步骤2.定义变量记住被增强对象
        private Connection conn;
        //步骤3.定义构造器接受被增强对象
        public DDConnection(Connection conn){
            this.conn = conn;
        }
        //步骤4.覆盖想要覆盖的方法,在这里将close方法覆盖成归还连接对象connection到linkedList中
        @Override
        public void close() throws SQLException{
            //将connection对象再次加入linkedList中
            connections.add(conn);
        }
        //步骤5.实现其他不想覆盖的方法,在后面就使用该类代替原本的被增强类
        @Override
        public boolean isClosed() throws SQLException {
            return conn.isClosed();
        }

    static {
        try {
            //读取配置文件
            InputStream in = DDDatasource.class.getClassLoader().getResourceAsStream("dddatasource.properties");
            //加载配置文件数据到properties对象中
            config.load(in);
            Class.forName(config.getProperty("jdbc.driver"));
        }catch (Exception e){
            e.printStackTrace();
            throw new RuntimeException("加载驱动失败");
        }
    }
        public DDDatasource(){
	        try{
	            for(int i = 0;i < Integer.valueOf(config.getProperty("jdbc.initConn"));i++){
	                //获取连接
	                Connection connection = DriverManager.getConnection(config.getProperty("jdbc.url"),config.getProperty("jdbc.user"),config.getProperty("jdbc.password"));
	                //放入集合
	                connections.add(connection);
	            }
	        }catch (Exception e){
	            throw new RuntimeException("初始化驱动失败");
	        }
    }
    @Override
    public Connection getConnection() throws SQLException {
        //从集合获取连接并移出
        Connection connection = connections.removeFirst();
        return new DDConnection(connection);
    }
}

2.编写配置文件

jdbc.driver = com.mysql.jdbc.Driver
jdbc.url = jdbc:mysql://localhost:3306/community?useSSL=false
jdbc.user = root
jdbc.password = 1234
jdbc.initConn = 10

3.调用连接池类获得连接对象

DDDatasource datasource = new DDDatasource();
Connection connection = datasource.getConnection();
System.out.println(connection);
connection.close();

4.当使用其他非JDBC连接池时,将上面的DDDatasource替换成对应的连接池类即可,如Druid时

        DruidDataSource datasource = new DruidDataSource();
        //可使用set方法来代替配置文件,设置数据库访问信息
        datasource.setUrl("jdbc:mysql://localhost:3306/community?useSSL=false");
        datasource.setDriverClassName("com.mysql.jdbc.Driver");
        datasource.setUsername("root");
        datasource.setPassword("1234");
        Connection connection = datasource.getConnection();
        System.out.println(connection);
        connection.close();
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值