继续添加语句
//----------多行多列查询-------- queryRows------------------
package com.han.sorm.core;
import java.lang.reflect.Field;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
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 {
//测试DML操作
public static void testDML(){
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 static void main(String[] args) {
//testDML();
//测试查询
List list = new MySqlQuery().queryRows(“select id,empname,age from emp where age>? and salary<?”
,Emp.class,new Object[]{10,10000});
System.out.println(list);
//遍历打印
for(Emp e : list){
System.out.println(e.getEmpname()+";"+e.getAge());
}
}
//删除
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) {//外部传进sql;把每行每列记录封装到Class clazz的对象里面;参数paramsConnection conn = DBManager.getConn(); List list = null;//存放查询结果的容器 ResultSet rs = null;//ResultSet记录集 PreparedStatement ps = null; try { ps = conn.prepareStatement(sql);//外部传进的sql参数 //给sql设参数 JDBCUtils.handleParams(ps, params); System.out.println(ps); rs = ps.executeQuery();// ResultSetMetaData metaData = rs.getMetaData(); //查询多行 while(rs.next()){ if(list==null){//容器如果是空的返回null list = new ArrayList(); } Object rowObj = clazz.newInstance();//调用javabean的无参构造器 //查询多列 查询 如:select username,pwd,age from user where id>? and age>18 for(int i=0;i<metaData.getColumnCount();i++){//返回对象中的列数 //返回名字 String columnName = metaData.getColumnLabel(i+1);//属性名 Object columnValue = rs.getObject(i+1);//对应的值 /*在ReflectUtils进行封装 * //调用rowObj对象的setusername(String uname)方法,将columnValue的值设置进去 Method m = clazz.getDeclaredMethod("set"+StringUtils.firstChar2UpperCase(columnName), columnValue.getClass());//通过反射获取set方法 m.invoke(rowObj, columnValue);//调用对象及参数
*/ //调用
ReflectUtils.invokeSet(rowObj, columnName, columnValue);
}
list.add(rowObj);//存放值
}
} catch (Exception e) {
e.printStackTrace();
}finally{
DBManager.close( ps, conn);
}
return list;
}
//查询返回一个数字(一行一列)
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<Object> params = new ArrayList<Object>();//存储SQL的参数对象
TableInfo tableInfo = TableContext.poClassTableMap.get(c);//获取表信息
//获取主键
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;
}
}
//--------------------封装–ReflectUtils------------------------
package com.han.sorm.utils;
import java.lang.reflect.Method;
/**
- 封装了反射常用的操作
/
public class ReflectUtils {
/ * 调用obj对象对应属性fieldName的get方法
* @param c
* @param fieldName
* @param obj
* @return
*/
public static Object invokeGet(String fieldName,Object obj){
try {
Class c = obj.getClass();
Method m = c.getDeclaredMethod(“get”+StringUtils.firstChar2UpperCase(fieldName), null);
return m.invoke(obj, null);
} catch (Exception e) {
e.printStackTrace();
return null;//异常为空
}
}
public static void invokeSet(Object obj,String columnName,Object columnValue){
Method m;
try {
m = obj.getClass().getDeclaredMethod(“set”+StringUtils.firstChar2UpperCase(columnName),
columnValue.getClass());//通过反射获取set方法
m.invoke(obj, columnValue);//调用对象及参数
} catch (Exception e) {
e.printStackTrace();
}
}
}
//---------------------测试结果--------------