package org.neframework.jpa.sql; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import org.neframework.jpa.core.JdbcPersistence; import org.neframework.jpa.exception.ServiceException; import org.neframework.jpa.page.Page; import org.neframework.jpa.util.ChkTools; import org.neframework.jpa.util.DataSourceTools; import org.neframework.jpa.util.MysqlOrmTools; public class JdbcComponent implements JdbcPersistence { /** * 如果第一个结果是 ResultSet 对象,则返回 true;如果第一个结果是更新计数或者没有结果,则返回 false */ @Override public boolean execute(String sql) { boolean execute = false; Connection conn = null; PreparedStatement pstmt = null; try { conn = DataSourceTools.getConn(); pstmt = conn.prepareStatement(sql); execute = pstmt.execute(sql); } catch (SQLException e) { e.printStackTrace(); throw new ServiceException(e); } finally { DataSourceTools.close(null, pstmt, conn); } return execute; }// # execute @Override public boolean execute(List<String> sqls, List<List<Object>> valList) { // TODO 批量修改对象,并且执行一组sql boolean execute = false; if (sqls.size() != valList.size()) { throw new RuntimeException("sql的数量必须和参数的数量一致."); } Connection conn = null; PreparedStatement pstmt = null; try { conn = DataSourceTools.getConn(); conn.setAutoCommit(false); for (int i = 0; i < sqls.size(); i++) { String sql = sqls.get(i); List<Object> val = valList.get(i); pstmt = conn.prepareStatement(sql); if (ChkTools.isNotNull(val)) { int index = 1; for (Object param : val) { pstmt.setObject(index++, param); } } pstmt.execute(); } execute = true; } catch (SQLException e) { execute = false; e.printStackTrace(); if (conn != null) { try { conn.rollback(); } catch (SQLException e1) { e1.printStackTrace(); } } } finally { DataSourceTools.close(null, pstmt, conn); } return execute; } @Override public List<Map<String, Object>> queryForList(String sql) { return this.queryForList(sql, new Object[] {}); } @Override public List<Map<String, Object>> queryForList(String sql, Object[] args) { List<Map<String, Object>> list = new ArrayList<Map<String, Object>>(); Connection conn = null; PreparedStatement pstmt = null; ResultSet rs = null; try { conn = DataSourceTools.getConn(); pstmt = conn.prepareStatement(sql); if (ChkTools.isNotNull(args)) { for (int i = 0; i < args.length; i++) { pstmt.setObject(i + 1, args[i]); } } rs = pstmt.executeQuery(); List<String> labels = MysqlOrmTools.getColumnLables(rs); while (rs.next()) { Map<String, Object> map = new HashMap<String, Object>(); Object val = null; for (String label : labels) { val = rs.getObject(label); map.put(label, val); } list.add(map); }// #while } catch (SQLException e) { e.printStackTrace(); throw new ServiceException(e); } finally { DataSourceTools.close(rs, pstmt, conn); } return list; }// #queryForList @Override public Map<String, Object> queryForMap(String sql) { return queryForMap(sql, null); } @Override public Map<String, Object> queryForMap(String sql, Object[] args) { Map<String, Object> map = new HashMap<String, Object>(); Connection conn = null; PreparedStatement pstmt = null; ResultSet rs = null; try { conn = DataSourceTools.getConn(); pstmt = conn.prepareStatement(sql); if (ChkTools.isNotNull(args)) { for (int i = 0; i < args.length; i++) { pstmt.setObject(i + 1, args[i]); } } rs = pstmt.executeQuery(); List<String> labels = MysqlOrmTools.getColumnLables(rs); if (rs.next()) { Object val = null; for (String label : labels) { val = rs.getObject(label); map.put(label, val); } }// #while } catch (SQLException e) { e.printStackTrace(); throw new ServiceException(e); } finally { DataSourceTools.close(rs, pstmt, conn); } return map; } @Override public int update(String sql) { return this.update(sql, null); } @Override public int update(String sql, Object[] args) { int update = 0; Connection conn = null; PreparedStatement pstmt = null; try { conn = DataSourceTools.getConn(); pstmt = conn.prepareStatement(sql); if (ChkTools.isNotNull(args)) { for (int i = 0; i < args.length; i++) { pstmt.setObject(i + 1, args[i]); } } update = pstmt.executeUpdate(); } catch (SQLException e) { e.printStackTrace(); throw new ServiceException(e); } finally { DataSourceTools.close(null, pstmt, conn); } return update; } /** * 分页查询 */ @Override public List<Map<String, Object>> queryForList(String sql, Page page) { return queryForList(sql, null, page); } @Override public List<Map<String, Object>> queryForList(String sql, Object[] vals, Page page) { Integer position = sql.toLowerCase().indexOf("from "); String sql_count = "select count(1) cnt " + sql.substring(position); return this.queryForList(sql, sql_count, vals, null, page); } @Override public List<Map<String, Object>> queryForList(String sql, String sql_count, Object[] vals, Map<String, String> sort_params, Page page) { List<Map<String, Object>> ret = new ArrayList<Map<String, Object>>(); PreparedStatement pstmt = null; ResultSet rs = null; Connection conn = null; try { conn = DataSourceTools.getConn(); long count = (Long) this.queryForMap(sql_count, vals).get("cnt"); page.setRowTotal(count); page.setPageTotal((int) (page.getRowTotal() - 1) / page.getPageSize() + 1); if (page.getPageNum() > page.getPageTotal()) { page.setPageNum(page.getPageTotal()); } if (page.getPageNum() <= 0) { page.setPageNum(1); } if (ChkTools.isNotNull(sort_params)) { StringBuilder sb = new StringBuilder(); for (String key : sort_params.keySet()) { sb.append(" ").append(key).append(" ").append(sort_params.get(key)).append(","); } String ob = " order by"; int orderIndex = sql.toLowerCase().indexOf(ob); if (orderIndex == -1) { sb.deleteCharAt(sb.length() - 1); sql += ob + sb.toString(); } else { sql = new StringBuilder(sql).insert(orderIndex + ob.length(), sb).toString(); } } // 分页 sql += " limit :start,:pageSize"; sql = sql.replace(":start", page.getPageSize() * (page.getPageNum() - 1) + ""); sql = sql.replace(":pageSize", page.getPageSize() + ""); pstmt = conn.prepareStatement(sql); if (ChkTools.isNotNull(vals)) { for (int i = 0; i < vals.length; i++) { pstmt.setObject(i + 1, vals[i]); } } rs = pstmt.executeQuery(); List<String> lables = MysqlOrmTools.getColumnLables(rs); while (rs.next()) { Map<String, Object> map = new HashMap<String, Object>(); for (String lable : lables) { map.put(lable, rs.getObject(lable)); } ret.add(map); } return ret; } catch (Exception e) { e.printStackTrace(); throw new ServiceException(e); } finally { DataSourceTools.close(rs, pstmt, conn); } } /** * 万能分页查询 */ @Override public List<Map<String, Object>> queryForListUniversal(String sql, Object[] vals, Page page) { List<Map<String, Object>> ret = new ArrayList<Map<String, Object>>(); PreparedStatement pstmt = null; ResultSet rs = null; Connection conn = null; try { conn = DataSourceTools.getConn(); pstmt = conn.prepareStatement(sql); if (ChkTools.isNotNull(vals)) { for (int i = 0; i < vals.length; i++) { pstmt.setObject(i + 1, vals[i]); } } rs = pstmt.executeQuery(); rs.last(); long count = rs.getRow(); page.setRowTotal(count); page.setPageTotal((int) (page.getRowTotal() - 1) / page.getPageSize() + 1); if (page.getPageNum() > page.getPageTotal()) { page.setPageNum(page.getPageTotal()); } if (page.getPageNum() <= 0) { page.setPageNum(1); } // 分页 sql += " limit :start,:pageSize"; sql = sql.replace(":start", page.getPageSize() * (page.getPageNum() - 1) + ""); sql = sql.replace(":pageSize", page.getPageSize() + ""); pstmt = conn.prepareStatement(sql); if (ChkTools.isNotNull(vals)) { for (int i = 0; i < vals.length; i++) { pstmt.setObject(i + 1, vals[i]); } } rs = pstmt.executeQuery(); List<String> lables = MysqlOrmTools.getColumnLables(rs); while (rs.next()) { Map<String, Object> map = new HashMap<String, Object>(); for (String lable : lables) { map.put(lable, rs.getObject(lable)); } ret.add(map); } return ret; } catch (Exception e) { e.printStackTrace(); throw new ServiceException(e); } finally { DataSourceTools.close(rs, pstmt, conn); } }// #queryForListUniversal // 带排序的 public List<Map<String, Object>> queryForList(String sql, Object[] vals, Map<String, String> sort_params, Page page) { // TODO Auto-generated method stub Integer position = sql.toLowerCase().indexOf("from "); String sql_count = "select count(1) cnt " + sql.substring(position); return this.queryForList(sql, sql_count, vals, sort_params, page); } }