日期:2014-05-16 浏览次数:20617 次
/** * 测试 * @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.