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. springweb 详解。

    spring web架构图 从图中可以看出, 如果要对输出的内容进行重构,不需要视图的话,在handlerMethodReturnValueHandler里进行操作,可以重构这个对象,以达到自定义输出 ...

  2. python opencv:代码执行时间计算

    t1 = cv2.getTickCount() # ...... t2 = cv2.getTickCount() # 计算花费的时间:毫秒 time = (t2-t1) / cv2.getTickFr ...

  3. HDU4280 Island Transport

    ISAP求最大流模板 #include<cstdio> #include<cstring> #include<algorithm> #include<iost ...

  4. Nexus-配置vPC 实验三

    配置EvPC(增强的vPC),下面两个FEX可以同时被两个N5K管理.注意:FEX只支持静态的Channel-group(mode on) N5K-1配置:配置FEXN5K-1(config)#fea ...

  5. java里判断字符串是否为数字类型的方法

    String type = "数字类型";if(StringUtils.isNotBlank(value)){ //区分正负数 if(value.startsWith(" ...

  6. SQL mybatis动态查询小结

    动态返回mysql某张表指定列的名字 <select id="queryColumns" resultType="map" parameterType=& ...

  7. encypt dataset

    import getoptimport sysimport uuidimport hashlibimport csvdef getIds(totals,encrypt): seed=set() for ...

  8. Redis数据的导出和导入(dump和load方式)

    迁移redis数据一般有如下3种方式: 第三方工具redis-dump,redis-load aof机制,需要开启aof功能 rdb存储机制 这里介绍第一种方式,通过redis-dump导出数据,再通 ...

  9. 安装oracle11g时出现:在注册表中没有找到指定的主目录名

    我碰到这个问题,不过我没去管它.直接安装了,后来数据库实例,什么的都能安装,目前没有发现什么问题. 造成这个的原因:是卸载oracle时注册表没有彻底删除! 如果后面出现问题,再记录.

  10. Inject shellcode into PE file

    先声明这是不免杀的,只是演示. 哔哩哔哩视频 新增节 一般能实现特定功能的shellcode的长度都比较长,可以分到几个节上的空白区,但是这样麻烦啊,或者把最后一个节扩大,但是最后一个节一般没有执行的 ...