您的位置:首页 > 数据库 > Oracle

Eclipse 中jdbc连接Oracle数据库的封装

2015-07-16 14:36 615 查看

Eclipse 中jdbc连接Oracle数据库的封装

1、定义一个DBHelper类,用于对数据库的连接进行封装,实现数据库的自定义连接

定义一个名为log4j.properties的配置文件,用于生成日志文件,便于数据库连接的测试和信息回馈。

定义一个名为jdbc.properties的配置文件用于数据库连接的配置信息的存放。

定义一个DBConfig类,用于对数据库配置文件jdbc.properties的读取和连接。



2、先在对每个类和配置文件进行实现。

1、编写jdbc.properties的配置文件

driver=oracle.jdbc.OracleDriver
url=jdbc:oracle:thin:@localhost:1521:yc
user=xh
password=a


其中存入的是键值对<key, value>的形式,把数据库的配置信息存入,使用时只要写入键值就可以了。 driver的值是数据库加载类, url是数据库的位置, user是要登录数据库的用户名, password是登录密码。



2、编写DBConfig类,用于读取配置信息

public class DBConfig extends Properties{
private static final Logger LOG = Logger.getLogger(DBHelper.class);
private static DBConfig dbConfig = new DBConfig();

private DBConfig(){
try {
LOG.debug("开始读取数据库配置文件:jdbc.properties" );
<span style="white-space:pre">			</span>//获取数据库配置文件
<span style="white-space:pre">			</span>InputStream in = DBConfig.class.getClassLoader().getResourceAsStream("jdbc.properties");
<span style="white-space:pre">			</span>LOG.debug("读取数据库配置文件成功。");
<span style="white-space:pre">			</span>LOG.debug("读取数据库配置文件成功。");
<span style="white-space:pre">			</span>load(in);<span style="white-space:pre">	</span>//装载配置文件
<span style="white-space:pre">			</span>LOG.debug("加载数据库配置文件完成。");
} catch (IOException e) {
LOG.error("加载数据库配置文件jdbc.properties失败!!!",e);
}
}

public static DBConfig getInstance(){
return dbConfig;
}

public static String getValue(String configName){
return dbConfig.getProperty(configName);
}
}


其中第一句是定义日志,日志文件下一步说。



3、编写日志文件log4j.properties

log4j.rootLogger = error, stdout,fileout

log4j.appender.stdout = org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout = org.apache.log4j.TTCCLayout

log4j.appender.fileout = org.apache.log4j.FileAppender
log4j.appender.fileout.File = yc2015_6_21.log
log4j.appender.fileout.layout = org.apache.log4j.PatternLayout
log4j.appender.fileout.layout.conversionPattern = %d %5p %l %m%n

//设置包的日志级别log4g.logger.xxx.xxx : xxx表示包名
log4j.logger.com.yc = debuge




4、编写DBHelper类



public class DBHelper {
//定义日志
private static final Logger LOG = Logger.getLogger(DBHelper.class);

// 数据库的驱动,加载只进行一次就可以了
static {
try {
LOG.debug("开始加载驱动。" + DBConfig.getValue("driver"));
// Class.forName("oracle.jdbc.OracleDriver");
Class.forName(DBConfig.getValue("driver"));
LOG.debug("加载驱动成功。");
} catch (ClassNotFoundException e) {
LOG.error("加载驱动失败!!!", e);
}
}

// 数据库连接是在需要操作sql的时候使用
public static Connection getConn() {
Connection con = null;
try {
LOG.debug("开始连接 数据库:" + "jdbc:oracle:thin:@localhost:1521:yc");
con = DriverManager.getConnection(DBConfig.getValue("url"),
DBConfig.getValue("user"), DBConfig.getValue("password"));
// con = DriverManager.getConnection(DBConfig.getValue("url"),
// DBConfig.getInstance());
LOG.debug("数据库连接成功。");
} catch (SQLException e) {
LOG.error("数据库连接失败!!!", e);
}
return con;
}

// 关闭连接,节省连接资源
public static void close(Connection con, Statement st, ResultSet rs) {
if (rs != null) { // 关闭结果集
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}

if (st != null) { // 关闭执行工具
try {
st.close();
} catch (SQLException e) {
e.printStackTrace();
}
}

if (con != null) { // 关闭连接
try {
con.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}

// 执行: 数据:程序 ==> 数据库, 数据库 ==> 程序

// 数据: 程序 ==> 数据库
/**
* @param sql  sql语句
* @param params  sql语句中占位符所对应的值
* @return    执行sql语句受影响的行数
*/
public static int executeUpdate(String sql, List<Object> params) {
Connection con = null; // 定义连接
PreparedStatement ps = null;
int count = 0;	//影响的行数
try {
con = getConn();	//取得连接
LOG.debug("开始预加载sql语句:" + sql);
ps = con.prepareStatement(sql);
LOG.debug("预加载sql语句完成。");
setParamValue(ps, params);	//给占位符注指
LOG.debug("开始执行sql语句:" + sql);
count = ps.executeUpdate();	//执行sql语句
LOG.debug("执行sql语句成功");
} catch (SQLException e) {
e.printStackTrace();
} finally {
close(con, ps, null);	//关闭连接
}

if (count > 0) {
System.out.println("操作成功。。");
} else {
System.out.println("操作失败。。");
}

return count;
}

// 执行多条语句
/**
* @param sqls: SQL语句与占位符的键值对的集合
* @param isAutoCommit: 是否自动事务TRUE:自动 ,FALSE:手动
* @return
*/
public static int executeUpdate(Map<String,List<Object>> sqls, boolean isAutoCommit){
Connection con = null;	//定义连接
PreparedStatement ps = null;
int count = 0;
try {
con = getConn(); //取得连接
con.setAutoCommit(isAutoCommit);  	//自动提交
for(Entry<String, List<Object>> sql : sqls.entrySet()){
try {
LOG.debug("开始预加载sql语句:" + sql.getKey());
ps = con.prepareStatement(sql.getKey());
LOG.debug("预加载sql语句完成。");
setParamValue(ps, sql.getValue());//给占位符注入值
LOG.debug("开始执行sql语句:" + sql.getKey());
count = ps.executeUpdate();	//执行sql语句
LOG.debug("执行sql语句成功");
} catch (SQLException e) {
LOG.error("执行sql语句:" + sql + "失败!!");
if(!isAutoCommit){
//如果有事务,一旦出现就向外抛出异常
throw new SQLException(e);
}
}
}
if(!isAutoCommit){
con.commit();	//如果不自动事务,就要自己提交事务
}
}catch (SQLException e) {
count = 0;
LOG.error("执行sql语句失败!!" + e);
try{
con.rollback();
}catch (SQLException e1) {
LOG.error("执行回滚任务失败!!" ,e);
}
}finally{
close(con, ps, null); //
}
return count;
}

//数据 : 数据库 ==> 程序
public static List<Map<String, Object>> executeQuery(String sql, List<Object> params){
Connection con = null; // 取到连接
PreparedStatement ps = null;
ResultSet rs = null;
List<Map<String, Object>> results = null;
try {
con = getConn();
LOG.debug("开始预加载sql语句:" + sql);
ps = con.prepareStatement(sql);
LOG.debug("预加载sql语句完成。");
setParamValue(ps, params);
LOG.debug("开始执行sql语句:" + sql);
rs = ps.executeQuery();
LOG.debug("执行sql语句成功");

results = new ArrayList<Map<String, Object>>();
ResultSetMetaData rsmd = rs.getMetaData();
int cc = rsmd.getColumnCount();
while(rs.next()){
Map<String, Object> record = new HashMap<String, Object>();
for(int i=0; i <= cc; i++){
Object obj = rs.getObject(i);
if(obj instanceof Timestamp){
obj = new Date(((Timestamp)obj).getTime());
}
record.put(rsmd.getColumnName(i).toLowerCase(),obj);
}
results.add(record);
}
} catch (SQLException e) {
LOG.error("执行sql语句:" + sql + "失败!!!");
} finally {
close(con, ps, rs);
}
return results;
}

//
public static void setParamValue(PreparedStatement ps, List<Object> params) {
for (int i = 0; i < params.size(); i++) {
try {
Object obj = params.get(i);
// 判断一个对象属于什么类型
if (params.get(i) instanceof java.util.Date) {
// 因为java.sql.Date包含日期和时间,java.util.Date只包含日期 不合适
// 需要有时分秒的日期类型 Timestamp
obj = new Timestamp(((java.util.Date) obj).getTime());
}
LOG.debug("开始给占位符在" + (i + 1) + "的位置注值" + obj);
ps.setObject(1 + i, obj);
LOG.debug("开始给占位符在" + (i + 1) + "的位置注值成功!!");
} catch (SQLException e) {
LOG.error("给占位符" + (i + 1) + "的位置注值失败!!!");
}
}
}

public static void main(String[] args) {

if (getConn() != null) {
System.out.println("数据库连接成功。");
} else {
System.out.println("数据库连接失败!!!");
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: