java操作数据库的工具类
来源:互联网 发布:淘宝网纸箱 编辑:程序博客网 时间:2024/05/29 02:00
public abstract class AbstractDao {protected final Log log = LogFactory.getLog(this.getClass());protected DBHelper helper = new DBHelper();private Map<String, Object> params;private String sqlQry;protected long size;protected long start;/** * 取得资料的比數 * * @param sqlQry * sql语句 * @return 资料笔数 */public int executeCount(String sqlQry) {return executeCount(sqlQry, new ArrayList<Object>());}/** * 取得符合条件的笔数 * * @param sqlQry * sql语句(参数格式 <span style="color:red">:参数名</span>) * @param params * 参数Map<String key, Object value> * @return 资料笔数 */public int executeCount(String sqlQuery, Map<String, Object> params) {ResultSet rs = null;int count = 0;try {this.sqlQry = sqlQuery;this.params = params;this.size = -1;this.start = -1;setParams();rs = helper.createStatement().executeQuery(sqlQry);if (rs.next()) {count = rs.getInt(1);}} catch (SQLException e) {log.error(e.toString(), e);} finally {log.debug(sqlQry);if (rs != null) {try {rs.close();} catch (SQLException e) {log.error(e.toString(), e);}}close();}return count;}/** * 取得符合条件的笔数 * * @param sqlQuery * sql语句(参数用<span style="color:red">?</span>代替) * @param params * 参数List<Object> * @return 资料笔数 */public int executeCount(String sqlQuery, List<Object> params) {ResultSet rs = null;int count = 0;try {PreparedStatement pstmt = helper.createStatement(sqlQuery);setParams(pstmt, params);rs = pstmt.executeQuery();if (rs.next()) {count = rs.getInt(1);}} catch (SQLException e) {log.error(e.toString(), e);} finally {log.debug(sqlQry);if (rs != null) {try {rs.close();} catch (SQLException e) {log.error(e.toString(), e);}}close();}return count;}public int executeCount(String sqlQuery, Object[] params) {List<Object> list = new ArrayList<Object>();if (params != null) {for (Object o : params) {list.add(o);}}return executeCount(sqlQuery, list);}/** * 根据提供的SQL查询数据 * * @param c * 数据类型 可以是Model.class 后 Object[].class * @param sqlQry * 查询SQL * @return 指定类型的List */public <T> List<T> executeQuery(Class<T> c, String sqlQry) {return executeQuery(c, sqlQry, new ArrayList<Object>());}/** * * 根据提供的SQL查询数据 * * @param c * 数据类型 可以是Model.class 后 Object[].class * @param sqlQuery * 查询SQL(参数格式 <span style="color:red">:参数名</span>) * @param params * 参数Map<String key, Object value> * @return 指定类型的List */@SuppressWarnings("unchecked")public <T> List<T> executeQuery(Class<T> c, String sqlQuery,Map<String, Object> params,Page page) {List<T> list = new ArrayList<T>();ResultSet rs = null;try {this.sqlQry = sqlQuery;this.params = params;if(page!=null){this.sqlQry+=" limit :size offset :start";this.start=page.getstartR(page.getCurpage(), page.getPagesize());this.size=page.getPagesize();}if (start >= 0 && size > 0) {setBigDecimal(":start", new BigDecimal(start));setBigDecimal(":size", new BigDecimal(size));}setParams();rs = helper.createStatement().executeQuery(sqlQry);if (c.toString().equals("class java.lang.Object")) {int cNum = rs.getMetaData().getColumnCount();while (rs.next()) {list.add((T) copyRsData(rs, cNum));}} else {try {// ResultSetDynaClass rsdc = new ResultSetDynaClass(rs);// Iterator<T> rows = rsdc.iterator();while (rs.next()) {T t = (T) c.newInstance();copyProperties(t, rs, log);// DynaBean row = (DynaBean) rows.next();// BeanUtils.copyProperties(t, row);list.add(t);}} catch (InstantiationException e) {e.printStackTrace();} catch (IllegalAccessException e) {e.printStackTrace();}}} catch (SQLException e) {log.error(e.toString(), e);} finally {if (rs != null) {try {rs.close();} catch (SQLException e) {log.error(e.toString(), e);}}close();log.debug(sqlQry);}return list;}/** * * 根据提供的SQL查询数据 * * @param c * 数据类型 可以是Model.class 后 Object[].class * @param sqlQry * 查询SQL(参数用<span style="color:red">?</span>代替) * @param params * 参数List<Object> * @return 指定类型的List */@SuppressWarnings("unchecked")public <T> List<T> executeQuery(Class<T> c, String sqlQry,List<Object> params) {List<T> list = new ArrayList<T>();ResultSet rs = null;try {PreparedStatement pstmt = helper.createStatement(sqlQry);setParams(pstmt, params);rs = pstmt.executeQuery();if (c.toString().equals("class java.lang.Object")) {int cNum = rs.getMetaData().getColumnCount();while (rs.next()) {list.add((T) copyRsData(rs, cNum));}} else {try {// ResultSetDynaClass rsdc = new ResultSetDynaClass(rs);// Iterator<T> rows = rsdc.iterator();while (rs.next()) {T t = (T) c.newInstance();copyProperties(t, rs, log);// DynaBean row = (DynaBean) rows.next();// BeanUtils.copyProperties(t, row);list.add(t);}} catch (InstantiationException e) {e.printStackTrace();} catch (IllegalAccessException e) {e.printStackTrace();}}} catch (SQLException e) {log.error(e.toString(), e);} finally {if (rs != null) {try {rs.close();} catch (SQLException e) {log.error(e.toString(), e);}}close();log.debug(sqlQry);}return list;}private static void copyProperties(Object dst, ResultSet row, Log log) {if (row == null || dst == null) {return;}try {// ResultSetMetaData rsmd = row.getMetaData();String field;Object value;Field[] fields = dst.getClass().getDeclaredFields();for (Field f : fields) {field = f.getName();f.setAccessible(true);try {value = row.getObject(field);f.set(dst, value);} catch (SQLException e) {log.debug("数据栏位与Model不一致."+ e);} catch (IllegalArgumentException e) {log.debug("数据栏位类型与Model不一致."+ e);} catch (IllegalAccessException e) {log.debug("Model属性无法访问."+e);}}//} catch (SQLException e) {//LALog4DB.data("数据栏位与Model不一致.", e, "copyProperties");//} catch (IllegalArgumentException e) {//LALog4DB.data("数据栏位类型与Model不一致.", e, "copyProperties");//} catch (IllegalAccessException e) {//LALog4DB.data("Model属性无法访问.", e, "copyProperties");} catch (Exception e) {LALog4DB.data("其他错误.", e, "copyProperties");}}public <T> List<T> executeQuery(Class<T> c, String sqlQry, Object[] params) {List<Object> list = new ArrayList<Object>();if (params != null) {for (Object o : params) {list.add(o);}}return executeQuery(c, sqlQry, list);}/** * 根据提供的SQL查询第一笔资料 * * @param c * 数据类型 可以是Model.class 后 Object[].class * @param sqlQry * 查询SQL(参数格式 <span style="color:red">:参数名</span>) * @param params * 参数Map<String key, Object value> * @return 指定类型的对象 */public <T> T queryFirstOrDefault(Class<T> c, String sqlQry,Map<String, Object> params,Page page) {T t = null;sqlQry += " limit 1";List<T> list = executeQuery(c, sqlQry, params,page);if (list != null && list.size() > 0) {t = list.get(0);}return t;}/** * 根据提供的SQL查询第一笔资料 * * @param c * 数据类型 可以是Model.class 后 Object[].class * @param sqlQry * 查询SQL(参数用<span style="color:red">?</span>代替) * @param params * 参数List<Object> <div style="color:red">可以是数组</div> * @return 指定类型的对象 */public <T> T queryFirstOrDefault(Class<T> c, String sqlQry,List<Object> params) {T t = null;sqlQry += " limit 1";List<T> list = executeQuery(c, sqlQry, params);if (list != null && list.size() > 0) {t = list.get(0);}return t;}/** * {@link com.lingan.common.AbstractDao#queryFirstOrDefault(Class, String, List) * 查看queryFirstOrDefault} */public <T> T queryFirstOrDefault(Class<T> c, String sqlQry, Object[] params) {List<Object> list = new ArrayList<Object>();if (params != null) {for (Object o : params) {list.add(o);}}return queryFirstOrDefault(c, sqlQry, list);}/** * {@link com.lingan.common.AbstractDao#executeUpdate(String,List) * 查看executeUpdate} */public int executeUpdate(String sqlQry) {return executeUpdate(sqlQry, new ArrayList<Object>());}/** * 执行update/insert/delete语句 * * @param sqlQry * 执行的SQL(参数格式 <span style="color:red">:参数名</span>) * @param params * 参数Map<String key, Object value> * @return 执行成功笔数 */public int executeUpdate(String sqlQry, Map<String, Object> params) {int count = 0;try {this.sqlQry = sqlQry;this.params = params;this.size = -1;this.start = -1;setParams();count = helper.createStatement().executeUpdate(sqlQry);} catch (SQLException e) {log.error(e.toString(), e);} finally {log.debug(sqlQry);if (!helper.trans) {try {helper.commit();} catch (SQLException e) {log.error(e.getMessage(), e);}close();}}return count;}/** * 执行update/insert/delete语句 * * @param sqlQry * 执行SQL(参数用<span style="color:red">?</span>代替) * @param params * 参数List<Object><br> * <div style="color:red"> 可以是数组,也可以不传入<br> * 如果不传入代表SQL中没有参数 </div> * @return 执行成功笔数 */public int executeUpdate(String sqlQry, List<Object> params) {int count = 0;try {PreparedStatement pstmt = helper.createStatement(sqlQry);setParams(pstmt, params);count = pstmt.executeUpdate();} catch (SQLException e) {log.error(e.toString(), e);} finally {log.debug(sqlQry);if (!helper.trans) {try {helper.commit();} catch (SQLException e) {log.error(e.getMessage(), e);}close();}}return count;}/** * {@link com.lingan.common.AbstractDao#executeUpdate(String,List) * 查看executeUpdate} */public int executeUpdate(String sqlQry, Object[] params) {List<Object> list = new ArrayList<Object>();if (params != null) {for (Object o : params) {list.add(o);}}return executeUpdate(sqlQry, list);}private void setParams(PreparedStatement pstmt, List<Object> params)throws SQLException {if (params != null) {Object o;for (int i = 1; i <= params.size(); i++) {o = params.get(i - 1);if (o instanceof String) {pstmt.setString(i, (String) o);} else if (o instanceof Date) {Date d = (Date) o;String t = DateUtils.format(d, "HHmmss");if (t.matches("[1-9]")) {pstmt.setTimestamp(i,new java.sql.Timestamp(d.getTime()));} else {pstmt.setDate(i, new java.sql.Date(d.getTime()));}} else if (o instanceof BigDecimal) {pstmt.setBigDecimal(i, (BigDecimal) o);} else if (o instanceof Long) {pstmt.setLong(i, (Long) o);} else if (o instanceof Integer) {pstmt.setInt(i, (Integer) o);}}}}/** * 将rs中的资料copy到Object数组中 * * @param rs * 查询结果集 * @return Object数组 * @throws SQLException * 无法取得结果集列数时, 抛出异常 */protected Object[] copyRsData(ResultSet rs) throws SQLException {return copyRsData(rs, -1);}/** * 将rs中的资料copy到Object数组中 * * @param rs * 查询结果集 * @param cNum * Object长度(如果cNum大于实际列数, 则以实际列数为准) * @return Object 数组 * @throws SQLException * 无法取得结果集列数时, 抛出异常 */protected Object[] copyRsData(ResultSet rs, int cNum) throws SQLException {Object[] objs = new Object[cNum];if (cNum > rs.getMetaData().getColumnCount()) {cNum = rs.getMetaData().getColumnCount();}for (int i = 0; i < cNum; i++) {try {objs[i] = rs.getObject(i + 1);} catch (SQLException e) {e.printStackTrace();}}return objs;}private void close() {helper.close();}private void setParams() throws SQLException {// 添加分頁if (start >= 0 && size > 0) {setBigDecimal(":start", new BigDecimal(start));setBigDecimal(":size", new BigDecimal(size));}// 設定參數if (params == null) {return;}Object value;for (String s : params.keySet()) {value = params.get(s);if (!s.startsWith(":")) {s = ":" + s;}setValue(s, value);}}private void setBigDecimal(String field, BigDecimal x) throws SQLException {setValue(field, x);}private void setValue(String field, Object value) throws SQLException {String regex = field + "[+,=,\\-,*,<,>,!,\\s,(,),]";String repStr = "";if (value == null) {repStr = "null";} else if (value instanceof String) {repStr = "'" + StringEscapeUtils.escapeSql((String) value) + "'";} else if (value instanceof Number) {repStr = value.toString();} else if (value instanceof Timestamp) {repStr = "'"+ new SimpleDateFormat("yyyy/MM/dd HH:mm:ss.S").format(DateUtils.toDate((Timestamp) value)) + "'";} else if (value instanceof Date) {repStr = "'" + new SimpleDateFormat("yyyy/MM/dd").format(value)+ "'";} else if (value instanceof List) {@SuppressWarnings("unchecked")List<Object> list = (List<Object>) value;for (Object o : list) {repStr += ",";if (o instanceof String) {repStr += "'" + StringEscapeUtils.escapeSql((String) o)+ "'";} else if (o instanceof Number) {repStr += o.toString();} else if (o instanceof Timestamp) {repStr += "'"+ new SimpleDateFormat("yyyy/MM/dd HH:mm:ss.S").format(DateUtils.toDate((Timestamp) o))+ "'";} else if (o instanceof Date) {repStr += "'"+ new SimpleDateFormat("yyyy/MM/dd").format(o)+ "'";}}if (repStr.length() > 0) {repStr = repStr.substring(1);} else {repStr = "''";}} else {repStr = "null";}Pattern pattern = Pattern.compile(regex);Matcher matcher = pattern.matcher(this.sqlQry + ")");boolean matchFound = matcher.find();StringBuffer strBuffer = new StringBuffer(this.sqlQry);int position = 0;while (matchFound) {for (int i = 0; i <= matcher.groupCount(); i++) {String groupStr = matcher.group(i);strBuffer.replace(position + matcher.start(), position+ matcher.start() + groupStr.length() - 1, repStr);position += repStr.length() - (groupStr.length() - 1);}if (matcher.end() + 1 > this.sqlQry.length())break;matchFound = matcher.find(matcher.end());}this.sqlQry = strBuffer.toString();}/** * 启用事务 */public void beginTrans() {helper.beginTrans();log.debug("事务已经启用, 请在交易完成时调用closeTrans");}/** * 结束事务并提交 */public void closeTrans() {helper.closeTrans();}}
声明此文章并非转载,是同事刘所写,我只是总结下,为以后的工作积累点经验。
- java操作数据库的工具类
- java 数据库操作工具类
- java数据库操作工具类
- 【java工具类】数据库操作时ResultSet的一个替代
- JAVA 数据库操作工具类----mysql
- java数据库操作--改写成工具类
- 数据库操作工具类
- 数据库操作工具类
- 数据库操作工具类
- 我的数据库操作工具类
- 常用代码备忘录(封装 Apache Commons 的 DbUtils 实现的数据库操作工具类)-DBUtil.java
- Java数据库的操作——DBUtils工具类结果集处理的方式有几种?
- java 数据库操作的类
- java操作ORACLE数据库工具类(JDBC)
- JAVA 数据库操作工具类(项目封装,mySQL)
- mysql 操作数据库 工具类
- PHP操作数据库工具类
- python操作数据库工具类
- 蓝桥杯 2011年第二届C语言初赛试题(1)
- 关于 :TCP/IP、Http、Socket的区别
- 策略模式
- Api-Demo Advanced preference分析
- Android中的Bmp图形格式(ALPHA_8,ARGB_4444,ARGB_8888,RGB_565)
- java操作数据库的工具类
- MyEclipse安装插件的几种方法
- ZOJ 1391 Horizontally Visible Segments(线段树)
- How to pass arguments in exchange
- 在代码中设置ListView的divider,需要注意的两个问题
- C#去除数组中的重复项代码
- 制作地址栏中的小图标
- Performance considerations for keySet() and entrySet() of Map
- 设计模式应用与发展之工厂模式 c++篇