首页 > 代码库 > 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框架