java_291_手写SORM框架_查询多行记录封装成List和javabean_queryRows方法_练习

继续添加语句
//----------多行多列查询-------- 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的对象里面;参数params

     Connection 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();
}
}
}

//---------------------测试结果--------------
在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值