/**
*
* @author 杨怿,EasyORM, 用于简单的ORM操作。修改简化并规范了hyberbin
* 出了insert,其他都要带where 子句。
*
* * 2.3 1301
* 完成了EasyBeansManager的ORM数据库操作方法
*/
package com.huahuan.database;
import com.jplus.json.EasyUiJson;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import org.jplus.hyb.database.SqlFilter;
import org.jplus.util.LoggerManage;
import org.jplus.util.Pagger;
public class EasyBeansManager extends SqlFilter {
/**
* 表名
*/
private String tableName;
/**
* 成员变量列表
*/
private List<Field> fields = null;
/**
* 表的实体类
*/
private Object tablebean;
/**
* 数据库操作对象
*/
private DatabaseAccess dao;
/**
* 获取用于引用 SQL 标识符的字符串
*/
// public static String quote = "";
public EasyBeansManager(DatabaseAccess dao) {
this.dao = dao;
}
//设置要操作的tablebean
private void setTableBean(Object tablebean) {
if (this.tablebean != tablebean) {
try {
this.tableName = tablebean.getClass().getSimpleName().toLowerCase();
this.tablebean = tablebean;
fields = new ArrayList<Field>();
fields.addAll(Arrays.asList(tablebean.getClass().getDeclaredFields()));
// firstSetField = false;
} catch (Exception ex) {
LoggerManage.logger.getLogger(ex.getMessage(),ex);
}
}
}
public void setPrepareParmeter(Object parameter) {
dao.setPreparedParameter(parameter);
}
//根据sql的where部分查询数据库,将rs转换成包含当前tablebean类型的ArrayList。
public List select(Object tablebean, String where) {
this.setTableBean(tablebean);
String sql = "select " + getFieldList() + " from " + tableName + " " + where;
if (super.isFilter()) {
super.getSql(sql);
sql = super.getSelectSQL();
}
List list = new ArrayList();
ResultSet rs = dao.executeQuery(sql);//执行查询
//将ResultSet转化为对象的List
try {
ResultSetMetaData metaData = rs.getMetaData();
while (rs != null && rs.next()) {
Object table = tablebean.getClass().newInstance();
for (int i = 1; i <= metaData.getColumnCount(); i++) {
Field field = table.getClass().getDeclaredField(metaData.getColumnName(i).toLowerCase());
try {
Method method = table.getClass().getMethod(set(field.getName()), field.getType());//取得set方法
method.invoke(table, rs.getObject(field.getName()));//调用实体类的setXXX方法
} catch (Exception ex) {
LoggerManage.logger.getLogger("表:" + table.getClass().getSimpleName() + " 字段:" + field.getName() + "类型不匹配!" + this.getClass().getName() + ex,ex);
}
}
//此处可以把table放入list
list.add(table);
}
} catch (Exception ex) {
LoggerManage.logger.getLogger("查询出错,表:" + tableName + "\nsql:" + sql + "\n" + EasyBeansManager.class.getName() + "\n" + ex,ex);
} finally {
}
return list;
}
public List select(Object tablebean, String where, Pagger page) {
String sql = "select count(*) as count from " + tableName + " " + where;
page.setItems(dao.executeCount(sql));
return select(tablebean, where+" limit "+page.getTop()+","+page.getSize());
}
public List select(Object tablebean, String where,EasyUiJson page) {
String sql = "select count(*) as count from " + tableName + " " + where;
page.setTotal(dao.executeCount(sql));
return select(tablebean, where+" limit "+page.getTop()+","+page.getRows());
}
public boolean insert(Object tablebean) {
this.setTableBean(tablebean);
String sql = "insert into " + tableName + "(" + getFieldList() + ") values (" + getValueList() + ")";
return (dao.executeUpdate(sql));
}
public boolean update(Object tablebean, String where) {
this.setTableBean(tablebean);
StringBuilder sql = new StringBuilder();
sql.append("update ").append(tableName).append(" set ");
boolean b = true;//判断是否第一次循环
for (Field field : fields) {
if (!b) {
sql.append(",");
} else {
b = false;
}
Object value = getFieldValue(tablebean, field.getName());
String name = field.getName();
if (value != null) {
dao.setPreparedParameter(value);
sql.append(name).append("=").append("?");
} else {
sql.append(name).append("=").append("null");
}
}
sql.append(" ").append(where);
return (dao.executeUpdate(sql.toString()));
}
public boolean delete(Object tablebean, String where) {
this.setTableBean(tablebean);
StringBuilder sql = new StringBuilder();
sql.append("delete from ").append(tableName).append(" ").append(where);
return (dao.executeUpdate(sql.toString()));
}
/**
* 拼装当前bean的所有字段名的字符串
*
* @return
*/
private StringBuffer getFieldList() {
StringBuffer fieldlist = new StringBuffer();
boolean b = true;//判断是否第一次循环
for (Field field : fields) {
//第一次循环不加逗号,并置为false
if (!b) {
fieldlist.append(",");
} else {
b = false;
}
fieldlist.append(field.getName().toLowerCase());
}
return fieldlist;
}
/**
* 拼装当前bean的所有字段值的字符串,如果有值的话做了预处理,实质上就“?”字符串。
*
* @return
*/
private StringBuffer getValueList() {
StringBuffer valuelist = new StringBuffer();
boolean b = true;//判断是否第一次循环
for (Field field : fields) {
Object value = getFieldValue(tablebean, field.getName());
//第一次循环不加逗号,并置为false
if (!b) {
valuelist.append(",");
} else {
b = false;
}
if (value != null) {
dao.setPreparedParameter(value);
valuelist.append("?");
} else {
valuelist.append("null");
}
}
return valuelist;
}
/**
* 取得一个成员变量的值
*
* @param field 成员变量
* @return
*/
private Object getFieldValue(Object tablebean, String fieldName) {
if (fieldName == null || fieldName.trim().equals("")) {
return null;
}
Object value = null;
try {
Method method = tablebean.getClass().getMethod(get(fieldName), (Class[]) null);//取得get方法
value = method.invoke(tablebean, (Object[]) null);//调用实体类的getXXX方法
} catch (Exception ex) {
LoggerManage.logger.getLogger(this.getClass().getName() + ex,ex);
}
return value;
}
/**
* 存入一个实体的成员变量值
*
* @param field
* @param value
* @return
*/
private Object setFieldValue(Object tablebean, String fieldName, Object value) {
if (value == null) {
return tablebean;
}
try {
Method method = tablebean.getClass().getMethod(set(fieldName), value.getClass());//取得set方法
method.invoke(tablebean, value);//调用实体类的setXXX方法
} catch (Exception ex) {
LoggerManage.logger.getLogger(this.getClass().getName() + ex,ex);
}
return tablebean;
}
/**
* 拼装getXXX方法的方法名字符串
*
* @param name 成员变量名
* @return
*/
public static String get(String name) {
String get = "get" + (name.charAt(0) + "").toUpperCase() + name.substring(1);//get+变量名的第一个字母大写
return get;
}
/**
* 拼装setXXX方法的方法名字符串
*
* @param name 成员变量名
* @return
*/
private static String set(String name) {
return "set" + (name.charAt(0) + "").toUpperCase() + name.substring(1);//get+变量名的第一个字母大写
}
}