1、DAO(Data Access Object):访问数据信息的类,包含对数据的CRUD(Create、Read、Update、Delete),而不包含任何业务相关的信息。

--DAO能够实现功能的模块化;

--有利于代码的维护和升级。

2、DAO中常用的方法:

--1)int update(String sql, Object ... args); //执行更新操作,返回受影响的行数,包括INSERT、UPDATE、DELETE操作。

--2)<T> T get(Class<T> clazz, String sql, Object ... args); //查询一条记录,返回对应的对象。

--3)<T> List<T> getForList(Class<T> clazz, String sql, Objeect ... args); // 查询多条记录,返回对应的对象列表。

--4)<E> E getForValue(String sql, Object ... args); //返回某条记录的某一个字段的值或一个统计的记录数。

3、实现:

public class DAO {
public int update(String sql, Object ... args){
Connection conn = null;
PreparedStatement ps = null;
int rowNum = 0;
try{
conn = JDBCUtils.getConnection();
ps = conn.prepareStatement(sql);
for(int i = 0; i < args.length; i++){
ps.setObject(i + 1, args[i]);
} rowNum = ps.executeUpdate();
return rowNum;
}catch(Exception e){
e.printStackTrace();
}finally{
JDBCUtils.release(conn, ps, null);
}
return rowNum;
} public <T> T get(Class<T> clazz, String sql, Object ...args){
T entity = null;
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
try{
conn = JDBCUtils.getConnection();
ps = conn.prepareStatement(sql);
for(int i = 0; i < args.length; i++){
ps.setObject(i + 1, args[i]);
} rs = ps.executeQuery();
Map<String, Object> map = new HashMap<String, Object>();
List<String> columnLabels = getColumnLabels(rs); if(rs.next()){
for(String columnLabel : columnLabels){
Object columnValue = rs.getObject(columnLabel);
map.put(columnLabel, columnValue);
}
} if(map.size() > 0){
entity = clazz.newInstance();
for(Map.Entry<String, Object> entry : map.entrySet()){
String fieldName = entry.getKey();
Object value = entry.getValue();
//使用BeanUtils工具类来为属性赋值
BeanUtils.setProperty(entity, fieldName, value);
/**使用反射的方式为属性赋值
Field field = clazz.getDeclaredField(key);
field.setAccessible(true);
field.set(entity, value);*/
}
return entity;
} }catch(Exception e){
e.printStackTrace();
}finally{
JDBCUtils.release(conn, ps, rs);
}
return entity;
} public <T> List<T> getForList(Class<T> clazz, String sql, Object ... args){
List<T> list = new ArrayList<>();
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
try{
conn = JDBCUtils.getConnection();
ps = conn.prepareStatement(sql);
for(int i = 0; i < args.length; i++){
ps.setObject(i + 1, args[i]);
} rs = ps.executeQuery();
/**
* 将得到的ResultSet结果集转换为Map<String, Object>列表,
* 其中key值为rs表的别名,value值为对应别名的值
*/
List<Map<String, Object>> data = handleResultSetToMapList(rs); /**
* 将MapList转换为对应的BeanList
*/
list = transferMapListToBeanList(clazz, data);
}catch(Exception e){
e.printStackTrace();
}finally{
JDBCUtils.release(conn, ps, rs);
}
return list;
} private <T> List<T> transferMapListToBeanList(Class<T> clazz,List<Map<String, Object>> data) throws Exception {
List<T> list = new ArrayList<>();
if(data.size() > 0){
for(Map<String, Object> map : data){
T entity = clazz.newInstance();
for(Map.Entry<String, Object> entry : map.entrySet()){
String fieldName = entry.getKey();
Object value = entry.getValue(); BeanUtils.setProperty(entity, fieldName, value);;
}
list.add(entity);
}
}
return list;
} public static <E> E getForValue(String sql, Object ... args){
E entity = null;
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
try{
conn = JDBCUtils.getConnection();
ps = conn.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{
JDBCUtils.release(conn, ps, rs);
}
return entity;
} /**
* 将获取到的结果集处理成MapList
* @param rs
* @return
* @throws Exception
*/
private List<Map<String, Object>> handleResultSetToMapList(ResultSet rs)
throws Exception {
List<String> columnLabels = getColumnLabels(rs);
List<Map<String, Object>> data = new ArrayList<Map<String, Object>>();
while(rs.next()){
Map<String, Object> map = new HashMap<String, Object>();
for(String columnLabel : columnLabels){
Object columnValue = rs.getObject(columnLabel);
map.put(columnLabel, columnValue);
}
data.add(map);
}
return data;
} /**
* 根据结果集获取所有列的别名
* @param rs
* @return
* @throws Exception
*/
private List<String> getColumnLabels(ResultSet rs) throws Exception{
List<String> list = new ArrayList<>();
ResultSetMetaData rsmd = rs.getMetaData();
for(int i = 0; i < rsmd.getColumnCount(); i++){
list.add(rsmd.getColumnLabel(i + 1));
}
return list;
}
}

JDBC--DAO设计模式的更多相关文章

  1. MySQL数据库学习笔记(十一)----DAO设计模式实现数据库的增删改查(进一步封装JDBC工具类)

    [声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4 ...

  2. DAO设计模式实现数据库的增删改查(进一步封装JDBC工具类)

    DAO设计模式实现数据库的增删改查(进一步封装JDBC工具类) 一.DAO模式简介 DAO即Data Access Object,数据访问接口.数据访问:故名思义就是与数据库打交道.夹在业务逻辑与数据 ...

  3. 一、DAO设计模式 二、DAO设计模式的优化 三、JDBC中的事务,连接池的使用

    一.DAO设计模式概述###<1>概念 DAO,Data Access Object ,用于访问数据库的对象. 位于业务逻辑和数据持久化层之间,实现对数据持久化层的访问![](1.png) ...

  4. jdbc/DAO模式

    DAO设计模式: 1.DAO:      DAO设计模式是属于J2EE数据层的操作,使用DAO设计模式可以简化大量代码,增强程序的可移植性. 2.DAO各部分详解:DAO设计模式包括以下4个主要部分: ...

  5. JavaWeb技术(二):DAO设计模式

    1. DAO全称:Data Access Object , 数据访问对象.使用DAO设计模式来封装数据持久化层的所有操作(CRUD),使得数据访问逻辑和业务逻辑分离,实现解耦的目的. 2. 典型的DA ...

  6. DAO设计模式 -- 使用数据库连接类连接MySql数据库并实现添加用户

    1. DAO简介    DAO设计模式是属于J2EE数据库层的操作,使用DAO设计模式可以简化大量代码,增强程序的可移植性. 2. DAO各部分详解    DAO设计模式包括5个重要的部分,分别为数据 ...

  7. JavaBean中DAO设计模式介绍(转)

    一.信息系统的开发架构 客户层-------显示层-------业务层---------数据层---------数据库 1.客户层:客户层就是客户端,简单的来说就是浏览器. 2.显示层:JSP/Ser ...

  8. jsp DAO设计模式

    DAO(Data Access Objects)设计模式是属于J2EE体系架构中的数据层的操作. 一.为什么要用DAO? 比较在JSP页面中使用JDBC来连接数据库,这样导致了JSP页面中包含了大量的 ...

  9. 简单的Dao设计模式

    简单的DAO设计模式 这两天学习到了DAO(Data Access Object 数据存取对象)设计模式.想谈谈自己的感受,刚开始接触是感觉有点难,觉得自己逻辑理不清,主要是以前学的知识比较零散没有很 ...

  10. JavaBean在DAO设计模式简介

    一.信息系统开发框架 客户层-------显示层-------业务层---------数据层---------数据库 1.客户层:客户层是client,简单的来说就是浏览器. 2.显示层:JSP/Se ...

随机推荐

  1. mysql的一些不常用语句

    今天写项目,用的ThinkPHP,写的时候有点费劲,原因嘛 无非是对框架或者mysql的一些知识的遗忘. 1.为了配合ThinkPHP中的控制器,需要修改数据库中表名,一时想不起来,幸好有百度,问题很 ...

  2. PHP序列化与反序列化(二)

    题目(攻防世界): __construct和__destruct的魔术方法是默认执行的,我们可以忽视他们,__wake up执行以后会返回当前主页上,需要绕过,下面的正则匹配preg_match也需要 ...

  3. 一个包含arctan与arctanh的积分

    \[\Large\int_0^1\frac{\arctan x \,\operatorname{arctanh} x\, \ln x}{x}\mathrm{d}x=\frac{\pi^2}{16}\m ...

  4. ArrayStack(栈)

    顺序栈即数组型的栈.什么是栈呢?简单来说就像一个刚好装的下乒乓球大小的球筒,假设不能暴力打开球筒且只有一端有出口,那你放入或取出里面的球的操作都只能在一端进行,并且把球放进去或取出来都是由顺序决定的, ...

  5. php学习 打星星

    <?php // 输入几行 $k=9; // 打孔三角 for($i=1;$i<=$k;$i++){ if($i==$k){ for($n=1;$n<=$k*2-1;$n++){ e ...

  6. springboot例子

    @Mapperpublic interface FinancingMapper { @Insert("<script>" + "insert into fin ...

  7. mac 终端连接服务器报错

    今天在连接虚拟机服务器时突然报了一个 WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!的错误.  会出现这个错误的原因是在第一次进行SSH连接时,会生 ...

  8. SSD boot test script for(if)循环

    ;Author : Bing Song ;// ;Usage: modify log drictory according to actual drictory gettime timestr &qu ...

  9. 吴裕雄 Bootstrap 前端框架开发——Bootstrap 表格:为任意 <table> 添加基本样式 (只有横向分隔线)

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  10. k种球若干,取n个球,输出所有取球方案 (模拟)

    有K种颜色的小球(K<=10),每种小球有若干个,总数小于100个. 现在有一个小盒子,能放N个小球(N<=8),现在要从这些小球里挑出N个小球,放满盒子. 想知道有哪些挑选方式.注:每种 ...