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

时间: 2024-08-26 06:47:02

JDBC框架的相关文章

深入分析JavaWeb Item33 -- 开发自己简易的JDBC框架

一.元数据介绍 元数据指的是"数据库"."表"."列"的定义信息. 1.1.DataBaseMetaData元数据 Connection.getDatabaseMetaData()获得代表DatabaseMetaData元数据的DatabaseMetaData对象. DataBaseMetaData对象的常用方法: getURL():返回一个String类对象,代表数据库的URL. getUserName():返回连接当前数据库管理系统的用户名.

编写自己的JDBC框架

元数据介绍 元数据指的是"数据库"."表"."列"的定义信息. DataBaseMetaData元数据 Connection.getDatabaseMetaData()获得代表DatabaseMetaData元数据的DatabaseMetaData对象. DataBaseMetaData对象的常用方法: getURL():返回一个String类对象,代表数据库的URL. getUserName():返回连接当前数据库管理系统的用户名. getDa

利用Java针对MySql封装的jdbc框架类 JdbcUtils 完整实现(包含增删改查、JavaBean反射原理,附源码)

最近看老罗的视频,跟着完成了利用Java操作MySql数据库的一个框架类JdbcUtils.java,完成对数据库的增删改查.其中查询这块,包括普通的查询和利用反射完成的查询,主要包括以下几个函数接口: 1.public Connection getConnection()   获得数据库的连接 2.public boolean updateByPreparedStatement(String sql, List<Object>params)throws SQLException  更新数据库

Spring的JDBC框架

转自: http://www.cnblogs.com/windlaughing/p/3287750.html Spring JDBC提供了一套JDBC抽象框架,用于简化JDBC开发. Spring主要提供JDBC模板方式.关系数据库对象化方式.SimpleJdbc方式.事务管理来简化JDBC编程 Spring提供了3个模板类: JdbcTemplate:Spring里最基本的JDBC模板,利用JDBC和简单的索引参数查询提供对数据库的简单访问. NamedParameterJdbcTemplat

javaweb学习总结(四十)——编写自己的JDBC框架

一.元数据介绍 元数据指的是"数据库"."表"."列"的定义信息. 1.1.DataBaseMetaData元数据 Connection.getDatabaseMetaData()获得代表DatabaseMetaData元数据的DatabaseMetaData对象. DataBaseMetaData对象的常用方法: getURL():返回一个String类对象,代表数据库的URL. getUserName():返回连接当前数据库管理系统的用户名.

JDBC框架的编写

JDBC框架直接使用JDBC开发,非常麻烦,步骤繁琐,所以在企业开发Web程序时,连接数据库进行操作都是通过JDBC框架来完成的知识点1,JDBC元数据API(编写JDBC框架基础)2,框架编写思想3,Apache DBUtils(tomcat的JDBC框架) 数据库元数据(metadata)数据库存储结构定义信息(库,表,记录,列的定义信息)DataBaseMetaData数据库元数据Connection.getMetaData();通过连接获得数据库元数据信息getURL():返回一个Str

java web学习总结(二十三) -------------------编写自己的JDBC框架

一.元数据介绍 元数据指的是"数据库"."表"."列"的定义信息. 1.1.DataBaseMetaData元数据 Connection.getDatabaseMetaData()获得代表DatabaseMetaData元数据的DatabaseMetaData对象. DataBaseMetaData对象的常用方法: getURL():返回一个String类对象,代表数据库的URL. getUserName():返回连接当前数据库管理系统的用户名.

spring jdbc框架

spring+jdbc 1.jdbc编程的特点: 模板编程 固定代码+动态的参数 spring产生dataSource JdbcTemplate{//模板编程 private DataSource dataSource; public void setDataSource(DataSource dataSource){ this.dataSource = dataSource; } public void update(String sql){ //产生链接 //产生Statement //执行

jdbc框架 commons-dbutils+google guice+servlet 实现一个例子

最近闲着无聊,于是看了一下jdbc框架 commons-dbutils与注入google guice. 我就简单的封装了一下代码,效率还是可以的.... jdbc+google guice+servlet 的web实现: http://pan.baidu.com/s/1i4OpyTJ 觉得不错点个赞...hello world!

day16 事务 - 数据库连接池 - 编写自己的jdbc框架

day16 事务-数据库连接池-编写自己的jdbc框架 1. 事务 1.1 事务回滚点 1.2 事务四大特性 ACID 1.2.1 隔离性 - 脏读 - 不可重复读 - 虚读(幻读) 1.3 事务的隔离级别 2. 数据库连接池 3. 常用开源数据库连接池(DataSource 接口的开源实现) 3.1 Apache DBCP 数据源 3.2 C3P0 数据源 (Spring 内置数据源) 4. 编写自己的 JDBC 框架 4.1 元数据 - DataBaseMetaData 4.2 做自己的 j