论坛首页 入门技术论坛

自己写的Jdbc BaseDao 的简单封装

浏览 4888 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2010-09-13   最后修改:2010-09-13
这是一个简单的jdbcBaseDao的封装。

自己写的。

面前能完成的一些功能,自己还算满意。正想搞个通用分页的。

坛子里找了下,发现有个可以,但是还是被人说出了很多缺点。。。。

所以,自己也有点信心不足了,特意发出来求虐!!!

希望大家把缺点说下,我改正!!谢谢

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;
	}
}



   发表时间:2010-09-14  
晕呃··怎么没人说话呢...

是不是写的太垃圾了呃...

0 请登录后投票
   发表时间: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;
  }



都差不多啦。。
0 请登录后投票
   发表时间:2011-01-18  
有点意思,自己也想写一个,但是查询方法无法解决,研究一下你的代码。
0 请登录后投票
   发表时间:2011-01-18  
又看了一下,查询方法还是不够完美,实际应用意义不大,因为select可能选取的是部分字段,而该方法是遍历实体类的所有可见字段,这样会出问题的。

有没有什么更好的方法呢?
0 请登录后投票
论坛首页 入门技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics