对5月13号中BaseDao方法进行优化改造,更接近于框架的编写
/*
* 通用查询、更新升级版
* */
public class BaseDao2 {
static {
try {
Class.forName(ConfigUtil.getValue("driver"));
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
} public Connection getConn(){
try {
return DriverManager.getConnection(ConfigUtil.getValue("url"),
ConfigUtil.getValue("username"),
ConfigUtil.getValue("password"));
} catch (SQLException e) {
e.printStackTrace();
return null;
}
} public void close(ResultSet rs, PreparedStatement ps, Connection conn){
try {
if(rs != null) {
rs.close();
}
if(ps != null){
ps.close();
}
if(conn != null){
conn.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
} /*
* 返回一条查询记录
* 输入参数Object[] obj中存放sql语句中变量的值
* */
public Object search(String sql, Object[] obj, Class<?> clz){
Connection conn = getConn();
PreparedStatement ps = null;
ResultSet rs = null;
try {
ps = conn.prepareStatement(sql);
if(obj != null && obj.length>0){
for(int i=0; i<obj.length; i++) {
ps.setObject(i + 1, obj[i]);
}
}
rs = ps.executeQuery();
if(!rs.next()){
return null;
}
/*
* 在此处应该要给对象赋值,但遇到了以下问题
* 如何确定列数?
* 如何确定列名?
* 如何确定查询的是哪个对象?
* */
return doResultSet(rs,clz);
} catch (SQLException e) {
throw new RuntimeException();
}finally {
close(null, ps, conn);
}
} /*
* 运用java反射机制,编写通用类,Class<?>表示不知道传入的会是什么类型的数据,因此用?代替
* */
public Object doResultSet(ResultSet rs, Class<?> clz){
Object bean = null;
try {
bean = clz.newInstance(); //对象实例化
ResultSetMetaData metaData = rs.getMetaData(); //获取元数据
int colCount = metaData.getColumnCount(); //获取列数
for(int i=0; i<colCount; i++){
Object colValue = rs.getObject(i+1); //获取列的值
String colName = metaData.getColumnName(i+1);
Field f = clz.getDeclaredField(colName);
f.setAccessible(true); //取消某些检测
f.set(bean,colValue); //将从数据库获取的值传递给bean对象
} } catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
} catch (NoSuchFieldException e) {
e.printStackTrace();
}
return bean;
} /*
* 查询对象为List,即有多条查询记录
* */
public Object searchList(String sql,Object[] obj,Class<?> clz){
PreparedStatement ps = null;
ResultSet rs = null;
Connection conn = getConn();
try {
ps = conn.prepareStatement(sql);
if(obj != null && obj.length>0) {
for (int i = 0; i < obj.length; i++) {
ps.setObject(i + 1, obj[i+1]);
}
}
rs = ps.executeQuery();
if(!rs.next()){
return null;
}
return doResultSetList(rs, clz);
} catch (SQLException e) {
e.printStackTrace();
return null;
}finally {
close(rs,ps,conn);
}
} public List<Object> doResultSetList(ResultSet rs,Class<?> clz){
List<Object> list = new ArrayList<Object>();
try {
while(rs.next()) {
Object bean = clz.newInstance();
ResultSetMetaData metaData = rs.getMetaData();
int colCount = metaData.getColumnCount();
for (int i = 0; i < colCount; i++) {
String colName = metaData.getColumnName(i + 1);
Object colValue = rs.getObject(i + 1);
Field f = clz.getDeclaredField(colName);
f.setAccessible(true);
f.set(bean, colValue);
}
list.add(bean);
}
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
} catch (NoSuchFieldException e) {
e.printStackTrace();
}
return list;
} public int update(String sql, Object[] obj){
Connection conn = getConn();
PreparedStatement ps = null;
try {
ps = conn.prepareStatement(sql);
if(obj != null && obj.length>0) {
for (int i = 0; i < obj.length; i++) {
ps.setObject(i+1,obj[i]);
}
}
return ps.executeUpdate();
} catch (SQLException e) {
throw new RuntimeException();
}finally {
close(null,ps,conn);
}
}
}
对5月13号中BaseDao方法进行优化改造,更接近于框架的编写的更多相关文章
- 2019第一期《python测试开发》课程,10月13号开学
2019第一期<python测试开发>课程,10月13号开学! 主讲老师:上海-悠悠 上课方式:QQ群视频在线教学,方便交流 本期上课时间:10月13号-12月8号,每周六.周日晚上20: ...
- 西安活动 | 2019年1月13号 "拥抱开源, 又见.NET" 线下交流活动报名进行中
随着.NET Core的发布和开源,.NET又重新回到人们的视野..NET Core的下个3.0即将release,加入非常多的新功能,越来越拥抱变化,DevOps和Microservice的最佳实践 ...
- 号外号外:9月13号《Speed-BI云平台案例实操--十分钟做报表》开讲了
引言:如何快速分析纷繁复杂的数据?如何快速做出老板满意的报表?如何快速将Speed-BI云平台运用到实际场景中? 本课程将通过各行各业案例背景,将Speed-BI云平台运用到实际场景中 ...
- java内部类 2016年12月13号
1.在外部类的任意位置创建内部类对象的方法: 1)从外部类的非静态方法之外的任意位置创建某个内部类的对象,必须指明这个对象所在的外部类和内部类:OuterClassName.InnerClassNam ...
- 7月13号day5总结
今天学习过程和小结 使用伪分布式进行大数据计算,计算气象站记录气温的平均值 weather map()方法,key值数据多所以用LongWritable,value值是string类型,string类 ...
- 4月13号的web标准化交流化-开端
这是实习工作的开始,也是正式踏入北京之后去参加的第一个活动.也算是想着法的去融入这个圈子. 这两个分享都是基于nodejs的.nodejs从11年开始就开始红火.但是真正nodejs能用来干什么? 我 ...
- 也记一次性能优化:LINQ to SQL中Contains方法的优化
距离上一篇博文更新已经两个月过去了.在此,先表一表这两个月干了些啥: 世界那么大,我也想去看看.四月份的时候,我入职了上海的一家电商公司,职位是.NET高级开发工程师.工作一个月,最大的感受是比以前小 ...
- 5月25号开学! 第13期《python3自动化测试selenium+接口》课程,python零基础也能学
2019年 第13期<python3自动化测试selenium+接口>课程,5月25号开学! 主讲老师:上海-悠悠 上课方式:QQ群视频在线教学 本期上课时间:5月25号-7月28号,每周 ...
- Microsoft在8月7号发布的帮助文档更新中,HelpLibrary2安装Cab文档包出现签名问题
在VS 2017 8月2号发布15.7.6版本后,在8月7号推送了helpview程序中的绝大部分更新文档,在本次推送中多数Cab文件出现了无法进行安装的签名问题, 不论是单个下载,还是删除本地所有已 ...
随机推荐
- 日志 logback-spring.xml配置
文章转载自: https://blog.csdn.net/xu_san_duo/article/details/80364600 logback-spring.xml配置文件 1. 自己改下value ...
- Centos7搭建Harbor私有仓库(一)
1 说明 前文Centos7搭建DockerRegistry介绍了DockerRegistry的搭建,但它没有UI页面,因此选择Harbor 以下基于镜像CentOS-7-x86_64-Minimal ...
- RS232、RS485和TTL电平与串行通信
RS232.RS485和TTL 作为一个底层软件开发工程师,经常会碰到RS232.RS485和TTL这一类的问题. 之前总是碰到问题之后Google一下,把当下的问题解决了之后就不管了,过个一两天就忘 ...
- python正则表达式练习题
# coding=utf-8 import re # 1. 写一个正则表达式,使其能同时识别下面所有的字符串:'bat','bit', 'but', 'hat', 'hit', 'hut' s =&q ...
- SQLAlchemy多对多
创建多对多表 from sqlalchemy.ext.declarative import declarative_base Base=declarative_base() from sqlalche ...
- 【python】raise_for_status()抛出requests.HTTPError错误
1.首先看下面代码的运行情况 import requests res = requests.get("https://www.csdn.net/eee", headers=head ...
- CodeForces - 95E: Lucky Country (多重背包)
pro:给定N个点,M条边,现在你要给一些连通块加边,使得至少存在一个连通块的大小是由4和7组成的数字.问至少加边数量. sol: 看似一个很难的题目. 首先不要想太难了,还是应该想能不能用背包做. ...
- fullcalendar + qTip2显示事件详情
fullcalendar 是一个很优秀的日历插件.qTip2 是一个强大的提示工具.在讲下面的功能之前,需要对fullcalendar 和 qTip2 有些了解,可直接点击下面贴出的2个地址: ful ...
- 【转】.NET Core 事件总线,分布式事务解决方案:CAP
[转].NET Core 事件总线,分布式事务解决方案:CAP 背景 相信前面几篇关于微服务的文章也介绍了那么多了,在构建微服务的过程中确实需要这么一个东西,即便不是在构建微服务,那么在构建分布式应用 ...
- LeetCode 740. Delete and Earn
原题链接在这里:https://leetcode.com/problems/delete-and-earn/ 题目: Given an array nums of integers, you can ...