利用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数据库)
由于时间关系,本人将在本博客中陆续推出高级框架阶段的系列教程,现已经发布如下几篇,如果对大家有帮助也请各位给点鼓励吧 ,比如关注微博、顶一下或者给点评论,谢谢!
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数据库)
同时由于时间关系,本人将在本博客中陆续推出高级框架阶段的系列教程,现已经发布如下几篇,如果对大家有帮助也请各位给点鼓励吧 ,比如关注微博、顶一下或者给点评论,谢谢!
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数据库)
相关文章推荐
- Java 利用反射、泛型实现dao层的增删改查
- 利用Java针对MySql封装的jdbc框架类 JdbcUtils 完整实现(包含增删改查、JavaBean反射原理,附源码)
- 利用Java Reflection(反射)原理,在hibernate里面实现对单表、视图的动态组合查询
- JAVA 利用JDBC连接MYSQL数据库以及增删改查的实现【学习笔记】
- 利用java类的反射机制,实现了 映射 获得post(get)的参数 的BaseServlet
- Android JNI静态和动态注册 、Java Reflect(C或C++层反射和JAVA层反射)、Java 可变参数(JNI实现)
- 利用Java Reflection(反射)原理,在hibernate里面实现对单表、视图的动态组合查询
- 利用Java针对MySql封装的jdbc框架类 JdbcUtils 完整实现(包括增删改查、JavaBean反射原理,附源代码)
- 【Java反射学习笔记系列之jdk动态代理】静态代理和动态代理的区别以及动态代理的作用和实现
- [Java]利用反射机制动态加载并创建包含参数的对象
- 利用Java针对MySql封装的jdbc框架类 JdbcUtils 完整实现(包含增删改查、JavaBean反射原理,附源码)
- JAVAWEB开发之Servlet3.0新特性的使用以及注解的详细使用和自定义注解的方法、动态代理的使用、利用动态代理实现细粒度的权限控制以及类加载和泛型反射
- Java 工具类 - 使用POI以及反射实现导出Excel的功能
- 利用泛型和反射对Java对象集合转换成Json的工具类
- java利用反射实现动态代理示例
- 利用Java的反射机制实现Bean实体与Map自动转换的工具类
- 利用JAVA的动态属性之反射原理实现一个简单AOP容器 - AOP的实现原理分析
- 使用java反射实现对象工厂以及工具类的编写
- 利用Java针对MySql封装的jdbc框架类 JdbcUtils 完整实现(包含增删改查、JavaBean反射原理,附源码)
- 利用Java针对MySql封装的jdbc框架类 JdbcUtils 完整实现(包含增删改查、JavaBean反射原理,附源码)