`

利用反射封装的JDBC工具类

阅读更多
/**
* JDBC工具类
*/
public class JdbcUtils {

private static final Logger logger = Logger.getLogger(JdbcUtils.class);//这种情况下默认使用logger打印,如是只打印到自定义的logger就获取自定义的logger的名称

         //这里使用的是c3p0数据源
private static DataSource dataSource;
        
         //数据源通过静态块进行初始化,保证在字节码加载时就初始话,且只初始化一次
static {
dataSource = new ComboPooledDataSource();
}
         
// 获得数据源连接池
public static DataSource getDateSource() {
return dataSource;
}

// 获得与指定数据库的连接
public static Connection getConnection() throws SQLException {
return dataSource.getConnection();
}

// 统一的释放资源方法
public static void release(ResultSet rs, Statement stmt, Connection conn) {
if (rs != null) {
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
rs = null;
}
if (stmt != null) {
try {
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
stmt = null;
}
if (conn != null) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
conn = null;
}
}

// 通用的增删改方法
public static boolean update(String sql, Object[] params) throws DaoException{
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
try {
conn = getConnection();
conn.setAutoCommit(false);//将事物默认提交设置为flase
pstmt = conn.prepareStatement(sql);
for (int i = 0; params != null && i < params.length; i++)
pstmt.setObject(i + 1,params[i]);//通过setObject设置参数所对应的值。sql语句的参数用?占位
int num = pstmt.executeUpdate();//executeUpdate会返回影响结果的条数
conn.commit();
conn.setAutoCommit(false);
if (num > 0)
return true;
return false;
} catch (SQLException e) {
if(conn != null){
try {
conn.rollback();
} catch (SQLException e1) {
throw new DaoException(e1);
}
}
throw new DaoException(e);
} finally {
release(rs, pstmt, conn);
}
}

/**
* @author
* @since
* @throws
* @description 对数据进行批量添加,当数据量大于100时,则整除1000时提交一次,wbs里存放的是批量数值数组的集合
*/
public static boolean updateBatch(String sql,List wbs) throws DaoException{
logger.info("批量添加开始");
Calendar calendar = Calendar.getInstance();
long startTime = calendar.getTimeInMillis();
calendar = null;
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
int count = 0;
boolean flag = false;
try {
conn = getConnection();
conn.setAutoCommit(false);
pstmt = conn.prepareStatement(sql);
for(Iterator it = wbs.iterator();it.hasNext();){
Object[] params = (Object[])it.next();
count++;
for (int i = 0; params != null && i < params.length; i++){
pstmt.setObject(i + 1, params[i]);
}
pstmt.addBatch();//将一批参数添加到pstmt对象的批处理命令
    if(count % 100 == 0){
    pstmt.executeBatch();
    conn.commit();//当数量到100时提交
    flag = true;
    }
}
pstmt.executeBatch();
conn.commit();
conn.setAutoCommit(true);
flag = true;
if(flag){
logger.info("批量添加结束");
Calendar calendarOld = Calendar.getInstance();
long endTime = calendarOld.getTimeInMillis();
//logger.info("批量添加共耗时:"+(endTime-startTime)+"ms");
logger.info("批量添加共耗时:"+(endTime-startTime)+"ms");
return true;
}
logger.info("批量添加失败");
return false;
} catch (SQLException e) {
if(conn != null){
try {
conn.rollback();
} catch (SQLException e1) {
throw new DaoException(e);
}
}
throw new DaoException(e);
} finally {
release(rs, pstmt, conn);
}
}

// 通用的查询方法
public static Object query(String sql, Object[] params, ResultSetHandler handler) throws DaoException{
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
try {
conn = getConnection();
pstmt = conn.prepareStatement(sql);
for (int i = 0; params != null && i < params.length; i++){
pstmt.setObject(i + 1, params[i]);
}
rs = pstmt.executeQuery();
Object result = handler.handle(rs);//此处的handler分为BeanHandler和ListHandler,对应的Handler通过反射将查询到值映射到对象或是集合里并返回。对应handler在最下方。
return result;
} catch (SQLException e) {
throw new DaoException(e);
} finally {
release(rs, pstmt, conn);
}
}

/**
* 此处返回的是插入数据后生成的主键
* @param sql
* @param params
* @return
*/
public static int insert(String sql,Object[] params) throws DaoException{
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
try{
conn = getConnection();
pstmt = conn.prepareStatement(sql,Statement.RETURN_GENERATED_KEYS);
for (int i = 0; params != null && i < params.length; i++)
pstmt.setObject(i + 1, params[i]);
pstmt.executeUpdate();
rs =pstmt.getGeneratedKeys();//获取刚刚插入的主键rs
rs.next();//获取刚刚获取的主键
int key = rs.getInt(1);
if(key > 0){
return key;
}else{
return 0;
}
}catch(SQLException e){
throw new DaoException(e);
}finally{
release(rs,pstmt,conn);
}
}

}
对应的BeanHandler和ListHandler如下:
public class BeanHandler implements ResultSetHandler {
private Class clazz;

public BeanHandler(Class clazz) {
this.clazz = clazz;
}

// 将结果集的第一行数据封装到bean返回
public Object handle(ResultSet rs) throws DaoException{
try {
if (rs.next()) {
Object bean = this.clazz.newInstance();
ResultSetMetaData metaData = rs.getMetaData();//获取rs的元数据,该元数据可以获得列的数量和对应列索引处的列的名称值
int columnCount = metaData.getColumnCount();
for (int i = 1; i <= columnCount; i++) {
String columnName = metaData.getColumnName(i);
Object value = rs.getObject(columnName);//根据列的名称获取对应的值
if(value instanceof Integer){
BeanUtils.setProperty(bean, columnName, (Integer)value);//将值转化为对应的类型然后反射到对应对象属性中。
}else if(value instanceof String){
BeanUtils.setProperty(bean, columnName, (String)value);
}else if(value instanceof Date){
BeanUtils.setProperty(bean, columnName, (Date)value);
}else if(value instanceof Boolean){
BeanUtils.setProperty(bean, columnName, (Boolean)value);
}else if(value instanceof Float){
BeanUtils.setProperty(bean, columnName, (Float)value);
}
}
return bean;
}
return null;
} catch (Exception e) {
throw new DaoException(e);
}
}

}

public class BeanListHandler implements ResultSetHandler {
private Class clazz;

public BeanListHandler(Class clazz) {
this.clazz = clazz;
}

// 将结果集的每一行封装到bean,将bean加入一个list返回
public Object handle(ResultSet rs) throws DaoException{
try {
List list = new ArrayList();
while (rs.next()) {
Object bean = this.clazz.newInstance();
ResultSetMetaData metaData = rs.getMetaData();
int columnCount = metaData.getColumnCount();
for (int i = 1; i <= columnCount; i++){
String columnName = metaData.getColumnName(i);
Object value = rs.getObject(columnName);

if(value instanceof Integer){
BeanUtils.setProperty(bean, columnName, (Integer)value);
}else if(value instanceof String){
BeanUtils.setProperty(bean, columnName, (String)value);
}else if(value instanceof Date){
BeanUtils.setProperty(bean, columnName, (Date)value);
}else if(value instanceof Boolean){
BeanUtils.setProperty(bean, columnName, (Boolean)value);
}
}
list.add(bean);
}
return list;
} catch (Exception e) {
e.printStackTrace();
throw new DaoException(e);
}
}
分享到:
评论

相关推荐

    java各种常用的工具类封装 源码

    dateUtil fileUtil propertyUtil 反射 json 分页 jdbc struts2 string 一些java开发 常用的工具类的总结 封装

    利用反射实现的持久层工具类(学习)

    这个是我自己利用反射机制封装的模仿hibernate的持久层工具,用于学习。里面有我的联系方式,工具类jar包和示例以及源码。有问题或者希望共通学习的同学可以联系我,寻求志同道合之人

    jdbc01.rar

    简单案例:封装jdbc工具类,使用泛型,反射,操作数据库商品类

    JDBCUtils.java

    利用java的反射机制来实现JDBC工具类 采用反射对JDBC的增删改查进行泛型的封装。

    Java反射技术的一般应用

    不过只要你稍微修改一下,就可作为自己工程中比较好的封装工具类使用! 下载解压之后,使用MyEclipse 5.5导入,打开该工程,找到DemoApplication类,然后点击run菜单--&gt;找到(x)Arguments,然后在Program arguments...

    使用反射技术和Facade模式演示封装数据库操作--ORM原理

    本人在教Java方向课程时,发现现组长们不能象以前班级的学长写出封装得比较好的DAO工具类。于是,使用Facade模式和反射技术模拟Hibernate框架技术演示怎样书封装数据库的操作。 环境:Windows XP Professional, JDK ...

    Java反射技术的一般应用(放低分数供大家学习)

    不过只要你稍微修改一下,就可作为自己工程中比较好的封装工具类使用! 下载解压之后,使用MyEclipse 5.5导入,打开该工程,找到DemoApplication类,然后点击run菜单--&gt;找到(x)Arguments,然后在Program ...

    学习了servlet之后,将servlet全部整合在一个工具类中

    一个工具类将servlet所有的东西全部整合进了,包括过滤器(处理乱码问题),反射技术,c3p0技术,类型转换 jdbc的封装,这个例子绝对是放血的下载,

    homework.zip

    jdbc实例,其中包含通用工具类,主程序等,实现对数据库中student表的增删改查功能,将jdbc单独封装成一个工具类进行操作,类似于sqlhelper

    SSM,crm项目

    定时器,java内存缓存,ssm流程,spring jdbc配置文件,解析ip地址、组装ip工具类、日期工具类、md5加密、数据分页、反射工具、消息、封装、字符转换

    Java开发常用jar包

    1.commons-beanutils.jar...12.commons-DbUtils.jar:Apache组织提供的一个资源JDBC工具类库,它是对JDBC的简单封装,对传统操作数据库的类进行二次封装,可以把结果集转化成List。 13.commons-Email.jar: 提供开源的API

    JavaSE jar包

    个人封装的Javase阶段相关的jar包,包含集合,反射,线程,IO,网络编程,jdbc等工具类 对于学习se新人,应该还是很有用处的,对于高手的话,请出门左转绕过。

    自制DatabaseUtilities的SourceCode和Java Archive

    通过反射、内省、JDBC、泛型自制一个DbUtils工具jar包,主要操作类为SqlRunner,由外部向SqlRunner对象提供Connection对象,通过SqlRunner对象执行SQL语句,支持insert,update,delete,select语句、批处理、聚合函数、...

    java基础案例与开发详解案例源码全

    12.5.2 使用集合工具类同步化集合类对象324 12.5.3 使用JDK5.0后提供的并发集合类324 12.6 用Timer类调度任务325 12.7 本章练习326 第13章 13.1 java.io.File类328 13.1.1 文件和目录是什么?328 13.1.2 Java对文件...

    JAVA_API1.6文档(中文)

    java.util 包含 collection 框架、遗留的 collection 类、事件模型、日期和时间设施、国际化和各种实用工具类(字符串标记生成器、随机数生成器和位数组)。 java.util.concurrent 在并发编程中很常用的实用工具类...

    JDBCManager:一款操作数据库的小工具

    JDBCManager使用文档介绍对sqlserver的jdbc增删改查操作进行的封装。使用了回调和反射机制。使操作数据库更加简便快:male_sign:乐。导入clone项目后,导入JDBCDao,JDBCHelper,JDBCObject,JDBCSetting四个类即可初始化...

    javaSE代码实例

    3.10 常用数学工具包——java.lang.Math类 39 3.10.1 数学常量 39 3.10.2 常用数学函数 40 3.11 小结 41 第4章 流程控制——Java世界的航行舵手 42 4.1 if条件语句 42 4.1.1 简略形式 42 4.1.2 完全...

    java api最新7.0

    java.util 包含 collection 框架、遗留的 collection 类、事件模型、日期和时间设施、国际化和各种实用工具类(字符串标记生成器、随机数生成器和位数组)。 java.util.concurrent 在并发编程中很常用的实用工具类。...

    疯狂JAVA讲义

    7.8 操作集合的工具类:Collections 283 7.8.1 排序操作 283 7.8.2 查找,替换操作 287 7.8.3 同步控制 288 7.8.4 设置不可变集合 288 7.9 烦琐的接口:Enumeration 289 7.10 本章小结 290 本章练习 290 第8...

    [Java参考文档].JDK_API 1.6

    java.util 包含 collection 框架、遗留的 collection 类、事件模型、日期和时间设施、国际化和各种实用工具类(字符串标记生成器、随机数生成器和位数组)。 java.util.concurrent 在并发编程中很常用的实用工具类。...

Global site tag (gtag.js) - Google Analytics