java JDBC通用BaseDao升級版0.3

來源:互聯網
上載者:User

,此次升級為瞭解決查詢時每次都要轉成對象集合,實現方式泛型加反射(那個流行的架構又沒用到反射呢),能反射對象就能反射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();                }            }        }    }}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.