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 学习个人感觉分为两种途径,第一种是在学校,在培训机构等地方学习. 有人指导:第二种是自学,通过视频,书籍,朋友等完成学习. 本文适合 自学,且基础薄弱或者无基础的人.先介绍下我 ...
随机推荐
- dx环境搭建
我使用的是vs2012+DXSDK_Jun10 DXSDK_Jun10下载地址http://download.microsoft.com/download/A/E/7/AE743F1F-632B-48 ...
- YouTube视频代码总结
var tag = document.createElement('script'); tag.src = "https://www.youtube.com/iframe_api" ...
- 关于php的一些开源程序
最好用的当属thinksns,目前更新到4.3.4, 社交型网站. 此网站提供大量源码,有时间可以去看看:http://down.admin5.com/
- MySQL配置文件路径及‘The total number of locks exceeds the lock table size’问题
在删除mysql中的数据时,遇到报错: ERROR 1206 (HY000): The total number of locks exceeds the lock table size 查了查,发现 ...
- [Linux]Vim的安装及使用
1.安装:$sudo apt-get install vim 2.查看Vim所在路径$whereis vim 3.启动Vim $'/usr/bin/vim.tiny' 4. 退出Vim窗口:Ctrl ...
- 利用def生成dll文件
DLL中导出函数的声明有两种方式:一种为在函数声明中加上__declspec(dllexport),这里不再举例说明:另外一种方式是采用模块定义(.def) 文件声明,.def文件为链接器提供了有关被 ...
- TCP/IP笔记 应用层(2)——FTP
1. FTP(File Transfer Protocol) 文件传送协议 FTP 只提供文件传送的一些基本的服务,它使用 TCP 可靠的运输服务.FTP 的主要功能是减少或消除在不同操作系统下处理文 ...
- NET平台和C#
.NET平台和C#编程 一.深入.NET框架 1..NET框架具有两个组件:CLR(公共语言运行时)和FCL(框架类库),CLR是.NET框架的基础 2.框架核心类库: System.Collecti ...
- ibatis错误
java.lang.IllegalArgumentException: Mapped Statement collection already contains value for com.regin ...
- div+css知识点(2)
文字溢出 显示省略号的 关键的三句代码text-overflow:ellipsis; -o-text-overflow:ellipsis; overflow:hidden;文字缩进的代码是什么text ...