在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. Bootstrap中表单控件状态(验证状态)

      Bootstrap 表单 http://www.runoob.com/try/try2.php?filename=bootstrap3-form-controlstate (这链接里有简介) &l ...

  2. Java中将图片保存到数据库中

    在实际的开发中,我们可能需要将图片.影音等文件直接保存到数据库中,然后通过编程方式将数据读出进行使用.例如将读出的图片数据显示出来,将读出的电影文件播放出来. 二进制数据直接保存到文件和从文件中读出非 ...

  3. 使用 Hexo + github 搭建个人博客

    来自:http://www.cnblogs.com/fengzheng/p/8031518.html Hexo 是什么 Hexo 是一个快速.简洁且高效的博客框架.Hexo 使用 Markdown(或 ...

  4. PrefixLength的计算

    直接用android4.2.2的源码来说话: \frameworks\base\services\java\com\android\server\NetworkManagementService.ja ...

  5. SQL Server——存储过程(Stored Procedure)、事物、触发器

    存储过程(proc 或 procedure) 存储过程(Stored Procedure),计算机用语,是一组为了完成特定功能的SQL语句集,是利用SQL Server所提供的Transact-SQL ...

  6. 使用Chrome-headless模式下,截屏不全屏的问题

    在headless模式下,是没有打开浏览器窗口的,那么driver.maximize_window(),找不到目标也打不开. 我们可以换一种方式,去在无头模式下,指定浏览器的窗口大小运行即可. __o ...

  7. windows下vim中文乱码处理

    现象:gvim安装后,打开中文utf-8编码的文件中文显示乱码 处理:1.启动gvim8.0,菜单 ”编辑“->"启动设定"在文件最开始处添加如下两行set fileenco ...

  8. java运行时的内存区域

    1.概述 java虚拟机在执行java程序的过程中会把它所管理的内存划分为若干个不同的数据区域. 这些区域都有各自的用途,以及创建和销毁的时间,有的区域随着虚拟机进程的启动而存在,有些区域则依赖用户线 ...

  9. Codeforces Round #555 (Div. 3) E. Minimum Array 【数据结构 + 贪心】

    一 题面 E. Minimum Array 二 分析 注意前提条件:$0 \le  a_{i} \lt n$ 并且 $0 \le  b_{i} \lt n$.那么,我们可以在$a_{i}$中任取一个数 ...

  10. HttpClient 工具类

    package com.sys.utils; import java.io.IOException; import java.net.URI; import java.util.ArrayList; ...