/**
  采用模版类型,封装了基本数据的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&&param.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&&param.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&&param.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高级部分的更多相关文章

  1. JDBC高级特性(一)结果集,批量更新

    一.ResultSet的高级特性 1 可滚动ResultSet 1)向前和向后滚动 滚动特性 在JDBC初期版本号中, ResultSet仅能向前滚动 在JDBC兴许版本号中, ResultSet默认 ...

  2. Java JDBC高级特性

    1.JDBC批处理 实际开发中需要向数据库发送多条SQL语句,这时,如果逐条执行SQL语句,效率会很低,因此可以使用JDBC提供的批处理机制.Statement和PreparedStatemen都实现 ...

  3. JDBC高级特性(二)事务、并发控制和行集

    一.事务 事务是指一个工作单元,它包括了一组加入,删除,改动等数据操作命令,这组命令作为一个总体向系统提交运行,要么都运行成功,要么所有恢复 在JDBC中使用事务 1)con.setAutoCommi ...

  4. JDBC高级篇(MYSQL)—— JDBC中初涉数据库事务

    注意:其中的JdbcUtil是我自定义的连接工具类:代码例子链接: package d_transaction; import java.sql.Connection; import java.sql ...

  5. JDBC具体解释(2)

    1.载入驱动程序. 注冊驱动程序有多方法,Class.forName();是一种显式地载入.当一个驱动程序类被Classloader装载后,在溶解的过程中,DriverManager会注冊这个驱动类的 ...

  6. Java Web学习路线

    2016-08-22的早上,本是一个很平静的早上,坐在去往公司的公交车上想到了很多之前上学时的点点滴滴,回想起来还真的是耐人寻味啊,当初青春的懵懂,当初的冲动,当初的做事不考虑后果! 也正是这耐人寻味 ...

  7. JdbcTemplate操作数据库

    1.JdbcTemplate操作数据库 Spring对数据库的操作在jdbc上面做了深层次的封装,使用spring的注入功能,可以把DataSource注册到JdbcTemplate之中.同时,为了支 ...

  8. 【黑马18期Java毕业生】黑马程序员Java全套资料+视频+工具

        Java学习路线图引言:        黑马程序员:深知广大爱好Java的人学习是多么困难,没视频没资源,上网花钱还老被骗. 为此我们历时一个月整理这套Java学习路线图,不管你是不懂电脑的小 ...

  9. 零基础如何自学java开发?

    开篇直奔主题,java 学习个人感觉分为两种途径,第一种是在学校,在培训机构等地方学习. 有人指导:第二种是自学,通过视频,书籍,朋友等完成学习. 本文适合 自学,且基础薄弱或者无基础的人.先介绍下我 ...

随机推荐

  1. 读取 xml 文件 获取其中保存的数据信息

    建立一个存储过程来返回要读取的数据形成结果集: CREATE PROC dbo.getValuesFromXmlByPath@fileName NVARCHAR(128)asDECLARE @T XM ...

  2. 修改PYTHONPATH的一种方法(在Window平台和Ubuntu下都有效)

    1.显示PYTHONPATH 2.修改PYTHONPATH 通过PYTHONPATH 中的任何 .pth 文件来添加pythonpath.比如我想添加/home/aa这个路径到pythonpath里, ...

  3. CollectionView就是这么简单!

    UICollectionView 和 UICollectionViewController 类是iOS6 新引进的API,用于展示集合视图,布局更加灵活,可实现多列布局,用法类似于UITableVie ...

  4. Constant is not finite! That's illegal. constant:inf'

    原本使用正常的情况, 切换为测试库突然出现这个错误, 网上搜索并排查后得出导致这个问题的原因: (1)就是你的除数为0(2)除数或者被除数为null 找出你出错的界面, 并打断点, 看看是否出现上面两 ...

  5. PHP Ajax简单实例

    最近学习Jquery Ajax部分,通过简单例子,比较了下post,get方法的不同 HTML部分 <html> <head> <title>jQuery Ajax ...

  6. js学习--DOM操作详解大全二(window对象)

    一.window - 计时器 1、setTimeout()可以用来在指定的时间之后单次调用函数.setTimeount(f,1000);//一秒后调用函数fclearTimeout();取消函数的执行 ...

  7. sql server 数据库基础学习心得 思维导图

  8. bitVector@ java bit自我practice##Q&A:为何int 来初始化size of bitVector?long,甚至是BigInteger等策略

    /* * BitSets are packed into arrays of "words." Currently a word is * a long, which consis ...

  9. gocode 安装

    1.安装git,将git/bin添加至PATH 2.执行go get -u github.com/nsf/gocode 3.在%GOPATH%/bin/下会生成gocode.exe

  10. [python]文本处理1.2

    1.0初步完成了文本截取需要信息的处理 1.1 修复了格式所造成的遗漏字符 1.2 去除了遗漏字符中的多余字符 bug-文本test14 有遗漏字符 bug-修复的遗漏字符中含有\n 未被识别为换行符