java减少数据访问层代码—反射2—数据访问层Wrapper—获取数据及分页
来源:互联网 发布:网络大学考试平台 编辑:程序博客网 时间:2024/05/21 14:00
——————————————使用效果——————————————————
——————————————源码——————————————————
————DButil类,这个类我封装的不好,主要看open(),close(),getResultList(String classpath,String sql,Object... src)这几个方法,主要代码我标红
package com.fendou.DBUtil;import java.sql.Connection;import java.sql.DriverManager;import java.sql.PreparedStatement;import java.sql.ResultSet;import java.sql.SQLException;import java.sql.Savepoint;import java.sql.Statement;import java.util.ArrayList;import java.util.List;import com.fendou.myfactory.Myfactory;import com.fendou.vo.Orders;import com.fendou.wrapper.IWrapper;import com.fendou.wrapper.WrapperBatcher;/** * DButil类2012-9-13 * @author 牟云飞 * */public class DButil<T> { private String driver=Myfactory.driver; private String url=Myfactory.url; private String user=Myfactory.user; private String pwd=Myfactory.pwd; private Connection con =null; private Statement stat = null ; private ResultSet rs = null; private PreparedStatement ps =null; public DButil(){ } /** * 打开数据连接,如果关闭成功,返回true,否则false * @return boolean */ public boolean open(){ boolean flag = false; try { Class.forName(driver); con = DriverManager.getConnection(url,user,pwd); flag=true; } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } return flag; } /** * 关闭连接,成功true,失败false * @return boolean */ public boolean close(){ boolean flag = false; try { if(rs!=null){ if(rs.isClosed()==false){ rs.close();} } if(stat!=null){ if(stat.isClosed()==false){ stat.close(); } } if(ps!=null){ if(ps.isClosed()==false){ ps.close(); } } if(con!=null){ if(con.isClosed()==false){ con.close(); } } flag = true; } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } return flag; } /** * 执行sql语句获得list * 通过iwrapper封装直接得到list * @param wrapper继承IWrapper<T> * @param sql语句 * @param src * @return */ public List<T> getResultList(String classpath,String sql,Object... src){ List<T> list = new ArrayList<T>(); //打开连接 open(); try { ps =con.prepareStatement(sql); for (int i = 0; i < src.length; i++) { ps.setObject(i+1,src[i] ); } //执行,获得result rs = ps.executeQuery(); //将resultset转换成list while(rs.next()){ WrapperBatcher<T> w = new WrapperBatcher<T>(); T t = w.setT(classpath, rs); list.add(t); } } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } //关闭连接 close(); //获得结果 return list; } /** * 执行sql语句返回受影响行数 *增加、删除、修改 * @param sql语句 * @param 参数 * @return 手影响行数 */ public int update(String sql,Object... src){ int count=0; //打开连接 open(); try { ps =con.prepareStatement(sql); for (int i = 0; i < src.length; i++) { ps.setObject(i+1,src[i] ); } //执行,获得受影响行数 count = ps.executeUpdate(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } //关闭连接 close(); //获得结果 return count; } /** * 执行sql语句返回受影响行数 *增加、删除、修改 * @param sql语句 * @return 手影响行数 */ public int update(String sql){ int count=0; //打开连接 open(); try { ps =con.prepareStatement(sql); //执行,获得受影响行数 count = ps.executeUpdate(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } //关闭连接 close(); //获得结果 return count; } /** * 得到连接 * @return Connection */ public Connection getConnection() { return con; } /** * 获取PreparedStatement * @param sql语句 * @return PreparedStatement */ public PreparedStatement getPreparedStatement(String sql){ try { ps = con.prepareStatement(sql); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } return ps; } /** * 执行PreparedStatement,获得结果集 * @param PreparedStatement * @return ResultSet */ public ResultSet executePreparedStatement(PreparedStatement pre){ try { rs = pre.executeQuery(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } return rs; } /** * 执行PreparedStatement,获得受影响的行数 * @param PreparedStatement * @return int */ public int executePSUpdate(PreparedStatement pre){ int i = 0; try { i = pre.executeUpdate(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } return i; } /** * 开始新的事务 */ public void openTran(){ if(con!=null){ try { con.commit(); con.setAutoCommit(false); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } /** * 提交事务 */ public void commit() { if(con!=null){ try { con.commit(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } /** * 事务回滚 */ public void rollback(){ try { con.rollback(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } /** * 设置断点 * @param 断点名 * @return */ public Savepoint setPoint(String name){ Savepoint s = null; try { s = con.setSavepoint(name); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } return s; } /** * 断点回滚 */ public boolean rollbackByPoint(Savepoint savepoint){ boolean flag = false; try { con.rollback(savepoint); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } return flag; } /** * 关闭事务 */ public void closeTran(){ if(con!=null){ try { con.setAutoCommit(false); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } //获取statment public Statement getStatement(){ if(con!=null){ try { stat = con.createStatement(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } return stat ; } //statement执行 public int executeStatmentUpdate(String sql){ int i = 0; try { i = stat.executeUpdate(sql); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } return i ; } //用statment返回结果集 public ResultSet executeStatmentQuery(String sql){ try { rs = stat.executeQuery(sql); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } return rs; } }
————WrapperBatcher<T>类,这个在DButil类中的getResultLis()方法t中使用
package com.fendou.wrapper;import java.lang.reflect.Field;import java.lang.reflect.InvocationTargetException;import java.lang.reflect.Method;import java.lang.reflect.Type;import java.sql.ResultSet;import java.sql.SQLException;import java.util.ArrayList;/** * 2012-9-18 * @author 牟云飞 * */public class WrapperBatcher<T> { /** * 方法一:将resultSet自动变成对应的类 * 方法二优秀,方法一再某些条件下是错误的,例如:get、set一旦调用顺序变动 * 都是set * @param 类的完整路径 * @param resultSet结果集 * @return 对应的类 */ public T setWrapper(String classPath,ResultSet rs){ T t = null; try { Class cl = Class.forName(classPath); //得到这个类的所有成员 Field[] name = cl.getDeclaredFields(); //得到这个类中所有的方法 Method[] method = cl.getDeclaredMethods(); //实例化 t = (T) cl.newInstance(); //调用set设置值 for(int i =0;i<method.length;i++){ if(method[i].getName().startsWith("set")){ int h =0; if(((i/2)-1)<=0){ h=0; }else{ h=i/2-1; } String type=name[h].getType().getName(); type = type.substring(type.lastIndexOf(".")+1,type.length()); System.out.println(type+" "+method[i].getName()); if(type.toString().equals("int")){ if(rs.getInt(method[i].getName().toLowerCase().substring(3,method[i].getName().length()))!=0){ method[i].invoke(t,rs.getInt(method[i].getName().toLowerCase().substring(3,method[i].getName().length()))); }else{ method[i].invoke(t,0); } }else if(type.toString().toLowerCase().equals("string")){ if(rs.getString(method[i].getName().toLowerCase().substring(3,method[i].getName().length()))!=null){ method[i].invoke(t,rs.getString(method[i].getName().toLowerCase().substring(3,method[i].getName().length()))); } }else if(type.toString().toLowerCase().equals("date")){ if(rs.getString(method[i].getName().toLowerCase().substring(3,method[i].getName().length()))!=null){ method[i].invoke(t,rs.getDate(method[i].getName().toLowerCase().substring(3,method[i].getName().length()))); } }else if(type.toString().toLowerCase().equals("double")){ if(rs.getDouble(method[i].getName().toLowerCase().substring(3,method[i].getName().length()))!=0){ method[i].invoke(t,rs.getDouble(method[i].getName().toLowerCase().substring(3,method[i].getName().length()))); }else { method[i].invoke(t,0.0); } } } } } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (InstantiationException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IllegalAccessException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IllegalArgumentException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (InvocationTargetException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } return t; } /** * 方法二:将resultSet自动变成对应的类 * 都是set * @param 类的完整路径 * @param resultSet结果集 * @return 对应的类 */ public T setT(String classpath,ResultSet rs){ T t = null; try { Class classType = Class.forName(classpath); //得到这个类的所有成员 Field[] name = classType.getDeclaredFields(); //得到这个类中所有的方法 Method[] method = classType.getDeclaredMethods(); //实例化 t = (T) classType.newInstance(); // 获得对象的所有属性 Field fields[] = classType.getDeclaredFields(); for (int i = 0; i < fields.length; i++) { Field field = fields[i]; String fieldName = field.getName(); String firstLetter = fieldName.substring(0, 1).toUpperCase();// // 获得和属性对应的getXXX()方法的名字// String getMethodName = "get" + firstLetter + fieldName.substring(1); // 获得和属性对应的setXXX()方法的名字 String setMethodName = "set" + firstLetter + fieldName.substring(1);// // 获得和属性对应的getXXX()方法// Method getMethod = classType.getMethod(getMethodName,new Class[] {}); // 获得和属性对应的setXXX()方法,使用filed对象的类型 Method setMethod = classType.getMethod(setMethodName,new Class[] { field.getType() });// // 调用原对象的getXXX()方法:指定调用的对象和方法的参数值列表// Object value = getMethod.invoke(t, new Object[] {});// System.out.println(fieldName + ":" + value); // 调用拷贝对象的setXXX()方法:指定调用的对象和参数值列表(注意必须是Object类型) String type=field.getType().getName(); type = type.substring(type.lastIndexOf(".")+1,type.length()); if(type.toString().equals("int")){ if(rs.getInt(field.getName())!=0){ setMethod.invoke(t,rs.getInt(field.getName())); } } if(type.toString().equals("String")){ if(rs.getString(field.getName())!=null){ setMethod.invoke(t,rs.getString(field.getName())); } } if(type.toString().equals("Date")){ if(rs.getDate(field.getName())!=null){ setMethod.invoke(t,rs.getTimestamp(field.getName())); } } if(type.toString().equals("Double")){ if(rs.getDouble(field.getName())!=0){ setMethod.invoke(t,rs.getDouble(field.getName())); } } } } catch (SecurityException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (NoSuchMethodException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IllegalArgumentException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IllegalAccessException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (InvocationTargetException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (InstantiationException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } return t; } }
- java减少数据访问层代码—反射2—数据访问层Wrapper—获取数据及分页
- java减少数据访问层代码—反射1—数据访问层Wrapper
- java减少数据访问层代码—反射2—数据访问层Wrapper—增加数据源码
- java减少数据访问层代码—反射2—数据访问层Wrapper—更新数据源码
- java减少数据访问层代码—反射3—数据访问层就一个接口一个实现
- java减少数据访问层代码—反射2—将ResulSet动态转成get、set
- 【JAVA】数据访问层
- 数据访问层2
- 数据访问层使用存储过程分页
- 收藏:数据访问层
- 数据访问层DataAccess
- 数据访问层学习
- C#数据访问层
- 数据访问层
- 数据访问层!
- 数据访问层
- C# 数据访问层
- 创建数据访问层
- 系统结构经验
- C语言中volatile关键字的作用
- 自有包使用经验
- SVN 作为服务启动
- C++中的static关键字
- java减少数据访问层代码—反射2—数据访问层Wrapper—获取数据及分页
- strust2 获取HttpServletResponse对象
- 查看android源码的版本号
- poj2187 凸包
- 不单单用java开发android,可以是C/C++ 或c#
- vc中把字符串转换成16进制数的函数
- 手机客户端应用程序的一些测试注意点
- 调查:软件工程师们都用什么编程语言
- 双显卡介绍