BaseDao.java 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698
  1. package com.uas.eis.dao;
  2. import java.sql.CallableStatement;
  3. import java.sql.Connection;
  4. import java.sql.SQLException;
  5. import java.sql.Timestamp;
  6. import java.util.ArrayList;
  7. import java.util.Date;
  8. import java.util.Iterator;
  9. import java.util.List;
  10. import java.util.Map;
  11. import com.uas.eis.entity.Configs;
  12. import org.springframework.beans.factory.annotation.Autowired;
  13. import org.springframework.dao.DataAccessException;
  14. import org.springframework.dao.EmptyResultDataAccessException;
  15. import org.springframework.jdbc.core.BeanPropertyRowMapper;
  16. import org.springframework.jdbc.core.CallableStatementCallback;
  17. import org.springframework.jdbc.core.CallableStatementCreator;
  18. import org.springframework.jdbc.core.JdbcTemplate;
  19. import org.springframework.stereotype.Repository;
  20. import com.uas.eis.utils.BaseUtil;
  21. import com.uas.eis.utils.Constant;
  22. import com.uas.eis.utils.DateUtil;
  23. import net.sf.json.JSONObject;
  24. @Repository
  25. public class BaseDao{
  26. static final String CREATE_SEQ = "CREATE SEQUENCE ?" + // 创建序列
  27. " MINVALUE 1 MAXVALUE 99999999999 INCREMENT BY 1 START WITH 3000 CACHE 20 NOORDER NOCYCLE ";
  28. @Autowired
  29. private JdbcTemplate jdbcTemplate;
  30. public JdbcTemplate getJdbcTemplate() {
  31. return jdbcTemplate;
  32. }
  33. public List<Map<String, Object>> queryForList(String sql) {
  34. try {
  35. return jdbcTemplate.queryForList(sql);
  36. } catch (EmptyResultDataAccessException e) {
  37. return null;
  38. }
  39. }
  40. public <T> List<T> queryForList(String sql, Class<T> elementType) {
  41. try {
  42. return jdbcTemplate.queryForList(sql, elementType);
  43. } catch (EmptyResultDataAccessException e) {
  44. return null;
  45. }
  46. }
  47. public List<Map<String, Object>> queryForList(String sql, Object... args) {
  48. try {
  49. return jdbcTemplate.queryForList(sql, args);
  50. } catch (EmptyResultDataAccessException e) {
  51. return null;
  52. }
  53. }
  54. public <T> List<T> queryForList(String sql, Object[] args, Class<T> elementType) {
  55. try {
  56. return jdbcTemplate.queryForList(sql, args, elementType);
  57. } catch (EmptyResultDataAccessException e) {
  58. return null;
  59. }
  60. }
  61. public <T> List<T> queryForList(String sql, Class<T> elementType, Object... args) {
  62. try {
  63. return jdbcTemplate.queryForList(sql, elementType, args);
  64. } catch (EmptyResultDataAccessException e) {
  65. return null;
  66. }
  67. }
  68. public <T> List<T> query(String sql, Object[] args, Class<T> elementType) {
  69. try {
  70. return jdbcTemplate.query(sql, args, new BeanPropertyRowMapper<T>(elementType));
  71. } catch (EmptyResultDataAccessException e) {
  72. return null;
  73. }
  74. }
  75. public <T> List<T> query(String sql, Class<T> elementType) {
  76. try {
  77. return jdbcTemplate.query(sql, new BeanPropertyRowMapper<T>(elementType));
  78. } catch (EmptyResultDataAccessException e) {
  79. return null;
  80. }
  81. }
  82. public <T> List<T> query(String sql, Class<T> elementType, Object... args) {
  83. try {
  84. return jdbcTemplate.query(sql, new BeanPropertyRowMapper<T>(elementType), args);
  85. } catch (EmptyResultDataAccessException e) {
  86. return null;
  87. }
  88. }
  89. public <T> T queryForObject(String sql, Class<T> elementType, Object... args) {
  90. try {
  91. return jdbcTemplate.queryForObject(sql, elementType, args);
  92. } catch (EmptyResultDataAccessException e) {
  93. return null;
  94. }
  95. }
  96. public void execute(String sql) {
  97. jdbcTemplate.execute(sql);
  98. }
  99. public synchronized boolean execute(String sql, Object... objs) {
  100. try {
  101. jdbcTemplate.update(sql, objs);
  102. return true;
  103. } catch (Exception e) {
  104. return false;
  105. }
  106. }
  107. public void execute(List<String> sqls) {
  108. if (sqls.size() > 0) {
  109. StringBuffer sb = new StringBuffer("begin ");
  110. for (String sql : sqls) {
  111. sb.append("execute immediate '").append(sql.replace("'", "''")).append("';");
  112. }
  113. sb.append("end;");
  114. jdbcTemplate.execute(sb.toString());
  115. }
  116. }
  117. /**
  118. * 批量执行Sql
  119. *
  120. * @param sqls
  121. * @param callbackSqls
  122. */
  123. public void batchExecute(List<SqlMap> sqls, List<String> callbackSqls) {
  124. if (sqls.size() > 0) {
  125. StringBuffer sb = new StringBuffer("begin ");
  126. for (SqlMap sql : sqls) {
  127. sb.append("execute immediate '").append(sql.getSql(false).replace("'", "''")).append("';");
  128. }
  129. for (String sql : callbackSqls) {
  130. sb.append("execute immediate '").append(sql.replace("'", "''")).append("';");
  131. }
  132. sb.append("end;");
  133. jdbcTemplate.execute(sb.toString());
  134. }
  135. }
  136. public void deleteById(String tablename, String keyField, long id) {
  137. deleteByCondition(tablename, keyField + "=" + id);
  138. }
  139. public void deleteByCondition(String tablename, String condition, Object... params) {
  140. StringBuffer sb = new StringBuffer();
  141. sb.append("DELETE FROM ");
  142. sb.append(tablename);
  143. sb.append(" WHERE ");
  144. sb.append(condition);
  145. execute(sb.toString(), params);
  146. }
  147. /**
  148. * 一个字段,一条结果
  149. *
  150. * @param tableName
  151. * 对应要查询的表
  152. * @param field
  153. * 要查询的字段
  154. * @param condition
  155. * 查询条件
  156. * @return field对应的数据
  157. */
  158. public Object getFieldDataByCondition(String tableName, String field, String condition) {
  159. StringBuffer sql = new StringBuffer("SELECT ");
  160. sql.append(field);
  161. sql.append(" FROM ");
  162. sql.append(tableName);
  163. sql.append(" WHERE ");
  164. sql.append(condition);
  165. SqlRowList srs = queryForRowSet(sql.toString());
  166. if (srs.next()) {
  167. return srs.getObject(1);
  168. } else {
  169. return null;
  170. }
  171. }
  172. /**
  173. * 一个字段,多条结果
  174. *
  175. * @param tableName
  176. * 对应要查询的表
  177. * @param field
  178. * 要查询的字段
  179. * @param condition
  180. * 查询条件
  181. * @return field对应的数据
  182. */
  183. public List<Object> getFieldDatasByCondition(String tableName, String field, String condition) {
  184. StringBuffer sb = new StringBuffer("SELECT ");
  185. sb.append(field);
  186. sb.append(" FROM ");
  187. sb.append(tableName);
  188. sb.append(((condition == null || "".equals(condition)) ? "" : (" WHERE " + condition)));
  189. SqlRowList srs = queryForRowSet(sb.toString());
  190. List<Object> list = new ArrayList<Object>();
  191. while (srs.next()) {
  192. list.add(srs.getObject(1));
  193. }
  194. return list;
  195. }
  196. /**
  197. * 多个字段,<=1条结果
  198. *
  199. * @param tableName
  200. * 对应要查询的表
  201. * @param fields
  202. * 要查询的字段,用逗号隔开
  203. * @param condition
  204. * 查询条件
  205. * @return fields对应的数据
  206. */
  207. public Object[] getFieldsDataByCondition(String tableName, String fields, String condition) {
  208. StringBuffer sql = new StringBuffer("SELECT ");
  209. sql.append(fields);
  210. sql.append(" FROM ");
  211. sql.append(tableName);
  212. sql.append(" WHERE ");
  213. sql.append(condition);
  214. String[] strs = fields.split(",");
  215. int length = strs.length;
  216. List<Map<String, Object>> list = jdbcTemplate.queryForList(sql.toString());
  217. Iterator<Map<String, Object>> iter = list.iterator();
  218. Object[] results = new Object[length];
  219. Object value = null;
  220. if (iter.hasNext()) {
  221. Map<String, Object> m = iter.next();
  222. for (int i = 0; i < length; i++) {
  223. value = m.get(strs[i].toUpperCase());
  224. if (value != null && value.getClass().getSimpleName().toUpperCase().equals("TIMESTAMP")) {
  225. Timestamp time = (Timestamp) value;
  226. try {
  227. value = DateUtil.parseDateToString(new Date(time.getTime()), Constant.YMD_HMS);
  228. } catch (Exception e) {
  229. e.printStackTrace();
  230. }
  231. }
  232. results[i] = value;
  233. }
  234. return results;
  235. }
  236. return null;
  237. }
  238. /**
  239. * 多个字段,多条结果
  240. *
  241. * @param tableName
  242. * 对应要查询的表
  243. * @param fields
  244. * 要查询的字段集合
  245. * @param condition
  246. * 查询条件
  247. * @return fields对应的数据
  248. */
  249. public List<Object[]> getFieldsDatasByCondition(String tableName, String[] fields, String condition) {
  250. StringBuffer sql = new StringBuffer("SELECT ");
  251. sql.append(BaseUtil.parseArray2Str(fields, ","));
  252. sql.append(" FROM ");
  253. sql.append(tableName);
  254. sql.append(" WHERE ");
  255. sql.append(condition);
  256. List<Map<String, Object>> list = getJdbcTemplate().queryForList(sql.toString());
  257. Iterator<Map<String, Object>> iter = list.iterator();
  258. List<Object[]> datas = new ArrayList<Object[]>();
  259. Object value = null;
  260. Map<String, Object> m = null;
  261. Object[] results = null;
  262. int length = fields.length;
  263. while (iter.hasNext()) {
  264. results = new Object[length];
  265. m = iter.next();
  266. for (int i = 0; i < length; i++) {
  267. value = m.get(fields[i].toUpperCase());
  268. if (value != null && value.getClass().getSimpleName().toUpperCase().equals("TIMESTAMP")) {
  269. Timestamp time = (Timestamp) value;
  270. try {
  271. value = DateUtil.parseDateToString(new Date(time.getTime()), Constant.YMD_HMS);
  272. } catch (Exception e) {
  273. e.printStackTrace();
  274. }
  275. }
  276. results[i] = value;
  277. }
  278. datas.add(results);
  279. }
  280. return datas;
  281. }
  282. /**
  283. * if resultSet is null return true
  284. */
  285. public boolean checkByCondition(String caller, String condition) {
  286. int count = getCountByCondition(caller, condition);
  287. if (count == 0) {
  288. return true;
  289. }
  290. return false;
  291. }
  292. /**
  293. * if resultSet not null return true
  294. */
  295. public boolean checkIf(String table, String condition) {
  296. int count = getCountByCondition(table, condition);
  297. if (count > 0) {
  298. return true;
  299. }
  300. return false;
  301. }
  302. /**
  303. * 修改操作
  304. *
  305. * @param tableName
  306. * 表
  307. * @param update
  308. * 修改内容
  309. * @param condition
  310. * 条件语句
  311. */
  312. public void updateByCondition(String tableName, String update, String condition) {
  313. StringBuffer sb = new StringBuffer("UPDATE ");
  314. sb.append(tableName);
  315. sb.append(" SET ");
  316. sb.append(update);
  317. sb.append(" WHERE ");
  318. sb.append(condition);
  319. execute(sb.toString());
  320. }
  321. /**
  322. * 调用存储过程 无返回值
  323. *
  324. * @param procedureName
  325. * 存储过程名称
  326. * @param args
  327. * 参数
  328. */
  329. public void procedure(String procedureName, Object[] args) {
  330. StringBuffer sql = new StringBuffer("{call ").append(procedureName).append("(");
  331. for (int i = 0; i < args.length; i++) {
  332. if (i > 0) {
  333. sql.append(",");
  334. }
  335. sql.append("?");
  336. }
  337. sql.append(")}");
  338. jdbcTemplate.update(sql.toString(), args);
  339. }
  340. /**
  341. * 调用存储过程
  342. *
  343. * @param procedureName
  344. * 存储过程名称
  345. * @param args
  346. * 参数
  347. * @return varchar类型结果
  348. */
  349. public List<String> callProcedureWithOut(final String procedureName, final Object[] args, final Integer[] inIndex,
  350. final Integer[] outIndex) {
  351. StringBuffer sql = new StringBuffer("{call " + procedureName + "(");
  352. for (int i = 0; i < inIndex.length + outIndex.length; i++) {
  353. if (sql.toString().contains("?")) {
  354. sql.append(",?");
  355. } else {
  356. sql.append("?");
  357. }
  358. }
  359. sql.append(")}");
  360. List<String> listR = jdbcTemplate.execute(sql.toString(), new CallableStatementCallback<List<String>>() {
  361. @Override
  362. public List<String> doInCallableStatement(CallableStatement cs) throws SQLException, DataAccessException {
  363. for (int i = 0; i < inIndex.length; i++) {
  364. cs.setObject(inIndex[i], args[i]);
  365. }
  366. for (int i = 0; i < outIndex.length; i++) {
  367. cs.registerOutParameter(outIndex[i], java.sql.Types.VARCHAR);
  368. }
  369. cs.execute();
  370. List<String> list = new ArrayList<String>();
  371. for (int i = 0; i < outIndex.length; i++) {
  372. list.add(cs.getString(outIndex[i]));
  373. }
  374. return list;
  375. }
  376. });
  377. return listR;
  378. }
  379. /**
  380. * 调用存储过程
  381. *
  382. * @param procedureName
  383. * 存储过程名称
  384. * @param args
  385. * 参数
  386. * @return varchar类型结果
  387. */
  388. public String callProcedure(final String procedureName, final Object... args) {
  389. try {
  390. return jdbcTemplate.execute(new CallableStatementCreator() {
  391. @Override
  392. public CallableStatement createCallableStatement(Connection conn) throws SQLException {
  393. StringBuffer storedProcName = new StringBuffer("{call ");
  394. int i = 0;
  395. storedProcName.append(procedureName + "(");
  396. for (i = 0; i < args.length; i++) {
  397. if (storedProcName.toString().contains("?")) {
  398. storedProcName.append(",");
  399. }
  400. storedProcName.append("?");
  401. }
  402. if (storedProcName.toString().contains("?")) {
  403. storedProcName.append(",");
  404. }
  405. storedProcName.append("?");
  406. storedProcName.append(")}");
  407. CallableStatement cs = conn.prepareCall(storedProcName.toString());
  408. for (i = 0; i < args.length; i++) {
  409. cs.setObject(i + 1, args[i]);
  410. }
  411. cs.registerOutParameter(args.length + 1, java.sql.Types.VARCHAR);
  412. return cs;
  413. }
  414. }, new CallableStatementCallback<String>() {
  415. @Override
  416. public String doInCallableStatement(CallableStatement cs) throws SQLException, DataAccessException {
  417. cs.execute();
  418. return cs.getString(args.length + 1);
  419. }
  420. });
  421. } catch (Exception e) {
  422. BaseUtil.showError(e.getMessage());
  423. }
  424. return null;
  425. }
  426. /**
  427. * 调用存储过程
  428. *
  429. * @param procedureName
  430. * 存储过程名称
  431. * @param cls
  432. * 返回结果java类型
  433. * @param sqlType
  434. * 返回结果的sql类型
  435. * @param args
  436. * 参数
  437. * @return varchar类型结果
  438. */
  439. public <T> T callbackProcedure(final String procedureName, final Class<T> cls, final int sqlType, final Object... args) {
  440. try {
  441. return jdbcTemplate.execute(new CallableStatementCreator() {
  442. @Override
  443. public CallableStatement createCallableStatement(Connection conn) throws SQLException {
  444. StringBuffer storedProcName = new StringBuffer("{call ");
  445. int i = 0;
  446. storedProcName.append(procedureName + "(");
  447. for (i = 0; i < args.length; i++) {
  448. if (storedProcName.toString().contains("?")) {
  449. storedProcName.append(",");
  450. }
  451. storedProcName.append("?");
  452. }
  453. if (storedProcName.toString().contains("?")) {
  454. storedProcName.append(",");
  455. }
  456. storedProcName.append("?");
  457. storedProcName.append(")}");
  458. CallableStatement cs = conn.prepareCall(storedProcName.toString());
  459. for (i = 0; i < args.length; i++) {
  460. cs.setObject(i + 1, args[i]);
  461. }
  462. cs.registerOutParameter(args.length + 1, sqlType);
  463. return cs;
  464. }
  465. }, new CallableStatementCallback<T>() {
  466. @SuppressWarnings("unchecked")
  467. @Override
  468. public T doInCallableStatement(CallableStatement cs) throws SQLException, DataAccessException {
  469. cs.execute();
  470. // do not use method: getObject(paramInt, paramClass)
  471. return (T) cs.getObject(args.length + 1);
  472. }
  473. });
  474. } catch (Exception e) {
  475. e.printStackTrace();
  476. BaseUtil.showError(e.getMessage());
  477. }
  478. return null;
  479. }
  480. /**
  481. * 查询结果集
  482. *
  483. * @param sql
  484. * 查询语句
  485. */
  486. public SqlRowList queryForRowSet(String sql) {
  487. SqlRowList rs = new SqlRowList();
  488. rs.setResultList(jdbcTemplate.queryForList(sql));
  489. return rs;
  490. }
  491. /**
  492. * 查询结果集
  493. *
  494. * @param sql
  495. * 查询语句
  496. * @param arg
  497. * 参数
  498. */
  499. public SqlRowList queryForRowSet(String sql, Object arg) {
  500. SqlRowList rs = new SqlRowList();
  501. rs.setResultList(getJdbcTemplate().queryForList(sql, arg));
  502. return rs;
  503. }
  504. /**
  505. * @param tableName
  506. * 对应要查询的表
  507. * @param condition
  508. * 查询条件
  509. * @return Count
  510. */
  511. public int getCountByCondition(String tableName, String condition) {
  512. StringBuffer sql = new StringBuffer("SELECT count(1) FROM ");
  513. sql.append(tableName);
  514. sql.append(" WHERE ");
  515. sql.append(condition);
  516. SqlRowList srs = queryForRowSet(sql.toString());
  517. if (srs.next()) {
  518. return srs.getInt(1);
  519. } else {
  520. try {
  521. throw new Exception("Condition:" + condition + " is wrong!");
  522. } catch (Exception e) {
  523. return -1;
  524. }
  525. }
  526. }
  527. public List<JSONObject> getFieldsJSONDatasByCondition(String tableName, String[] fields, String condition) {
  528. StringBuffer sql = new StringBuffer("SELECT ");
  529. sql.append(BaseUtil.parseArray2Str(fields, ","));
  530. sql.append(" FROM ");
  531. sql.append(tableName);
  532. sql.append(" WHERE ");
  533. sql.append(condition);
  534. List<JSONObject> datas = new ArrayList<JSONObject>();
  535. JSONObject obj = null;
  536. Object value = null;
  537. SqlRowList sl = queryForRowSet(sql.toString());
  538. while (sl.next()) {
  539. obj = new JSONObject();
  540. for (int i = 0; i < fields.length; i++) {
  541. value = sl.getObject(i + 1);
  542. if (value != null && "TIMESTAMP".equals(value.getClass().getSimpleName().toUpperCase())) {
  543. Timestamp time = (Timestamp) value;
  544. value = DateUtil.parseDateToString(new Date(time.getTime()), "yyyy-MM-dd HH:mm:ss");
  545. }
  546. obj.put(fields[i], value);
  547. }
  548. datas.add(obj);
  549. }
  550. return datas;
  551. }
  552. /**
  553. * 获取序列号
  554. *
  555. * @param seq
  556. * 指定的序列名
  557. */
  558. public int getSeqId(String seq) {
  559. try {
  560. String sql = "select " + seq + ".nextval from dual";
  561. SqlRowList rs = queryForRowSet(sql);
  562. if (rs.next()) {
  563. return rs.getInt(1);
  564. } else {// 如果不存在就创建序列
  565. int count = getCountByCondition("user_sequences", "Sequence_Name='" + seq.toUpperCase() + "'");
  566. if (count == 0)
  567. getJdbcTemplate().execute(CREATE_SEQ.replace("?", seq));
  568. return getSeqId(seq);
  569. }
  570. } catch (Exception e) {
  571. int count = getCountByCondition("user_sequences", "Sequence_Name='" + seq.toUpperCase() + "'");
  572. if (count == 0)
  573. getJdbcTemplate().execute(CREATE_SEQ.replace("?", seq));
  574. return getSeqId(seq);
  575. }
  576. }
  577. /**
  578. * 获取编号序列
  579. *
  580. * @param myTable
  581. * Caller
  582. * @param thisType
  583. * 2
  584. */
  585. public synchronized String sGetMaxNumber(String myTable, int thisType) {
  586. return callProcedure("Sp_GetMaxNumber", new Object[] { myTable, thisType });
  587. }
  588. /**
  589. * 一个字段,一条结果
  590. *
  591. * @param tableName
  592. * 对应要查询的表
  593. * @param field
  594. * 要查询的字段
  595. * @param condition
  596. * 查询条件
  597. * @return field对应的数据
  598. */
  599. public <T> T getFieldValue(String tableName, String field, String condition, Class<T> requiredType) {
  600. StringBuffer sql = new StringBuffer("SELECT ");
  601. sql.append(field);
  602. sql.append(" FROM ");
  603. sql.append(tableName);
  604. sql.append(" WHERE ");
  605. sql.append(condition);
  606. SqlRowList srs = queryForRowSet(sql.toString());
  607. if (srs.next()) {
  608. RowConvert<T> convert = new RowConvert<T>(requiredType);
  609. return convert.convert(srs.getObject(1));
  610. } else {
  611. return null;
  612. }
  613. }
  614. /**
  615. * 判断指定参数是否配置为“是”
  616. *
  617. * @param caller
  618. * @param code
  619. * 参数编号
  620. */
  621. public boolean isDBSetting(String caller, String code) {
  622. int count = getCount("select count(1) from configs where caller='" + caller + "' and code='" + code + "'");
  623. if (count==0){
  624. return false;
  625. }
  626. Configs configs = jdbcTemplate.queryForObject("select * from configs where caller=? and code=?",
  627. new BeanPropertyRowMapper<Configs>(Configs.class), caller, code);
  628. if (configs != null) {
  629. String data = configs.getData();
  630. if ("YN".equals(configs.getData_type())) {
  631. return String.valueOf(Constant.YES).equals(data);
  632. }
  633. return data == null ? false : true;
  634. }
  635. return false;
  636. }
  637. public int getCount(String sql) {
  638. SqlRowList rs = queryForRowSet(sql);
  639. if (rs.next()) {
  640. return rs.getInt(1);
  641. }
  642. return 0;
  643. }
  644. }