JDBC_DAO设计模式
 DAO:Data Access Object(数据访问对象)
  why:实现功能的模块化,更有利于代码的维护和升级。
  what:访问数据信息的类,包含了对数据的CRUD(create、read、update、delete),而不包含任何业务相关
  的信息。
  
  该DAO可以被子类继承或直接使用。
  
  how:使用JDBC编写DAO可能会包含的方法:
   //insert、update、delete操作都可以包含其中
   void update(String sql,Object...args);
   //查询一条记录,返回对应的对象
   <T> T get(Class<T> clazz,String sql,Object...args);
   //查询多条记录,返回对应的对象的集合
   <T> List<T> getForList(Class<T> clazz,String sql,Object...args);
   //返回某个对象的属性值
   <E>  E getForValue(String sql,Object...args);

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
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) {
   
  }
 }
 //查询一条记录,返回对应的对象
 public <T> T get(Class<T> clazz,String sql,Object...args){
  
  /*
   * 1、获取Connection
   * 2、获取PreparedStatement
   * 3、填充占位符
   * 4、进行查询,得到ResultSet
   * 5、准备一个Map<String,Object>对象,键->存放列的别名,键->存放列的值
   * 6、得到ResultSetMetaData对象
   * 7、处理ResultSet,把指针向下移动一个单位
   * 8、由ResultSetMetaData得到结果集中有多少列
   * 9、由ResultSetMetaData得到每一列的别名,由ResultSet得到具体每一列的值
   * 10、填充Map对象
   * 11、用反射创建Class对应的对象
   * 12、遍历Map对象,用反射填充对象的属性值:
   *   属性名为Map中的key,属性值为Map中的value
   * */
  
  T entity=null;
  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()) {
    Map<String,Object> values=new HashMap<>();
    ResultSetMetaData rsmd=rs.getMetaData();
    int columnCount=rsmd.getColumnCount();
    for (int i = 0; i < columnCount; i++) {
     String columnLabel=rsmd.getColumnLabel(i+1);
     Object columnValue=rs.getObject(columnLabel);
     values.put(columnLabel, columnValue);
    }
    
    entity=clazz.newInstance();
    
    for (Map.Entry<String, Object> entry : values.entrySet()) {
     String propertyName=entry.getKey();
     Object value=entry.getValue();
     //用反射赋值
     ReflectionUtils.setFieldValue(entity, propertyName, value);     
    }
    
   }
   
  } catch (Exception e) {
   e.printStackTrace();
  }
  return entity;
 }
 //查询多条记录,返回对应的对象的集合
 public <T> List<T> getForList(Class<T> clazz,String sql,Object...args){
  
  return null;
 }
 //返回某个对象的属性值
 public <E>  E getForValue(String sql,Object...args){
  
  return null;
 }
}

import static org.junit.Assert.*;
import java.sql.Date;
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() {
  fail("Not yet implemented");
 }

@Test
 public void testGetForValue() {
  fail("Not yet implemented");
 }

}

<六>JDBC_DAO 设计模式的更多相关文章

  1. JavaScript高级程序设计学习(六)之设计模式

    每种编程语言都有其自己的设计模式.不禁让人疑惑设计模式是用来做什么?有什么用? 简单的说,设计模式是为了让代码更简洁,更优雅,更完美. 同时设计模式也会让软件的性能更好,同时也会让程序员们更轻松.设计 ...

  2. 大型Java进阶专题(六)设计模式之代理模式

    代理模式 前言 又开始我的专题了,又停滞了一段时间了,加油继续吧.都知道 SpringAOP 是用代理模式实现,到底是怎么实现的?我们来一探究竟,并且自己仿真手写还原部分细节. 代理模式的应用 在生活 ...

  3. Java -- JDBC_DAO 设计模式

    DAO:Date Access Object 实现代码模块化,更加有利于代码的维护和升级. DAO 可以被子类继承或者直接使用. 访问数据信息的类,包含对数据的CRUD(create read upd ...

  4. python_way,day8 面向对象【多态、成员--字段 方法 属性、成员修饰符、特殊成员、异常处理、设计模式之单例模式、模块:isinstance、issubclass】

    python_way day8 一.面向对象三大特性: 多态 二.面向对象中的成员 字段.方法属性 三.成员修饰符 四.特殊成员 __init__.__doc__.__call__.__setitem ...

  5. Java常见设计模式学习(非原创)

    文章大纲 一.策略模式二.观察者模式三.工厂模式四.单例模式五.其他模式六.设计模式总结七.参考文章   一.策略模式 现在假设我们有个"鸭子项目",首先我们用OOP(面向对象)的 ...

  6. JAVA总结--设计模式

    三大类设计模式: 创建型模式,共五种:工厂方法模式.抽象工厂模式.单例模式.建造者模式.原型模式. 结构型模式,共七种:适配器模式.装饰器模式.代理模式.外观模式.桥接模式.组合模式.享元模式. 行为 ...

  7. Java书籍推荐

    Java书籍推荐 转自:http://www.cnblogs.com/exclm/archive/2009/01/03/1367597.html 一.入门 <Java 2从入门到精通>- ...

  8. python学习之路基础篇(第八篇)

    一.作业(对象的封装) 要点分析 1.封装,对象中嵌套对象 2.pickle,load,切记,一定要先导入相关的类二.上节内容回顾和补充 面向对象基本知识: 1.类和对象的关系 2.三大特性: 封装 ...

  9. java面试总结

    一.java的集合框架 HashMap.HashTable.CurrentHashMap的底层数据结构与区别? CurrentHashMap与HashTable是如何保证线程安全的? ArrayLis ...

随机推荐

  1. nodejs开发 express路由与中间件

    路由 通常HTTP URL的格式是这样的: http://host[:port][path] http表示协议. host表示主机. port为端口,可选字段,不提供时默认为80. path指定请求资 ...

  2. 《大道至简》第一章读后感--JAVA语言伪代码形式

    import.java.大道至简.*; //一·愚公移山 import.java.愚公移山.*; public class YuGongYiShan { //原始需求:惩山北之塞,出入之迂 //项目沟 ...

  3. PHP如何快速读取大文件

    在PHP中,对于文件的读取时,最快捷的方式莫过于使用一些诸如file.file_get_contents之类的函数,简简单单的几行代码就能 很漂亮的完成我们所需要的功能.但当所操作的文件是一个比较大的 ...

  4. MongoDB系列一:CentOS7.2下安装mongoDB3.2.8

    最近在又在倒腾MongoDB,把安装配置的相关命令贴出来 1.下载 wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel70- ...

  5. JSON.parse和eval的区别

    JSON.parse和eval的区别 JSON(JavaScript Object Notation)是一种轻量级的数据格式,采用完全独立于语言的文本格式,是理想的数据交换格式.同时,JSON是Jav ...

  6. css如何实现水平居中呢?css实现水平居中的方法?

    面试中遇到的一个问题:如何让css实现水平居中?下面来看一下哪些方法能实现水平居中. 首先分两种情况,行内元素还是块级元素.然而块级元素又分为定宽块状元素和不定款块状元素.先来看下行内元素如何水平居中 ...

  7. Fedora中允许mysql远程访问的几种方式

    Fedora中允许mysql远程访问,可以使用以下两种方式:a.改表. mysql>use mysql; mysql>update user set host = '%' where us ...

  8. 常用的windows cmd 的使用

    cd/:返回根目录 cd 文件名:进入某文件 md 文件名:新建文件 dir:显示当前文件夹内的文件目录 del:删除文件 rd:删除空目录(目录中不能有子目录和文件) deltree:删除目录并删除 ...

  9. js颠倒数组元素顺序reverse()

    颠倒数组元素顺序reverse() reverse() 方法用于颠倒数组中元素的顺序. 语法: arrayObject.reverse() 注意:该方法会改变原来的数组,而不会创建新的数组. 定义数组 ...

  10. 【转载】PyQt QSetting保存设置

    转载地址: http://blog.sina.com.cn/s/blog_4b5039210100h3zb.html 用户对应用程序经常有这样的要求:要求它能记住它的settings,比如窗口大小,位 ...