/*
* 通用查询、更新升级版
* */
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方法进行优化改造,更接近于框架的编写的更多相关文章

  1. 2019第一期《python测试开发》课程,10月13号开学

    2019第一期<python测试开发>课程,10月13号开学! 主讲老师:上海-悠悠 上课方式:QQ群视频在线教学,方便交流 本期上课时间:10月13号-12月8号,每周六.周日晚上20: ...

  2. 西安活动 | 2019年1月13号 "拥抱开源, 又见.NET" 线下交流活动报名进行中

    随着.NET Core的发布和开源,.NET又重新回到人们的视野..NET Core的下个3.0即将release,加入非常多的新功能,越来越拥抱变化,DevOps和Microservice的最佳实践 ...

  3. 号外号外:9月13号《Speed-BI云平台案例实操--十分钟做报表》开讲了

    引言:如何快速分析纷繁复杂的数据?如何快速做出老板满意的报表?如何快速将Speed-BI云平台运用到实际场景中?         本课程将通过各行各业案例背景,将Speed-BI云平台运用到实际场景中 ...

  4. java内部类 2016年12月13号

    1.在外部类的任意位置创建内部类对象的方法: 1)从外部类的非静态方法之外的任意位置创建某个内部类的对象,必须指明这个对象所在的外部类和内部类:OuterClassName.InnerClassNam ...

  5. 7月13号day5总结

    今天学习过程和小结 使用伪分布式进行大数据计算,计算气象站记录气温的平均值 weather map()方法,key值数据多所以用LongWritable,value值是string类型,string类 ...

  6. 4月13号的web标准化交流化-开端

    这是实习工作的开始,也是正式踏入北京之后去参加的第一个活动.也算是想着法的去融入这个圈子. 这两个分享都是基于nodejs的.nodejs从11年开始就开始红火.但是真正nodejs能用来干什么? 我 ...

  7. 也记一次性能优化:LINQ to SQL中Contains方法的优化

    距离上一篇博文更新已经两个月过去了.在此,先表一表这两个月干了些啥: 世界那么大,我也想去看看.四月份的时候,我入职了上海的一家电商公司,职位是.NET高级开发工程师.工作一个月,最大的感受是比以前小 ...

  8. 5月25号开学! 第13期《python3自动化测试selenium+接口》课程,python零基础也能学

    2019年 第13期<python3自动化测试selenium+接口>课程,5月25号开学! 主讲老师:上海-悠悠 上课方式:QQ群视频在线教学 本期上课时间:5月25号-7月28号,每周 ...

  9. Microsoft在8月7号发布的帮助文档更新中,HelpLibrary2安装Cab文档包出现签名问题

    在VS 2017 8月2号发布15.7.6版本后,在8月7号推送了helpview程序中的绝大部分更新文档,在本次推送中多数Cab文件出现了无法进行安装的签名问题, 不论是单个下载,还是删除本地所有已 ...

随机推荐

  1. RHEL6搭建网络yum源软件仓库

    RHEL的更新包只对注册用户生效,所以需要自己手动改成Centos的更新包 一.查看rhel本身的yum安装包 rpm -qa | grep yum 二.卸载这些软件包 rpm -qa | grep ...

  2. PHP CI框架调试开启报错信息方法

    方法如下三种: 1.php.ini 设置 display_errors = On error_reporting = E_ALL | E_STRICT 2.ci index.php 设置 define ...

  3. DoNetCore Web Api 采用Swagger进行接口文档管理

    第一步:创建API项目 步骤这里不说明 第二步:就是Nuget 包, 两种方式:1.工具->Nuget管理->程序包管理控制台 Install-Package Swashbuckle.As ...

  4. 【书评:Oracle查询优化改写】第五至十三章

    [书评:Oracle查询优化改写]第五至十三章 一.1  BLOG文档结构图 一.2  前言部分 一.2.1  导读 各位技术爱好者,看完本文后,你可以掌握如下的技能,也可以学到一些其它你所不知道的知 ...

  5. java使用RSA与AES加密解密

    首先了解下,什么是堆成加密,什么是非对称加密? 对称加密:加密与解密的密钥是相同的,加解密速度很快,比如AES 非对称加密:加密与解密的秘钥是不同的,速度较慢,比如RSA 先看代码(先会用在研究) 相 ...

  6. Linux操作系统的计划任务

    Linux操作系统的计划任务 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.任务计划概述 Linux任务计划.周期性任务执行 未来的某时间点执行一次任务: at: 指定时间点, ...

  7. 拿webshell方法汇总

    地址:https://blog.csdn.net/Breeze_CAT/article/details/80044676

  8. Redis.Memcache和MongoDB区别?

    Memcached的优势: Memcached可以利用多核优势,单吞吐量极高,可以达到几十万QPS(取决于Key.value的字节大小以及服务器硬件性能,日常环境中QPS高峰大约在4-6w左右.)适用 ...

  9. 深度学习Keras框架笔记之Dense类(标准的一维全连接层)

    深度学习Keras框架笔记之Dense类(标准的一维全连接层) 例: keras.layers.core.Dense(output_dim,init='glorot_uniform', activat ...

  10. gitlab修改ip

    gitlab 修改ip的两种方式: 修改/etc/gitlab/gitlab.rd 里面的#external_url 'http://gitlab.example.com' 为ip地址,然后重新构建- ...