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

JDBC 学习复习10 编写自己的JDBC框架

时间:2017-12-04 17:40:43      阅读:191      评论:0      收藏:0      [点我收藏+]

标签:设计   就是   学习   exe   statement   else   tac   util   cut   

首先万分感谢狼哥 孤傲苍狼 博客,整个jdbc学习的博客资料 链接为http://www.cnblogs.com/xdp-gacl/p/4006830.html

详细代码见狼哥博客,列出我学习过程中遇到的问题吧。

public static Object query(String sql, Object[] params, ResultSetHandler rsh)
            throws SQLException {
        Connection conn = null;
        PreparedStatement ppst = null;
        ResultSet rs = null;
        try {

            conn = getConnection();
            ppst = conn.prepareStatement(sql);
            for (int i = 0; i < params.length; i++) {
                ppst.setObject(i + 1, params[i]);
            }
            rs = ppst.executeQuery();
            return rsh.handler(rs);//关于这个策略模式的学习,详见设计模式吧,熟悉这种写法,在公司的工作过程中,类似写法遇到过,有用!
        } finally {
            release(conn, ppst, rs);
        }
    }

后面这么调用的

public User queryByID(int id) throws SQLException{
        String sql = "select * from user where uid=?";
        return (User) JDBCUtil.query(sql,new Object[]{id}, new BeanHandler(User.class));
    }

然后BeanHandler实际上就是ResultSetHandler 借口的实现类,主要目的就是把查询结果,放到通过发射获取到的JavaBean里面,也就从数据库里面加载到JVM内存里了

package dbex.domain;

import java.lang.reflect.Field;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;

public class BeanHandler implements ResultSetHandler {
    private Class<?> clazz;

    public BeanHandler(Class<?> clazz) {
        this.clazz = clazz;
    }

    public Object handler(ResultSet rs) {
        Object bean=null;
        try {
            if (!rs.next()) {//判空 直接返回null
                return bean;
            }
            // 把resultset对象中的列数据放入到Bean对应的属性中去
            bean = clazz.newInstance();
            ResultSetMetaData rsm = rs.getMetaData();
            int len = rsm.getColumnCount();
            for (int i = 0; i < len; i++) {
                String name = rsm.getColumnName(i + 1);
                Object data = rs.getObject(i+1);
                Field field = clazz.getDeclaredField(name);
                field.setAccessible(true);
                String type = rsm.getColumnTypeName(i+1);
//              if("INTEGER".equals(type)){
//                  System.out.println(type);
                    field.set(bean,data.toString());
//              }else if("String".equalsIgnoreCase(type)){
//                  field.set(bean,(String)data);
//                  System.out.println(type);
//              }else{
//                  field.set(bean, data);
//              }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return bean;
    }

}

总结下:策略模式 ,java反射

JDBC 学习复习10 编写自己的JDBC框架

标签:设计   就是   学习   exe   statement   else   tac   util   cut   

原文地址:http://www.cnblogs.com/humi/p/7977943.html

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