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