在javaEE中,java类的属性通过getter和setter来定义,get(或set)方法去除get(set)后,首字母小写即为Java类的属性。操作java类的属性有一个工具包,BeanUtils,其中的setProperty()方法是通过javaBean中的set方法赋值的。

使用BeanUtils需要加入两个jar包,

1.测试BeanUtils中的SetProperty()方法。

@Test
public void testSetProperty() throws IllegalAccessException, InvocationTargetException, NoSuchMethodException{
Object object = new Student();
System.out.println(object);
BeanUtils.setProperty(object,"type",2434);
System.out.println(object);
System.out.println(BeanUtils.getProperty(object,"type"));
}

运行后:

①创建一个Student对象student,未赋值之前属性为空;

②BeanUtils.setProperty(object,"type",2434); 为student赋值,属性为对应的Student类get(或set)方法去除get(set)后再把首字母小写;

③赋值后使用BeanUtils.getProperty(object,"type"); 获得属性值。

DAO:Data Access Object,是访问数据信息的类,包含了对数据的CRUD(create,read,update,delete),而不包含任何业务相关的信息,更容易实现功能的模块化,有利于代码的维护和升级。

1.update,包括插入,删除,更新操作

public void update(String sql,Object ... args){
Connection connection=null;
PreparedStatement preparedstatement=null;
ResultSet resultset=null;
try{
connection=JDBCTools.getConnection();
preparedstatement=connection.prepareStatement(sql);
for(int i=0;i<args.length;i++){
preparedstatement.setObject(i+1, args[i]);
}
preparedstatement.executeUpdate();
}catch(Exception e){
e.printStackTrace();
}finally{
JDBCTools.release(resultset,preparedstatement, connection);
}
}

测试方法:

@Test
public void testUpdate() {
String sql="INSERT INTO EXAMSTUDENT(FlowId,TYPE,IdCard,ExamCard,StudentName,Location,Grade)"
+ "VALUES(?,?,?,?,?,?,?)";
dao.update(sql,1,2,"23313","2321","Li","大连",313);
}

2.查询多条记录,返回对应的查询对象的集合

public <T> List<T> getForList(Class<T> clazz,String sql,Object ... args){
List<T> list=new ArrayList<>();
Connection connection=null;
PreparedStatement preparedstatement=null;
ResultSet resultset=null;
try{
//1.得到结果集resultset
connection=JDBCTools.getConnection();
preparedstatement=connection.prepareStatement(sql);
for(int i=0;i<args.length;i++){
preparedstatement.setObject(i+1, args[i]);
}
resultset=preparedstatement.executeQuery();
//2.处理结果集,将得到的ResultSet结果集中的别名和列值存入到Map中,得到Map的List
List<Map<String,Object>> listMap = handleResultSetToMapList(resultset);
//3.将Map的List转为clazz对应的List,其中Map的key即为clazz对应的属性名,Map的value为clazz对应的属性值
list=transferMapListToBeanList(clazz,listMap);
}catch(Exception e){
e.printStackTrace();
}finally{
JDBCTools.release(resultset,preparedstatement, connection);
}
return list;
}

2.1 得到结果集

2.2 将ResultSet结果集转换为MapList的方法:handleResultSetToMapList(resultset)

private List<Map<String, Object>> handleResultSetToMapList(ResultSet resultset)
throws Exception, SQLException {
List<Map<String,Object>> list=new ArrayList<>();
//得到resultset中的列名
List<String> columnLabels=getColumnLabels(resultset);
Map<String,Object> map=null;
while(resultset.next()){
map=new HashMap<>();
//得到SQL查询的列数
int count=columnLabels.size();
for(String columnLabel:columnLabels){
Object columnValue=resultset.getObject(columnLabel);
//将别名,列值存入到Map中
map.put(columnLabel,columnValue);
}
list.add(map);
}
return list;
}

其中得到resultset中的列名的方法:getColumnLabels(resultset)

private List<String> getColumnLabels(ResultSet resultset) throws Exception{
List<String> labels=new ArrayList<String>();
ResultSetMetaData rsmd=resultset.getMetaData();
int count=rsmd.getColumnCount();
while(resultset.next()){
for(int i=0;i<count;i++){
labels.add(rsmd.getColumnLabel(i+1));
}
}
return labels;
}

2.3 将MapList转换为javaBean属性对应的List:transferMapListToBeanList(clazz,listMap)

private <T> List<T> transferMapListToBeanList(Class<T> clazz,List<Map<String, Object>> listMap) throws InstantiationException, IllegalAccessException, InvocationTargetException {
List<T> result=new ArrayList<>();
T bean=null;
if(listMap.size()>0){
//listMap中存的是多条记录的列名和列值,遍历listMap
for(Map<String,Object> map1:listMap){
bean=clazz.newInstance();
//遍历map1
for(Map.Entry<String, Object> entry:map1.entrySet()){
String propertyName=entry.getKey();
Object propertyValue=entry.getValue();
BeanUtils.setProperty(bean,propertyName,propertyValue);
}
result.add(bean);
}
}
return result;
}

测试方法:

@Test
public void testGetForList() {
String sql="SELECT FlowID flowId,TYPE type,IDCard idCard,ExamCard examCard,"
+ "StudentName studentName,Location location,Grade grade FROM EXAMSTUDENT";
List<Student> student=dao.getForList(Student.class,sql);
System.out.println(student);
}

3.查询一条记录,返回对应的对象

public <T> T get(Class<T> clazz,String sql,Object ... args){
List<T> result=getForList(clazz,sql,args);
if(result.size()>0){
return result.get(0);
}
return null;
}

4.返回某条记录的某一个字段的值或一个统计的值(一共有多少条记录等)

public <E> E getForValue(String sql,Object ... args){
Connection connection=null;
PreparedStatement preparedstatement=null;
ResultSet resultset=null;
try{
connection=JDBCTools.getConnection();
preparedstatement=connection.prepareStatement(sql);
for(int i=0;i<args.length;i++){
preparedstatement.setObject(i+1, args[i]);
}
resultset=preparedstatement.executeQuery();
if(resultset.next()){
return (E)resultset.getObject(1);
}
}catch(Exception e){
e.printStackTrace();
}finally{
JDBCTools.release(resultset,preparedstatement, connection);
}
return null;
}

测试方法:

@Test
public void testGetForValue() {
String sql="SELECT ExamCard FROM EXAMSTUDENT WHERE FlowId=?";
String ExamCard=dao.getForValue(sql,1);
System.out.println(ExamCard);
}

wx搜索“程序员考拉”,专注java领域,一个伴你成长的公众号!

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. MYSQL 之 JDBC(七):增删改查(五) DAO设计模式

    Data Access Object,数据访问对象 what:访问数据信息的类.包含了对数据的CRUD(create.read.update.delete,增删改查)操作,而不包含任何业务相关的信息. ...

  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 数据存取对象)设计模式.想谈谈自己的感受,刚开始接触是感觉有点难,觉得自己逻辑理不清,主要是以前学的知识比较零散没有很 ...

随机推荐

  1. Chrome 中删除单条浏览记录

    悲伤...之前用非隐私窗口观看了小电影.于是打开 chrome://settings/ ...... 现在才知道 windows 上使用 shift + del 即可删除该浏览记录 ....... 以 ...

  2. datetime 模块

    datetimo 模块和time模块类似,只不过直接帮你定好了格式 import datetime time =datetime.datetime.now() print(time,type(time ...

  3. Java最常见的200+面试题及自己梳理的答案--面试必备(一)

    昨天在今日头条上看到一份所谓经常面别人的TL梳理的面试题,看着比较完善,但是,没有对应的答案,自己看着研究学习了下,顺带梳理下答案.主要包括以下模块:Java基础.容器.多线程.反射.对象拷贝.Jav ...

  4. Java多线程——对象组合

    我们不希望对每一次的内存访问都进行分析以确保程序是线程安全的,而是希望将一些现有的线程安全组件组合为更大规模的组件或者程序,这里介绍一些组合模式,这些组合模式能够使一个类更容易成为线程安全的,并且在维 ...

  5. TX2 之tensorflow环境部署

    刷机jetpack3.3 首先TX2必须是3.3版本的jetpack,因为截止目前nvidia发布的tensorflow只支持3.3版本的jetpack,刷机的具体步骤可以参考NVIDIA Jetso ...

  6. python全栈开发学习_内容目录及链接

    python全栈开发学习_day1_计算机五大组成部分及操作系统 python全栈开发学习_day2_语言种类及变量 python全栈开发_day3_数据类型,输入输出及运算符 python全栈开发_ ...

  7. 洛谷P3980 [NOI2008]志愿者招募

    题解 最小费用最大流 每一天是一条边\((inf-a[i], 0)\) 然后对于一类志愿者, 区间两端连一条\((inf, c[i])\) \(S\)向第一个点连\((inf, 0)\) 最后一个点向 ...

  8. Smarty <= 3.1.32 Remote Code execution(CVE-2017-1000480)

    Smarty介绍   smarty是一个php模板引擎,其项目地址:https://github.com/smarty-php/smarty 测试环境搭建   下载:https://github.co ...

  9. SqlServer索引、优化、约束、连接

    索引的创建和删除 create index in_name on person(name) --创建索引 drop index person.in_name --删除索引 create index i ...

  10. Sublime Text 3新建工程

    1. 创建工程 Project > Add Folder to Project 这时在sidebar中将出现刚刚添加的文件目录,如果还需要添加其他目录,则重复这一操作即可. 2. 保存工程 Pr ...