利用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数据库)
- 利用Java的反射、泛型以及动态参数实现JDBC工具类
- 利用java反射机制 读取配置文件 实现动态类加载以及动态类型转换
- 利用java反射机制 读取配置文件 实现动态类加载以及动态类型转换
- 利用反射实现类的动态加载
- 利用反射实现类的动态加载
- 利用反射实现类的动态加载
- 利用反射实现类的动态加载
- java学习 -- 利用类的反射和泛型自己动手写jdbc封装小类库
- JAVAWEB开发之Servlet3.0新特性的使用以及注解的详细使用和自定义注解的方法、动态代理的使用、利用动态代理实现细粒度的权限控制以及类加载和泛型反射
- 利用泛型和反射对Java对象集合转换成Json的工具类
- 利用Java的反射机制实现Bean实体与Map自动转换的工具类
- java 学习笔记--利用反射实现自定义toString()的工具类
- java 学习笔记--利用反射实现自定义toString()的工具类
- java的反射实现动态代理类
- 使用java反射实现对象工厂以及工具类的编写
- 利用反射实现类的动态加载(程序改正)
- 利用反射实现泛型的实现
- 利用java反射遍历类以及父类的方法
- C语言位运算符
- 搭建图片服务器《一》-linux安装ftp组件
- promise对象的简单用法
- 【NOIP模板】 gcd & lcm
- 嚼得菜根做得大事·《菜根谭》·六
- 利用Java的反射、泛型以及动态参数实现JDBC工具类
- 第11章-img特征,vertical-align,cursor,opacity
- 洛谷 P3811 【模板】乘法逆元
- Ant * 星号通配符
- (HihoCoder
- Java练习
- HDU 4300 Clairewd’s message
- 安装win10+ubuntu16.04双系统无法进入桌面问题
- php正则表达式去掉超链接