繼續新增語句
//-----------------修改------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;
}
}
執行