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

来源:互联网 发布:淘宝晚上收货时间 编辑:程序博客网 时间:2024/04/30 15:30

利用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/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数据库)

阅读全文
1 0
原创粉丝点击