JDBC高级部分
/**
采用模版类型,封装了基本数据的CRUD操作
基本属性从外部属性文件读取(如config.properties)
*/
public class BaseDao<T>
{
private InputStream in=this.getClass().getResourceAsStream("/com/tank/comm/config.properties");
private Properties properties=new Properties(); Connection conn=null;
PreparedStatement pstat=null;;
ResultSet res=null; /*public static void main(String[] args) {
System.out.println("----------");
new BaseDao().getConn();
System.out.println("----------");
}*/ public Connection getConn()
{
try
{
properties.load(in);
//System.out.println("加载文件路径");
Class.forName(properties.getProperty("driver"));
conn=DriverManager.getConnection(properties.getProperty("url"),
properties.getProperty("username"),
properties.getProperty("password"));
System.out.println("数据库连接成功!");
return conn;
}
catch(Exception ex)
{
ex.printStackTrace();
}
return null;
} /*
* 封装方法,用来执行insert,update,delete 功能
***/
public int executeUpdate(String sql,Object[]param)
{
int rows=0;
try
{ this.getConn();
pstat=conn.prepareStatement(sql);
if(param!=null&¶m.length!=0)
{ for(int x=0;x<param.length;x++)
{
pstat.setObject((x+1), param[x]); }
}
rows=pstat.executeUpdate();
}
catch(Exception ex)
{ ex.printStackTrace();
}
finally
{
this.closeAll(conn, pstat, res);
}
return rows; } /**
*封装执行select语句
* */
public List<T> executeQuery(String sql,Object[]param,Class<T> cls)
{
List<T> list = new ArrayList<T>(); this.getConn();
try
{
pstat=conn.prepareStatement(sql); if(param!=null&¶m.length!=0)
{ for(int x=0;x<param.length;x++)
{
pstat.setObject((x+1), param[x]); }
} res=pstat.executeQuery(); while(res.next())
{
//1 创建对象
T obj =cls.newInstance();
//对象属性赋值
Field []fs=cls.getDeclaredFields();
for(int x=0;x<fs.length;x++)
{
Field f=fs[x]; f.setAccessible(true);
//属性的类型
String ct = f.getType().getName();
String name=f.getName();
if(ct.equals("java.lang.String"))
{
f.set(obj, res.getString(name)); }
if(ct.equals("int"))
{
f.set(obj, res.getInt(name));
}
if(ct.equals("double"))
{
f.set(obj, res.getDouble(name)); }
if(ct.equals("java.sql.Date"))
{
f.set(obj, res.getDate(name)); }
if(ct.equals("char"))
{
f.set(obj, res.getString(name)); } } list.add(obj);
}
System.out.println("列表长度:"+list.size());
return list; }
catch(Exception ex)
{ ex.printStackTrace();
}
finally
{
this.closeAll(conn, pstat, res);
}
return null; }
/**
* 重载executeQuery方法
* 增加实体类的指定属性赋值
*
* @param sql 传入的sql语句
@param param 传入的参数数组
@param cls 传入的映射类(用由<T> 指定,避免出现类型转化等警告信息)
@param propertyList 属性集合,可以只为为映射类的指定属性赋值
* */
public List<T> executeQuery(String sql,Object[]param,Class<T> cls,List<String> propertyList){
List<T> list =new ArrayList<T>();
this.getConn();
try{
pstat=conn.prepareStatement(sql);
if(param!=null&¶m.length!=0)
{
for(int x=0;x<param.length;x++)
{
pstat.setObject((x+1), param[x]);
}
}
res=pstat.executeQuery(); //如果参数集合为空,返回上层默认实体类所有属性赋值
if(propertyList.isEmpty()){
this.executeQuery(sql, param, cls);
}else{
//不为空,则为集合内指定属性赋值
//取出实体类的所有属性
while(res.next()){
//创建实例对象
T obj=cls.newInstance();
//获取所有反射属性
Field fields[]=cls.getDeclaredFields();
for(int x=0;x<fields.length;x++)
{
Field f=fields[x];
f.setAccessible(true);
String fname=f.getName();
//判断集合是否包含该属性名,如果包含,为其赋值
if(propertyList.contains(fname)){
String ct=f.getType().getName();
if(ct.equals("java.lang.String"))
{
f.set(obj, res.getString((fname))); }
if(ct.equals("int"))
{
f.set(obj, res.getInt((fname)));
}
if(ct.equals("double"))
{
f.set(obj, res.getDouble((fname))); }
if(ct.equals("java.sql.Date"))
{
f.set(obj, res.getDate((fname))); }
if(ct.equals("char"))
{
f.set(obj, res.getString((fname)));
}
}
}
//将对象添加到集合
list.add(obj);
}
}
}catch(Exception e){
e.printStackTrace();
}finally{
this.closeAll(conn, pstat, res);
}
return list;
} //关闭连接,释放资源
public void closeAll(Connection conn,PreparedStatement pstat,ResultSet res)
{
try
{
if(res!=null)
{
res.close();
}
if(pstat!=null)
{
pstat.close();
}
if(conn!=null)
{
conn.close();
}
}
catch(Exception ex)
{
ex.printStackTrace();
}
} }
JDBC高级部分的更多相关文章
- JDBC高级特性(一)结果集,批量更新
一.ResultSet的高级特性 1 可滚动ResultSet 1)向前和向后滚动 滚动特性 在JDBC初期版本号中, ResultSet仅能向前滚动 在JDBC兴许版本号中, ResultSet默认 ...
- Java JDBC高级特性
1.JDBC批处理 实际开发中需要向数据库发送多条SQL语句,这时,如果逐条执行SQL语句,效率会很低,因此可以使用JDBC提供的批处理机制.Statement和PreparedStatemen都实现 ...
- JDBC高级特性(二)事务、并发控制和行集
一.事务 事务是指一个工作单元,它包括了一组加入,删除,改动等数据操作命令,这组命令作为一个总体向系统提交运行,要么都运行成功,要么所有恢复 在JDBC中使用事务 1)con.setAutoCommi ...
- JDBC高级篇(MYSQL)—— JDBC中初涉数据库事务
注意:其中的JdbcUtil是我自定义的连接工具类:代码例子链接: package d_transaction; import java.sql.Connection; import java.sql ...
- JDBC具体解释(2)
1.载入驱动程序. 注冊驱动程序有多方法,Class.forName();是一种显式地载入.当一个驱动程序类被Classloader装载后,在溶解的过程中,DriverManager会注冊这个驱动类的 ...
- Java Web学习路线
2016-08-22的早上,本是一个很平静的早上,坐在去往公司的公交车上想到了很多之前上学时的点点滴滴,回想起来还真的是耐人寻味啊,当初青春的懵懂,当初的冲动,当初的做事不考虑后果! 也正是这耐人寻味 ...
- JdbcTemplate操作数据库
1.JdbcTemplate操作数据库 Spring对数据库的操作在jdbc上面做了深层次的封装,使用spring的注入功能,可以把DataSource注册到JdbcTemplate之中.同时,为了支 ...
- 【黑马18期Java毕业生】黑马程序员Java全套资料+视频+工具
Java学习路线图引言: 黑马程序员:深知广大爱好Java的人学习是多么困难,没视频没资源,上网花钱还老被骗. 为此我们历时一个月整理这套Java学习路线图,不管你是不懂电脑的小 ...
- 零基础如何自学java开发?
开篇直奔主题,java 学习个人感觉分为两种途径,第一种是在学校,在培训机构等地方学习. 有人指导:第二种是自学,通过视频,书籍,朋友等完成学习. 本文适合 自学,且基础薄弱或者无基础的人.先介绍下我 ...
随机推荐
- 使用DataList 分页方法
什么是DataList我想应该不需要解释了,接下来分享本人在项目里使用到的通过DataList进行分页展示方法. 首先在ASPX页面添加一个DataList(后面都简称DL)控件,示例代码如下: &l ...
- ios专题 - openSSL
1 概述 1.1 产生背景 基 于万维网的电子商务和网上银行等新兴应用,极大地方便了人们的日常生活,受到人们的青睐.由于这些应用都需要在网络上进行在线交易,它们对网络通信的安全 性提出了更高的要求 ...
- redis【摘自网上,只为以后查看】
ubuntu安装启动redis 1.下载安装 cd /tmp wget http://redis.googlecode.com/files/redis-2.2.13.tar.gz tar -zxf r ...
- [转]setTimeout() 函数未定义错误
用 setTimeout("showMe()",1000) 时出现 showMe is not defined 错误.这是由于showMe() 函数不在 setTimeout 调用 ...
- 召回率与准确率[ZZ]
最近一直在做相关推荐方面的研究与应用工作,召回率与准确率这两个概念偶尔会遇到,知道意思,但是有时候要很清晰地向同学介绍则有点转不过弯来. 召回率和准确率是数据挖掘中预测.互联网中的搜索引擎等经常涉及的 ...
- C++判断Office版本——转载
自:http://blog.csdn.net/lpc_china/article/details/18359145 主要原理:查询windows注册表microsoft office软件项的值来判断版 ...
- BitMap(比特位)
所谓的Bit-map就是用一个bit位来标记某个元素对应的Value, 而Key即是该元素.由于采用了Bit为单位来存储数据,因此在存储空间方面,可以大大节省. 腾讯面试的时候,让写了一个BitMap ...
- C++重载流插入运算符和流提取运算符【转】
C++的流插入运算符“<<”和流提取运算符“>>”是C++在类库中提供的,所有C++编译系统都在类库中提供输入流类istream和输出流类ostream.cin和cout分别是 ...
- 用frame实现最基本的上中下三层布局,中间又分左右两部分.
用frame实现最基本的上中下三层布局,中间又分左右两部分. 用frame的好处在于不用象DIV一样要对浮动和大小进行精确控制,以及要考虑宽屏的时候怎么办.而且在导航的时候非常简单.比如说,左边是导航 ...
- yii2源码学习笔记(九)
Application是所有应用程序类的基类,接下来了解一下它的源码.yii2\base\Application.php. <?php /** * @link http://www.yiifra ...