java與數據庫oracle連接學習之jdbc(7)通過映射實現共享

1、工具類

package com.librarySystem;

import java.sql.*;

/**
 * JDBC的工具類:
 * 加載驅動:只需要加載一次
 * 建立連接:
 * 釋放資源:
 */

public class JDBCUTILS {
    private static final String DRIVER = "oracle.jdbc.OracleDriver";
    // 主機地址 連接本機 localhost  或者127.0.0.1
    // 端口號 Oracle 數據庫默認端口號 1521
    // 實例名 安裝全的是orcl,沒有安裝全的是XE
    private static String URL = "jdbc:oracle:thin:@localhost:1521:orcl";   // jdbc:oracle:thin: @主機地址 :  端口號 : 實例名
    private static String USER = "cc";
    private static String PASSWORD = "ccpassword";
    static {//因爲驅動只需要加載一次,所以在靜態語句中進行
        try {
            Class.forName(DRIVER);
        }catch(Exception e){
            e.printStackTrace();
        }
    }

    /**
     *建立與數據庫的連接
     * @return 連接好的連接
     */
    public static Connection getConnection(){
        try {
            Connection connection = DriverManager.getConnection(URL, USER, PASSWORD);
           return  connection;
        }catch(Exception ex){
            ex.printStackTrace();
        }
        return null;
    }

    /**
     * 釋放資源
     * @param resultSet 結果集
     * @param statement 語句對象
     * @param connection 連接
     */
    public static void close(ResultSet resultSet, Statement statement, Connection connection){//查詢時
        try
        {
            if (resultSet != null && !resultSet.isClosed())
                resultSet.close();
        }
        catch(SQLException ex)
        {
            ex.printStackTrace();
        }
        finally
        {
            try
            {
                if (statement != null && !statement.isClosed())
                    statement.close();
            }
            catch (SQLException ex)
            {
                ex.printStackTrace();
            }
            finally
            {
                try
                {
                    if (connection != null && !connection.isClosed())
                        connection.close();
                }
                catch(SQLException ex)
                {
                    ex.printStackTrace();;
                }
            }
        }
    }

    /**
     * 釋放資源
     * @param statement 語句對象
     * @param connection 連接
     */
    public static void close(Statement statement, Connection connection){//增刪改
        close(null,statement,connection);
    }
}

2、公用類

package com.librarySystem;

import oracle.sql.BfileDBAccess;

import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.math.BigDecimal;
import java.sql.*;
import java.util.*;

/**
 * 通用的DAO,可以對任意表做增刪改
 */
public     class CommonDao extends JDBCUTILS {
    /**
     * 對任意表做增刪改,根據增刪改的字符串或數字不同操作
     * @return
     */

    public static int executeUpdate(String sql,Object ...params){
        Connection conn =null;
        PreparedStatement preparedStatement =null;
        int i=0;
        try {
            //獲取連接
            conn = getConnection();
            //創建語句對象
            preparedStatement = conn.prepareStatement(sql);
            if(params!=null && params.length>0){//判斷需要佔位符
                for(int j=0;j<params.length;j++){
                    //設置佔位符
                    preparedStatement.setObject(j+1,params[j]);
                }
            }
             i = preparedStatement.executeUpdate();//成功爲1
        }catch(SQLException e){
            e.printStackTrace();
        }finally {//釋放資源
            close(preparedStatement,conn);
        }
        return i;
    }

    public static <T> List<T> queryBeenList(String sql,Class<T>classz ,Object ...paramas){
        Connection connection=null;
        PreparedStatement preparedStatement=null;
        ResultSet resultSet=null;
        List<T>lst =new ArrayList<>();
        T tmp =null;
        try{
            //獲取連接
            connection = getConnection();
            //創建語句對象
            preparedStatement = connection.prepareStatement(sql);
            if(paramas!=null&&paramas.length>0){//需要設置佔位符
                for(int i=0;i<paramas.length;i++){
                    preparedStatement.setObject(i+1,paramas[i]);
                }
            }
            //執行SQL語句
            resultSet = preparedStatement.executeQuery();
            //處理結果
            //獲取所有的屬性
            Field[]fields=classz.getDeclaredFields();
            //獲取元數據
            ResultSetMetaData  metaData = resultSet.getMetaData();
            //獲取共多少行
            int columnCount = metaData.getColumnCount();
            //準備字符串數組,用來保存字段名
            String []columnNames =new String[columnCount];
            for(int i=0;i<columnCount;i++){         //從數據庫中獲取變量名
                columnNames[i] = metaData.getColumnName(i+1);
            }
            while(resultSet.next()){            //行數據
                 tmp = classz.newInstance();
                for(Field  f:fields){           //從類的屬性名
                   String name = f.getName();
                   Class<?>type =f.getType();
                   //set屬性
                    String smn = "set"+name.substring(0,1).toUpperCase()+name.substring(1);
                   // 根據方法名找到方法類型
                    Method sm = classz.getMethod(smn, f.getType());
                    for(String columnName :columnNames){       //從數據庫獲取的變量名
                        if(columnName.equalsIgnoreCase(name) ) {        //忽略大小寫匹配,我的數據庫變量名和對象的變量名一樣,只是大小寫區別
                            Object value = resultSet.getObject(columnName);
                            if(value==null)
                                 continue;
                            if(value instanceof BigDecimal && type ==int.class){
                                  value = ((BigDecimal)value).intValue();
                            }
                            if(value instanceof BigDecimal && type ==double.class){
                                    value = ((BigDecimal)value).doubleValue();
                            }
                            sm.invoke(tmp,value);
                        }
                    }
                }
                lst.add(tmp);
            }
        }
        catch(SQLException e){
            e.printStackTrace();
        }
        catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        } finally {
           close(resultSet,preparedStatement,connection);
        }
        return lst;
    }

    public static <T> T  queryBeen(String sql,Class<T>classz,Object ...params){
       List<T>lst= queryBeenList(sql,classz,params);
       if(lst.size()>0){
           return lst.get(0);
       }
       return null;
    }

}

3、Reader類

package com.librarySystem;

public class Reader {
    private String rno;
    private String rname;
    private String rsex;
    private int rage;
    private String rboss;
    private String raddress;

    public String getRno() {
        return rno;
    }

    public String getRname() {
        return rname;
    }

    public String getRsex() {
        return rsex;
    }

    public int getRage() {
        return rage;
    }

    public String getRaddress() {
        return raddress;
    }

    public String getRboss() {
        return rboss;
    }

    public void setRno(String rno) {
        this.rno = rno;
    }

    public void setRname(String rname) {
        this.rname = rname;
    }

    public void setRsex(String rsex) {
        this.rsex = rsex;
    }

    public void setRage(int rage) {
        this.rage = rage;
    }

    public void setRboss(String rboss) {
        this.rboss = rboss;
    }

    public void setRaddress(String raddress) {
        this.raddress = raddress;
    }

    public String toString() {
        return rno + " " + rname + " " + rsex + " " + rage + " " + rboss + " " + raddress;
    }
}

4、連接

//學習鏈接: https://www.bilibili.com/video/BV14E411Q7wJ?p=2
package com.librarySystem;

import java.sql.*;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;



public class ConnnectDatabase extends CommonDao {
    /**
     * 查詢數據庫中資源對象
     * @return 對象集合
     */

    public static int doInsert(Reader reader) {
        String sql = "Insert into reader values('R011','George','男',?,null,?)";
        return executeUpdate(sql, reader.getRage(), reader.getRaddress());
    }

    public static int doDelete(String rno) {
        String sql = "Delete from reader where rno=?";
        return executeUpdate(sql, rno);
    }

    public static int doUpdate(Reader reader) {
        String sql = "Update reader set rname=?,rage=? where rno=?";
        return executeUpdate(sql, reader.getRname(), reader.getRage(), reader.getRno());
    }

    public static void main(String args[])
    {
        String sql = "Select * from reader";
         List<Reader> lst = new CommonDao().queryBeenList(sql,Reader.class);
         for(int i=0;i<lst.size();i++){
             System.out.println(  lst.get(i));
         }
    }

    public static List<Reader> queryAll() {
        String sql = "Select * from reader";
        return queryBeenList(sql,Reader.class);
    }

    public static Reader queryByRno(String rno) {
        String sql = "Select * from reader where rno=?";
        return queryBeen(sql,Reader.class ,rno);
    }
}





/*
遍歷列表
List<Reader> lst = queryALL();
        Iterator<Reader>it = lst.iterator();
        String tmp =null;
        while(it.hasNext()){
            tmp = ((Reader)it.next()).rname;
            System.out.println(tmp);
        }

 queryALL().forEach(str->
                {System.out.println(str);});
 */
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章