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操作表字段
1.增加字段 alter table docdsp add dspcodechar(200)2.删除字段 ALTER TABLE table_NAME DROP COLUMNc ...
- SQL使用数据库引擎存储过程,系统视图查询,DBA,BI开发人员必备基础知识
在开发过程中会遇到需要弄清楚这个数据库什么时候建的,这个数据库中有多少表,这个存储过程长的什么样子等等信息,今天把自己工作过程中经常用到的一些数据库引擎存储过程,系统视图等等总结一下以备不时之用.下面 ...
- [转]看看国外的javascript题目,你能全部做对吗?
叶小钗 的博客最近都在讨论面试题目 正好以前也看过一篇,就借花献佛拿出来分享一下 http://perfectionkills.com/javascript-quiz/ 附带了自己的理解,答案有争议的 ...
- 视频处理简单实例 [OpenCV 笔记2]
VideoCapture是OpenCV 2.X中新增的类,提供从摄像机或视频文件捕获视频的C++接口.利用它读入视频的方法一般有两种: // method 1 VideoCapture capture ...
- Qt5对付中文真好用
Qt好多C++程序员都在用,Qt4大家可能用的多,到了Qt5不熟悉的人到是很多,其中我喜欢的特性也是和Qt4大不一样的地方就是对中文的处理. Qt4中使用“QTextCodec::setCodecFo ...
- angularJs 页面筛选标签小功能
页面html: <div class="bar bar-calm bar-header"> <div class="title">新闻分 ...
- PLSQL性能优化技巧
1.理解执行计划1-1.什么是执行计划 oracle数据库在执行sql语句时,oracle的优化器会根据一定的规则确定sql语句的执行路径,以确保sql语句能以最优性能执行.在oracle数据库系统中 ...
- Android 进程和文件的UID/GID
一.文件的操作权限和UID,GID以及进程的UID,GID 1. 文件资源的权限力度:UID/GID 2. 文件的可操作权限 3. 进程的标识: PID, UID, GID, GIDs 二.UID,G ...
- 【算法】改进的冒泡排序 O(n^2) 稳定的 C语言
改进的冒泡排序 一.算法描述 基于原冒泡排序 每次选取第一个元素作为主元往后进行比较,若遇到比它小的则放到它左边(即进行交换),若遇到比它大的则选取大的作为主元进行后续比较,每趟选取了无序列中最大元素 ...
- 轻量级表格插件Bootstrap Table。拥有强大的支持固定表头、单/复选、排序、分页、搜索及自定义表头等功能。
Bootstrap Table是轻量级的和功能丰富的以表格的形式显示的数据,支持单选,复选框,排序,分页,显示/隐藏列,固定标题滚动表,响应式设计,Ajax加载JSON数据,点击排序的列,卡片视图等. ...