码迷,mamicode.com
首页 > 数据库 > 详细

JDBC框架

时间:2016-10-15 02:03:18      阅读:269      评论:0      收藏:0      [点我收藏+]

标签:

元数据:数据库,列,表的定义信息。

元数据是做框架必须用的,不做框架用不到。

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 = 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框架

标签:

原文地址:http://www.cnblogs.com/lxboy2009/p/5962471.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!