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

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("数据库连接失败!!!");
		}
	}
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值