BaseDao.java 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561
  1. package com.uas.eis.dao;
  2. import com.uas.eis.model.SqlRowList;
  3. import com.uas.eis.utils.BaseUtil;
  4. import com.uas.eis.utils.Constant;
  5. import com.uas.eis.utils.DateUtil;
  6. import net.sf.json.JSONObject;
  7. import org.springframework.beans.factory.annotation.Autowired;
  8. import org.springframework.dao.DataAccessException;
  9. import org.springframework.dao.EmptyResultDataAccessException;
  10. import org.springframework.jdbc.core.BeanPropertyRowMapper;
  11. import org.springframework.jdbc.core.CallableStatementCallback;
  12. import org.springframework.jdbc.core.CallableStatementCreator;
  13. import org.springframework.jdbc.core.JdbcTemplate;
  14. import org.springframework.stereotype.Repository;
  15. import java.sql.CallableStatement;
  16. import java.sql.Connection;
  17. import java.sql.SQLException;
  18. import java.sql.Timestamp;
  19. import java.util.*;
  20. @Repository
  21. public class BaseDao{
  22. @Autowired
  23. private JdbcTemplate jdbcTemplate;
  24. public JdbcTemplate getJdbcTemplate() {
  25. return jdbcTemplate;
  26. }
  27. public List<Map<String, Object>> queryForList(String sql) {
  28. try {
  29. return jdbcTemplate.queryForList(sql);
  30. } catch (EmptyResultDataAccessException e) {
  31. return null;
  32. }
  33. }
  34. public <T> List<T> queryForList(String sql, Class<T> elementType) {
  35. try {
  36. return jdbcTemplate.queryForList(sql, elementType);
  37. } catch (EmptyResultDataAccessException e) {
  38. return null;
  39. }
  40. }
  41. public List<Map<String, Object>> queryForList(String sql, Object... args) {
  42. try {
  43. return jdbcTemplate.queryForList(sql, args);
  44. } catch (EmptyResultDataAccessException e) {
  45. return null;
  46. }
  47. }
  48. public <T> List<T> queryForList(String sql, Object[] args, Class<T> elementType) {
  49. try {
  50. return jdbcTemplate.queryForList(sql, args, elementType);
  51. } catch (EmptyResultDataAccessException e) {
  52. return null;
  53. }
  54. }
  55. public <T> List<T> queryForList(String sql, Class<T> elementType, Object... args) {
  56. try {
  57. return jdbcTemplate.queryForList(sql, elementType, args);
  58. } catch (EmptyResultDataAccessException e) {
  59. return null;
  60. }
  61. }
  62. public <T> List<T> query(String sql, Object[] args, Class<T> elementType) {
  63. try {
  64. return jdbcTemplate.query(sql, args, new BeanPropertyRowMapper<T>(elementType));
  65. } catch (EmptyResultDataAccessException e) {
  66. return null;
  67. }
  68. }
  69. public <T> List<T> query(String sql, Class<T> elementType) {
  70. try {
  71. return jdbcTemplate.query(sql, new BeanPropertyRowMapper<T>(elementType));
  72. } catch (EmptyResultDataAccessException e) {
  73. return null;
  74. }
  75. }
  76. public <T> List<T> query(String sql, Class<T> elementType, Object... args) {
  77. try {
  78. return jdbcTemplate.query(sql, new BeanPropertyRowMapper<T>(elementType), args);
  79. } catch (EmptyResultDataAccessException e) {
  80. return null;
  81. }
  82. }
  83. public <T> T queryForObject(String sql, Class<T> elementType, Object... args) {
  84. try {
  85. return jdbcTemplate.queryForObject(sql, elementType, args);
  86. } catch (EmptyResultDataAccessException e) {
  87. return null;
  88. }
  89. }
  90. public void execute(String sql) {
  91. jdbcTemplate.execute(sql);
  92. }
  93. public synchronized boolean execute(String sql, Object... objs) {
  94. try {
  95. jdbcTemplate.update(sql, objs);
  96. return true;
  97. } catch (Exception e) {
  98. return false;
  99. }
  100. }
  101. public void execute(List<String> sqls) {
  102. if (sqls.size() > 0) {
  103. StringBuffer sb = new StringBuffer("begin ");
  104. for (String sql : sqls) {
  105. sb.append("execute immediate '").append(sql.replace("'", "''")).append("';");
  106. }
  107. sb.append("end;");
  108. jdbcTemplate.execute(sb.toString());
  109. }
  110. }
  111. public void deleteById(String tablename, String keyField, long id) {
  112. deleteByCondition(tablename, keyField + "=" + id);
  113. }
  114. public void deleteByCondition(String tablename, String condition, Object... params) {
  115. StringBuffer sb = new StringBuffer();
  116. sb.append("DELETE FROM ");
  117. sb.append(tablename);
  118. sb.append(" WHERE ");
  119. sb.append(condition);
  120. execute(sb.toString(), params);
  121. }
  122. /**
  123. * 一个字段,一条结果
  124. *
  125. * @param tableName
  126. * 对应要查询的表
  127. * @param field
  128. * 要查询的字段
  129. * @param condition
  130. * 查询条件
  131. * @return field对应的数据
  132. */
  133. public Object getFieldDataByCondition(String tableName, String field, String condition) {
  134. StringBuffer sql = new StringBuffer("SELECT ");
  135. sql.append(field);
  136. sql.append(" FROM ");
  137. sql.append(tableName);
  138. sql.append(" WHERE ");
  139. sql.append(condition);
  140. SqlRowList srs = queryForRowSet(sql.toString());
  141. if (srs.next()) {
  142. return srs.getObject(1);
  143. } else {
  144. return null;
  145. }
  146. }
  147. /**
  148. * 一个字段,多条结果
  149. *
  150. * @param tableName
  151. * 对应要查询的表
  152. * @param field
  153. * 要查询的字段
  154. * @param condition
  155. * 查询条件
  156. * @return field对应的数据
  157. */
  158. public List<Object> getFieldDatasByCondition(String tableName, String field, String condition) {
  159. StringBuffer sb = new StringBuffer("SELECT ");
  160. sb.append(field);
  161. sb.append(" FROM ");
  162. sb.append(tableName);
  163. sb.append(((condition == null || "".equals(condition)) ? "" : (" WHERE " + condition)));
  164. SqlRowList srs = queryForRowSet(sb.toString());
  165. List<Object> list = new ArrayList<Object>();
  166. while (srs.next()) {
  167. list.add(srs.getObject(1));
  168. }
  169. return list;
  170. }
  171. /**
  172. * 多个字段,<=1条结果
  173. *
  174. * @param tableName
  175. * 对应要查询的表
  176. * @param fields
  177. * 要查询的字段,用逗号隔开
  178. * @param condition
  179. * 查询条件
  180. * @return fields对应的数据
  181. */
  182. public Object[] getFieldsDataByCondition(String tableName, String fields, String condition) {
  183. StringBuffer sql = new StringBuffer("SELECT ");
  184. sql.append(fields);
  185. sql.append(" FROM ");
  186. sql.append(tableName);
  187. sql.append(" WHERE ");
  188. sql.append(condition);
  189. String[] strs = fields.split(",");
  190. int length = strs.length;
  191. List<Map<String, Object>> list = jdbcTemplate.queryForList(sql.toString());
  192. Iterator<Map<String, Object>> iter = list.iterator();
  193. Object[] results = new Object[length];
  194. Object value = null;
  195. if (iter.hasNext()) {
  196. Map<String, Object> m = iter.next();
  197. for (int i = 0; i < length; i++) {
  198. value = m.get(strs[i].toUpperCase());
  199. if (value != null && value.getClass().getSimpleName().toUpperCase().equals("TIMESTAMP")) {
  200. Timestamp time = (Timestamp) value;
  201. try {
  202. value = DateUtil.parseDateToString(new Date(time.getTime()), Constant.YMD_HMS);
  203. } catch (Exception e) {
  204. e.printStackTrace();
  205. }
  206. }
  207. results[i] = value;
  208. }
  209. return results;
  210. }
  211. return null;
  212. }
  213. /**
  214. * 多个字段,多条结果
  215. *
  216. * @param tableName
  217. * 对应要查询的表
  218. * @param fields
  219. * 要查询的字段集合
  220. * @param condition
  221. * 查询条件
  222. * @return fields对应的数据
  223. */
  224. public List<Object[]> getFieldsDatasByCondition(String tableName, String[] fields, String condition) {
  225. StringBuffer sql = new StringBuffer("SELECT ");
  226. sql.append(BaseUtil.parseArray2Str(fields, ","));
  227. sql.append(" FROM ");
  228. sql.append(tableName);
  229. sql.append(" WHERE ");
  230. sql.append(condition);
  231. List<Map<String, Object>> list = getJdbcTemplate().queryForList(sql.toString());
  232. Iterator<Map<String, Object>> iter = list.iterator();
  233. List<Object[]> datas = new ArrayList<Object[]>();
  234. Object value = null;
  235. Map<String, Object> m = null;
  236. Object[] results = null;
  237. int length = fields.length;
  238. while (iter.hasNext()) {
  239. results = new Object[length];
  240. m = iter.next();
  241. for (int i = 0; i < length; i++) {
  242. value = m.get(fields[i].toUpperCase());
  243. if (value != null && value.getClass().getSimpleName().toUpperCase().equals("TIMESTAMP")) {
  244. Timestamp time = (Timestamp) value;
  245. try {
  246. value = DateUtil.parseDateToString(new Date(time.getTime()), Constant.YMD_HMS);
  247. } catch (Exception e) {
  248. e.printStackTrace();
  249. }
  250. }
  251. results[i] = value;
  252. }
  253. datas.add(results);
  254. }
  255. return datas;
  256. }
  257. /**
  258. * if resultSet is null return true
  259. */
  260. public boolean checkByCondition(String caller, String condition) {
  261. int count = getCountByCondition(caller, condition);
  262. if (count == 0) {
  263. return true;
  264. }
  265. return false;
  266. }
  267. /**
  268. * if resultSet not null return true
  269. */
  270. public boolean checkIf(String table, String condition) {
  271. int count = getCountByCondition(table, condition);
  272. if (count > 0) {
  273. return true;
  274. }
  275. return false;
  276. }
  277. /**
  278. * 修改操作
  279. *
  280. * @param tableName
  281. * 表
  282. * @param update
  283. * 修改内容
  284. * @param condition
  285. * 条件语句
  286. */
  287. public void updateByCondition(String tableName, String update, String condition) {
  288. StringBuffer sb = new StringBuffer("UPDATE ");
  289. sb.append(tableName);
  290. sb.append(" SET ");
  291. sb.append(update);
  292. sb.append(" WHERE ");
  293. sb.append(condition);
  294. execute(sb.toString());
  295. }
  296. /**
  297. * 调用存储过程 无返回值
  298. *
  299. * @param procedureName
  300. * 存储过程名称
  301. * @param args
  302. * 参数
  303. */
  304. public void procedure(String procedureName, Object[] args) {
  305. StringBuffer sql = new StringBuffer("{call ").append(procedureName).append("(");
  306. for (int i = 0; i < args.length; i++) {
  307. if (i > 0) {
  308. sql.append(",");
  309. }
  310. sql.append("?");
  311. }
  312. sql.append(")}");
  313. jdbcTemplate.update(sql.toString(), args);
  314. }
  315. /**
  316. * 调用存储过程
  317. *
  318. * @param procedureName
  319. * 存储过程名称
  320. * @param args
  321. * 参数
  322. * @return varchar类型结果
  323. */
  324. public List<String> callProcedureWithOut(final String procedureName, final Object[] args, final Integer[] inIndex,
  325. final Integer[] outIndex) {
  326. StringBuffer sql = new StringBuffer("{call " + procedureName + "(");
  327. for (int i = 0; i < inIndex.length + outIndex.length; i++) {
  328. if (sql.toString().contains("?")) {
  329. sql.append(",?");
  330. } else {
  331. sql.append("?");
  332. }
  333. }
  334. sql.append(")}");
  335. List<String> listR = jdbcTemplate.execute(sql.toString(), new CallableStatementCallback<List<String>>() {
  336. @Override
  337. public List<String> doInCallableStatement(CallableStatement cs) throws SQLException, DataAccessException {
  338. for (int i = 0; i < inIndex.length; i++) {
  339. cs.setObject(inIndex[i], args[i]);
  340. }
  341. for (int i = 0; i < outIndex.length; i++) {
  342. cs.registerOutParameter(outIndex[i], java.sql.Types.VARCHAR);
  343. }
  344. cs.execute();
  345. List<String> list = new ArrayList<String>();
  346. for (int i = 0; i < outIndex.length; i++) {
  347. list.add(cs.getString(outIndex[i]));
  348. }
  349. return list;
  350. }
  351. });
  352. return listR;
  353. }
  354. /**
  355. * 调用存储过程
  356. *
  357. * @param procedureName
  358. * 存储过程名称
  359. * @param args
  360. * 参数
  361. * @return varchar类型结果
  362. */
  363. public String callProcedure(final String procedureName, final Object... args) {
  364. try {
  365. return jdbcTemplate.execute(new CallableStatementCreator() {
  366. @Override
  367. public CallableStatement createCallableStatement(Connection conn) throws SQLException {
  368. StringBuffer storedProcName = new StringBuffer("{call ");
  369. int i = 0;
  370. storedProcName.append(procedureName + "(");
  371. for (i = 0; i < args.length; i++) {
  372. if (storedProcName.toString().contains("?")) {
  373. storedProcName.append(",");
  374. }
  375. storedProcName.append("?");
  376. }
  377. if (storedProcName.toString().contains("?")) {
  378. storedProcName.append(",");
  379. }
  380. storedProcName.append("?");
  381. storedProcName.append(")}");
  382. CallableStatement cs = conn.prepareCall(storedProcName.toString());
  383. for (i = 0; i < args.length; i++) {
  384. cs.setObject(i + 1, args[i]);
  385. }
  386. cs.registerOutParameter(args.length + 1, java.sql.Types.VARCHAR);
  387. return cs;
  388. }
  389. }, new CallableStatementCallback<String>() {
  390. @Override
  391. public String doInCallableStatement(CallableStatement cs) throws SQLException, DataAccessException {
  392. cs.execute();
  393. return cs.getString(args.length + 1);
  394. }
  395. });
  396. } catch (Exception e) {
  397. BaseUtil.showError(e.getMessage());
  398. }
  399. return null;
  400. }
  401. /**
  402. * 调用存储过程
  403. *
  404. * @param procedureName
  405. * 存储过程名称
  406. * @param cls
  407. * 返回结果java类型
  408. * @param sqlType
  409. * 返回结果的sql类型
  410. * @param args
  411. * 参数
  412. * @return varchar类型结果
  413. */
  414. public <T> T callbackProcedure(final String procedureName, final Class<T> cls, final int sqlType, final Object... args) {
  415. try {
  416. return jdbcTemplate.execute(new CallableStatementCreator() {
  417. @Override
  418. public CallableStatement createCallableStatement(Connection conn) throws SQLException {
  419. StringBuffer storedProcName = new StringBuffer("{call ");
  420. int i = 0;
  421. storedProcName.append(procedureName + "(");
  422. for (i = 0; i < args.length; i++) {
  423. if (storedProcName.toString().contains("?")) {
  424. storedProcName.append(",");
  425. }
  426. storedProcName.append("?");
  427. }
  428. if (storedProcName.toString().contains("?")) {
  429. storedProcName.append(",");
  430. }
  431. storedProcName.append("?");
  432. storedProcName.append(")}");
  433. CallableStatement cs = conn.prepareCall(storedProcName.toString());
  434. for (i = 0; i < args.length; i++) {
  435. cs.setObject(i + 1, args[i]);
  436. }
  437. cs.registerOutParameter(args.length + 1, sqlType);
  438. return cs;
  439. }
  440. }, new CallableStatementCallback<T>() {
  441. @SuppressWarnings("unchecked")
  442. @Override
  443. public T doInCallableStatement(CallableStatement cs) throws SQLException, DataAccessException {
  444. cs.execute();
  445. // do not use method: getObject(paramInt, paramClass)
  446. return (T) cs.getObject(args.length + 1);
  447. }
  448. });
  449. } catch (Exception e) {
  450. e.printStackTrace();
  451. BaseUtil.showError(e.getMessage());
  452. }
  453. return null;
  454. }
  455. /**
  456. * 查询结果集
  457. *
  458. * @param sql
  459. * 查询语句
  460. */
  461. public SqlRowList queryForRowSet(String sql) {
  462. SqlRowList rs = new SqlRowList();
  463. rs.setResultList(jdbcTemplate.queryForList(sql));
  464. return rs;
  465. }
  466. /**
  467. * @param tableName
  468. * 对应要查询的表
  469. * @param condition
  470. * 查询条件
  471. * @return Count
  472. */
  473. public int getCountByCondition(String tableName, String condition) {
  474. StringBuffer sql = new StringBuffer("SELECT count(1) FROM ");
  475. sql.append(tableName);
  476. sql.append(" WHERE ");
  477. sql.append(condition);
  478. SqlRowList srs = queryForRowSet(sql.toString());
  479. if (srs.next()) {
  480. return srs.getInt(1);
  481. } else {
  482. try {
  483. throw new Exception("Condition:" + condition + " is wrong!");
  484. } catch (Exception e) {
  485. return -1;
  486. }
  487. }
  488. }
  489. public List<JSONObject> getFieldsJSONDatasByCondition(String tableName, String[] fields, String condition) {
  490. StringBuffer sql = new StringBuffer("SELECT ");
  491. sql.append(BaseUtil.parseArray2Str(fields, ","));
  492. sql.append(" FROM ");
  493. sql.append(tableName);
  494. sql.append(" WHERE ");
  495. sql.append(condition);
  496. List<JSONObject> datas = new ArrayList<JSONObject>();
  497. JSONObject obj = null;
  498. Object value = null;
  499. SqlRowList sl = queryForRowSet(sql.toString());
  500. while (sl.next()) {
  501. obj = new JSONObject();
  502. for (int i = 0; i < fields.length; i++) {
  503. value = sl.getObject(i + 1);
  504. if (value != null && "TIMESTAMP".equals(value.getClass().getSimpleName().toUpperCase())) {
  505. Timestamp time = (Timestamp) value;
  506. value = DateUtil.parseDateToString(new Date(time.getTime()), "yyyy-MM-dd HH:mm:ss");
  507. }
  508. obj.put(fields[i], value);
  509. }
  510. datas.add(obj);
  511. }
  512. return datas;
  513. }
  514. }