您的位置:首页 > 编程语言 > Java开发

利用Java的反射、泛型以及动态参数实现JDBC工具类

2017-09-22 21:35 711 查看
利用Java的反射、泛型以及动态参数实现JDBC工具类,对于初学者来讲,除了可以锻炼编程思维,也为理解框架技术打下良好基础。分享给大家!

同时由于时间关系,本人将在本博客中陆续推出高级框架阶段的系列教程,现已经发布如下几篇,如果对大家有帮助也请各位给点鼓励吧 ,比如关注微博、顶一下或者给点评论,谢谢!

http://blog.csdn.net/dl0246/article/details/77996811 SSM框架CRUD操作&批量删除&批量追加数据(Oracle&MySQL数据库)

http://blog.csdn.net/dl0246/article/details/77966611 诸多设计模式中,最为常见的三种设计模式-单例模式,代理模式,工厂模式

http://blog.csdn.net/dl0246/article/details/78251319 SpringMVC入门及系列教程(一)-SpringMVC环境搭建及入门案例(详细)

http://blog.csdn.net/dl0246/article/details/78259612 SpringMVC入门及系列教程(二)-SpringMVC请求周期及响应处理(初级)(详细)

http://blog.csdn.net/dl0246/article/details/78274343 SpringMVC入门及系列教程(三)-请求的映射(详细)

http://blog.csdn.net/dl0246/article/details/78286685 SpringMVC入门及系列教程(四)-SpringMVC在控制器中获取请求中的参数值(详细)

http://blog.csdn.net/dl0246/article/details/78390587 SpringMVC入门及系列教程(五)-响应处理&响应参数处理&SpringMVC作用域对象&SpringMVC原生Servlet对象

http://blog.csdn.net/dl0246/article/details/77996811 SSM框架CRUD操作&批量删除&批量追加数据(Oracle&MySQL数据库)

package com.rock.util;

import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;

import org.apache.commons.beanutils.BeanUtils;

/**
*
* FileName:    com.rock.util   JDBCUtil.java
* TODO:        JDBC的工具类
* Copyright:   Copyright (c) 2015-2016 All Rights Reserved. Company: 01skill-soft.com Inc.
* @author:     Rock
* @Date:       2017年6月8日:上午9:16:41
* @version:    1.0
*
*           Modification History: Date         Author      Version     Description
*           ----------------------------------------------------------------------
*                                 2017年6月8日    Rock        1.0         1.0 Version
*
*/
public class JDBCUtil {
static{
try {
Class.forName("oracle.jdbc.OracleDriver");
} catch (ClassNotFoundException e) {
//          e.printStackTrace();
Err.err(e,"加载数据库驱动异常,静态语句块异常,具分许原因可能是没有导入相关的jar包导致.......");

}
}

/**
* 专门用于执行DML语句的方法
* @param sql
* @return
*/
public int runSql(String sql){
Connection conn=getConnection();
PreparedStatement stmt=null;
try {
stmt=conn.prepareStatement(sql);
return stmt.executeUpdate();
} catch (SQLException e) {
//          e.printStackTrace();
Err.err(e,"运行普通的DML文异常,public int runSql(String sql)");
}
finally{
release(null, stmt, conn);
}
return 0;
}
//  根据表的主键列检索数据   要么一行数据没有要么只有一行
/**
* @Author   :Rock
* @Date     :2017年6月8日 下午4:27:26
* @TODO     :获取指定ID的一条数据,以其实体实例返回
* @Arguments:@param sql  :where id=值的DQL语句
* @Arguments:@param clazz:实体类class
* @Arguments:@param args:sql中的参数  动态参数
* @Arguments:@return
*/
public <T>T queryById(String sql,Class<T> clazz,Object ... args){
Connection conn=this.getConnection();
PreparedStatement stmt=null;
ResultSet rs=null;
try {
stmt=conn.prepareStatement(sql);

for(int i=0;i<args.length;i++)
stmt.setObject(i+1, args[i]);
rs=stmt.executeQuery();
ResultSetMetaData meta=rs.getMetaData();
T t=null;
if(rs.next()){
t=clazz.newInstance();
int count=meta.getColumnCount();
for(int i=0;i<count;i++){
BeanUtils.copyProperty(t, meta.getColumnName(i+1).toLowerCase(), rs.getObject(i+1));
}
}
return t;

} catch (Exception e) {
//          e.printStackTrace();
Err.err(e,"运行根据ID获取指定实体信息的的DQL文异常,public <T>T queryById(String sql,Class<T> clazz,Object ... args)");
}

return null;
}
/**
* query("select * from book");
* query("select * from news");
* query("select * from emp");
* query("select * from booktype");
* @Author   :Rock
* @Date     :2017年6月8日 下午1:17:14
* @TODO     :
* @Arguments:@param sql
* @Arguments:@return
*/
/*{
query("select * from book" ,Book.class);
query("select * from booktype" ,BookType.class);
}*/
public <T>List<T> query(String sql,Class<T> clazz){
Connection conn=this.getConnection();
PreparedStatement stmt=null;
ResultSet rs=null;
List<T> all=new ArrayList<T>();
try {
stmt=conn.prepareStatement(sql);
rs=stmt.executeQuery();
ResultSetMetaData meta=rs.getMetaData();
while(rs.next()){
T t=clazz.newInstance();//将
int count=meta.getColumnCount();
for(int i=1;i<=count;i++){   ///循环了结果集中封装了几列数据。
/*copyProerty(Javabean对象,对象中的变量名,值);
copyProerty(Book,bname,值);
将值赋给Book类的bname属性中存储*/
BeanUtils.copyProperty(t, meta.getColumnName(i).toLowerCase(), rs.getObject(i));
}
all.add(t);
}
} catch(Exception e) {
//          e.printStackTrace();
Err.err(e,"运行不带参数的DQL文异常,public <T>List<T> query(String sql,Class<T> clazz)");
}
return all;
}
/**
* @Author   :Rock
* @Date     :2017年6月8日 下午1:36:28
* @TODO     :完成带有?占位符的select语句的执行
* @Arguments:@param sql
* @Arguments:@param clazz
* @Arguments:@return
*/
public <T>List<T> query(String sql,Class<T> clazz,Object...args){
Connection conn=this.getConnection();
PreparedStatement stmt=null;
ResultSet rs=null;
List<T> all=new ArrayList<T>();
try {
stmt=conn.prepareStatement(sql);
//给SQL语句中的?占位符传递具体的参数
for(int i=0;i<args.length;i++)
stmt.setObject(i+1, args[i]);

rs=stmt.executeQuery();
ResultSetMetaData meta=rs.getMetaData();
while(rs.next()){
T t=clazz.newInstance();//利用java中的反射机制 创建实体类(JavaBean)的对象
int count=meta.getColumnCount();
for(int i=1;i<=count;i++){
//                  将结果集中的值存于t这个对象的指定变量中存储 bid
BeanUtils.copyProperty(t, meta.getColumnName(i).toLowerCase(), rs.getObject(i));
}
all.add(t);
}

} catch (Exception e) {
//          e.printStackTrace();
Err.err(e,"运行带参数的DQL文异常,public <T>List<T> query(String sql,Class<T> clazz,Object...args)");
}
return all;
}

/**
* 专门用于执行DML语句的方法  带有?号参数的DML语句的执行
* @param sql
* @return
* String ... args  就是定义了一个动态数组参数    run("delete....","1","2","3");
* String[] args;的概念,
* args:就是数组的对象名称,
*/

public int runSql(String sql,Object ... args){
Connection conn=getConnection();
PreparedStatement stmt=null;
try {
stmt=conn.prepareStatement(sql);
for(int i=0;i<args.length;i++){
stmt.setObject(i+1, args[i]);
}
return stmt.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
Err.err(e,"运行带参数的DML文异常,public int runSql(String sql,Object ... args)");
}
finally{
release(null, stmt, conn);
}
return 0;
}
/**
* @Author   :Rock
* @Date     :2017年6月8日 上午10:19:42
* @TODO     :关闭数据库对象
* @Arguments:@param rs
* @Arguments:@param stmt
* @Arguments:@param conn
*/
private void release(ResultSet rs, Statement stmt, Connection conn) {
try {
if (rs != null)
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
try {
if (stmt != null)
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
try {
if (conn != null)
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}

/**
* @Author   :Rock
* @Date     :2017年6月8日 上午10:19:59
* @TODO     :获得数据库连接对象
* @Arguments:@return
*/
private Connection getConnection(){
Connection connection = null;
Properties properties = new Properties();
try {
String initFile=System.getProperty("user.dir").substring(System.getProperty("user.dir").lastIndexOf("\\")+1)+"-config.properties";
System.out.println(System.getProperty("user.dir"));
System.out.println(initFile);
properties.load(JDBCUtil.class.getResourceAsStream("/"+initFile));

connection = DriverManager.getConnection(properties.getProperty("oracle.url"),properties.getProperty("oracle.user"),properties.getProperty("oracle.password"));
return connection;

} catch (Exception e) {
//          e.printStackTrace();
Err.err(e,"获取数据库连接错误private Connection getConnection()");
}
return null;
}
}


由于时间关系,本人将在本博客中陆续推出高级框架阶段的系列教程,现已经发布如下几篇,如果对大家有帮助也请各位给点鼓励吧 ,比如关注微博、顶一下或者给点评论,谢谢!

http://blog.csdn.net/dl0246/article/details/77996811 SSM框架CRUD操作&批量删除&批量追加数据(Oracle&MySQL数据库)

http://blog.csdn.net/dl0246/article/details/77966611 诸多设计模式中,最为常见的三种设计模式-单例模式,代理模式,工厂模式
http://blog.csdn.net/dl0246/article/details/7825 afff
1319 SpringMVC入门及系列教程(一)-SpringMVC环境搭建及入门案例(详细)

http://blog.csdn.net/dl0246/article/details/78259612 SpringMVC入门及系列教程(二)-SpringMVC请求周期及响应处理(初级)(详细)

http://blog.csdn.net/dl0246/article/details/78274343 SpringMVC入门及系列教程(三)-请求的映射(详细)

http://blog.csdn.net/dl0246/article/details/78286685 SpringMVC入门及系列教程(四)-SpringMVC在控制器中获取请求中的参数值(详细)

http://blog.csdn.net/dl0246/article/details/78390587 SpringMVC入门及系列教程(五)-响应处理&响应参数处理&SpringMVC作用域对象&SpringMVC原生Servlet对象

http://blog.csdn.net/dl0246/article/details/77996811 SSM框架CRUD操作&批量删除&批量追加数据(Oracle&MySQL数据库)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐