首先定义一个类去获取对象你的属性及其值
ObjectFields.java
package com.framework.betterorm.reflection;
import com.framework.betterorm.test.User;
import java.beans.PropertyDescriptor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Map;
public class ObjectFields {
private ObjectFields() {
}
/**
* 获取属性名数组
*/
public static String[] getFiledName(Object o) {
Field[] fields = o.getClass().getDeclaredFields();
String[] fieldNames = new String[fields.length];
for (int i = 0; i < fields.length; i++) {
fieldNames[i] = fields[i].getName();
}
return fieldNames;
}
/**
* 根据属性名获取属性值
*/
private static Object getFieldValueByName(String fieldName, Object o) {
try {
String firstLetter = fieldName.substring(0, 1).toUpperCase();
String getter = "get" + firstLetter + fieldName.substring(1);
Method method = o.getClass().getMethod(getter);
o = method.invoke(o);
} catch (Exception e) {
e.printStackTrace();
}
return o;
}
public static void setFieldValue(Object object, Map<String, Object> value) {
try {
Class clazz = object.getClass();
String[] filedName= getFiledName(object);
for (String str :filedName) {
PropertyDescriptor pd = new PropertyDescriptor(str, clazz);
Method setMethod = pd.getWriteMethod();
if (setMethod != null) {
setMethod.invoke(object, value.get(str));
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
public static Map<String, Object> getFieldValuesMap(Object o) {
String[] fieldName = getFiledName(o);
Map<String, Object> fieldValueMap = new HashMap<>();
for (String str : fieldName) {
fieldValueMap.put(str, getFieldValueByName(str, o));
}
return fieldValueMap;
}
public static void main(String[] args) {
User user = new User("test", "test");
System.out.println(getFieldValuesMap(user));
}
}
在AbstractDataBaseOperationFactory类中定义两个方法分别去实现数据库查询与更新操作
代码如下
@Override
public int update(String sql, Object object) {
String sqlStr=sql;
System.out.println("将要执行update方法");
int colum = 0;
//获取连接
DataBaseManager.getDataBaseConnect();
PreparedStatement preparedStatement;
try {
//设置事务为非自动提交
conn.setAutoCommit(autoCommit);
//去除特殊标记
sql = PropertyParser.parse(sql);
//获取参数列表
List<String> parameter = PropertyParser.getParameter(sqlStr);
//准备数据库操作对象
preparedStatement = conn.prepareStatement(sql);
int i = 1;
//获取object对象属性值
Map<String, Object> fieldValuesMap = ObjectFields.getFieldValuesMap(object);
for (String str : parameter) {
preparedStatement.setObject(i, fieldValuesMap.get(str));
i++;
}
colum = preparedStatement.executeUpdate();
commit(conn);
preparedStatement.close();
} catch (SQLException e) {
rollback(conn);
e.printStackTrace();
}
return colum;
}
@Override
public Object select(String sql, Object object) {
String sqlStr=sql;
System.out.println("将要执行select方法");
DataBaseManager.getDataBaseConnect();
PreparedStatement preparedStatement;
try {
conn.setAutoCommit(autoCommit);
sql = PropertyParser.parse(sql);
List<String> parameter = PropertyParser.getParameter(sqlStr);
preparedStatement = conn.prepareStatement(sql);
int i = 1;
Map<String, Object> fieldValuesMap = ObjectFields.getFieldValuesMap(object);
for (String str : parameter) {
preparedStatement.setObject(i, fieldValuesMap.get(str));
i++;
}
i=0;
ResultSet resultSet = preparedStatement.executeQuery();
String[] fieldNames = ObjectFields.getFiledName(object);
Map<String, Object> valuesMap = new HashMap<>();
//给对象属性赋值
while (resultSet.next()) {
valuesMap.put(fieldNames[i], resultSet.getObject(fieldNames[i]));
valuesMap.put(fieldNames[i+1],resultSet.getObject(fieldNames[i+1]));
i++;
}
ObjectFields.setFieldValue(object, valuesMap);
preparedStatement.close();
} catch (SQLException e) {
rollback(conn);
e.printStackTrace();
}
return object;
}