对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文件出现了无法进行安装的签名问题, 不论是单个下载,还是删除本地所有已 ...
随机推荐
- php精度比较函数bccomp
bccomp (PHP 4, PHP 5, PHP 7) bccomp — 比较两个任意精度的数字 说明 int bccomp ( string $left_operand , string $rig ...
- python3基础之“术语表(2)”
51.编程: 让计算机执行的指令. 52.代码: 让计算机执行的命令. 53.底层编程语言: 与高级语言相比,更接近二进制的语言. 54.高级编程语言: 读起来像英语的易于理解的语言. 55.汇编语言 ...
- provide inject应用及和props对比
之前本人写过几篇element ui源码解析,其中提到provide/inject,当时只是匆匆带过,没有做深入研究,直到后来一次开发,需要实现孙组件更改父组件的值才想起来,原来这一对属性有如此大的用 ...
- JavaScript之轮播图
(1)html <div class="box" id="box"> <ul class="uls" id="u ...
- Python illustrating Downhill simplex method for minimizing the user-supplied scalar function的代码
学习过程,把代码过程较好的代码段做个记录,如下的代码段是关于Python illustrating Downhill simplex method for minimizing the user-su ...
- Trunk 实现跨交换机 VLAN 通信
当网络中有多台交换机时,位于不同交换机上的相同VLAN的主机之间时如何通信的呢?我们使用Trunk实现跨交换机VLAN通信.还有以太网通道的操作哦. 实验拓扑 两台交换机直连,每台下面再连接两台VPC ...
- ArcGIS操作技巧——怎样把地图放到PPT中,并且进行编辑?
需求:把arcgis配好的矢量地图插入到ppt中,并且要求可以在PPT中进行修改和重新着色.编辑. 效果:如下图所示: 操作过程: 方法一: 在最上面工具栏找到edit——>copy map t ...
- jmeter+nmon+crontab简单的执行接口定时压测
一.概述 临时接到任务要对系统的接口进行压测,上面的要求就是:压测,并发2000 在不熟悉系统的情况下,按目前的需求,需要做的步骤: 需要有接口脚本 需要能监控系统性能 需要能定时执行脚本 二.观察 ...
- moviepy改进的想码
这个要比前一个厚实点. 更改视频亮度,增加字幕,去除音轨,淡入特效,转换,截取时间,控制位置,组合图框,合成多段, 嗯,很多都有了. from django.test import TestCase ...
- unix域套接字
对于本地通信,unix域套接字通信是internet通信速度的2倍