1. 程式人生 > 其它 >Orm-JDBC(物件關係對映的資料庫查詢) 程式碼更新

Orm-JDBC(物件關係對映的資料庫查詢) 程式碼更新

技術標籤:mysqljava

Orm-JDBC(物件關係對映的資料庫查詢)

本次更新內容
  • 完成多條資料查詢
  • 更新資料操作
  • 刪除資料的操作
  • 以及上個版本bug的修改

測試:

 public static void main(String[] args) {
        //例項化dao
        CommonDao dao=new CommonDao();

        //一行資料查詢
        String sql="select * from tb_goods where id=?";
        //TbGoods object = dao.findObject(sql, TbGoods.class,2,3);
        //System.err.println(object);

        //多行資料查詢
        sql="select * from tb_goods";
        //List<TbGoods> objectList = dao.findListObject(sql, TbGoods.class);
        //System.err.println(objectList);

        //更新資料操作
        sql="update tb_goods set name='小丫丫' where id=? or name=?";
        //int row = dao.updateObjects(sql, 2,"小雞雞");
        //System.err.println(row);

        sql="delete from tb_goods where id=?";
        int row=dao.deleteObjects(sql,2);
        System.err.println(row);
    }
CommondDao 程式碼更新
package com.epoint.util;

import java.lang.reflect.Method;
import java.sql.*;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.List;

public class CommonDao
{
    private static Connection conn = null;

    static {
        conn=DruidUtils.getConnection();
    }

    /**
     * 獲取例項化CommonDao
     */
    public CommonDao getInstance() {
        CommonDao dao = new CommonDao();
        return dao;
    }

    /**
     * 刪除資料
     * @param sql sql
     * @param params 引數
     * @return 受影響的行數
     */
    public int deleteObjects(String sql, Object... params){
        return updateOrDelete(sql,params);
    }

    /**
     * 更新資料
     * @return 返回受影響的行數
     */
    public int updateObjects(String sql, Object... params){
        return updateOrDelete(sql,params);
    }

    private int updateOrDelete(String sql, Object... params){
        int row =0;
        try {
            //3.通過資料庫的連線操作資料庫,實現增刪改查
            PreparedStatement statement = conn.prepareStatement(sql);
            //獲取需要傳入引數的個數
            ParameterMetaData parameterMetaData = statement.getParameterMetaData();
            //如果需要傳入的引數個人大於>0則需要設定引數
            if (parameterMetaData.getParameterCount() > 0) {
                for (int i = 1; i <= parameterMetaData.getParameterCount(); i++) {
                    statement.setString(i, params[i - 1].toString());
                }
            }
            //執行更新操作
            row = statement.executeUpdate();
        }catch (Exception e){
            e.printStackTrace();
        }
        return row;
    }

    /**
     * 查詢多條資料
     * @param sql 查詢sql
     * @param cls 需要對映的物件
     * @param params sql中的引數
     * @return 返回值List
     */
    public List findListObject(String sql, Class cls, Object... params){
        List list=new ArrayList();
        Object obj =null;
        try {
            //3.通過資料庫的連線操作資料庫,實現增刪改查
            PreparedStatement statement = conn.prepareStatement(sql);
            //獲取需要傳入引數的個數
            ParameterMetaData parameterMetaData = statement.getParameterMetaData();
            //如果需要傳入的引數個人大於>0則需要設定引數
            if(parameterMetaData.getParameterCount()>0){
                for (int i = 1; i <= parameterMetaData.getParameterCount(); i++) {
                    statement.setString(i, params[i-1].toString());
                }
            }

            //4.獲取結果集
            ResultSet resultSet =statement.executeQuery();

            //6.獲取結果集元資料
            ResultSetMetaData metaData = resultSet.getMetaData();
            //7.獲取欄位的個數
            int columnCount = metaData.getColumnCount();
            //是否例項化的開關,保證物件只例項化一次
            boolean flag=true;
            //8.遍歷  建立類物件(來接資料查詢出來的資料)
            while (resultSet.next()) {
                if(flag){
                    obj = cls.getConstructor(null).newInstance(null);
                    flag=false;
                }
                for (int i = 1; i <= columnCount; i++) {
                    //9.獲取欄位的名字
                    String columnName = metaData.getColumnName(i);//id, name ,age
                    //10.獲取對應欄位的資料
                    Object value = resultSet.getObject(columnName);
                    //11.給指定欄位的資料在類物件中給賦值
                    setValue(columnName, value, obj, cls);
                }
                list.add(obj);
            }
            //DruidUtils.closeAll(conn,statement,resultSet);
        }catch (Exception e){
            e.printStackTrace();
        }
        //返回查詢到的物件
        return list;
    }

    /**
     * 查詢一條資料
     * @param sql 需要查詢的sql
     * @param cls 對映的物件
     * @param params sql中的引數
     * @param <T> 泛型
     * @return 返回傳入物件型別
     */
    public <T> T findObject(String sql, Class cls, Object... params) {
        Object obj =null;
        try {
            //3.通過資料庫的連線操作資料庫,實現增刪改查
            PreparedStatement statement = conn.prepareStatement(sql);
            //獲取需要傳入引數的個數
            ParameterMetaData parameterMetaData = statement.getParameterMetaData();
            //如果需要傳入的引數個人大於>0則需要設定引數
            if(parameterMetaData.getParameterCount()>0){
                for (int i = 1; i <= parameterMetaData.getParameterCount(); i++) {
                    statement.setString(i, params[i-1].toString());
                }
            }
            //4.獲取結果集
            ResultSet resultSet =statement.executeQuery();
            //6.獲取結果集元資料
            ResultSetMetaData metaData = resultSet.getMetaData();
            //7.獲取欄位的個數
            int columnCount = metaData.getColumnCount();
            //8.遍歷  建立類物件(來接資料查詢出來的資料)
            if(resultSet.next()) {
                obj = cls.getConstructor(null).newInstance(null);
                for (int i = 1; i <= columnCount; i++) {
                    //9.獲取欄位的名字
                    String columnName = metaData.getColumnName(i);//id, name ,age
                    //10.獲取對應欄位的資料
                    Object value = resultSet.getObject(columnName);
                    //11.給指定欄位的資料在類物件中給賦值
                    setValue(columnName, value, obj, cls);
                }
            }
            //DruidUtils.closeAll(conn,statement,resultSet);
        }catch (Exception e){
            e.printStackTrace();
        }
        //返回查詢到的物件
        return (T) obj;
    }

    private void setValue(String field, Object value, Object obj, Class cls) throws Exception {
        //獲取物件中的方法陣列
        Method[] method = cls.getMethods();
        //加上資料庫欄位加上set
        String fieldName = "set" + field;
        for (int n = 0; n < method.length; n++) {
            //如果匹配到對應的set方法則執行賦值操作
            if (method[n].getName().equalsIgnoreCase(fieldName)) {
                //獲取方法引數資料型別
                String[] clsList = method[n].getParameterTypes()[0].getName().split("\\.");
                String type = clsList[clsList.length - 1];
                switch (type) {
                    case "Integer":
                    case "int":
                        method[n].invoke(obj, Integer.parseInt(value.toString()));//給對應的方法引數賦值
                        break;

                    case "Double":
                    case "double":
                        method[n].invoke(obj, Double.parseDouble(value.toString()));
                        break;

                    case "Long":
                    case "long":
                        method[n].invoke(obj, Long.parseLong(value.toString()));
                        break;

                    case "Float":
                    case "float":
                        method[n].invoke(obj, Float.parseFloat(value.toString()));
                        break;

                    case "Date":
                        method[n].invoke(obj, new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(value.toString()));
                        break;
                    case "String":
                        method[n].invoke(obj, value.toString());
                        break;
                }
                break;
            }
        }
    }
}

如果對你有幫助,或者喜歡交流技術請進入QQ群(點選下面圖示):
Orm-jdbc