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. notepad++ java编码,输出中文字符时,编译出错

    呆在公司中,最近受开发手机app的几个同事影响,想学android的开发,心血来潮,挡也挡不住,说干就干,直接看教程,发现有很多关于java的语法知识不懂,于是又来学java,学习的过程中难免出现问题 ...

  2. 《创业者技能树》--创业课--14天复盘第一课candy2--HHR计划

    1,厉害的人是如何分析问题的?

  3. DVWA实验之Brute Force(暴力破解)- High

    DVWA实验之Brute Force(暴力破解)- High   有关DVWA环境搭建的教程请参考: https://www.cnblogs.com/0yst3r-2046/p/10928380.ht ...

  4. Vue父组件主动获取子组件的数据和方法

    Vue父组件主动获取子组件的数据和方法 https://www.jianshu.com/p/bf88fc809131

  5. window照片查看器无法查看照片的问题

    查看其他照片都可以,只有特殊的两张无法查看.百度|| 修改了环境变量中的tmp变量,路径改为e:\tmp(注:要选择磁盘空间足够的磁盘). 刷新过后,重新打开同一张图片,如下: 用系统自带画图软件尝试 ...

  6. IIS 配置迁移

    使用管理员身份运行cmd 应用程序池: # 导出所有应用程序池 %windir%\system32\inetsrv\appcmd list apppool /config /xml > c:\a ...

  7. 「CQOI2009」中位数

    「CQOI2009」中位数 传送门 这道题将会用到一点桶的思想. 首先我们可以在排列中先找到 \(b\) 的位置(找不到的话就直接输出 \(0\)). 然后我们从 \(b\) 的位置(设为 \(p\) ...

  8. MySQL - 设置UTF-8编码

    1. 在Windows上,安装时请选择UTF-8编码,以便正确地处理中文. 在Mac或Linux上,需要编辑MySQL的配置文件,把数据库默认的编码全部改为UTF-8.MySQL的配置文件默认存放在/ ...

  9. scrapy-redis分布式

    scrapy是python界出名的一个爬虫框架,提取结构性数据而编写的应用框架,可以应用在包括数据挖掘,信息处理或存储历史数据等一系列的程序中. 虽然scrapy 能做的事情很多,但是要做到大规模的分 ...

  10. Hibernate笔记二

    1.延迟加载(懒加载) 概念 需要用到该数据的时候才要加载 种类 类的延迟加载 案例 说明:注意:使用的是Load方法 1.  执行22行代码的时候,不发出sql语句,说明类的延迟加载和主键没有关系 ...