一、使用jdbc編寫查詢框架
除SQL語句不同之外,根據操作的實體不同,對ResultSet的映射也各不相同,因此可義一個query方法,除以參數形式接收變化的SQL語句外,可以使用策略模式由qurey方法的調用者決定如何把ResultSet中的數據映射到實體對象中
在DBManager類中-------------------此類是一個數據庫連接池和框架類
public class DBManager {
private static DataSource ds=null;
//加載配置文件
static{
InputStream in=DBManager.class.getClassLoader().getResourceAsStream("config/dbcp.properties");
//映射類型的集合,用來存放讀取出來的鍵值對
Properties p=new Properties();
try {
p.load(in);
//通過配置文件構建數據庫連接池
ds=BasicDataSourceFactory.createDataSource(p);
} catch (Exception e) {
// TODO Auto-generatedcatch block
e.printStackTrace();
}
}
public static Connection getconnConnection() throws SQLException{
return ds.getConnection();
}
//歸還到數據庫連接池中
public static void release(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();
}
}
//進行代碼優化
public static void update(String sql,Object []params ){
Connection con=null;
PreparedStatement st=null;
ResultSet rs=null;
try {
con=DBManager.getconnConnection();
st=con.prepareStatement(sql);
for(int i=0;i<params.length;i++){
st.setObject(i+1,params[i]);
}
st.executeUpdate();
} catch (SQLException e) {
// TODO Auto-generatedcatch block
e.printStackTrace();
}finally{
DBManager.release(con, st, rs);
}
}
public static Object find(String sql,Object []params,ResultSetHandlerrsh) throws SQLException{
Connection con=null;
PreparedStatement st=null;
ResultSet rs=null;
try {
con=DBManager.getconnConnection();
st=con.prepareStatement(sql);
for(int i=0;i<params.length;i++){
st.setObject(i+1,params[i]);
}
rs=st.executeQuery();
return rsh.handler(rs);
}finally{
DBManager.release(con, st, rs);
}
}
}
由於不知道程序員是怎麼處理結果集的,所以將結果集的操作封裝到一個接口中
如下:
public interface ResultSetHandler {
public Object handler(ResultSet rs);
}
實現接口的類處理結果集
public class BeanListHandler implements ResultSetHandler {
private Class clazz;
public BeanListHandler(Class clazz){
this.clazz=clazz;
}
@Override
public Object handler(ResultSet rs) {
List list=new ArrayList();
try {
while(rs.next()){
//讀取一行
//將其封裝到bean對象中
Object bean=clazz.newInstance();
ResultSetMetaData meta=rs.getMetaData();
int count=meta.getColumnCount();
for(int i=1;i<=count;i++){
String name=meta.getColumnName(i);
Object value=rs.getObject(name);
Field f=clazz.getDeclaredField(name);
f.setAccessible(true);
f.set(bean, value);
}
//把bean對象加入到list集合中
list.add(bean);
}
return list;
} catch (Exception e) {
// TODO Auto-generatedcatch block
throw new RuntimeException(e);
}
}
}
在userDaoImpl中調用此方法:
public void insert(){
QueryRunner runner=new QueryRunner(DBManagaer_c3p0.datasource());
String sql="insert into users(name,password) values('pp','1111')";
try {
runner.update(sql);
} catch (SQLException e) {
// TODO Auto-generatedcatch block
e.printStackTrace();
}
}