对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文件出现了无法进行安装的签名问题, 不论是单个下载,还是删除本地所有已 ...
随机推荐
- 支付宝支付 微信支付SDK接口不统一? 盘他!
开发过支付宝.微信支付的同学都知道,微信的支付 API 设计感觉是 Java 开发工程师写的,远不如支付宝 SDK 的接口设计用起来顺手.在这里,统一封装微信支付和支付宝支付的API,使两种支付方 ...
- php在虚拟机和windows上的应用
学习目标:linux+apache+php合在一起的应用 在windows中三者的的关联及应用 php是apache的一个外挂程序,必须依靠web服务器才可以运行.当客户 ...
- 《我是一只IT小小鸟》(续)读书笔记——第八周
第三位作者强调了大学阶段规划的重要性,作者初入大学,一切都很新鲜想尝试,却缺乏对学习生活的规划.最终导致的是学习成绩的下降.其实编程也是一样,我们常常感到自己和那些大神的差距,感慨过后,往往也就罢了. ...
- 给 linux redis 设置密码
在redis.conf 找到 下面添加一行: 这样的话,密码就可以设置成123456,然后重启redis就可以了.
- day 03 作业 预科
目录 作业 1.简述变量的组成 2.简述变量名的命名规范 3.简述注释的作用 4.使用turtle库构造一幅图,贴在markdown文档中 作业 1.简述变量的组成 变量由变量名.赋值符号.变量值所组 ...
- MySQL Processlist--查看会话执行过的SQL情况
对于MySQL 5.7版本,可以使用sys.session视图来查看会话最后一次执行的SQL: SELECT * FROM sys.session WHERE CONN_ID = \G 其中sys.s ...
- GNS3、Wireshark、SecureCRT 环境部署
本次GNS3环境部署教程基于官方推荐的稳定版1.5.4.初次接触此软件,详细的使用方法不是很清楚,所以以此作为学习记录,仅供参考,后期补充. 软件介绍 GNS3 GNS3是一款具有图形化界面可以运行在 ...
- pandas之数据处理
首先,数据加载 pandas提供了一些用于将表格型数据读取为DataFrame对象的函数,期中read_csv和read_table这两个使用最多. 1.删除重复元素 使用duplicated()函数 ...
- zabbix4.2.5常见问题指南
一.zabbix配置postgres监控 rpm -ivh https://download.postgresql.org/pub/repos/yum/9.5/redhat/rhel-7-x86_64 ...
- SparkSQL读写外部数据源-jext文件和table数据源的读写
object ParquetFileTest { def main(args: Array[String]): Unit = { val spark = SparkSession .builder() ...