对查找进行优化实例代码:

对查找进行优化实例代码:

DBManager部分:

public static Object find(String sql,Object[] params ,ResultSetHandler rsh) throws SQLException{

       //怎样对结果集进行相应的处理————用到反射和元数据对象

       Connection con=null;

       PreparedStatement st=null;

       ResultSet rs=null;

       con=DBManager.getConnection();

       try {

           st=con.prepareStatement(sql);

           for(int i=0;i<params.length;i++){

              st.setObject(i+1, params[i]);

           }

           rs=st.executeQuery();

           //对结果集的处理

           //调用程序员传过来的对结果集进行处理的方法即可(UserDaoImpl)

           return rsh.handler(rs); 

          

       } finally{

           DBManager.release(con, st, rs);

       }

    }

UserDaoImpl部分

//(1)查找一个

    public void find() throws SQLException{

       String sql="select *from users where id=?";

       Object[] params={2};

       //实行查询

       BeanHandler rsh=new BeanHandler(User.class);

       User user=(User) DBManager.find(sql, params, rsh);

       System.out.println(user.toString());

    }

//作为框架的开发者,构建结果集的处理器,将结果集中的第一行记录封装在一个javabean对象中

public class BeanHandler implements ResultSetHandler {

    //传递javabean类所对应的class对象

    private Class clazz;//代表某种类型

    public BeanHandler(Class clazz){

       this.clazz=clazz;

    }

    @Override

    public Object handler(ResultSet rs) {

       // TODO Auto-generatedmethod stub

       try {

           if(!rs.next()){

              return null;

           }

           //读取结果集中的各个列封装到javabean

           Object bean=clazz.newInstance();//创建指定的javabean对象

           //读取结果集

           ResultSetMetaData meta=rs.getMetaData();//结果集中有几行几列,每列的类型,结果集的元数据对象

           int count = meta.getColumnCount();//得到列数

           for(int i=1;i<=count;i++){

              //把结果集中的列读取出来设置到bean对象上

             

              String coumnName=meta.getColumnName(i);//得到第i列的列名

              Object value=rs.getObject(coumnName);//从结果集中读取到了指定列的值

              //调用set方法设置属性

              //通过反射机制得到bean对象中的某一个属性所对应的Field对象

              Field f=bean.getClass().getDeclaredField(coumnName);//得到bean所对应的class类型

              f.setAccessible(true);

              f.set(bean, value);

          

           }

           return bean;

       } catch (Exception e) {

           // TODO Auto-generatedcatch block

           throw new RuntimeException(e);//运行时异常

       }

    }

}

//(2)查找全部

    public List findAll() throws SQLException{

       List list=null;

       String sql="select *from users";

       Object[] params={};

       BeanListHandler rsh=new BeanListHandler(User.class);

       list=(List) DBManager.find(sql, params, rsh);//调用自己编写的框架

       return list;

    }

//用来得到查询多行多列

public class BeanListHandler implements ResultSetHandler {

    private Class clazz;//代表某种类型

    public BeanListHandler(Class clazz){

       this.clazz=clazz;

    }

    @Override

    public Object handler(ResultSet rs) {

       try{

           List list=new ArrayList();

           while(rs.next()){

              //循环的读取一行,把这一行设置到bean 对象中,再把该bean 对象加入到list集合里面去

              Object bean=clazz.newInstance();//创建bean对象

              ResultSetMetaData meta=rs.getMetaData();//得到结果集元数据

              int count=meta.getColumnCount();//得到总列数

              for(int i=1;i<=count;i++){

                  String columnName=meta.getColumnName(i);

                  Object value=rs.getObject(columnName);

                 

                  Field f=clazz.getDeclaredField(columnName);

                  f.setAccessible(true);

                  f.set(bean, value);

              }

              //将bean 对象加入到list集合中

              list.add(bean);

           }

           return list;

       }catch(Exception e){

           throw new RuntimeException(e);

       }

    }

}

 

public interface ResultSetHandler {

//結果集处理器接口

    //规定一个方法,让程序员按照规定的方法写

    public Object handler(ResultSet rs);

   

}

MyResultSetHandler部分

public class MyResultSetHandler implements ResultSetHandler {

    @Override

    public Object handler(ResultSet rs) {

       // TODO Auto-generatedmethod stub

       User user=new User();

       try {

           if(rs.next()){

              user.setId(rs.getInt(1));

              user.setName(rs.getString(2));

              user.setPassword(rs.getString(3));

              user.setEmail(rs.getString(4));

             

           }

       } catch (SQLException e) {

           // TODO Auto-generatedcatch block

           e.printStackTrace();

       }

       return user; 

    }

}

User.java部分:

public class User {

    private int id;

    private String name;

    private String password;

    private String email;

    private Date birthday;

    public int getId() {

       return id;

    }

    public void setId(int id) {

       this.id = id;

    }

    public String getName() {

       return name;

    }

    public void setName(String name) {

       this.name = name;

    }

    public String getPassword() {

       return password;

    }

    public void setPassword(String password) {

       this.password = password;

    }

    public String getEmail() {

       return email;

    }

    public void setEmail(String email) {

       this.email = email;

    }

    public Date getBirthday() {

       return birthday;

    }

    public void setBirthday(Date birthday) {

       this.birthday = birthday;

    }

    @Override

    public String toString() {

       return "User[id=" + id + ", "

              + (name != null ? "name=" + name + ", " : "")

              + (password != null ? "password=" + password + ", " : "")

              + (email != null ? "email=" + email + ", " : "")

              + (birthday != null ? "birthday=" + birthday : "") + "]";

    }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值