日期:2014-05-16  浏览次数:20601 次

封装jdbc 实现简单的JdbcTemplate
测试结果:
/**
	 * 测试
	 * @param args
	 */
	public static void main(String[] args) {
		
		/**
		 * 使用ThreadLocal实现~确保每一个线程都访问自己的connection
		 * 实际上用main函数测试并不好,使用Thread测试更好~
		 */
		JdbcTemplateImp jt = new JdbcTemplateImp();
		
		//开启事物
		jt.openTransaction();
		
		
		//查询
		List<Map> list = jt.query("select * from emp");
		for(Map map : list){
			System.out.println(map.get("ENAME"));
			System.out.println(map.get("SAL"));
		}
		
		//添加方法1
		jt.execute("insert into myemp values(8888,'xiaomaha','CLERK',7782,'20-5月-1984',9999,666,20)");
		
		//添加方法2
		jt.execute("insert into myemp values(?,?,?,?,?,?,?,?)", new Object[]{
				9999,"xiaomaha2","CLERK",7788,"20-5月-1984",9988,66,20});

		//删除
		jt.execute("delete from myemp where ename=?",new Object[]{"xiaomaha"});
		
		//删除 故意写错,看回滚是否成功! 注释后程序正常~~~~~~~~
		jt.execute("delete from myemp where err_ename=?",new Object[]{"xiaomaha"});
		
		
		//关闭事物
		jt.closeTransaction();
		
	}

接口:
package org.jdbc;

import java.util.List;
import java.util.Map;

public interface JdbcTemplate {
	/**
	 * 查询接口
	 * @param sql
	 * @return
	 */
	public List<Map> query(String sql);
	/**
	 * 查询接口
	 * @param sql
	 * @param parameters 参数
	 * @return
	 */
	public List<Map> query(String sql ,Object[] parameters);
	
	public void openTransaction();
	
	public void closeTransaction();
	/**
	 * 执行接口
	 * @param sql
	 */
	public void execute(String sql);
	/**
	 * 执行接口
	 * @param sql
	 * @param parameters 参数
	 */
	public void execute(String sql ,Object[] parameters);
}


实现:
package org.jdbc;

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.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
 * jdbc实现连接池实际更好,但这个例子主要是想实现jdbcTemplate功能
 * 所以map来装connection,都没写,使用连接池不需要每次关闭connection,只需要回收给map对象
 * 简单的pool其实很简单,但考虑到安全及性能需要花费大量时间,和精力
 * 这个一个简单的jdbcTemplate实现如下
 * @author Administrator
 *
 */
public class JdbcTemplateImp implements JdbcTemplate{
	
	public JdbcTemplateImp(){
		init();
	};
	static{
		try {
			//一个application只需要加载一次,写成xml读取更好,通过xml或properties文件读取就可以通用了!~略
			Class.forName("oracle.jdbc.driver.OracleDriver");
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
	}
	
	private ThreadLocal<Connection> conn = new ThreadLocal<Connection>(); //ThreadLocal

	private void init(){
		
		try{
			//写成xml读取更好,通过xml或properties文件读取就可以通用了!~略
			String url="jdbc:oracle:thin:@localhost:1521:ora",uname= "scott",passw="tiger";
			Connection con = DriverManager.getConnection(url,uname,passw);
			conn.set(con);
			
		}catch(Exception e){
			e.printStackTrace();
		}
		
	}
	
	public List<Map> query(String sql , Object[] parameters){
		PreparedStatement ps = null;
		try {
			ps = conn.get().prepareStatement(sql);
			for(int i=0 ;i<parameters.length ;i++){
				ps.setObject(i+1, parameters[i]);
			}
			ResultSet rs = ps.executeQuery();
			return resultToMap(rs);
		} catch (SQLException e) {
			
			e.printStackTrace();
			
			return null;
		}finally{
			try {
				ps.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
		
		
	}
	
	public List<Map> query(String sql){
		
		PreparedStatement ps = null;
		try {
			ps = conn.get().prepareStatement(sql);
			ResultSet rs = ps.executeQuery();
			return resultToMap(rs);
		} catch (SQLException e) {
			
			e.printStackTrace();
			
			return null;
		}finally{
			try {
				ps.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
		
		
	}
	
	/**
	 * 转换为map类型
	 * @param rs
	 * @return
	 */
	private List<Map> resultToMap(ResultSet rs){
		List<Map> list = new ArrayList<Map>();
		try {
			ResultSetMetaData rsmd = rs.getMetaData();
			int colCount = rsmd.