DAO类:

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import com.kk.jdbc.JDBCTools;
import com.kk.jdbc.ReflectionUtils;

public class DAO {

   //insert、update、delete操作都可以包含其中
   public void update(String sql,Object...args){
      Connection con=null;
      PreparedStatement ps=null;
      try {
   
         con=JDBCTools.getConnection();
         ps=con.prepareStatement(sql);
         for (int i = 0; i < args.length; i++) {
          ps.setObject(i+1, args[i]);
       }
       ps.executeUpdate();
      } catch (Exception e) {
         JDBCTools.release(null,ps, con);
      }
   }
   //查询一条记录,返回对应的对象
   public <T> T get(Class<T> clazz,String sql,Object...args){
  
      List<T> result=getForList(clazz, sql, args);
      if (result.size()>0) {
         return result.get(0);
      }
      return null;
   }
   //查询多条记录,返回对应的对象的集合
   public <T> List<T> getForList(Class<T> clazz,String sql,Object...args){
  
      List<T> list=new ArrayList<>();
      Connection con=null;
      PreparedStatement ps=null;
      ResultSet rs=null;
  
      try {
         /*
          * 1、得到结果集
          *
          * */
         con=JDBCTools.getConnection();
         ps=con.prepareStatement(sql);
         for (int i = 0; i < args.length; i++) {
            ps.setObject(i+1, args[i]);
         }
   
         rs=ps.executeQuery();
         /*
          * 2、处理结果集,得到Map的List,其中一个Map对象就是一条记录;
          *   key-->rs中列的别名
          *   value-->列的值
          * */
         List<Map<String, Object>> values = handleResultSetToMapList(rs);
         /*
          * 3、把Map的List转为clazz对应的集合,其中Map的key即为clazz对应的对象的propertyName
          *    value即为clazz对应对象的propertyValue.
          * */
         list=transfterMapListToBeanList(clazz,  values);
   
      } catch (Exception e) {
         JDBCTools.release(rs, ps, con);
      }
  
      return list;
   }
   private <T> List<T> transfterMapListToBeanList(Class<T> clazz,List<Map<String, Object>> values)
       throws InstantiationException, IllegalAccessException {
  
      List<T> result=new ArrayList<>();
      T bean=null;
      //12、判断list是否为null,不为null遍历,将得到的每一个Map对象转为一个Class参数对应的Object对象
      if (values.size()>0) {
         for (Map<String, Object> m : values) {
            bean=clazz.newInstance();
            for (Map.Entry<String,Object> entry: m.entrySet()) {
               String propertyName=entry.getKey();
               Object value=entry.getValue();
               ReflectionUtils.setFieldValue(bean, propertyName, value);
            }
            //13、把Object对象放入到list中
            result.add(bean);
         }
      }
      return result;
   }
 
   //处理结果集,得到Map的一个List,其中一个Map对应一条记录
   private List<Map<String, Object>> handleResultSetToMapList(ResultSet rs) throws SQLException {
      //5、准备一个List<Map<String,Object>>,一个Map对象对应一条记录
      List<Map<String,Object>> values=new ArrayList<>();
      List<String> columnLabels=getColumnLabels(rs);
      Map<String,Object> map=null;
      //7、处理ResultSet,使用while循环
      while(rs.next()){
         map=new HashMap<>();
   
         for (String columnLabel:columnLabels) {
            Object value=rs.getObject(columnLabel);
            map.put(columnLabel, value);
         }
         //11、将填充好的Map对象放入list中
         values.add(map);
      }
      return values;
   }
 
   //获取结果集的ColumnLabel对应的List
   private List<String> getColumnLabels(ResultSet rs) throws SQLException{
  
      List<String> labels=new ArrayList<>();
  
      ResultSetMetaData rsmd=rs.getMetaData();
      for (int i = 0; i < rsmd.getColumnCount(); i++) {
         labels.add(rsmd.getColumnLabel(i+1));
      }
  
      return labels;
   }
 
   //返回某个对象的属性值
   public <E>  E getForValue(String sql,Object...args){
  
      //1、得到结果集:该结果集应该只有一行且只有一列
      Connection con=null;
      PreparedStatement ps=null;
      ResultSet rs=null;
      try {
   
         con=JDBCTools.getConnection();
         ps=con.prepareStatement(sql);
         for (int i = 0; i < args.length; i++) {
            ps.setObject(i+1, args[i]);
         }
         rs=ps.executeQuery();
   
         if (rs.next()) {
              return (E) rs.getObject(1);
         }
   
      } catch (Exception e) {
         e.printStackTrace();
      }finally{
         JDBCTools.release(rs, ps, con);
      }
  
      //2、取得结果集的
  
  
        return null;
     }
  }

单元测试类:

import java.sql.Date;
import java.util.List;
import org.junit.Test;
import com.kk.jdbc.Student;

  public class DAOTest {

    DAO dao=new DAO();
 
     @Test
     public void testUpdate() {
      String sql="insert into customers(name,email,birth) values (?,?,?)";
      dao.update(sql, "xiaoming","xm@.com",new Date(new java.util.Date().getTime()));
  
   }

  @Test
   public void testGet() {
      String sql="select FlowId flow_Id,Type,IDCard,ExamCard,StudentName from examstudent where FlowId=?";
      Student stu=dao.get(Student.class,sql,1);
      System.out.println(stu);
   }

  @Test
    public void testGetForList() {
      String sql="select FlowId flow_Id,Type,IDCard,ExamCard,StudentName from examstudent";
      List<Student> st=dao.getForList(Student.class, sql);
      System.out.println("向日葵:"+st);
    }

  @Test
   public void testGetForValue() {
      String sql="select ExamCard from examstudent where FlowId=?";
      String examCard=dao.getForValue(sql, 13);
      System.out.println(examCard);
  
      sql="select max(grade) from examstudent";
      int grade=dao.getForValue(sql);
      System.out.println(grade);
   }

}

<八>JDBC_重构DAO查询方法的更多相关文章

  1. <五>JDBC_利用反射及JDBC元数据编写通用的查询方法

    此类针对javaBean类写了一个通用的查询方法,List<javaBean> 通用查询更新中...:通过学习,深刻体会到学会反射就等于掌握了java基础的半壁江山! 一.使用JDBC驱动 ...

  2. Java -- JDBC_利用反射及 JDBC 元数据编写通用的查询方法

    先利用 SQL 进行查询,得到结果集: 利用反射创建实体类的对象:创建对象: 获取结果集的列的别名: 再获取结果集的每一列的值, 结合 3 得到一个 Map,键:列的别名,值:列的值: 再利用反射为 ...

  3. MyBatis学习--mybatis开发dao的方法

    简介 使用Mybatis开发Dao,通常有两个方法,即原始Dao开发方法和Mapper接口开发方法. 主要概念介绍: MyBatis中进行Dao开发时候有几个重要的类,它们是SqlSessionFac ...

  4. 11Mybatis_mybatis开发Dao的方法

    在介绍开发Dao的方法之前先介绍下SqlSession. 1.先介绍一下SqlSessionFactoryBuilder:通过SqlSessionFactoryBuilder创建会话工厂SqlSess ...

  5. 四 mybatis开发dao的方法

    mybatis开发dao的方法 1.1     SqlSession使用范围 1.1.1     SqlSessionFactoryBuilder //以流的方式读取总的配置文件 Reader rea ...

  6. mybatis系列-04-mybatis开发dao的方法

    4.1     SqlSession使用范围 4.1.1     SqlSessionFactoryBuilder 通过SqlSessionFactoryBuilder创建会话工厂SqlSession ...

  7. Hibernate查询方法总结

    1. HQL查询 HQL是Hiberante官方推荐的Hibernate检索方式,它使用类似SQL的查询语言,以面向对象的方式从数据库中查询.可以使用HQL查询具有继承.多态和关 联关系的数据.在检索 ...

  8. Mybatis的原始dao开发方法

    在进入主题之前先提一下sqlSession.sqlSession是一个面向用户(程序员)的接口. sqlSession中提供了很多操作数据库的方法,如: selectOne(返回单个对象).selec ...

  9. J2EE进阶(十七)Hibernate中常用的HQL查询方法(getHibernateTemplate())

    J2EE进阶(十七)Hibernate中常用的HQL查询方法(getHibernateTemplate())   当我们使用Hibernate进行数据的CRUD操作时,利用模版进行操作不失为一种方法. ...

随机推荐

  1. UVA-11997 K Smallest Sums

    UVA - 11997 K Smallest Sums Time Limit: 1000MS   Memory Limit: Unknown   64bit IO Format: %lld & ...

  2. 【bzoj3531】 [SDOI2014]旅行

    题目描述 S国有N个城市,编号从1到N.城市间用N-1条双向道路连接,满足从一个城市出发可以到达其它所有城市.每个城市信仰不同的宗教,如飞天面条神教.隐形独角兽教.绝地教都是常见的信仰.为了方便,我们 ...

  3. 个性化设置phpMyAdmin,去掉“以树形显示数据库”,禁用“发送错误报告”

    个性化设置phpMyAdmin 在使用phpMyAdmin 3.5.8.2时,发现: 如果数据库有相同的前缀,左边数据库导航会把前缀合并,即所谓的“以树形显示数据库”,真的有点不习惯,如下图所示: 不 ...

  4. 【Android学习】《Android开发视频教程》第二季笔记(未完待续)

    视频地址: http://study.163.com/course/courseMain.htm?courseId=207001 课时22  Activity生命周期(一) 1.如何在一个应用中添加新 ...

  5. spark streaming 接收 kafka 数据java代码WordCount示例

    http://www.cnblogs.com/gaopeng527/p/4959633.html

  6. java final 关键字

    1.修饰类当用final修饰一个类时,表明这个类不能被继承.也就是说,如果一个类你永远不会让他被继承,就可以用final进行修饰.final类中的成员变量可以根据需要设为final,但是要注意fina ...

  7. Python正则表达式详解

    我用双手成就你的梦想 python正则表达式 ^ 匹配开始 $ 匹配行尾 . 匹配出换行符以外的任何单个字符,使用-m选项允许其匹配换行符也是如此 [...] 匹配括号内任何当个字符(也有或的意思) ...

  8. WEB API异常处理

    当一个web api抛出一个异常后 此异常会被转化成一个HTTP响应 错误代码为500的服务错误 但是如果你不想让客户端看到500的错误码 你也可以自定义错误码 如下代码当用户输入的ID没有与之相关的 ...

  9. HDU 4113 Construct the Great Wall(插头dp)

    好久没做插头dp的样子,一开始以为这题是插头,状压,插头,状压,插头,状压,插头,状压,无限对又错. 昨天看到的这题. 百度之后发现没有人发题解,hust也没,hdu也没discuss...在acm- ...

  10. grep 正则表达式

    本文转自:http://www.jb51.net/article/31207.htm 正则表达式只是一种表示法,只要工具支持这种表示法, 那么该工具就可以处理正则表达式的字符串.vim.grep.aw ...