java_290_手寫SORM框架_修改數據_update方法的實現_練習

2020-08-12 20:42:03

繼續新增語句
//-----------------修改------update-------------------------
package com.han.sorm.core;

import java.lang.reflect.Field;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.util.ArrayList;
import java.util.List;
import com.han.po.Emp;
import com.han.sorm.bean.ColumnInfo;
import com.han.sorm.bean.TableInfo;
import com.han.sorm.utils.JDBCUtils;
import com.han.sorm.utils.ReflectUtils;
/**

  • 新增實現類 負責針對Mysql數據庫的查詢
    */
    public class MySqlQuery implements Query {
    public static void main(String[] args) {
    Emp e = new Emp();
    //e.setId(40);
    e.setEmpname(「tom」);
    e.setSalary(2589.0);
    e.setAge(30);
    e.setBonus(3000.0);
    e.setBirthday(new java.sql.Date(System.currentTimeMillis()));//System.currentTimeMillis當前時間
    e.setId(1);

     //new MySqlQuery().delete(e);//刪除
     //new MySqlQuery().insert(e);//儲存
     new MySqlQuery().update(e, new String[]{"empname","age","salary"});
    

    }
    //刪除
    public void delete(Class clazz,Object id) {
    // 刪除數據庫某個內容;如 Emp.class,2–>delete from emp where id = 2;
    // 通過Class物件找TableInfo ;類名與表名要一致
    TableInfo tableInfo = TableContext.poClassTableMap.get(clazz);
    // 獲取主鍵(前面已經封裝好了)
    ColumnInfo onlyPriKey = tableInfo.getOnlyPriKey();
    // 拼出SQL語句
    String sql = " delete from " + tableInfo.getTname() + " where "
    + onlyPriKey.getName() + 「=?」;
    // 執行SQL語句
    executeDML (sql, new Object[]{id});// Object[]是陣列但現在只有一個id
    }
    //刪除一個欄位
    public void delete(Object obj) {
    // 只傳一個物件情況
    Class c = obj.getClass();
    // 獲取表名
    TableInfo tableInfo = TableContext.poClassTableMap.get©;
    // 獲取主鍵(前面已經封裝好了)
    ColumnInfo onlyPriKey = tableInfo.getOnlyPriKey();
    // 通過反射機制 機製,呼叫屬性對應的get與set方法

     Object priKeyValue = ReflectUtils.invokeGet(onlyPriKey.getName(), obj);// 呼叫封裝好的方法
     delete (c, priKeyValue);
    

    }
    //直接執行一個DML語句
    public Object executeDML(String sql, Object[] params) {
    Connection conn = DBManager.getConn();
    int count = 0;
    PreparedStatement ps = null;
    try {
    ps = conn.prepareStatement(sql);
    //給sql設參數
    JDBCUtils.handleParams(ps, params);
    System.out.println(ps);
    count = ps.executeUpdate() ;//返回 一個數
    } catch (Exception e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }finally{
    DBManager.close( ps, conn);
    }
    return count;
    }
    //新增
    public void insert(Object obj) {
    //過程obj–>表中;即 insert into 表名(id,uname,pwd) values (?,?,?);形式
    //1.獲取表名
    Class c = obj.getClass();
    List params = new ArrayList();//儲存SQL的參數物件
    TableInfo tableInfo = TableContext.poClassTableMap.get©;//獲取表資訊
    //拼裝
    StringBuilder sql = new StringBuilder(" insert into 「+tableInfo.getTname()+」 (");
    int conntNotNullField = 0;//計算不爲null的屬性值

     //獲取屬性
     Field[] fs = c.getDeclaredFields();
     for(Field f:fs){ 
     	String fieldName = f.getName();//獲取名稱
     	Object fieldValue = ReflectUtils.invokeGet(fieldName, obj);//獲取值 ;
     	if(fieldValue != null){
     		conntNotNullField++;//計算問號數
     		sql.append(fieldName+",");
     		params.add(fieldValue);//把名稱儲存
     	} 
     }
     sql.setCharAt(sql.length()-1, ')');// sql.length()-1逗號的位置;把逗號換成小括號
     sql.append(" values ( "); 
     //生成問號
     for(int i=0;i<conntNotNullField;i++){
     	sql.append("?,");
     }
     sql.setCharAt(sql.length()-1, ')');
     //執行
     executeDML(sql.toString(), params.toArray());//toArray()轉爲陣列
     //2.不爲空的欄位及對應的參數
    

    }
    //查詢返回一行記錄
    public Object queryInqueRow(String sql, Class clazz, Object[] params) {
    return null;
    }
    //查詢返回多行記錄
    public List queryRows(String sql, Class clazz, Object[] params) {
    return null;
    }
    //查詢返回一個數字(一行一列)
    public Number queryNumber(String sql, Object[] params) {
    return null;
    }
    //查詢返回一個值(一行一列)
    public Object queryValue(String sql, Object[] params) {
    return null;
    }
    //修改
    public int update(Object obj, String[] fieldNames) {
    //需要修改語句;如:obj{「uanme」,「pwd」}–>update 表名 set uname=?,pwd=? where id=?;
    Class c = obj.getClass();//1.獲取表名
    List params = new ArrayList();//儲存SQL的參數物件
    TableInfo tableInfo = TableContext.poClassTableMap.get©;//獲取表資訊
    //獲取主鍵
    ColumnInfo prikey = tableInfo.getOnlyPriKey();//獲取唯一主鍵
    //拼裝
    StringBuilder sql = new StringBuilder(" update 「+tableInfo.getTname()+」 set 「);
    for(String fname : fieldNames){
    Object fvalue = ReflectUtils.invokeGet(fname, obj);//?對應的值
    params.add(fvalue);
    sql.append(fname+」=?,");
    }
    sql.setCharAt(sql.length()-1, ’ ‘);//用’'替換","
    sql.append(" where 「);
    sql.append(prikey.getName()+」=? ");//獲取id
    params.add(ReflectUtils.invokeGet(prikey.getName(), obj));//獲取主鍵的值即最後的?值
    //執行
    executeDML(sql.toString(), params.toArray());

      return 0;
    

    }
    }
    在这里插入图片描述
    執行
    在这里插入图片描述

在这里插入图片描述