今天在写一个项目时要频繁的操作数据库,于是就写了一个SqlHelper工具类,方便操作使用。如有不足之处,望各位大牛批评指正!
配置文件dbInfo.properties的内容为: ClassName=oracle.jdbc.driver.OracleDriverurl=jdbc\:oracle\:thin\:@127.0.0.1\:1521\:MYORAL
user=scott
password=*******
/** *配置文件中的MYORAL要改为你使用的数据库 *password是你设置的scott密码 **/ 本人将所有的参数都用static 修饰,目的是在使用SqlHelper工具类时,只需要加载一次。注意:每次使用crud方法后要及时调用close()方法来关闭相关的资源。当多个servlet都需要使用SqlHelper工具类时,首先要调用getConnection()方法得到连接,因为你有可能在某个servlet中已经关闭了资源,这样就会抛出异常。 当然,也可以根据具体的项目需要对该工具类再进行封装。
package com.hefan.tool;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Properties;
/**
*
* @注意:如果一个方法中的异常没有被捕获,而是抛出时,则在使用到该方法时就需要捕获或者继续抛出
* 例如下面方法的异常有些被捕获,有些被抛出
*
*/
public class sqlHelper {
//定义使用数据库的变量
private static Connection cn = null;
private static PreparedStatement ps = null;
private static ResultSet rs = null;
//定义连接数据库的变量
private static String ClassName = "";
private static String url = "";
private static String user = "";
private static String password = "";
//配置文件参数
private static Properties pp = null;
private static InputStream ips = null;
//定义为static,驱动只需加载一次
static{
//读取配置文件
pp = new Properties();
//当配置文件放在项目src目录下面时,要使用类加载器读入
ips = sqlHelper.class.getClassLoader().getResourceAsStream("dbInfo.properties");
try {
pp.load(ips);
ClassName = pp.getProperty("ClassName");
url = pp.getProperty("url");
user = pp.getProperty("user");
password = pp.getProperty("password");
Class.forName(ClassName);
cn = DriverManager.getConnection(url,user,password);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
try {
ips.close();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
//得链接
public void getConnection(){
try {
cn = DriverManager.getConnection(url,user,password);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//查询函数
public ResultSet check(String sql,Object[] parameter){
try {
ps = cn.prepareStatement(sql);
if(parameter!=null){
for(int i=0;i<parameter.length;i++){
ps.setObject(i+1, parameter[i]);
}
}
rs = ps.executeQuery();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return rs;
}
//添加函数
public void add(String sql,Object[] parameter){
execute(sql, parameter);
}
//删除函数
public void delete(String sql,Object[] parameter){
execute(sql, parameter);
}
//修改函数
public void update(String sql,Object[] parameter){
execute(sql, parameter);
}
//执行函数,由于不管是增加,删除,或修改,其函数体内容是一样的,且没有返回值,所以单写一个执行函数供调用
public void execute(String sql,Object[] parameter){
try {
ps = cn.prepareStatement(sql);
if(parameter!=null){
for(int i=0;i<parameter.length;i++){
ps.setObject(i+1, parameter[i]);
}
}
ps.executeUpdate();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//关闭连接函数
public void close(){
try{
if(rs!=null){
rs.close();
}
if(ps!=null){
ps.close();
}
if(cn!=null){
cn.close();
}
}catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
rs = null;
ps = null;
cn = null;
}
}
}