<六>JDBC_DAO 设计模式
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 设计模式的更多相关文章
- JavaScript高级程序设计学习(六)之设计模式
每种编程语言都有其自己的设计模式.不禁让人疑惑设计模式是用来做什么?有什么用? 简单的说,设计模式是为了让代码更简洁,更优雅,更完美. 同时设计模式也会让软件的性能更好,同时也会让程序员们更轻松.设计 ...
- 大型Java进阶专题(六)设计模式之代理模式
代理模式 前言 又开始我的专题了,又停滞了一段时间了,加油继续吧.都知道 SpringAOP 是用代理模式实现,到底是怎么实现的?我们来一探究竟,并且自己仿真手写还原部分细节. 代理模式的应用 在生活 ...
- Java -- JDBC_DAO 设计模式
DAO:Date Access Object 实现代码模块化,更加有利于代码的维护和升级. DAO 可以被子类继承或者直接使用. 访问数据信息的类,包含对数据的CRUD(create read upd ...
- python_way,day8 面向对象【多态、成员--字段 方法 属性、成员修饰符、特殊成员、异常处理、设计模式之单例模式、模块:isinstance、issubclass】
python_way day8 一.面向对象三大特性: 多态 二.面向对象中的成员 字段.方法属性 三.成员修饰符 四.特殊成员 __init__.__doc__.__call__.__setitem ...
- Java常见设计模式学习(非原创)
文章大纲 一.策略模式二.观察者模式三.工厂模式四.单例模式五.其他模式六.设计模式总结七.参考文章 一.策略模式 现在假设我们有个"鸭子项目",首先我们用OOP(面向对象)的 ...
- JAVA总结--设计模式
三大类设计模式: 创建型模式,共五种:工厂方法模式.抽象工厂模式.单例模式.建造者模式.原型模式. 结构型模式,共七种:适配器模式.装饰器模式.代理模式.外观模式.桥接模式.组合模式.享元模式. 行为 ...
- Java书籍推荐
Java书籍推荐 转自:http://www.cnblogs.com/exclm/archive/2009/01/03/1367597.html 一.入门 <Java 2从入门到精通>- ...
- python学习之路基础篇(第八篇)
一.作业(对象的封装) 要点分析 1.封装,对象中嵌套对象 2.pickle,load,切记,一定要先导入相关的类二.上节内容回顾和补充 面向对象基本知识: 1.类和对象的关系 2.三大特性: 封装 ...
- java面试总结
一.java的集合框架 HashMap.HashTable.CurrentHashMap的底层数据结构与区别? CurrentHashMap与HashTable是如何保证线程安全的? ArrayLis ...
随机推荐
- JAVA关键字与保留字说明及使用
1.abstract 2.boolean 3.break 4.byte 5.case 6.catch 7.char 8.class 9.continue 10.default 11.do 12.dou ...
- C#,int转成string,string转成int
转载:http://www.cnblogs.com/xshy3412/archive/2007/08/29/874362.html 1,int转成string用toString 或者Convert.t ...
- Websites for more Android development information
There is a vibrant, helpful Android developer community on the Web. Here are a numberof useful websi ...
- Ruby常用比较操作符
操作符 含义 == 测试值是否相等 ==== 用来比较case语句的目标和每个when从句的项 <=> 通用比较操作符. 根据接受者小于, 等于, 大于其参数, 返回-1, 0. 1 & ...
- Github.com的Git和TortoiseGit图文教程
图文介绍Windows系统下使用 Github账户 + msysgit + TortoiseGit 进行文件管理的方法. 安装 安装mysysgit 下载地址:msysgit 安装过程: 0.启动 1 ...
- 【强烈推荐】如何给TortoiseGit 配置密钥?
TortoiseGit 使用扩展名为ppk的密钥,而不是ssh-keygen生成的rsa密钥.也就是说使用 ssh-keygen -C "username@email.com" - ...
- PHP Object 转 Array,Json 转 Array
object 转 array /** * object 转 array */ function object_to_array($obj){ $_arr = is_object($obj)? get_ ...
- MyEclispe发布web项目-遁地龙卷风
(-1)写在前面 我用的是MyEclipse8.5. 还记得以前帮助一个女同学解决问题的时候,特意情调了要先启动服务在发布项目,其实单独的时候都是知道的,总和起来后就容易片面的给出结论.因为不会发生问 ...
- Java实现JDBC连接数据库实例
import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sq ...
- selenium常用的js总结
1. 对input执行输入 直接设置value属性, 此方法主要应对输入框自动补全以及readonly属性的element,sendkeys不稳定 比如: //inputbox is a WebEle ...