/*
*查询类的接口
*/
package som.gu.core;
import java.util.List;
/**
* 提供查询服务的核心类
* @author 谷
*
*/
public interface Query {
/**
* 执行一个DML语句
* @param sqlDML语句
* @param param 参数
* @return 返回受影响的行数
*/
int executeDML(String sql,Object[]params);
/**
* 插入一个对象
* @param clazz
* @param obj
*/
void insert (Object obj);
/**
*
* @param clazz对应的记录所在表对象
* @param id主键
* @return
*/
void delete(Class clazz,Object id);//delete from clazz where id=id
/**
*删除对应记录
* @param obj记录对应的对象
*/
void delete(Object obj);
/**
*
* @param obj要更新的对象
* @param files要更新的字段
*/
void update(Object obj,String[]files);//update users set name=? ss=?
/**
*
* @param clazz记录对应的类
* @param sql查询语句
* @param params,sql的参数
* @return 查询到的记录
*/
List queryRows(Class clazz,String sql,Object[]params);//查询
/**
*
* @param clazz记录对应的类
* @param sql查询语句
* @param params,sql的参数
* @return 查询到的记录
*/
Number queryNumber(Class clazz,String sql,Object[]params);//查询
}
/*
*实现类
*/
package som.gu.core;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import som.gu.po.Users;
import com.gu.bean.columnInfo;
import com.gu.bean.tableInfo;
import com.gu.utils.JdbcUtils;
import com.gu.utils.StringUtils;
import com.gu.utils.reflectUtils;
public class MysqlQuery implements Query {
public static void main(String[] args) {
//删除一个对象
/*Users us=new Users();
us.SetId(11);
new MysqlQuery().delete(us);*/
//插入一个对象
/*Users us=new Users();
us.SetUser("tom");
us.SetPassword("43343");
new MysqlQuery().insert(us);*/
//更新一个对象
/*Users us=new Users();
us.SetUser("jerry");
us.SetId(12);
new MysqlQuery().update(us,new String[]{"user"});*/
//查询多行
Users us=new Users();
List<Users> list=new MysqlQuery().queryRows(us.getClass(),"select * from users where id>? and id<13 ", new Object[]{10});
for(Users obj:list){
System.out.println(obj.GetUser());
}
}
@Override
public int executeDML(String sql, Object[] params) {
Connection conn=DBManager.getConnect();
PreparedStatement ps=null;
int count=0;
try {
ps=conn.prepareStatement(sql);
JdbcUtils.handleParams(ps, params);
count=ps.executeUpdate();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
DBManager.closeRes(null, ps, conn);
}
return count;
}
@Override
public void delete(Class clazz, Object id) {
//class user,id=11
//delete from user where id=?
tableInfo info=tableContext.poClassTableMap.get(clazz);
columnInfo onlyKey=info.getOnlyKey();
String sql="delete from "+ info.gettName()+ " where "+onlyKey.getName()+" =?";
System.out.print(sql);
executeDML(sql, new Object[]{id});
}
@Override
public void delete(Object obj) {
Class c=obj.getClass();
tableInfo info=tableContext.poClassTableMap.get(c);
columnInfo onlyKey=info.getOnlyKey();//主键
//通过反射获得对应的get,set方法
Object onlypriKey=reflectUtils.invokeGet(onlyKey.getName(), obj);
delete(c,onlypriKey);
}
@Override
public void update(Object obj, String[] files) {
//update table set name=?,id=?where key=?
Class c=obj.getClass();
tableInfo table=tableContext.poClassTableMap.get(c);
columnInfo onlyKey=table.getOnlyKey();
StringBuilder sql=new StringBuilder("update "+table.gettName()+" set ");
List<Object>params=new ArrayList<>();
for(String fName:files){
Object fValue=reflectUtils.invokeGet(fName, obj);
params.add(fValue);
sql.append(fName+"=?,");
}
sql.setCharAt(sql.length()-1, ' ');
sql.append("where "+onlyKey.getName()+"=?;");
params.add(reflectUtils.invokeGet(onlyKey.getName(), obj));
// System.out.print(sql.toString());
executeDML(sql.toString(), params.toArray());
}
@Override
public List queryRows(Class clazz, String sql, Object[] params) {
//query *from table where id=?//user=?//pa=?
Connection conn=DBManager.getConnect();
PreparedStatement ps=null;
List<Object>list=new ArrayList<>();
ResultSet rs=null;
try {
ps=conn.prepareStatement(sql);
JdbcUtils.handleParams(ps, params);//set sql语句中的参数
rs=ps.executeQuery();
ResultSetMetaData metaDate=rs.getMetaData();
while(rs.next()){
Object RowObj=null;
try {
RowObj = clazz.newInstance();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}//调用JavaBean的无参构造器
for(int i=0;i<metaDate.getColumnCount();i++){
String columnName=metaDate.getColumnLabel(i+1);
Object columnValue=rs.getObject(i+1);
//调用set方法将属性值设进去
reflectUtils.invokeSet( columnName,columnValue, RowObj);
}
list.add(RowObj);
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
DBManager.closeRes(null, ps, conn);
}
return list;
}
@Override
public Number queryNumber(Class clazz, String sql, Object[] params) {
// TODO Auto-generated method stub
return null;
}
@Override
public void insert(Object obj) {
//insert into table ()values(???);
Class c=obj.getClass();
tableInfo table=tableContext.poClassTableMap.get(c);
List<String>params=new ArrayList<>();//不为空的参数名
List<Object>values=new ArrayList<>();
int count=0;//计算参数个数
StringBuilder sql=new StringBuilder("insert into "+table.gettName()+" (");
Field[] fields=c.getDeclaredFields();//反射获得属性数组
for(Field f:fields){//获得属性名和属性值
String fName=f.getName();
Object fValue=reflectUtils.invokeGet(fName, obj);
if(fValue!=null){
count++;
params.add(fName);
sql.append(fName+",");
values.add(fValue);
}
}
sql.setCharAt(sql.length()-1, ')');
sql.append(" values(");
for(int i=0;i<count;i++){
sql.append("?,");
}
sql.setCharAt(sql.length()-1, ')');
sql.append(";");
executeDML(sql.toString(), values.toArray());
}
}