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 学习个人感觉分为两种途径,第一种是在学校,在培训机构等地方学习. 有人指导:第二种是自学,通过视频,书籍,朋友等完成学习. 本文适合 自学,且基础薄弱或者无基础的人.先介绍下我 ...
随机推荐
- Sql解锁 数据库死锁检测
USE [DataBaseName]GO/****** Object: StoredProcedure [dbo].[sp_check_deadlock] Script Date: 07/04 ...
- jsp - 引用 jar包.
在jsp中使用不同的方式引用jar,准备的工作也不同.我接触过的有两种:1)直接在jsp页面中引用;2)在src下的java类中引用,然后在jsp中调用java类. 1)直接引用:可以将jar包丢到W ...
- 【转】Objective-C中的instancetype和id关键字
原文:http://blog.csdn.net/wzzvictory/article/details/16994913 一.什么是instancetype instancetype是clang 3.5 ...
- php实现无限级树型菜单(函数递归算法)
首先到数据库取数据,放到一个数组,然后把数据转化为一个树型状的数组,最后把这个树型状的数组转为html代码.也可以将第二步和第三步合为一步. 详细如下:1.数据库设计:脚本如下:CREATE TABL ...
- Linux 特殊权限位
特殊权限位 LINUX 基本权限有9位但是还有三位特殊权限. suid s(有x权限) S(没有x权限) 4 在用户权限的第三位 sgid s(有x权限) S(没有x权限) 2 在用户组权限的第三位 ...
- PHP设计模式之:策略模式
<?phpabstract class Strategy{ public abstract function AlgorithmInterface();} class ConcreteSt ...
- [C#学习]在多线程中如何调用Winform[转]
问题的产生: 我的WinForm程序中有一个用于更新主窗口的工作线程(worker thread),但文档中却提示我不能在多线程中调用这个form(为什么?),而事实上我在调用时程序常常会崩掉.请问如 ...
- Linux 防火墙设置,禁止某个ip访问
service iptables status 查看防火墙状态 service iptables start 开启防火墙 service iptables ...
- 关于UPdate用法的
updaterestore_base set restore_base.localcost =(select localcost from [nt2000\cpi].chongia2. ...
- url、base64 编码规则
UrlEncode 相关: URI所允许的字符分作保留与未保留. 保留字符是那些具有特殊含义的字符. 例如, 斜线字符用于URL (或者更一般的, URI)不同部分的分界符. 未保留字符没有这些特殊含 ...