JDBC中的那些设计模式

1、单例模式获取数据库链接

一、关于单例模式的定义

保证一个类仅有一个实例,并提供访问它的全局访问点。Java里面实现的单例是一个虚拟机的范围。由于装载类的功能时虚拟机,因此一个虚拟机在听过本身的Classload装载饿汉式实现单例类的时候就会建立一个类的实例。单例的实质是:控制实例的数目 。负责建立Singleton类本身惟一实例,并提供一个getInstance的方法,让外部来访问这个类的惟一实例。java

二、单例模式的分类

懒汉式会一直等到立刻要使用实例的时候才建立,是典型的时间换空间。饿汉式在装载类的时候就建立对象实例,典型的空间换时间。mysql

三、单例模式实现的步骤

  1. 私有化构造方法
    private Singleton(){}
  2. 定义存储实例的属性
    //static 懒汉式为了在静态方法中使用
    //static 饿汉式 在类装载的时候进行初始化,多个实例的static变量会共享同一块内存区域
    private static Singleton singleton=null;
  3. 提供获取实例的静态方法
    public static Singleton getInstance(){
        return singleton;
    } 

 四、模板实现

懒汉式的实现:sql

package SingletonPattern;

public class LazySingleton {
    //一、定义一个变量来存储类实例
    private static LazySingleton uniqueInstance=null;
    //二、私有化构造方法,能够在内部类控制建立实例的项目
    private LazySingleton(){}
    //三、定义一个方法为客户端提供类实例
    public static synchronized LazySingleton getInstance(){
        //判断存储实例的变量是否有值
        //延迟加载:一开始不要加载资源和数据,一直等到立刻用这个资源或者数据了,才加载
        //缓存的思想:一种典型的空间换时间的方案。
        if(uniqueInstance==null){
            //若是没有,就建立一个实例,并把值赋值给存储类实例的变量
            uniqueInstance=new LazySingleton();
        }
        //若是有值,那就直接使用
        return uniqueInstance;
    }
}

饿汉式实现数据库

package SingletonPattern;

public class HungarySingleton {
        //一、定义一个变量来存储建立好的类实例,直接在这里建立实例,只能建立一次
        private static HungarySingleton uniqueInstance=new HungarySingleton();
        //二、私有化构造方法,能够在内部类控制建立实例的项目
        private HungarySingleton(){}
        //三、定义一个方法为客户端提供类实例
        public static HungarySingleton getInstance(){
            //直接使用建立好的实例
            return uniqueInstance;
        }
}

 五、JDBC链接实例挑战

package com.lyjs.jdbcTools;

import java.io.InputStream;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;
import javax.sql.DataSource;

import org.apache.commons.dbcp.BasicDataSourceFactory;

public final class JdbcUtils {
    //单列模式
    private JdbcUtils(){}
    private static DataSource myDataSource=null;
    //声明实例
    private JdbcUtils jdbcUtils =new JdbcUtils();
    public JdbcUtils getJdbcUtils(){
        return jdbcUtils;
    }
    static{
        try {
            Class.forName("com.mysql.jdbc.Driver");
            //加载dbcp配置文件
            Properties prop=new Properties();
            InputStream is=JdbcUtils.class.getClassLoader().getResourceAsStream("dbcpconfig.properties");
            prop.load(is);
            //建立链接池
            myDataSource=BasicDataSourceFactory.createDataSource(prop);
        } catch (Exception e) {
            e.printStackTrace();
            throw new ExceptionInInitializerError();
        }
    }
    
    //获取数据源
    public  DataSource getDataSource(){
        return myDataSource;
    }
    //获取连接
    public  Connection getConnection(){
        try {
            return myDataSource.getConnection();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
    //关闭链接
    public  void free(ResultSet rs, Statement st, Connection conn) {
        try {
            if (rs != null) {
                rs.close();
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            try {
                if (st != null) {
                    st.close();
                }
            } catch (SQLException e) {
                e.printStackTrace();
            } finally {
                try {
                    if (conn != null)
                        conn.close();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
    }
}
相关文章
相关标签/搜索