浏览 4887 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2010-09-13
最后修改:2010-09-13
自己写的。 面前能完成的一些功能,自己还算满意。正想搞个通用分页的。 坛子里找了下,发现有个可以,但是还是被人说出了很多缺点。。。。 所以,自己也有点信心不足了,特意发出来求虐!!! 希望大家把缺点说下,我改正!!谢谢 Java代码 package com.demo.dao; import java.lang.reflect.Field; import java.lang.reflect.Method; import java.sql.*; import java.util.ArrayList; import java.util.List; public class BaseDao { /** * 获得连接 * @return * @throws Exception */ public Connection getConn()throws Exception{ /* -***********************-mysql数据库-************************/ Class.forName("com.mysql.jdbc.Driver"); String uri="jdbc:mysql://localhost:3306/test?&useUnicode=true&characterEncoding=UTF-8"; return DriverManager.getConnection(uri,"root","123"); /* -***********************sqlserver2005数据库-******************* Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver"); String uri="jdbc:sqlserver://127.0.0.1:1433;DataBaseName=master"; return DriverManager.getConnection(uri,"sa","123");*/ } /** * 关闭连接 * @param rs * @param sm * @param conn */ public void closeAll(ResultSet rs,Statement sm,Connection conn)throws Exception{ if(rs!=null) rs.close(); if(sm!=null) sm.close(); if(conn!=null) conn.close(); } /** * 增加,删除,修改 * @param sql * @param args * @return */ public boolean executeUpdate(String sql,Object[] args){ boolean flag=false; Connection conn=null; PreparedStatement sm=null; try { conn=this.getConn(); sm=conn.prepareStatement(sql); if(conn != null){ for (int i = 0; i < args.length; i++) { sm.setObject(i+1, args[i]); } } if(sm.executeUpdate() > 0){ flag = true; } } catch (Exception e) { // TODO: handle exception }finally{ try { this.closeAll(null, sm, conn); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } return flag; } /** * 查询方法 * @param sql * @param args * @return */ public List executeQuery(String sql,Object[] args,Class clazz){ List list=new ArrayList(); Connection conn = null; PreparedStatement sm = null; ResultSet rs = null; try { conn = this.getConn(); sm = conn.prepareStatement(sql); if(args != null){ for (int i = 0; i < args.length; i++) { sm.setObject(i+1, args[i]); } } rs=sm.executeQuery(); while(rs.next()){ //通过反射得到一个对象 list.add(this.getObj(clazz, rs)); } } catch (Exception e) { // TODO: handle exception }finally{ try { this.closeAll(null, sm, conn); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } return list; } public static Object getObj(Class clazz,ResultSet rs)throws Exception{ //所有的属性 Field[] field= clazz.getDeclaredFields(); Object info= clazz.newInstance(); for (int i = 0; i < field.length; i++) { String name=field[i].getName().toUpperCase(); //得到方法名 name="set"+name.charAt(0)+name.substring(1).toLowerCase(); //得到类型 Class c=field[i].getType(); //得到方法 Method method= clazz.getMethod(name, c); //实现方法 method.invoke(info, rs.getObject(i+1)); } return info; } } 加入了数据库Date类型的转换 刚刚修改后的: package com.demo.dao; import java.lang.reflect.Field; import java.lang.reflect.Method; import java.sql.*; import java.util.ArrayList; import java.util.List; import com.demo.entity.User; public class BaseDao { /** * 获得连接 * @return * @throws Exception */ public Connection getConn()throws Exception{ /* -***********************-mysql数据库-*********************** Class.forName("com.mysql.jdbc.Driver"); String uri="jdbc:mysql://localhost:3306/test?&useUnicode=true&characterEncoding=UTF-8"; return DriverManager.getConnection(uri,"root","123");*/ /* -***********************sqlserver2005数据库-********************/ Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver"); String uri="jdbc:sqlserver://127.0.0.1:1433;DataBaseName=demo"; return DriverManager.getConnection(uri,"sa","123"); } /** * 关闭连接 * @param rs * @param sm * @param conn */ public void closeAll(ResultSet rs,Statement sm,Connection conn)throws Exception{ if(rs!=null) rs.close(); if(sm!=null) sm.close(); if(conn!=null) conn.close(); } /** * 增加,删除,修改 * @param sql * @param args * @return */ public boolean executeUpdate(String sql,Object[] args){ boolean flag=false; Connection conn=null; PreparedStatement sm=null; try { conn=this.getConn(); sm=conn.prepareStatement(sql); if(conn != null){ for (int i = 0; i < args.length; i++) { sm.setObject(i+1, args[i]); } } if(sm.executeUpdate() > 0){ flag = true; } } catch (Exception e) { // TODO: handle exception }finally{ try { this.closeAll(null, sm, conn); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } return flag; } /** * 查询方法 * @param sql * @param args * @return */ public List executeQuery(String sql,Object[] args,Class clazz){ List list=new ArrayList(); Connection conn = null; PreparedStatement sm = null; ResultSet rs = null; try { conn = this.getConn(); sm = conn.prepareStatement(sql); if(args != null){ for (int i = 0; i < args.length; i++) { sm.setObject(i+1, args[i]); } } rs=sm.executeQuery(); while(rs.next()){ //通过反射得到一个对象 list.add(this.getObj(clazz, rs)); } } catch (Exception e) { e.printStackTrace(); }finally{ try { this.closeAll(null, sm, conn); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } return list; } private static Object getObj(Class clazz,ResultSet rs)throws Exception{ //所有的属性 Field[] field= clazz.getDeclaredFields(); Object info= clazz.newInstance(); for (int i = 0; i < field.length; i++) { //得到属性名 String name=field[i].getName(); //包装成SetXXX方法 name="set"+name.substring(0,1).toUpperCase()+name.substring(1); //得到类型 Class c=field[i].getType(); //得到方法 Method method= clazz.getMethod(name, c); //实现方法,如果实体类的中有属性为Date类型的,则换种方式转实现 Class c2=Class.forName("java.sql.Date"); if(c == c2){ method.invoke(info, rs.getDate(i+1)); }else{ method.invoke(info, rs.getObject(i+1)); } } return info; } } 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2010-09-14
晕呃··怎么没人说话呢...
是不是写的太垃圾了呃... |
|
返回顶楼 | |
发表时间:2010-09-16
//释放资源
public void closeAll(Connection con,PreparedStatement pt,ResultSet rs){ if(con!=null) try { con.close(); } catch (Exception e) { e.printStackTrace(); } if(pt!=null) try { pt.close(); } catch (Exception e) { e.printStackTrace(); } if(rs!=null){ try { rs.close(); } catch (Exception e) { e.printStackTrace(); } } } Connection con=null; PreparedStatement ps=null; ResultSet rs=null; //执行增删改操作 public int execute(String sql,Object param[]){ int count=0; try { con=getConn(); ps=con.prepareStatement(sql); if(param!=null){ for(int i=0;i<param.length;i++){ ps.setObject(i+1,param[i]); } } count=ps.executeUpdate(); } catch (Exception e) { e.printStackTrace(); }finally{ this.closeAll(con, ps, rs); } return count; } 都差不多啦。。 |
|
返回顶楼 | |
发表时间:2011-01-18
有点意思,自己也想写一个,但是查询方法无法解决,研究一下你的代码。
|
|
返回顶楼 | |
发表时间:2011-01-18
又看了一下,查询方法还是不够完美,实际应用意义不大,因为select可能选取的是部分字段,而该方法是遍历实体类的所有可见字段,这样会出问题的。
有没有什么更好的方法呢? |
|
返回顶楼 | |