JDBCUtils 三种JDBC工具类:简单封装、利用properties、利用连接池

JDBC,Java数据库连接。
使用该技术要导入mysql-connector-java-5.1.37-bin.jar

当我们使用Java连接数据库时,总会创建各种对象,比如 Connection、PreparedStatement、Statement、ResultSet等等。如果每次写代码都创建一次,是很麻烦的一件事。

所以 JDBCUtils (JDBC工具类) 应用而生,把这些对象的创建放在一个类中,每次使用从这个类中的相关方法获取即可。

下面介绍三种 JDBCUtils。

 

第一种

第一种比较简单,把对象简单封装即可。

public class DButil {
	//获取数据库连接
	public static Connection getConnection() {
		Connection conn = null;
		try {
			Class.forName("com.mysql.jdbc.Driver");
			String url = "jdbc:mysql://localhost:3306/shz";
			String uname = "root";
			String upassword = "root";
			conn = DriverManager.getConnection(url, uname, upassword);
		}catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			System.out.println("加载失败!驱动类没有找到!");
		} catch (SQLException e) {
			e.printStackTrace();
			System.out.println("数据库连接失败!请检查数据库名以及用户帐号!");
		}
		return conn;
	}
    //关闭数据库连接connection,statement,resultset
	public static void closeAll(Connection conn,Statement stmt,ResultSet rs) {
		if(conn != null) {
			try {
				conn.close();
			}catch (Exception e) {
				e.printStackTrace();
			}
		}
		if(stmt != null) {
			try {
				stmt.close();
			}catch (Exception e) {
				e.printStackTrace();
			}
		}
		if(rs != null) {
			try {
				rs.close();
			}catch (Exception e) {
				e.printStackTrace();
			}
		}
	}
	
	//创建数据库操作对象PreparedStatement
	public static PreparedStatement PreparedStatement(Connection conn,String sql) {
		PreparedStatement pstmt = null;
		try {
			pstmt=conn.prepareStatement(sql);
		}catch (Exception e) {
			e.printStackTrace();
		}
		return pstmt;
	}
	//创建数据库操作对象Statement
	public static Statement getStatement(Connection conn) {
		Statement statement = null;
		try {
			statement = conn.createStatement();
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return statement;
	}
	//执行 增删改sql语句 的方法封装 
	public static int excuteDML(String sql,Object...objs) {
		int n = 0;
		Connection connection = null;
		PreparedStatement preparedStatement = null;
		try {
			connection = getConnection();
			preparedStatement = PreparedStatement(connection, sql);
			for (int i = 0; i < objs.length; i++) {
				preparedStatement.setObject(i+1, objs[i]);
			}
			n = preparedStatement.executeUpdate();
		} catch (SQLException e) {
			e.printStackTrace();
		}finally {
			closeAll(connection, preparedStatement, null);
		}
		return n;
	}
}

最后一个方法在工具类中可以舍去。

 

第二种

第二种工具类是对第一种的改进。
我们不难发现在第一种中,有关数据库的配置还是写死的,也就是说,如果数据库的密码、库等发生改变,还得修改源码。

所以我们把这些有关数据库的配置,抽取到后缀名为 properties 的文件中:

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

如果数据库配置发生改变,直接来修改该配置文件即可,不需要动源码。

public class JDBCUtils {
    //静态变量,供静态代码块和静态方法使用
    private static String url;
    private static String user;
    private static String password;
    private static String driver;

    //读取jdbc.properties文件
    //静态代码块:随着类的加载而加载
    static{
        try {
            //properties集合类
            Properties pro = new Properties();
            //加载文件
            /*
            * 1.绝对路径
            * 2.获取src路径下的文件 ClassLoader
            * */
            ClassLoader classLoader = JDBCUtils.class.getClassLoader();
            URL res = classLoader.getResource("jdbc.properties");
            String path = res.getPath();//获取到properties文件的绝对路径
            pro.load(new FileReader(path));

            //获取属性
            url=pro.getProperty("url");
            user=pro.getProperty("user");
            password=pro.getProperty("password");
            driver=pro.getProperty("driver");

            //注册驱动:数据库改变时,修改properties文件即可
            Class.forName(driver);

        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    //获取连接
    public static Connection getConnection() throws SQLException {
        return DriverManager.getConnection(url,user,password);
    }

    //释放资源
    public static void close(Statement stmt,Connection conn){
        if(stmt!=null){
            try {
                stmt.close();
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }
        }
        if(conn!=null){
            try {
                conn.close();
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }
        }
    }
    
    public static void close(ResultSet rs,Statement stmt, Connection conn){
        if(rs!=null){
            try {
                rs.close();
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }
        }
        if(stmt!=null){
            try {
                stmt.close();
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }
        }
        if(conn!=null){
            try {
                conn.close();
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }
        }
    }
}

 

第三种

第三种是对第二种的提升。
不仅使用 properties 配置文件,还使用了 druid 连接池技术。
使用连接池,要导入相关的包:
JDBCUtils 三种JDBC工具类:简单封装、利用properties、利用连接池_第1张图片
当然,配置文件可以自己编写:

driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://127.0.0.1:3306/db3
username=root
password=root
initialSize=5
maxActive=10
maxWait=3000

该配置文件可以放到项目的任意位置。

public class JDBCUtils {
     private static DataSource ds;
     
     static {
         try {
              Properties pro = new Properties();
              pro.load(JdbcUtils.class.getClassLoader().getResourceAsStream("druid.properties"));
         
              ds=DruidDataSourceFactory.createDataSource(pro);
         } catch (IOException e) {
              // TODO Auto-generated catch block
              e.printStackTrace();
         } catch (Exception e) {
              // TODO Auto-generated catch block
              e.printStackTrace();
         }
     }

    //获取连接
     public static Connection getConnection() throws  SQLException {
         return ds.getConnection();
     }
     
    //关闭对象(不包含ResultSet)---重载方法
     public static void close(Statement stmt,Connection  conn) {
            //调用三参的close方法
            close(null,stmt,conn);
     }
     
    //关闭对象(包含ResultSet)
     public static void close(ResultSet rs,Statement  stmt,Connection conn) {
         if(rs!=null) {
              try {
                  rs.close();
              } catch (SQLException e) {
                  // TODO Auto-generated catch block
                  e.printStackTrace();
              }
         }
         
         if(stmt!=null) {
              try {
                  stmt.close();
              } catch (SQLException e) {
                  // TODO Auto-generated catch block
                  e.printStackTrace();
              }
         }
         
         if(conn!=null) {
              try {
                  conn.close();
              } catch (SQLException e) {
                  // TODO Auto-generated catch block
                  e.printStackTrace();
              }//归还连接
         }
     }
     
    //获得数据库连接池
     public static DataSource getDataSource() {
         return ds;
     }    
}

 

你可能感兴趣的:(数据库)