首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > J2EE开发 >

jdbc 打包 Object恢复类型或者其他妙招

2012-12-17 
jdbc 封装 Object恢复类型或者其他妙招自己写了个jdbc的工具类.抽出主要的方法.//填充preparedstatement

jdbc 封装 Object恢复类型或者其他妙招
自己写了个jdbc的工具类.
抽出主要的方法.

//填充preparedstatement 参数
public static PreparedStatement fillStatement(PreparedStatement pstm,
Object[] params) throws SQLException {
if (pstm == null || params == null || params.length == 0) {
throw new NullPointerException("params are empty ");
}
for (int i = 0; i < params.length; i++) {
pstm.setObject(i + 1, params[i]);
}
return pstm;
}
//============================
//取元数据信息这个方法会比较慢,后续会改用配置文件的方法来取
public static List getMetaInfoList(String sql, Connection conn,
Object[] params) throws SQLException{
String newSql = "select * from "+sql+" where 1=2";
ResultSet rs = executeQuery(newSql,conn,params);
ResultSetMetaData rsmd =  rs.getMetaData();
int count = rsmd.getColumnCount();
String[] colNames = new String[count];//可以使用setObject 賦值
String[] colLabels = new String[count];//取值用這個
int[] colSqlTypes = new int[count];//sql types 可以由這個對應到java的 type
for(int i =0 ;i<count;i++){
colNames[i]=rsmd.getColumnClassName(i+1);
colLabels[i]=rsmd.getColumnLabel(i+1);
colSqlTypes[i] = rsmd .getColumnType(i+1);
}
List list = new ArrayList(3);
list.add(0, colNames);
list.add(1,colLabels);
list.add(2, colSqlTypes);
return list;
}

//================================

//格式化获取的 游标 数据
public static Object formatterResultSet(ResultSet rs,List metaInfo) throws SQLException{
if(rs==null||rs.isClosed()){
throw new IllegalArgumentException("the result is closed or null ,resultset:"+rs);
}
String[] collabels = (String[]) metaInfo.get(1);
int count = collabels.length;
while(rs.next()){
for(int i =0 ;i<count ;i++){
rs.getObject(collabels[i]);
}
}
//.....未完
return null ;
}



public static ResultSet executeQuery(String sql, Connection conn,
Object[] params) throws SQLException {
PreparedStatement pstm = conn.prepareStatement(sql);
pstm = fillStatement(pstm, params);
return pstm.executeQuery();
}
//===========================================================

在写到formatterResultSet方法的时候,我突然在数据类型那里卡住了.
请问下,我这样全部使用Object 来做,会不会降低很多效率.可否有提高效率的做法.
还有我该如何恢复失去的类型信息.
可否有具体的代码可以参考.
太深的代码我还看不懂.

[最优解释]

/**
 * 访问数据库的基类dao
 * @version 2.0
 * */
public abstract class CoreDao extends PageDao {

@MatchingBean
public JdbcConfig jdbcConfig;

/**
 * 获得数据库连接
 * @return Connection
 */
public Connection getConnection() {
try {
Connection connection = jdbcConfig.getDataSource().getConnection();
connection.setAutoCommit(true);
return connection;
} catch (Exception e) {
e.printStackTrace();
return null;


}
}

/**
 * 获得预编译语句
 * @param connection 数据库连接
 * @param sql sql语句
 * @param args 参数列表
 * @return PreparedStatement
 */
public PreparedStatement getPrepared(Connection connection, String sql, Object[] args) {
PreparedStatement prepared = null;
try {
if (null != connection && null != sql) {
prepared = connection.prepareStatement(sql);
if (null != prepared) {
if (null != args && args.length > 0) {
for (int i = 0; i < args.length; i++) {
prepared.setObject(i + 1, args[i]);
}
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
return prepared;
}

/**
 * 获得结果集
 * @param prepared 预编译语句
 * @return ResultSet
 */
public ResultSet getResultSet(PreparedStatement prepared) {
ResultSet resultSet = null;
try {
if (null != prepared) {
resultSet = prepared.executeQuery();
}
} catch (Exception e) {
e.printStackTrace();
}
return resultSet;
}

/**
 * 关闭所有连接
 * @param connection 数据库连接
 * @param prepared 预编译语句
 * @param resultSet 结果集
 */
public void closeAll(Connection connection, PreparedStatement prepared, ResultSet resultSet) {
try {
if (null != resultSet) {
resultSet.close();
resultSet = null;
}
if (null != prepared) {
prepared.close();
prepared = null;
}
if (null != connection && !connection.isClosed()) {
connection.close();
connection = null;
}
} catch (Exception e) {
e.printStackTrace();
}
}

/**
 * 操作数据库(增删改)
 * @param sql sql语句
 * @param args 参数列表
 * @return Integer
 */
public Integer manage(String sql, Object[] args) {
Integer result = 0;
Connection connection = null;
PreparedStatement prepared = null;
try {
connection = getConnection();
prepared = getPrepared(connection, sql, args);
if (null != prepared) {
if (jdbcConfig.getShowSql()) {
System.out.println("jdbc-sql:  " + sql.toString());
}
result = prepared.executeUpdate();
}
} catch (Exception e) {
e.printStackTrace();
} finally {
closeAll(connection, prepared, null);
}
return result;
}

/**
 * 从数据库中获得一列值
 * @param sql sql语句
 * @param args 参数列表
 * @return List
 */
public List<String> getTeam(String sql, Object[] args) {
List<String> result = new ArrayList<String>();


Connection connection = null;
PreparedStatement prepared = null;
ResultSet resultSet = null;
try {
connection = getConnection();
prepared = getPrepared(connection, sql, args);
if (jdbcConfig.getShowSql()) {
System.out.println("jdbc-sql:  " + sql.toString());
}
resultSet = getResultSet(prepared);
if (null != resultSet) {
while (resultSet.next()) {
result.add(resultSet.getString(1));
}
}
} catch (Exception e) {
e.printStackTrace();
} finally {
closeAll(connection, prepared, resultSet);
}
return result;
}

/**
 * 从数据库中获得一个值
 * @param sql sql语句
 * @param args 参数列表
 * @return String
 */
public String getValue(String sql, Object[] args) {
List<String> list = getTeam(sql, args);
return (list.size() > 0) ? list.get(0) : "";
}

/**
 * 判断真假(数据库是否有这个记录)
 * @param sql sql语句必须是select count(*) from ...
 * @param args 参数列表
 * @return Boolean
 */
public Boolean validate(String sql, Object[] args) {
Boolean result = false;
try {
String value = getValue(sql, args);
if (!"".equals(value) && Integer.parseInt(value) > 0) {
result = true;
}
} catch (Exception e) {
e.printStackTrace();
}
return result;
}

/**
 * 获得对象数组
 * @param sql sql语句
 * @param args 参数列表
 * @param keys 取值的key
 * @return Object[]
 */
public Object[] getArray(String sql, Object[] args, String[] keys) {
Object[] array = new Object[] {};
if (null != keys && keys.length > 0) {
array = new Object[keys.length];
Connection connection = null;
PreparedStatement prepared = null;
ResultSet resultSet = null;
try {
connection = getConnection();
prepared = getPrepared(connection, sql, args);
if (jdbcConfig.getShowSql()) {
System.out.println("jdbc-sql:  " + sql.toString());
}
resultSet = getResultSet(prepared);
if (null != resultSet && resultSet.next()) {
for (int i = 0; i < keys.length; i++) {
array[i] = resultSet.getObject(keys[i]);
}
}
} catch (Exception e) {
e.printStackTrace();
} finally {
closeAll(connection, prepared, resultSet);
}
}
return array;
}

/**
 * 获得对象数组的集合
 * @param sql sql语句
 * @param args 参数列表
 * @param keys 取值的key
 * @return List
 */
public List<Object[]> getArrayList(String sql, Object[] args, String[] keys) {


List<Object[]> list = new ArrayList<Object[]>();
if (null != keys && keys.length > 0) {
Connection connection = null;
PreparedStatement prepared = null;
ResultSet resultSet = null;
try {
connection = getConnection();
prepared = getPrepared(connection, sql, args);
if (jdbcConfig.getShowSql()) {
System.out.println("jdbc-sql:  " + sql.toString());
}
resultSet = getResultSet(prepared);
if (null != resultSet) {
while (resultSet.next()) {
Object[] array = new Object[keys.length];
for (int i = 0; i < keys.length; i++) {
array[i] = resultSet.getObject(keys[i]);
}
list.add(array);
}
}
} catch (Exception e) {
e.printStackTrace();
} finally {
closeAll(connection, prepared, resultSet);
}
}
return list;
}

/**
 * 获得分页
 * @param numSql 查询数据数量的sql必须是select count(*) from ...
 * @param args 参数列表(可以为null)
 * @param pageIndex 当前页数
 * @param radix 分页的基数
 * @param function 分页的js函数,比如:document.form1.submit()
 * @return PageModel
 * */
public PageModel pagination(String numSql, Object[] args, int pageIndex, int radix, String function) {
try {
Integer amount = Integer.parseInt(getValue(numSql, args));
return getPageModel(amount, pageIndex, radix, 30, function);
} catch (Exception e) {
e.printStackTrace();
}
return new PageModel();
}

/**
 * 获得分页
 * @param numSql 查询数据数量的sql必须是select count(*) from ...
 * @param args 参数列表(可以为null)
 * @param pageIndex 当前页数
 * @param radix 分页的基数
 * @param maxRadix 允许的最大的分页基数
 * @return PageModel
 * */
public PageModel pagination(String numSql, Object[] args, int pageIndex, int radix, int maxRadix) {
try {
Integer amount = Integer.parseInt(getValue(numSql, args));
return getPageModel(amount, pageIndex, radix, maxRadix, "");
} catch (Exception e) {
e.printStackTrace();
}
return new PageModel();
}

}




[其他解释]
另外,各位,检查代码运行效率.可有什么好的方法.希望各位老师不吝赐教.

多谢.
[其他解释]
/**
 * 访问数据库的基类dao实现类
 * @version 2.0
 * */
public abstract class BaseDaoImpl<T extends Serializable> extends CoreDao implements BaseDao<T> {

/**
 * 获得泛型实体类的class
 * @return Class
 */
@SuppressWarnings("unchecked")
public Class<T> getThisClass() {
return (Class<T>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0];


}

/**
 * 封装数据
 * @param sql sql语句
 * @param args 参数列表
 * @return List
 * */ 
@SuppressWarnings("unchecked")
public List<T> getDataList(String sql, Object[] args) {
List list = new ArrayList();
Connection connection = null;
PreparedStatement prepared = null;
ResultSet resultSet = null;
try {
connection = getConnection();
prepared = getPrepared(connection, sql, args);
if (jdbcConfig.getShowSql()) {
System.out.println("jdbc-sql:  " + sql.toString());
}
resultSet = getResultSet(prepared);
EntityBean bean = getEntity();
while (resultSet.next()) {
Object object = getThisClass().newInstance();
for (String property : bean.getPropertyMap().keySet()) {
ReflectUtil.setPropertyValue(object, property, resultSet.getString(bean.getPropertyMap().get(property)));
}
for (String foreign : bean.getForeignMap().keySet()) {
String foreignValue = resultSet.getString(foreign.split(";")[1]);
if (null != foreignValue && !"".equals(foreignValue)) {
Object daoObject = bean.getForeignMap().get(foreign);
Method method = daoObject.getClass().getMethod("get", Class.forName(Settled.SERIALIZABLE_CLASS));
Object foreignObject = method.invoke(daoObject, foreignValue);
method = getThisClass().getMethod(ReflectUtil.getMethodName(foreign.split(";")[0], "set"), Class.forName(foreign.split(";")[2]));
method.invoke(object, foreignObject);
}
}
if (null != getEntity().getIdColumn() && null != getEntity().getIdName()) {
String idValue = resultSet.getString(bean.getIdColumn());
ReflectUtil.setPropertyValue(object, bean.getIdName(), idValue);
Settled.CACHE_ID_ENTITY_MAP.put(getEntity().getClassName() + "_" + idValue, object);
}
list.add(object);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
closeAll(connection, prepared, resultSet);
}
return list;
}

/**
 * 查询部分实体集合
 * @param sql sql语句
 * @param args 参数列表
 * @param num 实体的个数
 * @return List
 */
@SuppressWarnings("unchecked")
public List<T> getListPart(String sql, Object[] args, int num) {
List list = new ArrayList();
Connection connection = null;
PreparedStatement prepared = null;
ResultSet resultSet = null;
try {
connection = getConnection();
prepared = getPrepared(connection, sql, args);
if (jdbcConfig.getShowSql()) {
System.out.println("jdbc-sql:  " + sql.toString());
}
resultSet = getResultSet(prepared);
EntityBean bean = getEntity();
int i = 0;
while (resultSet.next()) {
i++;
if (i <= num) {
Object object = getThisClass().newInstance();
for (String property : bean.getPropertyMap().keySet()) {


ReflectUtil.setPropertyValue(object, property, resultSet.getString(bean.getPropertyMap().get(property)));
}
for (String foreign : bean.getForeignMap().keySet()) {
String foreignValue = resultSet.getString(foreign.split(";")[1]);
if (null != foreignValue && !"".equals(foreignValue)) {
Object daoObject = bean.getForeignMap().get(foreign);
Method method = daoObject.getClass().getMethod("get", Class.forName(Settled.SERIALIZABLE_CLASS));
Object foreignObject = method.invoke(daoObject, foreignValue);
method = getThisClass().getMethod(ReflectUtil.getMethodName(foreign.split(";")[0], "set"), Class.forName(foreign.split(";")[2]));
method.invoke(object, foreignObject);
}
}
if (null != getEntity().getIdColumn() && null != getEntity().getIdName()) {
String idValue = resultSet.getString(bean.getIdColumn());
ReflectUtil.setPropertyValue(object, bean.getIdName(), idValue);
Settled.CACHE_ID_ENTITY_MAP.put(getEntity().getClassName() + "_" + idValue, object);
}
list.add(object);
} else {
break;
}
}
} catch (Exception e) {
e.printStackTrace();
} finally {
closeAll(connection, prepared, resultSet);
}
return list;
}

/**
 * 查询单个实体
 * @param sql sql语句
 * @param args 参数列表
 * @return T
 */
public T getObject(String sql, Object[] args) {
List<T> list = getDataList(sql, args);
return (list.size() > 0) ? (T) list.get(0) : null;
}

/**
 * 获得表中的下一个ID的值
 * @return Long
 */
public Long getNextId() {
Long result = 0l;
try {
String sql = "select max(" + getEntity().getIdColumn() + ") from " + getEntity().getTableName();
String value = getValue(sql, null);
if (null != value && !"".equals(value)) {
result = Long.parseLong(value) + 1;
} else {
result = 1l;
}
} catch (Exception e) {
e.printStackTrace();
}
return result;
}

/**
 * 保存记录
 * @param entity 实体
 * @return entity
 * */
public T add(T entity) {
EntityBean bean = getEntity();
String idValue = null;
List<Object> args = new ArrayList<Object>();
String sql = "insert into " + bean.getTableName() + " (", paramSql = "";;
if (EntityBean.ID_CREATE_CUSTOM.equals(bean.getIdCreate())) {
sql += bean.getIdColumn() + ",";
idValue = (String) ReflectUtil.getPropertyValue(entity, bean.getIdName());
args.add(idValue);
}
if (EntityBean.ID_CREATE_SEQUENCE.equals(bean.getIdCreate())) {
sql += bean.getIdColumn() + ",";
idValue = getValue("select " + bean.getIdSequence() + ".Nextval from dual", null);


args.add(idValue);
}
for (String property : bean.getPropertyMap().keySet()) {
Object value = ReflectUtil.getPropertyValue(entity, property);
if (null != value) {
sql += bean.getPropertyMap().get(property) + ",";
if (Settled.DATE_CLASS.equals(value.getClass().getName())) {
if (JdbcConfig.DATABASE_ORACLE.equals(jdbcConfig.getDatabaseType())) {
paramSql += "to_date('" + Settled.FORMAT_DATE_TIME.format((Date) value) + "','yyyy-mm-dd hh24:mi:ss'),";

if (JdbcConfig.DATABASE_MYSQL.equals(jdbcConfig.getDatabaseType())) {
paramSql += "?,";
args.add(Settled.FORMAT_DATE_TIME.format((Date) value));
}
if (JdbcConfig.DATABASE_SQLSERVER.equals(jdbcConfig.getDatabaseType())) {
paramSql += "?,";
args.add(Settled.FORMAT_DATE_TIME.format((Date) value));
}
} else {
paramSql += "?,";
args.add(value.toString());
}
}
}
for (String foreign : bean.getForeignMap().keySet()) {
Object foreignValue = ReflectUtil.getPropertyValue(entity, foreign.split(";")[0]);
if (null != foreignValue) {
Object foreignIdValue = ReflectUtil.getPropertyValue(foreignValue, jdbcConfig.getEntityMap().get(foreign.split(";")[2]).getIdName());
if (null != foreignIdValue && sql.indexOf(foreign.split(";")[1] + ",") == -1) {
sql += foreign.split(";")[1] + ",";
paramSql += "?,";
args.add(foreignIdValue.toString());
}
}
}
sql = sql.substring(0, sql.length() - 1);
sql += ") values (";
if (EntityBean.ID_CREATE_CUSTOM.equals(bean.getIdCreate()) 
[其他解释]
 EntityBean.ID_CREATE_SEQUENCE.equals(bean.getIdCreate())) {
sql += "?,";
}
sql += paramSql.substring(0, paramSql.length() - 1);
sql += ")";
manage(sql, args.toArray());
if (EntityBean.ID_CREATE_NATIVE.equals(bean.getIdCreate())) {
idValue = String.valueOf(getNextId() - 1);
}
ReflectUtil.setPropertyValue(entity, bean.getIdName(), idValue);
Settled.CACHE_ID_ENTITY_MAP.put(bean.getClassName() + "_" + idValue, entity);
return entity;
}

/**
 * 删除记录
 * @param id 实体的ID
 * @return entity
 * */
public T del(Serializable id) {
T entity = get(id);
String sql = "delete from " + getEntity().getTableName() + " where " + getEntity().getIdColumn() + "=?";
manage(sql, new Object[]{ id });
Settled.CACHE_ID_ENTITY_MAP.remove(getEntity().getClassName() + "_" + id);
return entity;
}

}


[其他解释]
/**
 * 修改记录
 * @param entity 实体
 * @return entity
 * */
public T edit(T entity) {
EntityBean bean = getEntity();
List<Object> args = new ArrayList<Object>();


String sql = "update " + bean.getTableName() + " set";
for (String property : bean.getPropertyMap().keySet()) {
Object value = ReflectUtil.getPropertyValue(entity, property);
if (null != value) {
if (Settled.DATE_CLASS.equals(value.getClass().getName())) {
if (JdbcConfig.DATABASE_ORACLE.equals(jdbcConfig.getDatabaseType())) {
sql += " " + bean.getPropertyMap().get(property) + "=to_date('" + Settled.FORMAT_DATE_TIME.format((Date) value) + "','yyyy-mm-dd hh24:mi:ss'),";

if (JdbcConfig.DATABASE_MYSQL.equals(jdbcConfig.getDatabaseType())) {
sql += " " + bean.getPropertyMap().get(property) + "=?,";
args.add(Settled.FORMAT_DATE_TIME.format((Date) value));
}
if (JdbcConfig.DATABASE_SQLSERVER.equals(jdbcConfig.getDatabaseType())) {
sql += " " + bean.getPropertyMap().get(property) + "=?,";
args.add(Settled.FORMAT_DATE_TIME.format((Date) value));
}
} else {
sql += " " + bean.getPropertyMap().get(property) + "=?,";
args.add(value.toString());
}
}
}
for (String foreign : bean.getForeignMap().keySet()) {
Object foreignValue = ReflectUtil.getPropertyValue(entity, foreign.split(";")[0]);
if (null != foreignValue) {
Object foreignIdValue = ReflectUtil.getPropertyValue(foreignValue, jdbcConfig.getEntityMap().get(foreign.split(";")[2]).getIdName());
if (null != foreignIdValue && sql.indexOf(" " + foreign.split(";")[1] + "=?,") == -1) {
sql += " " + foreign.split(";")[1] + "=?,";
args.add(foreignIdValue.toString());
}
}
}
sql = sql.substring(0, sql.length() - 1);
sql += " where " + bean.getIdColumn() + "=?";
String idValue = String.valueOf(ReflectUtil.getPropertyValue(entity, bean.getIdName()));
args.add(idValue);
manage(sql, args.toArray());
return resetEditCache(entity, idValue);
}

// 修改记录是更新缓存
@SuppressWarnings("unchecked")
private T resetEditCache(T entity, String idValue) {
try {
EntityBean bean = getEntity();
Object object = Settled.CACHE_ID_ENTITY_MAP.get(bean.getClassName() + "_" + idValue);
if (null != object) {
for (String property : bean.getPropertyMap().keySet()) {
Object value = ReflectUtil.getPropertyValue(entity, property);
if (null != value) {
Method method = object.getClass().getMethod(ReflectUtil.getMethodName(property, "set"), value.getClass());
method.invoke(object, value);
}
}
for (String foreign : bean.getForeignMap().keySet()) {
Object foreignValue = ReflectUtil.getPropertyValue(entity, foreign.split(";")[0]);
if (null != foreignValue) {
Method method = object.getClass().getMethod(ReflectUtil.getMethodName(foreign.split(";")[0], "set"), foreignValue.getClass());
method.invoke(object, foreignValue);
}
}
T t = (T) object;


Settled.CACHE_ID_ENTITY_MAP.put(bean.getClassName() + "_" + idValue, t);
return t;
}
} catch (Exception e) {
e.printStackTrace();
}
return get(idValue);
}

/**
 * 根据ID获得记录
 * @param id 实体的ID
 * @return entity
 * */
@SuppressWarnings("unchecked")
public T get(Serializable id) {
if (null != Settled.CACHE_ID_ENTITY_MAP.get(getEntity().getClassName() + "_" + id)) {
return (T) Settled.CACHE_ID_ENTITY_MAP.get(getEntity().getClassName() + "_" + id);
}
String sql = "select * from " + getEntity().getTableName() + " where " + getEntity().getIdColumn() + "=?";
T entity = getObject(sql, new Object[]{ id });
Settled.CACHE_ID_ENTITY_MAP.put(getEntity().getClassName() + "_" + id, entity);
return entity;
}

/**
 * 获得表中的所有的实体
 * @return List
 */
public List<T> getBeans() {
String order = (null != getEntity().getIdColumn() ? " order by " + getEntity().getIdColumn() : "");
String sql = "select * from " + getEntity().getTableName() + order;
return (List<T>) getDataList(sql, null);
}

/**
 * 根据属性查找实体列表
 * @param property 属性名称
 * @param expression 表达式
 * @param value 匹配的值
 * @return List
 */
public List<T> findByProperty(String property, String expression, Object value) {
String column = getEntity().getIdColumn();
if (!property.equals(getEntity().getIdName())) {
column = getEntity().getPropertyMap().get(property);
}
String order = (null != getEntity().getIdColumn() ? " order by " + getEntity().getIdColumn() : "");
String sql = "select * from " + getEntity().getTableName() + " where " + column + " " + expression + " ?" + order;
return (List<T>) getDataList(sql, new Object[]{ value });
}

/**
 * 获得分页(该方法暂时不支持sqlserver)
 * @param sql 查询数据数量的sql必须是select * from 开头
 * @param args 参数列表(可以为null)
 * @param pageIndex 当前页数
 * @param radix 分页的基数
 * @param function 分页的js函数,比如:document.form1.submit()
 * @return PageModel
 * */
public PageModel getPage(String sql, Object[] args, int pageIndex, int radix, String function) {
args = (null == args ? new Object[] {} : args);
PageModel model = pagination(sql.replace("*", "count(*)"), args, pageIndex, radix, function); 
Object[] newArgs = new Object[args.length + 2];
for (int i = 0; i < args.length; i++) {
newArgs[i] = args[i];
}
if (JdbcConfig.DATABASE_ORACLE.equals(jdbcConfig.getDatabaseType())) {


sql = "select * from ( select temp.*, rownum rownumt from (" + sql + ") temp where rownum <= ?) where rownumt > ?";
newArgs[newArgs.length - 2] = model.getStop();
newArgs[newArgs.length - 1] = model.getStart();
model.setList(getDataList(sql, newArgs));
}
if (JdbcConfig.DATABASE_MYSQL.equals(jdbcConfig.getDatabaseType())) {
sql += " limit ?,?";
newArgs[newArgs.length - 2] = model.getStart();
newArgs[newArgs.length - 1] = radix;
model.setList(getDataList(sql, newArgs));
}
return model;
}

/**
 * 获得分页(该方法暂时不支持sqlserver)
 * @param sql 查询数据数量的sql必须是select * from 开头
 * @param args 参数列表(可以为null)
 * @param pageIndex 当前页数
 * @param radix 分页的基数
 * @param maxRadix 允许的最大的分页基数
 * @return PageModel
 * */
public PageModel getPage(String sql, Object[] args, int pageIndex, int radix, int maxRadix) {
args = (null == args ? new Object[] {} : args);
PageModel model = pagination(sql.replace("*", "count(*)"), args, pageIndex, radix, maxRadix); 
Object[] newArgs = new Object[args.length + 2];
for (int i = 0; i < args.length; i++) {
newArgs[i] = args[i];
}
if (JdbcConfig.DATABASE_ORACLE.equals(jdbcConfig.getDatabaseType())) {
sql = "select * from ( select temp.*, rownum rownumt from (" + sql + ") temp where rownum <= ?) where rownumt > ?";
newArgs[newArgs.length - 2] = model.getStop();
newArgs[newArgs.length - 1] = model.getStart();
model.setList(getDataList(sql, newArgs));
}
if (JdbcConfig.DATABASE_MYSQL.equals(jdbcConfig.getDatabaseType())) {
sql += " limit ?,?";
newArgs[newArgs.length - 2] = model.getStart();
newArgs[newArgs.length - 1] = radix;
model.setList(getDataList(sql, newArgs));
}
return model;
}

/**
 * 获得当前的EntityBean
 * @return EntityBean
 */
public EntityBean getEntity() {
return jdbcConfig.getEntityMap().get(getThisClass().getName());
}




这样封装后的数据层实现类:
/**
 * 部门dao实现类(注解注入)
 * @version 1.0
 */
@ServiceBean
public class BranchDaoImpl extends BaseDaoImpl<Branch> implements BranchDao {

// 根据公司获得所有部门
public List<Branch> getList(Long deptId) {
return getDataList("select * from BRANCH where DEPT_ID = ? order by BRANCH_ID", new Object[] { deptId });
}

//分页查询部门
public PageModel getPagination(Branch bean, Integer pageIndex, Integer radix) {
String sql = "select * from  BRANCH where DEPT_ID = ?";
List<Object> args = new ArrayList<Object>();


args.add(bean.getDept().getId());
sql += " order by BRANCH_ID";
return getPage(sql, args.toArray(), pageIndex, radix, bean.getFunction());
}

 //根据公司和部门名称获得部门
public Branch getBean(Long deptId, String name) {
return getObject("select * from BRANCH where DEPT_ID = ?  and BRANCH_NAME =? ",  new Object[]{ deptId, name });
}

}


增加,修改,删除,根据ID查询的就一行代码,就不粘贴了,
[其他解释]
去看看阿帕奇的DBUtils的类库吧。

我感觉楼主想做一个通用的JDBC工具类吧
推荐用泛型不要用对象型
for example:



/**
 * 查询集合操作
 * @param clazz 返回类型
 * @param sql    
 * @param dbId      数据库标识
 * @return   结果集合
 * @throws SQLException  操作失败
 */
public <T> List<T> find(Class<T> clazz,String sql) throws SQLException{
                QueryRunner run=new QueryRunner();
if(conn==null
[其他解释]
conn.isClosed())
throw new SQLException("connection is closed please call open method first");
ResultSetHandler<List<T>> handler = new BeanListHandler<T>(clazz,new AnnotationRowProcess(new AnnotationBeanProcessor()));
List<T> rsts=null;
try {
rsts=run.query(conn, sql, handler);
} catch (SQLException e) {
log.error("query faild! ",e);
throw e;
}
return rsts;
}




[其他解释]
基于上面这种模式的查询对应的实体类中加入相应的注解是可以完全映射的、
有兴趣楼主可以研究spring3.1
[其他解释]
引用:
基于上面这种模式的查询对应的实体类中加入相应的注解是可以完全映射的、
有兴趣楼主可以研究spring3.1


+1


/**
 * @see 部门
 * @author admin
 * */
@Table(name = "BRANCH")
public class Branch extends BaseBean {

private static final long serialVersionUID = 1L;
private Long id;// ID
private Dept dept;// 所在公司
private String name;// 部门名称
private String remark;// 部门描述
private Integer userNum;// 员工人数
private String tel;// 部门电话
private String fax;// 传真

@PrimaryKey(name = "BRANCH_ID", create= "sequence", sequence = "BRANCH_SEQ")
public Long getId() {
return id;
}

public void setId(Long id) {
this.id = id;
}

@Column(name = "BRANCH_TEL")
public String getTel() {
return tel;
}

public void setTel(String tel) {
this.tel = tel;
}

@Column(name = "BRANCH_FAX")
public String getFax() {
return fax;
}

public void setFax(String fax) {


this.fax = fax;
}

@Column(name = "EMP_NUM")
public Integer getUserNum() {
return userNum;
}

public void setUserNum(Integer userNum) {
this.userNum = userNum;
}

@ForeignKey(name = "DEPT_ID")
public Dept getDept() {
return dept;
}

public void setDept(Dept dept) {
this.dept = dept;
}

@Column(name = "BRANCH_NAME")
public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

@Column(name = "BRANCH_REMARK")
public String getRemark() {
return remark;
}

public void setRemark(String remark) {
this.remark = remark;
}

}

热点排行