import java.lang.reflect.Field;
import java.sql.SQLException;
import java.text.MessageFormat;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import org.apache.commons.lang.StringUtils;
import com.autocreate.dbpool.DBUtil;
import com.autocreate.util.JBeanClass;
import com.autocreate.util.Log;
import com.autocreate.util.TimeTools;
public class BaseService<T>
{
/**
* 通过反射创建查询语句
* @param info
* @return
*/
@SuppressWarnings("unchecked")
public T query(T info)
{
Log.getLogger().info("query object: " + info);
StringBuffer sqlBuffer = new StringBuffer(512);
String className = info.getClass().getSimpleName();
sqlBuffer.append("select * from ").append(className);
Object[] whereObj = createWhereByPrimaryKey(info);
String sql = sqlBuffer.toString() + whereObj[0];
return (T)DBUtil.getInstance().queryBean(sql, info.getClass(), ((List)whereObj[1]).toArray());
}
/**
* 通过反射创建insert语句
* @param info
* @return
* @throws Exception
*/
@SuppressWarnings("unchecked")
public boolean insert(T info) throws Exception
{
Log.getLogger().info("insert object: " + info);
StringBuffer sqlBuffer = new StringBuffer(512);
StringBuffer bufferName = new StringBuffer(256);
StringBuffer bufferValue = new StringBuffer(256);
List paramList = new ArrayList();
String className = info.getClass().getSimpleName();
sqlBuffer.append("insert into ").append(className).append("(");
Object obj = null;
Object[] typeAndValue = null;
Field[] fields = info.getClass().getDeclaredFields();
for (Field f : fields)
{
obj = JBeanClass.getGetterMethodInvokeValue(info, f.getName());
if (null != obj)
{
typeAndValue = getValueByType(f.getType().getName(), obj);
bufferName.append(f.getName()).append(",");
bufferValue.append(typeAndValue[0]).append(",");
paramList.add(typeAndValue[1]);
}
}
sqlBuffer.append(StringUtils.removeEnd(bufferName.toString(), ","))
.append(") values (")
.append(StringUtils.removeEnd(bufferValue.toString(), ","))
.append(")");
return DBUtil.getInstance().update(sqlBuffer.toString(), paramList.toArray());
}
/**
* 通过反射创建update语句
* @param info
* @return
* @throws Exception
*/
@SuppressWarnings("unchecked")
public boolean update(T info) throws Exception
{
Log.getLogger().info("update object: " + info);
StringBuffer sqlBuffer = new StringBuffer(512);
StringBuffer bufferName = new StringBuffer(256);
List paramList = new ArrayList();
// 通过反射构建update语句
String className = info.getClass().getSimpleName();
sqlBuffer.append("update ").append(className).append(" set ");
Object obj = null;
Object[] typeAndValue = null;
Field[] fields = info.getClass().getDeclaredFields();
for (Field f : fields)
{
obj = JBeanClass.getGetterMethodInvokeValue(info, f.getName());
if (null != obj)
{
typeAndValue = getValueByType(f.getType().getName(), obj);
bufferName.append(f.getName()).append(" = ").append(typeAndValue[0]).append(", ");
paramList.add(typeAndValue[1]);
}
}
sqlBuffer.append(StringUtils.removeEnd(bufferName.toString(), ", "));
Object[] whereObj = createWhereByPrimaryKey(info);
String sql = sqlBuffer.toString() + whereObj[0];
paramList.addAll((List)whereObj[1]);
return DBUtil.getInstance().update(sql, paramList.toArray());
}
/**
* 通过反射创建delete语句
* @param info
* @return
* @throws SQLException
*/
@SuppressWarnings("unchecked")
public boolean delete(T info) throws SQLException
{
StringBuffer sqlBuffer = new StringBuffer(256);
String className = info.getClass().getSimpleName();
sqlBuffer.append("delete from ").append(className);
Object[] whereObj = createWhereByPrimaryKey(info);
String sql = sqlBuffer.toString() + whereObj[0];
return DBUtil.getInstance().update(sql, ((List)whereObj[1]).toArray());
}
/**
* 通过对象主键创建WHERE条件
* @param info
* @return
*/
private Object[] createWhereByPrimaryKey(T info)
{
StringBuffer whereBuffer = new StringBuffer(256);
List<Object> paramList = null;
Object obj = null;
String tablePrimaryKey = JBeanClass.getMethodInvokeValue(info, "getTablePrimaryKey", null, null).toString();
//Log.getLogger().info("The \"" + info.getClass().getSimpleName() + "\" table's Primary Key is: " + tablePrimaryKey);
if (StringUtils.isNotEmpty(tablePrimaryKey))
{
whereBuffer.append(" where ");
String[] primaryKeys = tablePrimaryKey.split(",");
paramList = new ArrayList<Object>();
for (String str : primaryKeys)
{
obj = JBeanClass.getGetterMethodInvokeValue(info, str);
if (null != obj)
{
whereBuffer.append(str).append(" = ? and ");
paramList.add(obj);
}
}
}
String where = StringUtils.removeEnd(whereBuffer.toString(), "and ");
return new Object[] {where, paramList};
}
/**
* 根据类型和返回对应的值,insert、update时候用到
* @param type
* @param value
* @return
*/
private Object[] getValueByType(String type, Object value)
{
Object[] obj = new Object[2];
if (type.equals("java.util.Date"))
{
obj[0] = "to_date(?,'YYYY-MM-DD HH24:MI:SS')";
obj[1] = TimeTools.format2.format(value);
}
else
{
obj[0] = "?";
obj[1] = value;
}
return obj;
}
/**
* 查询所有
* @param tableName
* @param clazz
* @param whereMap
* @return
*/
@SuppressWarnings("unchecked")
public List<T> queryList(String tableName, Class clazz, Map<String, Object> whereMap)
{
Object[] obj = getWhereCase(whereMap);
String sql = "select * from " + tableName + obj[0];
Object[] param = (Object[])obj[1];
return DBUtil.getInstance().queryBeanList(sql, clazz, param);
}
/**
* 查询一页数据
* @param tableName
* @param clazz
* @param whereMap
* @param pageNumber
* @param pageSize
* @return
*/
@SuppressWarnings("unchecked")
public List<T> queryPageList(String tableName, Class clazz, Map<String, Object> whereMap, int pageNumber,
int pageSize)
{
String sql =
"select * from (select a.*,rownum row_num from (select * from {0}{1})a) b where b.row_num between {2} and {3}";
int beg = (pageNumber - 1) * pageSize + 1;
int end = pageNumber * pageSize;
Object[] obj = getWhereCase(whereMap);
Object[] messageFormatObj = {tableName, obj[0], beg, end};
sql = MessageFormat.format(sql, messageFormatObj);
Object[] param = (Object[])obj[1];
return DBUtil.getInstance().queryBeanList(sql, clazz, param);
}
/**
* 根据表名和参数获取总记录数
* @param tableName
* @param whereMap
* @return
*/
@SuppressWarnings("unchecked")
public int getCount(String tableName, Map<String, Object> whereMap)
{
Object[] obj = getWhereCase(whereMap);
String sql = "select count(*) as c from " + tableName + obj[0];
Object[] param = (Object[])obj[1];
Map map = (Map)DBUtil.getInstance().queryMap(sql, param);
if (null != map)
{
return Integer.parseInt(map.get("c").toString());
}
return 0;
}
/**
* 组装SQL WHERE ORDERBY条件
* @param whereMap
* @return Object[0]: sql , Object[1]: params
*/
@SuppressWarnings("unchecked")
private Object[] getWhereCase(Map<String, Object> whereMap)
{
Object[] obj = new Object[2];
if (null != whereMap && !whereMap.isEmpty())
{
StringBuffer buffer = new StringBuffer(128);
buffer.append(" where 1 = 1 ");
Iterator<Map.Entry<String, Object>> it = whereMap.entrySet().iterator();
List list = new ArrayList();
while (it.hasNext())
{
Map.Entry<String, Object> entry = it.next();
// 如果key或value为null, 或者为orderby, 则continue
if (null == entry.getKey() || null == entry.getValue() || entry.getValue().toString().equals("")
|| entry.getKey().trim().equalsIgnoreCase("orderby"))
{
continue;
}
else
{
buffer.append("and ").append(entry.getKey()).append(" = ? ");
list.add(entry.getValue());
}
}
obj[0] = buffer.append(whereMap.get("orderby") == null ? "" : whereMap.get("orderby"));
obj[1] = list.toArray();
}
else
{
obj[0] = "";
obj[1] = null;
}
return obj;
}
}