封装jdbc 单例模式的应用

时间:2021-05-19 20:57:42

实现增删该查的jdbc封装

import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Properties;

public class DbUtil {
    private static String user = null;
    private static String password = null;
    private static String driver = null;
    private static String url = null;
    private static Connection conn = null;
    
    private static Properties p =null;
    
    //单利模式 --懒汉式(双重锁定)保证线程的安全性
    public static DbUtil db = null;
    private DbUtil(){
        
    }
    public static DbUtil getInstance(){
        if(db == null){
            synchronized(DbUtil.class){
                if(db == null){
                    db = new DbUtil();
                }            
            }        
        }
        return db;
    }
    //读取配置文件且加载数据库驱动
    static{
        //实例化一个properties对象用来解析我们的配置文件
        p = new Properties();
        //通过类加载器来读取我们的配置文件,以字节流的形式读取
        InputStream in = DbUtil.class.getClassLoader().getResourceAsStream("/config.properties");
        try {
            //将配置文件自如到Propreties对象,来进行解析
            p.load(in);
            //读取配置文件
            driver = p.getProperty("driver");
            url = p.getProperty("url");
            user = p.getProperty("user");
            password = p.getProperty("password");
            //加载驱动
            Class.forName(driver);
        } catch (IOException e1) {
            e1.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } 
        
    }
    //建立数据库的连接
    public Connection getConn(){
        try {
            return DriverManager.getConnection(url, user, password);
        } catch (SQLException e) {
            e.printStackTrace();
            return null;
        }
    }
    //查询返回List容器
    public List<Map<String,Object>> query(String sql,Object...params){
        PreparedStatement pst = null;
        ResultSet rs = null;
        try {
            //获得连接
            conn = getConn();
            //获得preparedSttement对象进行预编译(?占位符)
            pst = conn.prepareStatement(sql);
            int paramsIndex = 1;
            for(Object p : params){
                pst.setObject(paramsIndex++, p);
            }
            //执行sql语句获得结果集的对象
            rs = pst.executeQuery();
            //获得结果集中列的信息
            ResultSetMetaData rst = rs.getMetaData();
            //获得结果集的列的数量
            int column = rst.getColumnCount();
            //创建List容器
            List<Map<String,Object>> rstList = new ArrayList<Map<String,Object>>();
            //处理结果
            while(rs.next()){
                //创建Map容器存取每一列对应的值
                Map<String,Object> m = new HashMap<String,Object>();
                for(int i=1;i<=column;i++){
                    m.put(rst.getColumnName(i), rs.getObject(i));
                }
                //将Map容器放入List容器中
                rstList.add(m);
            }
            return rstList;
        } catch (SQLException e) {
            e.printStackTrace();
            return null;
        }finally{
            //关闭资源
            close(rs, pst, conn);
        }
    }
     
     public List<Map<String,Object>> query(String sql,List<Object> params){
            PreparedStatement pst = null;
            ResultSet rs = null;
            try {
                //获得连接
                conn = getConn();
                //获得preparedSttement对象进行预编译(?占位符)
                pst = conn.prepareStatement(sql);
                int paramsIndex = 1;
                for(Object p : params){
                    pst.setObject(paramsIndex++, p);
                }
                //执行sql语句获得结果集的对象
                rs = pst.executeQuery();
                //获得结果集中列的信息
                ResultSetMetaData rst = rs.getMetaData();
                //获得结果集的列的数量
                int column = rst.getColumnCount();
                //创建List容器
                List<Map<String,Object>> rstList = new ArrayList<Map<String,Object>>();
                //处理结果
                while(rs.next()){
                    //创建Map容器存取每一列对应的值
                    Map<String,Object> m = new HashMap<String,Object>();
                    for(int i=1;i<=column;i++){
                        m.put(rst.getColumnName(i), rs.getObject(i));
                    }
                    //将Map容器放入List容器中
                    rstList.add(m);
                }
                return rstList;
            } catch (SQLException e) {
                e.printStackTrace();
                return null;
            }finally{
                //关闭资源
                close(rs, pst, conn);
            }
        }
    
    //分页查询总共有多少条记录totleSize
    public long queryLong(String sql,Object...params){
        PreparedStatement pst = null;
        ResultSet rs = null;
        try {
            //获得连接
            conn = getConn();
            //获得preparedSttement对象进行预编译(?占位符)
            pst = conn.prepareStatement(sql);
            int paramsIndex = 1;
            for(Object p : params){
                pst.setObject(paramsIndex++, p);
            }
            //执行sql语句获得结果集的对象
            rs = pst.executeQuery();
            while(rs.next()){
                return Long.valueOf(rs.getLong(1));
            }
            return 0;
        } catch (SQLException e) {
            e.printStackTrace();
            return 0;
        }
    }
    //插入
    public boolean insert(String sql,Object...params){
        PreparedStatement pst = null;
        ResultSet rs = null;
        try {
            //获得连接
            conn = getConn();
            //获得PrepareStatement对象进行预编译
            pst = conn.prepareStatement(sql);
            //处理将数据插入占位符
            int paramsIndex = 1;
            for(Object p : params){
                pst.setObject(paramsIndex++, p);
            }
            //执行sql语句
            pst.executeUpdate();
            return true;
        } catch (SQLException e) {
            e.printStackTrace();
            return false;
        }finally{
            //关闭资源
            close(null, pst, conn);
        }
    }
    
    //修改
    public boolean update(String sql,Object...params){
        PreparedStatement pst = null;
        ResultSet rs = null;
        try {
            //获得连接
            conn = getConn();
            //获得PrepareStatement对象进行预编译
            pst = conn.prepareStatement(sql);
            //处理将数据插入占位符
            int paramsIndex = 1;
            for(Object p : params){
                pst.setObject(paramsIndex++, p);
            }
            //执行sql语句
            pst.executeUpdate();
            return true;
        } catch (SQLException e) {
            e.printStackTrace();
            return false;
        }finally{
            //关闭资源
            close(null, pst, conn);
        }
    }
    
    //删除
    public boolean delete(String sql,Object...params){
        PreparedStatement pst = null;
        ResultSet rs = null;
        try {
            //获得连接
            conn = getConn();
            //获得PrepareStatement对象进行预编译
            pst = conn.prepareStatement(sql);
            //处理将数据插入占位符
            int paramsIndex = 1;
            for(Object p : params){
                pst.setObject(paramsIndex++, p);
            }
            //执行sql语句
            pst.executeUpdate();
            return true;
        } catch (SQLException e) {
            e.printStackTrace();
            return false;
        }finally{
            //关闭资源
            close(null, pst, conn);
        }
    }
    //关闭资源
    public static void close(ResultSet rs,PreparedStatement pst,Connection conn){
        if(rs!=null){
            try {
                rs.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
            rs = null;
        }
        if(pst!=null){
            try {
                pst.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
            pst = null;
        }
        if(conn!=null){
            try {
                conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
            conn = null;
        }
    }
}

配置文件config.properties:

user=root
password=root
driver=com.mysql.jdbc.Driver
url=jdbc\:mysql\://localhost\:3306/cp_data