首页 > 代码库 > JDBC框架
JDBC框架
元数据:数据库,列,表的定义信息。
元数据是做框架必须用的,不做框架用不到。
public class JdbcUtils { private static DataSource ds = null; static{ try{ InputStream in = JdbcUtils.class.getClassLoader().getResourceAsStream("dbcpconfig.properties"); Properties prop = new Properties(); prop.load(in); BasicDataSourceFactory factory = new BasicDataSourceFactory(); ds = factory.createDataSource(prop); }catch (Exception e) { throw new ExceptionInInitializerError(e); } } public static Connection getConnection() throws SQLException{ return ds.getConnection(); } public static void release(Connection conn,Statement st,ResultSet rs){ if(rs!=null){ try{ rs.close(); //throw new }catch (Exception e) { e.printStackTrace(); } rs = null; } if(st!=null){ try{ st.close(); }catch (Exception e) { e.printStackTrace(); } st = null; } if(conn!=null){ try{ conn.close(); }catch (Exception e) { e.printStackTrace(); } } } //String sql = "insert into account(id,name,money) values(?,?,?)" object[]{1,"aaa","10000"}; public static void update(String sql,Object params[]) throws SQLException{ Connection conn = null; PreparedStatement st = null; ResultSet rs = null; try{ conn = getConnection(); st = conn.prepareStatement(sql); for(int i=0;i<params.length;i++){ st.setObject(i+1,params[i]); } st.executeUpdate(); }finally{ release(conn, st, rs); } } // public static Object query(String sql,Object params[],ResultSetHandler handler) throws SQLException{ Connection conn = null; PreparedStatement st = null; ResultSet rs = null; try{ conn = getConnection(); st = conn.prepareStatement(sql); for(int i=0;i<params.length;i++){ st.setObject(i+1,params[i]); } rs = st.executeQuery(); return handler.handler(rs); }finally{ release(conn, st, rs); } }} interface ResultSetHandler{ public Object handler(ResultSet rs);}class BeanHandler implements ResultSetHandler{ private Class clazz; public BeanHandler(Class clazz){ this.clazz = clazz; } public Object handler(ResultSet rs) { try{ if(!rs.next()){ return null; } //创建封装结果集的bean Object bean = clazz.newInstance(); //得到结果集的元数据,以获取结果集的信息 ResultSetMetaData meta = rs.getMetaData(); int count = meta.getColumnCount(); for(int i=0;i<count;i++){ String name = meta.getColumnName(i+1); //获取到结果集每列的列名 id Object value = http://www.mamicode.com/rs.getObject(name); //1 //反射出bean上与列名相应的属性 Field f = bean.getClass().getDeclaredField(name); f.setAccessible(true); f.set(bean, value); } return bean; }catch (Exception e) { throw new RuntimeException(e); } }}class BeanListHandler implements ResultSetHandler{ private Class clazz; public BeanListHandler(Class clazz){ this.clazz = clazz; } public Object handler(ResultSet rs) { List list = new ArrayList(); try{ while(rs.next()){ Object bean = clazz.newInstance(); ResultSetMetaData meta = rs.getMetaData(); int count = meta.getColumnCount(); for(int i=0;i<count;i++){ String name = meta.getColumnName(i+1); Object value = rs.getObject(name); Field f = bean.getClass().getDeclaredField(name); f.setAccessible(true); f.set(bean, value); } list.add(bean); } }catch (Exception e) { throw new RuntimeException(e); } return list; } }
O-R Mapping:即把对象映射到关系型数据库里
常用O-R Mapping映射工具
Hibernate
Ibatis
Commons DbUtils(只是对JDBC简单封装)
commons-dbutils 是 Apache 组织提供的一个开源 JDBC工具类库,它是对JDBC的简单封装,学习成本极低,
并且使用dbutils能极大简化jdbc编码的工作量,同时也不会影响程序的性能。因此dbutils成为很多不喜欢hibernate的公司的首选
下载并查看commons-dbutils API文档
两个最重要的对象:
org.apache.commons.dbutils.QueryRunner
org.apache.commons.dbutils.ResultSetHandler
QueryRunner :增删改查
QueryRunner的查询结果集要封装到Handler中去,因此DButils框架的核心是ResultSetHandler,要掌握ResultSetHandler的子类。
ResultSetHandler接口 :
该接口用于处理 java.sql.ResultSet,将数据按要求转换为另一种形式。
ResultSetHandler 接口的实现类
ArrayHandler:把结果集中的第一行数据转成对象数组。
ArrayListHandler:把结果集中的每一行数据都转成一个数组,再存放到List中。
BeanHandler:将结果集中的第一行数据封装到一个对应的JavaBean实例中。
BeanListHandler:将结果集中的每一行数据都封装到一个对应的JavaBean实例中,存放到List里。
ColumnListHandler:将结果集中某一列的数据存放到List中。
KeyedHandler(name):将结果集中的每一行数据都封装到一个Map里,再把这些map再存到一个map里,其key为指定的key。
MapHandler:将结果集中的第一行数据封装到一个Map里,key是列名,value就是对应的值。
MapListHandler:将结果集中的每一行数据都封装到一个Map里,然后再存放到List
JDBC框架