package com.cdjj.y2t034.mavk.db.executeUpdate;
import java.lang.reflect.Method;
import java.sql.Connection;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Set;
/**
* 数据操作类(append,amend,delete)
* 功能:根据传入对象以及SQL完成对数据库数据的增加、修改、删除操作
* 时间:2009年4月17日
* 地点:望平街(home)
* 作者:刘伟
* 备注:
* 该类的使用方法:
* 调用代参构造实例一个本类的对象,传入需要操作的对象以及SQL语句例如(增删改亦同):insert into abcd(aa,bb,cc) values(?,?,?)
* 要求:
* 1.数据类成员变量名称必须与数据库字段名一致
* 2.待操作对象所属类中只能出现一个getId的方法例如:getUId.如果是复合类请使用getUser方式的放出引用的对象(User为类名称)
* @author mavk ~.~
*
*/
class ExecuteUpdateObject extends ExecuteUpdate{
/**
* 带操作数据对象
*/
private Object object;
/**
* 此变量用于保存待插入preparedStatement的值
*/
List<Object> sqlParameterList;
/**
* 此变量保存需要操作的数据类型
*/
Class classs;
/**
* 此变量保存传入参数的类的所有方法(不包括继承得到的方法)
*/
Method[] methods;
/**
* 此变量用于保存传入参数的所有get方法名以及返回值HashMap<除去get后的方法名,返回值>
*/
HashMap<String, Object> methodValues;
/**
* 此变量用于保存SQL语句的参数以及参数的出现位置HashMap<出现位置, 参数名>,通过比较methodValues的键得到
*/
HashMap<Integer, String> sqlLocation;
/**
* 此变量用于保存经过冒泡排序后的methodValues(按照出现位置来排序)
*/
List<HashMap<Integer, String>> sqlValueList;
/**
* 此变量保存当前需要执行的是增加还是修改删除操作,false为新增操作,true为删改操作
*/
boolean appendOrAmendDelete;
/**
* 默认构造方法
*/
public ExecuteUpdateObject(){}
/**
* 代参构造方法
* @param object 待操作对象
* @param strSql 待编译SQL语句
*/
public ExecuteUpdateObject(Object object,String strSql,Connection conn) {
this.conn = conn; //得到连接
this.sql = strSql; //得到待编译sql语句
this.object = object; //得到带操作对象
this.classs = this.object.getClass(); //得到用户需要操作的数据类型
this.methods = classs.getDeclaredMethods(); //得到参数object对象的方法,包括公共、私有、保护、默认、但不包括继承得到的方法
this.sqlParameterList = new ArrayList<Object>(); //实例化保存待插入PreparedStatement的值集合
this.methodValues = new HashMap<String, Object>(); //实例化保存object对象的所有get方法名以及返回值的集合
this.sqlLocation = new HashMap<Integer, String>(); //实例化保存SQL语句的参数以及参数的出现位置的hashmap
this.sqlValueList = new ArrayList<HashMap<Integer, String>>();//实例化保存经过冒泡排序后的methodValues的集合
}
/**
* 写入待操作对象
* @param object 带操作
*/
public void setObject(Object object) {
this.object = object;
}
/**
* 判断对象类型的方法
* @param object 待判断对象
* @return true为常用数据类型,false为自定义类型
*/
private boolean classTypeCheck(String methodReturnValue) {
if (methodReturnValue.equals("int")
|| methodReturnValue.equals("class java.lang.Integer")
|| methodReturnValue.equals("class java.lang.String")
|| methodReturnValue.equals("double")
|| methodReturnValue.equals("class java.util.Date")) {
return true;
}
return false;
}
/**
* 判断数据类型的方法
* @param objectReturnValue 需要判断的数据
* @reurn type为java定义的数据类型,false为自定义类型
private boolean classTypeCheckTwo(Object objectReturnValue){
if(objectReturnValue == null || objectReturnValue instanceof String || objectReturnValue instanceof Boolean || objectReturnValue instanceof Number){
}
}*/
/**
* 循环拿到sql语句的参数及其出现位置(按照带操作对象所属类的方法名来查找),并放入sqlValueList中
* @return 判断是否拿到了SQL语句参数及其出现位置,以及待排序集合是否有数据
*/
private boolean getSqlParameterLocation(){
Set set = methodValues.keySet();
Object[] objects = set.toArray();
for (int i = 0; i < objects.length; i++) { //循环拿到sql语句的参数及其出现位置,并放入sqls中
String methodName = objects[i].toString(); // 拿到处理过后方法名
/* 全部转换为大写,方便比较 */
String tempMethodName = methodName.toUpperCase();
String tempSQL = sql.toUpperCase();
if (tempSQL.indexOf(tempMethodName) != -1) { // 只比对方法名数组中存在的sql参数
sqlLocation = new HashMap<Integer, String>(); //重新引用一个变量
sqlLocation.put(tempSQL.indexOf(tempMethodName), methodName);// 从sql语句中找到指定参数及其所在位置,并保存在hashmap中
sqlValueList.add(sqlLocation); // 保存到list集合中,待冒泡排序
}
}
if(sqlValueList.size() > 0){
return true;
}else{
return false;
}
}
/**
* 冒泡排序,重新排列sqlValueList,按照sql语句中参数出现位置排序
* @return 是否排序成功
*/
private boolean compositor(){
HashMap<Integer, String> maxHashMapKey = null;
for (int i = 0; i < sqlValueList.size(); i++) {
for (int j = 0; j < sqlValueList.size() - i - 1; j++) {
/* 转换为数组,为了比较hshmap键值 */
Set set1 = sqlValueList.get(j).keySet();
Object[] sqlsKey1 = set1.toArray();
Set set2 = sqlValueList.get(j + 1).keySet();
Object[] sqlsKey2 = set2.toArray();
// 比较键值
if (Integer.parseInt(sqlsKey1[0].toString()) > Integer.parseInt(sqlsKey2[0].toString())) {
maxHashMapKey = sqlValueList.get(j);
sqlValueList.set(j, sqlValueList.get(j + 1));
sqlValueList.set(j + 1, maxHashMapKey);
}
}
}
//判断是否排序成功
if(sqlValueList != null && sqlValueList.size() > 0){
return true;
}else{
return false;
}
}
/**
* 判断待操作对象需要执行的功能
* <p>根据带操作对象的id来判断即将执行的操作,如果返回的id不为空则为修改删除操作反之则为新增操作</br>
* @throws Exception 异常处理
*/
private void appendOrAmendCheck() throws Exception{
//循环查找获取id方法,并执行查看是否有返回值
for (int i = 0; i < methods.length; i++) {
//如果此方法有get和Id关键字则执行
if (methods[i].getName().indexOf("get") != -1 && methods[i].getName().indexOf("Id") != -1) {
try{
// 获取此get方法返回值,判断是否有值,如果没有值说明即将执行的操作新增
if (methods[i].invoke(object, null) == null) {
appendOrAmendDelete = false;
return;
} else {
appendOrAmendDelete = true;
return;
}
}catch(Exception e){
System.out.print("");
}
}
}
System.out.println("没有找到取得id的方法,请确认带操作数据对象是否符合使用本类的要求");
}
/**
* 创建动态SQL对象
* @param Sql sql语句
* @param listValue 占位符值
* @return 是否创建成功
* @throws Exception 异常处理
*/
private boolean getPreparedStatement() throws Exception {
try {
ps = conn.prepareStatement(sql);
} catch (Exception e) {
System.out.println("无法生成PreparedStatement对象,可能没有数据库连接");
}
if (sqlParameterList.size() > 0) {
for (int i = 0; i < sqlParameterList.size(); i++) {
try{
ps.setObject(i + 1, sqlParameterList.get(i));
}catch(Exception e){
System.out.println("空指针异常,可能替换占位符的值为空");
}
}
return true;
}else{
System.out.println("没有替换占位符的值,请确认待操作对象类满足使用本类要求");
return false;
}
}
/**
* 获取替换preparedStatemetn占位符的值的集合
* @return 是否成功拿到
*/
private boolean getSwapSqlParameter(){
for (int i = 0; i < sqlValueList.size(); i++) {
Set set1 = methodValues.keySet();
Object[] methodKey = set1.toArray();
Set set2 = sqlValueList.get(i).keySet();
Object[] sqlsKey = set2.toArray();
for (int j = 0; j < methodValues.size(); j++) {
//如果处理后的方法名等于冒泡排序后的sql参数名则添加
if (methodKey[j].equals(sqlValueList.get(i).get(sqlsKey[0]))) {
sqlParameterList.add(methodValues.get(methodKey[j]));
}
}
}
//判断是否拿到了数据
if(sqlParameterList.size() == 0){
return false;
}else{
return true;
}
}
/**
* 获取方法名称�
没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
收起资源包目录
executeUpdate.rar (6个子文件)
executeUpdate.jar 7KB
executeUpdate
ExecuteUpdateObject.java 11KB
ExecuteSolve.java 1KB
ExecuteUpdateInt.java 989B
ExecuteUpdate.java 1023B
IExecuteUpdate.java 367B
共 6 条
- 1
资源评论
- lovejava100002012-10-29有点难看懂啊,我是初学者,慢慢学习你的代码吧
zjwilove4
- 粉丝: 21
- 资源: 3
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功