java JDBC通用BaseDao升级版0.3

,此次升级为了解决查询时每次都要转成对象集合,实现方式泛型加反射(那个流行的框架又没用到反射呢),能反射对象就能反射SQL语句,能反射SQL语句你和hibernate框架就很接近

package com.sun.dao;

import java.lang.reflect.Method;
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.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Vector;
/** * @author sun bo * @version 1.3, 2015/12/21 * 这次升级为了解决每次查询是都要换成对象集合的烦恼 */
public class BaseDao<T>{
    final String driver = "com.microsoft.sqlserver.jdbc.SQLServerDriver";
    private String ip = "localhost";
    private String databaseName;
    private String user = "sa";
    private String password = "123456";

    /** * 用于构建连接数据库 * * @param ip * 数据库地址 * @param databaseName * 数据库的库名 * @param user * 数据库登陆用户名 * @param password * 数据库密码 */
    public BaseDao(String ip, String databaseName, String user, String password) {
        super();
        this.ip = ip;
        this.databaseName = databaseName;
        this.user = user;
        this.password = password;
    }

    /** * 这个构造用于连接本机的数据库 * * @param databaseName * :数据库名 */
    public BaseDao(String databaseName) {
        super();
        this.databaseName = databaseName;
    }

    /** * 用于创建连接对象 * * @return Connection * @throws SQLException */
    private Connection createConnection() throws SQLException {

        return DriverManager.getConnection("jdbc:sqlserver://" + ip
                + ":1433;database=" + databaseName, user, password);

    }

    /** * 此方法只能用于查询 * * @param sql * :查询sql语句 * @param obj * :SQL语句给值 * @param sun * 请传入你要查询的对象 * @return :list: * 在list里放的是泛型对象, * ...obj:应用JDK1.5新特性,可以传1个值或数组方便使用 */
    public ArrayList<T> excuteQuery(String sql,Object ...obj,Class<T> sun)
    {
        Connection con=null;
        PreparedStatement ps=null;
        ResultSet rs=null;
        try{
        Class.forName(driver);
        con=createConnection();
        ps=con.prepareStatement(sql);
        if(obj!=null&& obj.length>0)
        {
            for (int i = 0; i < obj.length; i++) {

                ps.setObject(i+1, obj[i]);
            }
        }
        rs=ps.executeQuery();
        ArrayList list=new ArrayList();
        if(rs!=null)
        {
            ResultSetMetaData data=rs.getMetaData();

            while(rs.next())
            {
                //创建泛型对象
                Object o=Class.forName(sun.getName()).newInstance();

                //获得查询的数据库有多少列
                int count=data.getColumnCount();
                for (int i = 0; i < count; i++) {

                    //获得列名
                    String columnName=data.getColumnName(i+1);//id
                    //获得列值
                    Object value= rs.getObject(i+1); //setId
                    //生成要执行的方法,因为方法的的第二个单词大写所有需要转换大小写
                    String methodName="set"+columnName.replace(columnName.charAt(0)+"", new String(columnName.charAt(0)+"").toUpperCase());
                    //System.out.println(columnName.replace(columnName.charAt(0)+"", new String(columnName.charAt(0)+"").toUpperCase()));
                    //System.out.println(methodName);
                    //利用反射机制,生成setXX()方法的Method对象并执行该setXX()方法。 
                    Method method=o.getClass().getMethod(methodName, value.getClass());   
                    method.invoke(o, value);

                }
                list.add(o);
            }
            return list;
        }else{
            return null;
        }


        }catch(Exception e){
            e.printStackTrace();
            return null;
        }finally{
                if(rs!=null)
                {
                    try {
                        rs.close();
                    } catch (SQLException e) {
                        e.printStackTrace();
                    }
                }
                if(ps!=null)
                {
                    try {
                        ps.close();
                    } catch (SQLException e) {
                        e.printStackTrace();
                    }
                }
                if(con!=null)
                {
                    try {
                        con.close();
                    } catch (SQLException e) {
                        e.printStackTrace();
                    }
                }

        }
    }

    /** * 此方法只能执行增删改 * * @param sql * :查询sql语句 * @param obj * :SQL语句给值 * @return 真假: */
    public boolean excuteUpdate(String sql, Object[] obj) {
        Connection con = null;
        PreparedStatement ps = null;
        try {
            Class.forName(driver);
            con = createConnection();
            ps = con.prepareStatement(sql);
            if (obj != null && obj.length > 0) {
                for (int i = 0; i < obj.length; i++) {

                    ps.setObject(i + 1, obj[i]);
                }
            }
            int a = ps.executeUpdate();

            if (a > 0) {
                return true;

            } else {
                return false;
            }

        } catch (Exception e) {
            e.printStackTrace();
            return false;
        } finally {

            if(ps!=null)
            {
                try {
                    ps.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            if(con!=null)
            {
                try {
                    con.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        }
    }

}

你可能感兴趣的:(java,jdbc,泛型)