<八>JDBC_重构DAO查询方法
DAO类:
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import com.kk.jdbc.JDBCTools;
import com.kk.jdbc.ReflectionUtils;
public class DAO {
//insert、update、delete操作都可以包含其中
public void update(String sql,Object...args){
Connection con=null;
PreparedStatement ps=null;
try {
con=JDBCTools.getConnection();
ps=con.prepareStatement(sql);
for (int i = 0; i < args.length; i++) {
ps.setObject(i+1, args[i]);
}
ps.executeUpdate();
} catch (Exception e) {
JDBCTools.release(null,ps, con);
}
}
//查询一条记录,返回对应的对象
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;
}
//查询多条记录,返回对应的对象的集合
public <T> List<T> getForList(Class<T> clazz,String sql,Object...args){
List<T> list=new ArrayList<>();
Connection con=null;
PreparedStatement ps=null;
ResultSet rs=null;
try {
/*
* 1、得到结果集
*
* */
con=JDBCTools.getConnection();
ps=con.prepareStatement(sql);
for (int i = 0; i < args.length; i++) {
ps.setObject(i+1, args[i]);
}
rs=ps.executeQuery();
/*
* 2、处理结果集,得到Map的List,其中一个Map对象就是一条记录;
* key-->rs中列的别名
* value-->列的值
* */
List<Map<String, Object>> values = handleResultSetToMapList(rs);
/*
* 3、把Map的List转为clazz对应的集合,其中Map的key即为clazz对应的对象的propertyName
* value即为clazz对应对象的propertyValue.
* */
list=transfterMapListToBeanList(clazz, values);
} catch (Exception e) {
JDBCTools.release(rs, ps, con);
}
return list;
}
private <T> List<T> transfterMapListToBeanList(Class<T> clazz,List<Map<String, Object>> values)
throws InstantiationException, IllegalAccessException {
List<T> result=new ArrayList<>();
T bean=null;
//12、判断list是否为null,不为null遍历,将得到的每一个Map对象转为一个Class参数对应的Object对象
if (values.size()>0) {
for (Map<String, Object> m : values) {
bean=clazz.newInstance();
for (Map.Entry<String,Object> entry: m.entrySet()) {
String propertyName=entry.getKey();
Object value=entry.getValue();
ReflectionUtils.setFieldValue(bean, propertyName, value);
}
//13、把Object对象放入到list中
result.add(bean);
}
}
return result;
}
//处理结果集,得到Map的一个List,其中一个Map对应一条记录
private List<Map<String, Object>> handleResultSetToMapList(ResultSet rs) throws SQLException {
//5、准备一个List<Map<String,Object>>,一个Map对象对应一条记录
List<Map<String,Object>> values=new ArrayList<>();
List<String> columnLabels=getColumnLabels(rs);
Map<String,Object> map=null;
//7、处理ResultSet,使用while循环
while(rs.next()){
map=new HashMap<>();
for (String columnLabel:columnLabels) {
Object value=rs.getObject(columnLabel);
map.put(columnLabel, value);
}
//11、将填充好的Map对象放入list中
values.add(map);
}
return values;
}
//获取结果集的ColumnLabel对应的List
private List<String> getColumnLabels(ResultSet rs) throws SQLException{
List<String> labels=new ArrayList<>();
ResultSetMetaData rsmd=rs.getMetaData();
for (int i = 0; i < rsmd.getColumnCount(); i++) {
labels.add(rsmd.getColumnLabel(i+1));
}
return labels;
}
//返回某个对象的属性值
public <E> E getForValue(String sql,Object...args){
//1、得到结果集:该结果集应该只有一行且只有一列
Connection con=null;
PreparedStatement ps=null;
ResultSet rs=null;
try {
con=JDBCTools.getConnection();
ps=con.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{
JDBCTools.release(rs, ps, con);
}
//2、取得结果集的
return null;
}
}
单元测试类:
import java.sql.Date;
import java.util.List;
import org.junit.Test;
import com.kk.jdbc.Student;
public class DAOTest {
DAO dao=new DAO();
@Test
public void testUpdate() {
String sql="insert into customers(name,email,birth) values (?,?,?)";
dao.update(sql, "xiaoming","xm@.com",new Date(new java.util.Date().getTime()));
}
@Test
public void testGet() {
String sql="select FlowId flow_Id,Type,IDCard,ExamCard,StudentName from examstudent where FlowId=?";
Student stu=dao.get(Student.class,sql,1);
System.out.println(stu);
}
@Test
public void testGetForList() {
String sql="select FlowId flow_Id,Type,IDCard,ExamCard,StudentName from examstudent";
List<Student> st=dao.getForList(Student.class, sql);
System.out.println("向日葵:"+st);
}
@Test
public void testGetForValue() {
String sql="select ExamCard from examstudent where FlowId=?";
String examCard=dao.getForValue(sql, 13);
System.out.println(examCard);
sql="select max(grade) from examstudent";
int grade=dao.getForValue(sql);
System.out.println(grade);
}
}
<八>JDBC_重构DAO查询方法的更多相关文章
- <五>JDBC_利用反射及JDBC元数据编写通用的查询方法
此类针对javaBean类写了一个通用的查询方法,List<javaBean> 通用查询更新中...:通过学习,深刻体会到学会反射就等于掌握了java基础的半壁江山! 一.使用JDBC驱动 ...
- Java -- JDBC_利用反射及 JDBC 元数据编写通用的查询方法
先利用 SQL 进行查询,得到结果集: 利用反射创建实体类的对象:创建对象: 获取结果集的列的别名: 再获取结果集的每一列的值, 结合 3 得到一个 Map,键:列的别名,值:列的值: 再利用反射为 ...
- MyBatis学习--mybatis开发dao的方法
简介 使用Mybatis开发Dao,通常有两个方法,即原始Dao开发方法和Mapper接口开发方法. 主要概念介绍: MyBatis中进行Dao开发时候有几个重要的类,它们是SqlSessionFac ...
- 11Mybatis_mybatis开发Dao的方法
在介绍开发Dao的方法之前先介绍下SqlSession. 1.先介绍一下SqlSessionFactoryBuilder:通过SqlSessionFactoryBuilder创建会话工厂SqlSess ...
- 四 mybatis开发dao的方法
mybatis开发dao的方法 1.1 SqlSession使用范围 1.1.1 SqlSessionFactoryBuilder //以流的方式读取总的配置文件 Reader rea ...
- mybatis系列-04-mybatis开发dao的方法
4.1 SqlSession使用范围 4.1.1 SqlSessionFactoryBuilder 通过SqlSessionFactoryBuilder创建会话工厂SqlSession ...
- Hibernate查询方法总结
1. HQL查询 HQL是Hiberante官方推荐的Hibernate检索方式,它使用类似SQL的查询语言,以面向对象的方式从数据库中查询.可以使用HQL查询具有继承.多态和关 联关系的数据.在检索 ...
- Mybatis的原始dao开发方法
在进入主题之前先提一下sqlSession.sqlSession是一个面向用户(程序员)的接口. sqlSession中提供了很多操作数据库的方法,如: selectOne(返回单个对象).selec ...
- J2EE进阶(十七)Hibernate中常用的HQL查询方法(getHibernateTemplate())
J2EE进阶(十七)Hibernate中常用的HQL查询方法(getHibernateTemplate()) 当我们使用Hibernate进行数据的CRUD操作时,利用模版进行操作不失为一种方法. ...
随机推荐
- 前端进阶试题css(来自js高级前端开发---豪情)既然被发现了HOHO,那我就置顶了嘿嘿!觉得自己技术OK的可以把这套题目做完哦,然后加入高级前端的社区咯
http://www.cnblogs.com/jikey/p/4426105.html js高级前端开发加群方法(此群很难进,里面纯技术,严禁广告,水群) 完整题目做完发邮箱(jikeytang@16 ...
- mpp文件转换成jpg图片,可以用pdf文件做中转站
用project软件做了一个表,发现不能转换成图片,先把mpp文件转换成pdf文件,然后用PS打开pdf文件,存储为jpg格式就行了
- Android 手机摇一摇功能的实现
package myapplication.com.myapp.activity; public class Home_Activity extends AppCompatActivity{ //传感 ...
- Scrapy001-框架初窥
Scrapy001-框架初窥 @(Spider)[POSTS] 1.Scrapy简介 Scrapy是一个应用于抓取.提取.处理.存储等网站数据的框架(类似Django). 应用: 数据挖掘 信息处理 ...
- javax.validation.ConstraintViolationException---Hibernate后台实体校验
javax.validation.ConstraintViolationException ... 71 moreCaused by: javax.validation.ConstraintViola ...
- LeetCode 219 Contains Duplicate II
Problem: Given an array of integers and an integer k, find out whether there are two distinct indice ...
- C#设计模式之工厂方法
工厂方法模式: 1.不再提供一个按钮工厂类来统一负责所有产品的创建,而是将具体按钮的创建过程交给专门的工厂子类去完成 如果出现新的按钮类型,只需要为这种新类型的按钮定义一个具体的工厂类就可以创建该新按 ...
- 火狐min-height不兼容解决方法
我们在进行页面架构的时候,一般会分成三个section:header.body.footer.如下面这个页面: 这个时候我们就需要对body部分进行最小高度设置,才能避免footer部分出现在页面中间 ...
- C++ 基础知识复习(六)
操作系统部分: 79. 操作系统的最小调度单位:线程. 线程thread,进程process.一个进程至少包含一个线程,主线程,main thread. 80. 资源的最小单位是:进程. 81. 进程 ...
- PHP实现四种基本排序算法
前提:分别用冒泡排序法,快速排序法,选择排序法,插入排序法将下面数组中的值按照从小到大的顺序进行排序. $arr(1,43,54,62,21,66,32,78,36,76,39); 1. 冒泡排序 思 ...