封装jdbc 单例模式的应用

实现增删该查的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
时间: 2024-10-04 10:24:06

封装jdbc 单例模式的应用的相关文章

DAO设计模式实现数据库的增删改查(进一步封装JDBC工具类)

一.DAO模式简介 DAO即Data Access Object,数据访问接口.数据访问:故名思义就是与数据库打交道.夹在业务逻辑与数据库资源中间. DAO模式实际上是两个模式的组合,即Data Accessor (数据访问者)模式和 Active Domain Object(领域对象)模式.Data Accessor 模式实现了数据访问和业务逻辑的分离:Active Domain Object 模式实现了业务数据的对象化封装. 需要注意的是,DAO设计模式是Java EE中的设计模式,而非Ja

MySQL数据库学习笔记(十)----JDBC事务处理、封装JDBC工具类

首先需要回顾一下上一篇文章中的内容:MySQL数据库学习笔记(九)----JDBC的PreparedStatement接口重构增删改查 一.JDBC事务处理: 我们已经知道,事务的概念即:所有的操作要么同时成功,要么同时失败.在MySQL中提供了Commit.Rollback命令进行事务的提交与回滚.实际上在JDBC中也存在事务处理,如果要想进行事务处理的话,则必须按照以下的步骤完成. JDBC中事务处理的步骤: 1.要取消掉JDBC的自动提交:void setAutoCommit(boolea

规范和封装jdbc程序代码

JDBC 部分方法引用工具类 1 package it.cast.jdbc; 2 3 import java.sql.Connection; 4 import java.sql.DriverManager; 5 import java.sql.ResultSet; 6 import java.sql.SQLException; 7 import java.sql.Statement; 8 9 public class jdbcUtils { 10 11 private static String

spring jdbc查询 依赖JdbcTemplate这个类模版封装JDBC的操作

1 package cn.itcast.spring.jdbc; 2 3 import java.util.List; 4 5 import org.springframework.jdbc.core.support.JdbcDaoSupport; 6 7 public class PersonDao extends JdbcDaoSupport{ 8 public void update(){ 9 this.getJdbcTemplate().execute("update person se

MySQL数据库学习笔记(十一)----DAO设计模式实现数据库的增删改查(进一步封装JDBC工具类)

[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4059514.html 联系方式:[email protected] [正文] 一.DAO模式简介 DAO即Data Access Object,数据访问接口.数据访问:故名思义就是与数据库打交道.夹在业务逻辑与数据库资源中间. DAO模式实际上是两个模式的组合,即Data Accessor (数据

Java封装JDBC数据库增、删、改、查操作成JAR文件,以供Web工程调用,适用于多种数据库

废话不多说,直接上源代码,最后有使用方法,当然,也可以作为普通公用类使用,只是封装成JAR更方便使用. [java] view plain copy package db.util; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.InputStreamReader; import java.sql.CallableStatement; impor

封装JDBC操作数据库的方法

自己动手封装java操作数据库的方法: 一:目录结构 二:所需依赖的第三方jar包 这里只需引入mysql-connector-java-5.1.8-bin.jar,mysql数据库驱动jar包 三:代码 1:和数据库进行交互,首先是数据源,获取连接,代码如下: 1 /** 2 * 3 */ 4 package com.hlcui.datasource; 5 6 import java.sql.Connection; 7 import java.sql.DriverManager; 8 impo

【Java技术点滴】——ThreadLocal封装JDBC事务操作

背景 在Java程序实现中,我们往往应用到事务的机制,在业务层进行事务开启,创建数据库连接,调用Dao层方法进行数据库访问,过程中需要将数据库连接Connection作为参数传递给Dao层方法.显而易见,这样的实现不利于Dao层方法的复用,当在不使用事务的情况下,我们是需要在Dao层方法中创建数据库连接的,这样Dao层方法免去Connection参数就可以使得方法更加独立.明确了,怎样解决这样的尴尬?对于此,我们使用了ThreadLocal进行解决. 基本介绍 "本地线程变量",可以理

结构体的封装、单例模式代码

//对象方法封装结构体 1 #import <Foundation/Foundation.h> 2 typedef struct 3 { 4     char *name; 5     int age; 6 }Student; 7 8 @interface CZValue : NSObject 9 @property (nonatomic,assign)Student stu; 10 - (instancetype)valueWithStudent:(Student)stu; 11 @end