/** * @date 2012/2/19 15:10 添加事务处理,重复使用的方法 * @date 2012/4/13 14:10 * @date 2012/8/6 添加延迟加载 自动关联查询 结果集从LinkedList改成ArrayList */ package org.jplus.hyb.database; import com.jplus.json.EasyUiJson; import java.lang.reflect.Field; import java.lang.reflect.Method; import java.sql.Connection; import java.sql.ResultSet; import java.sql.ResultSetMetaData; import java.sql.SQLException; import java.util.ArrayList; import java.util.List; import org.jplus.util.FieldUtil; import org.jplus.util.LoggerManage; import org.jplus.util.Pagger; /** * 数据库持久层框架核心类之一 <p> 此类用于给定POJO类的数据库操作 强制绑定了数据库预处理机制。 * 需要在项目缺省包下面添加配置文件database.properties(整个项目仅此一个数据库配置)。 * 多用于对数据库单表的插入、更新、删除、查询操作,对POJO类的依赖性很强。 可以支持数据库事务处理。 支持一个数据库连接的单次,多次利用。 </p> * * @version 3.6 * @author hyberbin */ public class Hyberbin extends DatabaseAccess { /** 表名 */ private String tableName; /** 成员变量列表 */ private List<String> fields = null; /** 表的实体类 */ private Object tablebean; /** 是否更新空值 */ private boolean updateNull = false; /** 是否查询到了数据 */ private boolean isLoaded = false; /** 为空的字段列表 */ private List<String> nuList; /**是否第一次SetField*/ private boolean firstSetField=true; /** * 根据表的实体类初始化 * * @param tablebean 表的实体类 */ private void ini(Object tablebean) { if (tablebean != null) { try { this.tableName = tablebean.getClass().getSimpleName().toLowerCase(); this.tablebean = tablebean; firstSetField=true; fields = new ArrayList<String>(); for (Field field : tablebean.getClass().getDeclaredFields()) { fields.add(field.getName()); } } catch (Exception ex) { LoggerManage.logger.getLogger("Hyberbin初始化错误\t", ex); } } } /** * 构造方法,一次性操作。操作完后自动关闭数据库。 <p> Ex: <p>News news=new News();//POJO类,源自于数据库 * <strong><p>Hyberbin hyberbin=new * Hyberbin(news);//构建Hyberbin,给出POJO类表示当前只对news表进行操作,而且是一次性操作。操作完后自动关闭数据库。</strong> * * @param tablebean 表的实体类 */ public Hyberbin(Object tablebean) { super(DatabaseINI.getConnection()); ini(tablebean); //database = ;//数据库操作对象 } /** * 用自带的数据库连接进行数据库操作,用于构造可多次使用的Hyberbin <p>Ex: <p>News news=new * News();//POJO类,源自于数据库 <p>Connection conn = * DatabaseINI.getDatabase().getConn();//获得一个数据库连接 <strong><p>Hyberbin * hyberbin=new Hyberbin(news,conn);//用自带的数据库连接进行数据库操作</strong> * * @param tablebean 表的实体类 * @param conn 数据库连接 */ public Hyberbin(Object tablebean, Connection conn) { super(conn); ini(tablebean); transactionBegan(); } /** * 自动获得一个连接,获得后设置该连接可以重复使用,用于构造可多次使用的Hyberbin <p>Ex: <p>News news=new * News();//POJO类,源自于数据库 <p>Type type=new Type();//POJO类,源自于数据库 * <p>news.setId(1); <p>type.setType("公司新闻"); <strong><p>Hyberbin * hyberbin=new * Hyberbin(news,true);//构建Hyberbin,给出POJO类表示当前只对news表进行操作,而且是一次性操作。true表示操作完后要重复使用不自动关闭数据库。</strong> * <p>Boolean b=hyberbin.dellOneByKey("id");//根据id删除一条新闻 * <p>hyberbin.changeTable(type);//切换数据库表的操作对象(换一个表操作)。 <p>Boolean * b=hyberbin.insert("id");//在表中插入一条数据。传入一个字段名,表示该字段名是数据库自动生成,无需插入。 * <p>hyberbin.reallyClose();//只有调用这个方法之后数据库连接才真正关闭。 * * @param tablebean 表的实体类 * @param repeat 是否多次使用 */ public Hyberbin(Object tablebean, boolean repeat) { this(tablebean); transactionBegan(); } /** * 设置是否自动清除预处理参数 * @param auto */ public void setAutoClearPrepare(boolean auto) { autoClearPrepare = auto; } /** * 设置操作的表名. <p>如果没有设置将会默认采用实体名 * * @param tableName */ public void setTableName(String tableName) { this.tableName = tableName; } /** * 对一个表进行操作或者进行过一次数据库操作后换一个表进行操作 * <p>用此方法的前提是数据库连接没有自动关闭.即构造方法必需是Hyberbin(Object tablebean, Connection * conn)或者是Hyberbin(Object tablebean, boolean repeat)。 <p>Ex: <p>News * news=new News();//POJO类,源自于数据库 <p>Type type=new Type();//POJO类,源自于数据库 * <p>news.setId(1); <p>type.setType("公司新闻"); <p>Hyberbin hyberbin=new * <p>Hyberbin(news,true);//构建Hyberbin,给出POJO类表示当前只对news表进行操作,而且是一次性操作。true表示操作完后要重复使用不自动关闭数据库。 * <p>Boolean b=hyberbin.dellOneByKey("id");//根据id删除一条新闻 * <p><strong>hyberbin.changeTable(type);//切换数据库表的操作对象(换一个表操作)。</strong> * <p>Boolean * b=hyberbin.insert("id");//在表中插入一条数据。传入一个字段名,表示该字段名是数据库自动生成,无需插入。 * <p>hyberbin.reallyClose();//只有调用这个方法之后数据库连接才真正关闭。 * * @param tablebean 表的实体类 * @return 自身 */ public Hyberbin changeTable(Object tablebean) { ini(tablebean); clearParmeter(); return this; } /** * 移去一个成员变量 不需要更新或者读取的字段将不会出现在数据库操作当中 * <p>此方法对所有的查询、修改、添加都能起作用。用于在有很多字段情况下去除少量不需要操作的字段,提高数据库效率。 * <p>些方法返回自身对象,可以链式编程。hyberbin.removeField("newstype").removeField("id"); * <p>Ex: <p>News news=new News();//POJO类,源自于数据库 <p>Hyberbin hyberbin=new * Hyberbin(news);//构建Hyberbin,给出POJO类表示当前只对news表进行操作,而且是一次性操作。操作完后自动关闭数据库。 * <strong><p>hyberbin.removeField("newstype");</strong> * <p>如果还需要移除查其它字段可以继续removeField("id")等等。 <p>hyberbin.showAll(); * * @param fieldName 要移去的成员变量 * @return 自身 */ public Hyberbin removeField(String fieldName) { if (fieldName == null || fieldName.trim().equals("")) { return this; } fields.remove(fieldName); return this; } /** * 设置一个成员变量 只有指定字段才出现在数据库操作当中 * <p>此方法对所有的查询、修改、添加都能起作用。用于在有很多字段情况下只对少量字段进行操作,提高数据库效率。 * <p>些方法返回自身对象,可以链式编程。hyberbin.setField("newstype").setField("id"); <p>Ex: * <p>News news=new News();//POJO类,源自于数据库 <p>Hyberbin hyberbin=new * Hyberbin(news);//构建Hyberbin,给出POJO类表示当前只对news表进行操作,而且是一次性操作。操作完后自动关闭数据库。 * <strong><p>hyberbin.setField("newstype");</strong> * <p>如果还需要查其它字段可以继续setField("id")等等。 * <p>hyberbin.showAll();//在这个查询到的集合中将只会查到“newstype”这个字段的信息。 * * @param fieldName 要查询的成员变量 * @return 自身 */ public Hyberbin setField(String fieldName) { if(firstSetField){ fields=null; firstSetField=false; } if (fields == null) { fields = new ArrayList<String>(); } fields.add(fieldName); return this; } /** * 查询的时候获得所有字段名 * * @return */ private String getFieldList() { if (fields != null) { StringBuilder fieldlist = new StringBuilder(); for (String field : fields) { fieldlist.append(",").append(field); } return fieldlist.substring(1); } else { return ""; } } /** * 从查询结果中取得数据存入表的实体类 * * @param table 表的实体类 * @param rs 查询结果 */ private Object loadData(Object table, ResultSet rs) throws Exception { ResultSetMetaData metaData = rs.getMetaData(); for (int i = 1; i <= metaData.getColumnCount(); i++) { Field field = table.getClass().getDeclaredField(metaData.getColumnName(i).toLowerCase()); loadDataToPojo(table, field, field.getName(), rs); } return table; } /** * 将数据库中取到的值存入POJO类 * * @param table POJO类 * @param field POJO类的字段 * @param rs 数据查询集合 */ private void loadDataToPojo(Object table, Field field, String column, ResultSet rs) { Object o = null; try { Method method = table.getClass().getMethod(FieldUtil.set(field.getName()), field.getType());//取得set方法 o = resultSetGet(rs, field, column); if (o != null) { method.invoke(table, o); //调用实体类的setXXX方法 } } catch (Exception ex) { LoggerManage.logger.getLogger("表:" + table.getClass().getSimpleName() + " 字段:" + field.getName() + "类型不匹配!" + o.getClass().getName(), ex); } } private Object resultSetGet(ResultSet rs, Field field, String column) throws Exception { String methodName = DatabaseINI.mapping_props.getProperty(field.getType().getSimpleName()); Method method = ResultSet.class.getMethod(methodName == null ? "getObject" : methodName, String.class);//取得set方法 return method.invoke(rs, column); } /** * 自动生成SQL语句 * * @return */ private GetSql getSql() { GetSql gs = new GetSql(); for (String field : fields) { Object value = FieldUtil.getFieldValue(tablebean, field); if (value != null) { setParmeter(value); gs.add(field, "?", "");//将有值的进行预处理 if (nuList != null && nuList.size() > 0) { nuList.remove(field); } } else if (value == null && updateNull) { gs.add(field, "null", "");//生成部分sql语句 } } if (nuList != null && nuList.size() > 0) { for (String nullF : nuList) { if (fields.contains(nullF)) { gs.add(nullF, "null", "");//生成部分sql语句 } } } nuList = null; return gs; } /** * 设置是否更新NULL <p>一般情况下系统会默认直接跳过值为空的字段,以提高数据库效率。 <p>如果要清空该字段的信息就应该调用这个方法。 * <p>此方法对数据库的插入、修改起作用。 <p>Ex: * <strong><p>hyberbin.setUpdateNull(true);</strong> * * @param b true或者false */ public void setUpdateNull(boolean b) { updateNull = b; } /** * 在预处理中加入新的参数 <p>此方法可以对数据库的增、删、改、查起作用。 * <p>些方法返回自身对象,可以链式编程。hyberbin.addParmeter("%"+other+"%").addParmeter("1"); * <p>为了增加数据库操作的安全性,建议所有自构的sql语句均要调用本方法。 <p>加入参数时所有参数均不需要单引号。 * <p>加入时应该按照参数出现的位置按顺序调用。 <p>like语句应该这样添加addParmeter("%"+other+"%"); <p>Ex: * <p>News news=new News();//POJO类,源自于数据库 <p>Hyberbin hyberbin=new * Hyberbin(news);//构建Hyberbin,给出POJO类表示当前只对news表进行操作,而且是一次性操作。操作完后自动关闭数据库。 * <p>String other="hyb"; * <strong><p>hyberbin.addParmeter("%"+other+"%");</strong> * <strong><p>hyberbin.addParmeter("1");</strong> * <p>hyberbin.showOne("select * from news where content like ? and * newstype=?"); * * @param parmeter 参数 * @return 自身对象 */ public Hyberbin addParmeter(Object parmeter) { setParmeter(parmeter); return this; } /** * 数据库插入 <p>此方法用于对数据库单表的插入操作,默认情况下不插入字段值为空的字段。 <p>此方法已经默认采用预处理技术。 * <p>传入的参数是字段名而不是字段值。 <p>Ex: <p>News news=new News();//POJO类,源自于数据库 * <p>Hyberbin hyberbin=new * Hyberbin(news);//构建Hyberbin,给出POJO类表示当前只对news表进行操作,而且是一次性操作。操作完后自动关闭数据库。 * <p>news.setNewsType(2); <p>news.setContent("这是一则新闻!"); <strong><p>boolean * b=hyberbin.insert("id");//参数传入“id”表示id数据库会自动生成。如果不是自动生成那么可以传入""或者null。</strong> * * @param primarkey 插入的主键,可以为空 * @return 是否成功 */ public boolean insert(String primarkey) { removeField(primarkey); GetSql gs = getSql(); String sql = gs.getInsert(tableName);//生成sql语句 return update(sql); } /** * 数据库更新 <p>此方法用于对数据库单表的修改操作,默认情况下不修改字段值为空的字段。 <p>此方法已经默认采用预处理技术。 * <p>传入的参数是字段名而不是字段值。 <p>Ex: <p>News news=new News();//POJO类,源自于数据库 * <p>Hyberbin hyberbin=new * Hyberbin(news);//构建Hyberbin,给出POJO类表示当前只对news表进行操作,而且是一次性操作。操作完后自动关闭数据库。 * <p>news.setId(1); <p>news.setNewsType(2); <p>news.setContent("这是一则新闻!"); * <strong><p>boolean * b=hyberbin.updataByKey("id");//参数传入“id”表示根据id的值去修改,即修改id=1的那条记录。</strong> * * @param key 更新条件字段 * @return 是否成功 */ public boolean updateByKey(String key) { removeField(key); GetSql gs = getSql();//自动生成sql语句 Object PKvalue = FieldUtil.getFieldValue(tablebean, key); setParmeter(PKvalue); gs.add(quote + key + quote, "?", "where");//生成sql的where部分,quote即为引号 String sql = gs.getUpdate(tableName);//生成sql语句 boolean b = update(sql); return b; } /** * 给指定字段指定条件的语句自增 <p>此方法用于给指定字段指定条件的语句自动加1操作,例如用户看一则新闻后点击量自动加1; * <p>此方法默认不会使用sql预处理技术。 <p>参数where中应该包含“where”关键字。 * <p>建议用户自己使用预处理技术(addParmeter("……"))以提高安全性。 <p>Ex: <p>Hyberbin * hyberbin=new * Hyberbin(news);//构建Hyberbin,给出POJO类表示当前只对news表进行操作,操作完后自动关闭数据库。 * <p>hyberbin.addParmeter(1); * <strong><p>hyberbin.autoUp("clickTimes","where id=?");</strong> * * @param field 要自增的字段 * @param where 条件 含有“where” * @return 是否成功 */ public boolean autoUp(String field, String where) { String sql = new StringBuilder("update ").append(quote).append(tableName).append(quote).append(" set ").append(quote).append(field).append(quote).append("=").append(quote).append(field).append(quote).append("+1 ").append(where).toString(); return update(sql); } /** * 数据库删除 <p>此方法默认不会使用sql预处理技术。 <p>参数where中应该包含“where”关键字。 * <p>建议用户自己使用预处理技术(addParmeter("……"))以提高安全性。 <p>Ex: <p>Hyberbin * hyberbin=new * Hyberbin(news);//构建Hyberbin,给出POJO类表示当前只对news表进行操作,操作完后自动关闭数据库。 * <p>hyberbin.addParmeter(1); <strong><p>hyberbin.dell("where * id=?");//删除id为1的新闻</strong> * * @param where 要删除的条件 含有“where” * @return 是否成功 */ public boolean dell(String where) { String sql = new StringBuilder("delete from ").append(quote).append(tableName).append(quote).append(" ").append(where).toString(); return update(sql); } /** * 根据键值删除一条数据 <p>此方法默认使用sql预处理技术。 <p>用户只需要提供关键字段的字段名即可。注意:参数是字段名。 <p>Ex: * <p>Hyberbin hyberbin=new * Hyberbin(news);//构建Hyberbin,给出POJO类表示当前只对news表进行操作,操作完后自动关闭数据库。 * <p>hyberbin.addParmeter(1); * <strong><p>hyberbin.dellOneByKey("id");//删除id为1的新闻</strong> * * @param key 键值 * @return 是否成功 */ public boolean dellOneByKey(String key) { String sql = new StringBuilder("delete from ").append(quote).append(tableName).append(quote).append(" where ").append(key).append(" =?").toString(); Object PKvalue = FieldUtil.getFieldValue(tablebean, key); setParmeter(PKvalue); return update(sql); } /** * 根据指定SQL语句查询一条数据 <p>此方法用于对数据库单表的查询操作,用于用户自己提供sql语句。 * <p>此方法返回的是Object对象,用户需要自行强制类型转换。 <p>此方法默认不会使用sql预处理技术。 * <p>建议用户自己使用预处理技术(addParmeter("……"))以提高安全性。 <p>Ex: <p>Hyberbin * hyberbin=new * Hyberbin(news);//构建Hyberbin,给出POJO类表示当前只对news表进行操作,操作完后自动关闭数据库。 * <p>hyberbin.addParmeter(2); <strong><p>hyberbin.showOne("select * from * news where id=?"); //查询id为2的新闻</strong> * * @param <T> 所有POJO类 * @param sql 指定SQL语句 * @return 查询对象 */ public <T> T showOne(String sql) { sql += " limit 0,1"; if (super.isFilter()) { super.getSql(sql); sql = super.getSelectSQL(); } ResultSet rs = query(sql);//执行查询 try { if (rs != null && rs.next()) { loadData(tablebean, rs); isLoaded = true; } else { isLoaded = false; tablebean = tablebean.getClass().newInstance();//创建实体 } } catch (Exception ex) { LoggerManage.logger.getLogger("Hyberbin查询出错,表:" + tableName + "\nsql:" + sql + "\n", ex); } finally { close(); } return (T) tablebean; } /** * 通过指定字段查询一条数据 <p>此方法用于对数据库单表的查询操作,用于只提供关键的字段名信息。 * <p>此方法返回的是Object对象,用户需要自行强制类型转换。 <p>此方法默认使用sql预处理技术。 <p>Ex: * <p>news.setId(2); <p>Hyberbin hyberbin=new * Hyberbin(news);//构建Hyberbin,给出POJO类表示当前只对news表进行操作,操作完后自动关闭数据库。 * <strong><p>hyberbin.showOnebyKey("id"); //查询id为2的新闻</strong> * 如果有缓存会自动从缓存中取出对象并克隆到tablebean 如果在存入缓存时用了setField或者removeField方法将导致缓存中数据不全 * * @param <T> 所有POJO类 * @param key 指定字段 * @return 查询对象 */ public <T> T showOnebyKey(String key) { Object value = FieldUtil.getFieldValue(tablebean, key); setParmeter(value); String sql = new StringBuilder("select ").append(getFieldList()).append(" from ").append(quote).append(tableName).append(quote).append(" where ").append(key).append("=?").toString();//sql语句 showOne(sql); return (T) tablebean; } /** * 数据库批量查询 <p>此方法查询一个表的所有记录,不常用。 <p>此方法返回的是 List,用户需要自行强制类型转换。 <p>Ex: * <p>Hyberbin hyberbin=new Hyberbin(news); * <strong><p>hyberbin.showAll();</strong> * * @return 查询结果集合 */ public List showAll() { String sql = new StringBuilder("select ").append(getFieldList()).append(" from ").append(tableName).toString();//sql语句 return showList(sql); } /** * 查询数据库中符合条件的记录数 <p>此方法用于查询符合用户条件的数据记录条数。 <p>参数where中应该包含“where”关键字。 * <p>此方法默认不使用sql预处理技术。 <p>建议用户自己使用预处理技术(addParmeter("……"))以提高安全性。 <p>Ex: * <p>Hyberbin hyberbin=new * Hyberbin(news);//构建Hyberbin,给出POJO类表示当前只对news表进行操作,操作完后自动关闭数据库。 * <p>hyberbin.addParmeter(2); <strong><p>hyberbin.getCount("where * newstype=?"); //查询newstype为2的新闻有多少条</strong> * * @param where 查询条件 含有“where” * @return 个数 */ public int getCount(String sql) { int count = 0; if (sql.trim().startsWith("where")) { sql = new StringBuilder("select count(*) as count from ").append(quote).append(tableName).append(quote).append(" ").append(sql).toString(); } else if (sql.trim().equals("")) { sql = new StringBuilder("select count(*) as count from ").append(quote).append(tableName).append(quote).toString(); } else { sql = new StringBuilder("select count(*) as count from (").append(sql).toString() + ") hyberbin"; } ResultSet rs = query(sql); try { if (rs != null && rs.next()) { count = rs.getInt(1); } } catch (SQLException ex) { LoggerManage.logger.getLogger("Hyberbin查询总记录数出错,表:" + tableName + "\nsql:" + sql + "\n", ex); } close(); return count; } /** * mysql分页查询 <p>注意:此方法只适用于mysql数据库 <p>此方法用于分页查询用户给定的条件下的数据集合,提供了分页查询的接口。 * <p>参数where中应该包含“where”关键字。 <p>此方法默认不使用sql预处理技术。 * <p>建议用户自己使用预处理技术(addParmeter("……"))以提高安全性。 <p>Ex: <p>Hyberbin * hyberbin=new * Hyberbin(news);//构建Hyberbin,给出POJO类表示当前只对news表进行操作,操作完后自动关闭数据库。 * <p>hyberbin.addParmeter(2); <strong><p>hyberbin.showByMySqlPage("where * newstype=?",0,10,true);</strong> * //查询newstype为2的新闻记录,从0开始取10条记录,true表示返回集合的第一条数据为符合条件的总记录数。 * * @param where 查询条件 含有“where” * @param top 起始位置 * @param size 查询量 * @param total 是否查询符合条件的总条数 * @return 查询集合 */ public List showByMySqlPage(String where, int top, int size, boolean total) { if (autoClearPrepare) { delayClear = true; } if (total) {//如果之前是自动关闭 delayClose = true; } StringBuilder sql = new StringBuilder("select ").append(getFieldList()).append(" from ").append(quote).append(tableName).append(quote).append(" ").append(where); if (super.isFilter()) { super.getSql(sql.toString()); sql = new StringBuilder(super.getSelectSQL()); } List list = showList(sql.toString() + " limit " + top + "," + size); return list; } /** * mysql分页查询 <p>注意:此方法只适用于mysql数据库 <p>此方法用于分页查询用户给定的条件下的数据集合,提供了分页查询的接口。 * <p>参数where中应该包含“where”关键字。 <p>此方法默认不使用sql预处理技术。 * <p>建议用户自己使用预处理技术(addParmeter("……"))以提高安全性。 <p>Ex: <p>Hyberbin * hyberbin=new * Hyberbin(news);//构建Hyberbin,给出POJO类表示当前只对news表进行操作,操作完后自动关闭数据库。 * <p>hyberbin.addParmeter(2); <strong><p>hyberbin.showByMySqlPage("where * newstype=?",0,10,true);</strong> * //查询newstype为2的新闻记录,从0开始取10条记录,true表示返回集合的第一条数据为符合条件的总记录数。 * * @param where 查询条件 含有“where” * @param top 起始位置 * @param size 查询量 * @param total 是否查询符合条件的总条数 * @return 查询集合 */ public List showByMySqlPage(String where, Pagger pagger) { if (autoClearPrepare) { delayClear = true; } if (autoClose) {//如果之前是自动关闭 delayClose = true; } StringBuilder sql = new StringBuilder("select ").append(getFieldList()).append(" from ").append(quote).append(tableName).append(quote).append(" ").append(where); if (super.isFilter()) { super.getSql(sql.toString()); sql = new StringBuilder(super.getSelectSQL()); } List list = showList(sql.toString() + " limit " + pagger.getTop() + "," + pagger.getSize()); pagger.setItems(getCount(sql.toString())); return list; } public List showByMySqlPage(String where, EasyUiJson pagger) { if (autoClearPrepare) { delayClear = true; } if (autoClose) {//如果之前是自动关闭 delayClose = true; } StringBuilder sql = new StringBuilder("select ").append(getFieldList()).append(" from ").append(quote).append(tableName).append(quote).append(" ").append(where); if (super.isFilter()) { super.getSql(sql.toString()); sql = new StringBuilder(super.getSelectSQL()); } List list = showList(sql.toString() + " limit " + pagger.getTop() + "," + pagger.getRows()); pagger.setTotal(getCount(sql.toString())); return list; } /** * 数据库的批量查询 <p>此方法用于对数据库单表的查询操作,用于用户自己提供sql语句。 <p>由于是自己构造sql语句所以适用于所有数据库。 * <p>此方法默认不会使用sql预处理技术。 <p>建议用户自己使用预处理技术(addParmeter("……"))以提高安全性。 <p>Ex: * <p>Hyberbin hyberbin=new * Hyberbin(news);//构建Hyberbin,给出POJO类表示当前只对news表进行操作,而且是一次性操作。操作完后自动关闭数据库。 * <p>hyberbin.addParmeter(2); <strong><p>hyberbin.showList("select * from * news where newstype=?");</strong> * * @param sql * @return 查询结果集合 */ public List showList(String sql) { List list = new ArrayList(); if (super.isFilter()) { super.getSql(sql); sql = super.getSelectSQL(); } ResultSet rs = query(sql);//执行查询 try { while (rs != null && rs.next()) { list.add(loadData(tablebean.getClass().newInstance(), rs)); } } catch (Exception ex) { LoggerManage.logger.getLogger("Hyberbin查询列表出错,表:" + tableName + "\nsql:" + sql + "\n", ex); } finally { close(); } isLoaded = list.size() > 0 ? true : false; return list; } /** * 设置空值列表 更新的时候会自动将下列值设置为空. * 用于只更新从表单获得的空值 原数据库的空值不动 * @param nuList */ public void setNuList(List<String> nuList) { this.nuList = nuList; updateNull = false; } /** * 当前Hyberbin是否真正查询到了数据 * * @return */ public boolean isLoaded() { return isLoaded; } }