`
252190908
  • 浏览: 228940 次
文章分类
社区版块
存档分类
最新评论

dbutils通用类,dbutils分页查询

 
阅读更多

dbutils通用类,dbutils分页查询,第一部分是公共类,封装好了操作数据库的方法。第二部分是分页的bean。

 

第一部分:

Java代码 复制代码 收藏代码
  1. publicclass DBUtilsTemplate {
  2. private DataSource dataSource;
  3. private QueryRunner queryRunner;
  4. privatestaticfinal Log LOG = LogFactory.getLog(DBUtilsTemplate.class);
  5. public DBUtilsTemplate(DataSource dataSources) {
  6. this();
  7. }
  8. public DBUtilsTemplate() {
  9. dataSource = MyDataSource.getdataSource();
  10. }
  11. /**
  12. *
  13. * @param sql
  14. * 插入sql语句
  15. * @param params
  16. * 插入参数
  17. * @return 返回影响行数
  18. */
  19. publicint insert(String sql, Object[] params) {
  20. queryRunner = new QueryRunner(dataSource);
  21. int affectedRows = 0;
  22. try {
  23. if (params == null) {
  24. affectedRows = queryRunner.update(sql);
  25. } else {
  26. affectedRows = queryRunner.update(sql, params);
  27. }
  28. } catch (SQLException e) {
  29. e.printStackTrace();
  30. LOG.error("insert.插入记录错误:" + sql, e);
  31. }
  32. return affectedRows;
  33. }
  34. /**
  35. * 插入数据库,返回自动增长的主键
  36. *
  37. * @param sql -
  38. * 执行的sql语句
  39. * @return 主键 注意;此方法没关闭资源
  40. */
  41. publicint insertForKeys(String sql, Object[] params) {
  42. int key = 0;
  43. Connection conn = null;
  44. PreparedStatement stmt = null;
  45. ResultSet rs = null;
  46. try {
  47. conn = dataSource.getConnection();
  48. stmt = conn.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);
  49. ParameterMetaData pmd = stmt.getParameterMetaData();
  50. if (params.length < pmd.getParameterCount()) {
  51. thrownew SQLException("参数错误:" + pmd.getParameterCount());
  52. }
  53. for (int i = 0; i < params.length; i++) {
  54. stmt.setObject(i + 1, params[i]);
  55. }
  56. stmt.executeUpdate();
  57. rs = stmt.getGeneratedKeys();
  58. if (rs.next()) {
  59. key = rs.getInt(1);
  60. }
  61. } catch (SQLException e) {
  62. e.printStackTrace();
  63. LOG.error("insertForKey.插入返回主键错误:" + sql, e);
  64. } finally {
  65. if (rs != null) { // 关闭记录集
  66. try {
  67. rs.close();
  68. } catch (SQLException e) {
  69. e.printStackTrace();
  70. }
  71. }
  72. if (stmt != null) { // 关闭声明
  73. try {
  74. stmt.close();
  75. } catch (SQLException e) {
  76. e.printStackTrace();
  77. }
  78. }
  79. if (conn != null) { // 关闭连接对象
  80. try {
  81. conn.close();
  82. } catch (SQLException e) {
  83. e.printStackTrace();
  84. }
  85. }
  86. }
  87. return key;
  88. }
  89. private ScalarHandler scalarHandler = new ScalarHandler() {
  90. @Override
  91. public Object handle(ResultSet rs) throws SQLException {
  92. Object obj = super.handle(rs);
  93. if (obj instanceof BigInteger)
  94. return ((BigInteger) obj).longValue();
  95. return obj;
  96. }
  97. };
  98. publiclong count(String sql, Object... params) {
  99. Number num = 0;
  100. try {
  101. queryRunner = new QueryRunner(dataSource);
  102. if (params == null) {
  103. num = (Number) queryRunner.query(sql, scalarHandler);
  104. } else {
  105. num = (Number) queryRunner.query(sql, scalarHandler, params);
  106. }
  107. } catch (SQLException e) {
  108. e.printStackTrace();
  109. LOG.error("count.统计数量错误" + sql, e);
  110. }
  111. return (num != null) ? num.longValue() : -1;
  112. }
  113. /**
  114. * 执行sql语句
  115. *
  116. * @param sql
  117. * sql语句
  118. * @return 受影响的行数
  119. */
  120. publicint update(String sql) {
  121. return update(sql, null);
  122. }
  123. /**
  124. * 单条修改记录
  125. *
  126. * @param sql
  127. * sql语句
  128. * @param param
  129. * 参数
  130. * @return 受影响的行数
  131. */
  132. publicint update(String sql, Object param) {
  133. return update(sql, new Object[] { param });
  134. }
  135. /**
  136. * 单条修改记录
  137. *
  138. * @param sql
  139. * sql语句
  140. * @param params
  141. * 参数数组
  142. * @return 受影响的行数
  143. */
  144. publicint update(String sql, Object[] params) {
  145. queryRunner = new QueryRunner(dataSource);
  146. int affectedRows = 0;
  147. try {
  148. if (params == null) {
  149. affectedRows = queryRunner.update(sql);
  150. } else {
  151. affectedRows = queryRunner.update(sql, params);
  152. }
  153. } catch (SQLException e) {
  154. e.printStackTrace();
  155. LOG.error("update.单条修改记录错误:" + sql, e);
  156. }
  157. return affectedRows;
  158. }
  159. /**
  160. * 批量修改记录
  161. *
  162. * @param sql
  163. * sql语句
  164. * @param params
  165. * 二维参数数组
  166. * @return 受影响的行数的数组
  167. */
  168. publicint[] batchUpdate(String sql, Object[][] params) {
  169. queryRunner = new QueryRunner(dataSource);
  170. int[] affectedRows = newint[0];
  171. try {
  172. affectedRows = queryRunner.batch(sql, params);
  173. } catch (SQLException e) {
  174. e.printStackTrace();
  175. LOG.error("update.批量修改记录错误:" + sql, e);
  176. }
  177. return affectedRows;
  178. }
  179. /**
  180. * 执行查询,将每行的结果保存到一个Map对象中,然后将所有Map对象保存到List中
  181. *
  182. * @param sql
  183. * sql语句
  184. * @return 查询结果
  185. */
  186. public List<Map<String, Object>> find(String sql) {
  187. return find(sql, null);
  188. }
  189. /**
  190. * 执行查询,将每行的结果保存到一个Map对象中,然后将所有Map对象保存到List中
  191. *
  192. * @param sql
  193. * sql语句
  194. * @param param
  195. * 参数
  196. * @return 查询结果
  197. */
  198. public List<Map<String, Object>> find(String sql, Object param) {
  199. return find(sql, new Object[] { param });
  200. }
  201. /**
  202. * 执行查询,将每行的结果保存到一个Map对象中,然后将所有Map对象保存到List中
  203. *
  204. * @param sql
  205. * sql语句
  206. * @param params
  207. * 参数数组
  208. * @return 查询结果
  209. */
  210. @SuppressWarnings("unchecked")
  211. public List<Map<String, Object>> findPage(String sql, int page, int count, Object... params) {
  212. sql = sql + " LIMIT ?,?";
  213. queryRunner = new QueryRunner(dataSource);
  214. List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
  215. try {
  216. if (params == null) {
  217. list = (List<Map<String, Object>>) queryRunner.query(sql, new MapListHandler(), new Integer[] { page,
  218. count });
  219. } else {
  220. list = (List<Map<String, Object>>) queryRunner.query(sql, new MapListHandler(), ArrayUtils.addAll(
  221. params, new Integer[] { page, count }));
  222. }
  223. } catch (SQLException e) {
  224. e.printStackTrace();
  225. LOG.error("map 数据分页查询错误", e);
  226. }
  227. return list;
  228. }
  229. /**
  230. * 执行查询,将每行的结果保存到一个Map对象中,然后将所有Map对象保存到List中
  231. *
  232. * @param sql
  233. * sql语句
  234. * @param params
  235. * 参数数组
  236. * @return 查询结果
  237. */
  238. @SuppressWarnings("unchecked")
  239. public List<Map<String, Object>> find(String sql, Object[] params) {
  240. queryRunner = new QueryRunner(dataSource);
  241. List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
  242. try {
  243. if (params == null) {
  244. list = (List<Map<String, Object>>) queryRunner.query(sql, new MapListHandler());
  245. } else {
  246. list = (List<Map<String, Object>>) queryRunner.query(sql, new MapListHandler(), params);
  247. }
  248. } catch (SQLException e) {
  249. e.printStackTrace();
  250. LOG.error("map 数据查询错误", e);
  251. }
  252. return list;
  253. }
  254. /**
  255. * 执行查询,将每行的结果保存到Bean中,然后将所有Bean保存到List中
  256. *
  257. * @param entityClass
  258. * 类名
  259. * @param sql
  260. * sql语句
  261. * @return 查询结果
  262. */
  263. public <T> List<T> find(Class<T> entityClass, String sql) {
  264. return find(entityClass, sql, null);
  265. }
  266. /**
  267. * 执行查询,将每行的结果保存到Bean中,然后将所有Bean保存到List中
  268. *
  269. * @param entityClass
  270. * 类名
  271. * @param sql
  272. * sql语句
  273. * @param param
  274. * 参数
  275. * @return 查询结果
  276. */
  277. public <T> List<T> find(Class<T> entityClass, String sql, Object param) {
  278. return find(entityClass, sql, new Object[] { param });
  279. }
  280. /**
  281. * 执行查询,将每行的结果保存到Bean中,然后将所有Bean保存到List中
  282. *
  283. * @param entityClass
  284. * 类名
  285. * @param sql
  286. * sql语句
  287. * @param params
  288. * 参数数组
  289. * @return 查询结果
  290. */
  291. @SuppressWarnings("unchecked")
  292. public <T> List<T> find(Class<T> entityClass, String sql, Object[] params) {
  293. queryRunner = new QueryRunner(dataSource);
  294. List<T> list = new ArrayList<T>();
  295. try {
  296. if (params == null) {
  297. list = (List<T>) queryRunner.query(sql, new BeanListHandler(entityClass));
  298. } else {
  299. list = (List<T>) queryRunner.query(sql, new BeanListHandler(entityClass), params);
  300. }
  301. } catch (SQLException e) {
  302. e.printStackTrace();
  303. LOG.error("Error occured while attempting to query data", e);
  304. }
  305. return list;
  306. }
  307. /**
  308. * 查询出结果集中的第一条记录,并封装成对象
  309. *
  310. * @param entityClass
  311. * 类名
  312. * @param sql
  313. * sql语句
  314. * @return 对象
  315. */
  316. public <T> T findFirst(Class<T> entityClass, String sql) {
  317. return findFirst(entityClass, sql, null);
  318. }
  319. /**
  320. * 查询出结果集中的第一条记录,并封装成对象
  321. *
  322. * @param entityClass
  323. * 类名
  324. * @param sql
  325. * sql语句
  326. * @param param
  327. * 参数
  328. * @return 对象
  329. */
  330. public <T> T findFirst(Class<T> entityClass, String sql, Object param) {
  331. return findFirst(entityClass, sql, new Object[] { param });
  332. }
  333. /**
  334. * 查询出结果集中的第一条记录,并封装成对象
  335. *
  336. * @param entityClass
  337. * 类名
  338. * @param sql
  339. * sql语句
  340. * @param params
  341. * 参数数组
  342. * @return 对象
  343. */
  344. @SuppressWarnings("unchecked")
  345. public <T> T findFirst(Class<T> entityClass, String sql, Object[] params) {
  346. queryRunner = new QueryRunner(dataSource);
  347. Object object = null;
  348. try {
  349. if (params == null) {
  350. object = queryRunner.query(sql, new BeanHandler(entityClass));
  351. } else {
  352. object = queryRunner.query(sql, new BeanHandler(entityClass), params);
  353. }
  354. } catch (SQLException e) {
  355. LOG.error("返回一条记录错误:findFirst" + e.getMessage());
  356. e.printStackTrace();
  357. }
  358. return (T) object;
  359. }
  360. /**
  361. * 查询出结果集中的第一条记录,并封装成Map对象
  362. *
  363. * @param sql
  364. * sql语句
  365. * @return 封装为Map的对象
  366. */
  367. public Map<String, Object> findFirst(String sql) {
  368. return findFirst(sql, null);
  369. }
  370. /**
  371. * 查询出结果集中的第一条记录,并封装成Map对象
  372. *
  373. * @param sql
  374. * sql语句
  375. * @param param
  376. * 参数
  377. * @return 封装为Map的对象
  378. */
  379. public Map<String, Object> findFirst(String sql, Object param) {
  380. return findFirst(sql, new Object[] { param });
  381. }
  382. /**
  383. * 查询出结果集中的第一条记录,并封装成Map对象
  384. *
  385. * @param sql
  386. * sql语句
  387. * @param params
  388. * 参数数组
  389. * @return 封装为Map的对象
  390. */
  391. @SuppressWarnings("unchecked")
  392. public Map<String, Object> findFirst(String sql, Object[] params) {
  393. queryRunner = new QueryRunner(dataSource);
  394. Map<String, Object> map = null;
  395. try {
  396. if (params == null) {
  397. map = (Map<String, Object>) queryRunner.query(sql, new MapHandler());
  398. } else {
  399. map = (Map<String, Object>) queryRunner.query(sql, new MapHandler(), params);
  400. }
  401. } catch (SQLException e) {
  402. e.printStackTrace();
  403. LOG.error("findFirst.查询一条记录错误" + sql, e);
  404. }
  405. return map;
  406. }
  407. /**
  408. * 查询某一条记录,并将指定列的数据转换为Object
  409. *
  410. * @param sql
  411. * sql语句
  412. * @param columnName
  413. * 列名
  414. * @return 结果对象
  415. */
  416. public Object findBy(String sql, String params) {
  417. return findBy(sql, params, null);
  418. }
  419. /**
  420. * 查询某一条记录,并将指定列的数据转换为Object
  421. *
  422. * @param sql
  423. * sql语句
  424. * @param columnName
  425. * 列名
  426. * @param param
  427. * 参数
  428. * @return 结果对象
  429. */
  430. public Object findBy(String sql, String columnName, Object param) {
  431. return findBy(sql, columnName, new Object[] { param });
  432. }
  433. /**
  434. * 查询某一条记录,并将指定列的数据转换为Object
  435. *
  436. * @param sql
  437. * sql语句
  438. * @param columnName
  439. * 列名
  440. * @param params
  441. * 参数数组
  442. * @return 结果对象
  443. */
  444. public Object findBy(String sql, String columnName, Object[] params) {
  445. queryRunner = new QueryRunner(dataSource);
  446. Object object = null;
  447. try {
  448. if (params == null) {
  449. object = queryRunner.query(sql, new ScalarHandler(columnName));
  450. } else {
  451. object = queryRunner.query(sql, new ScalarHandler(columnName), params);
  452. }
  453. } catch (SQLException e) {
  454. e.printStackTrace();
  455. LOG.error("findBy。错误" + sql, e);
  456. }
  457. return object;
  458. }
  459. /**
  460. * 查询某一条记录,并将指定列的数据转换为Object
  461. *
  462. * @param sql
  463. * sql语句
  464. * @param columnIndex
  465. * 列索引
  466. * @return 结果对象
  467. */
  468. public Object findBy(String sql, int columnIndex) {
  469. return findBy(sql, columnIndex, null);
  470. }
  471. /**
  472. * 查询某一条记录,并将指定列的数据转换为Object
  473. *
  474. * @param sql
  475. * sql语句
  476. * @param columnIndex
  477. * 列索引
  478. * @param param
  479. * 参数
  480. * @return 结果对象
  481. */
  482. public Object findBy(String sql, int columnIndex, Object param) {
  483. return findBy(sql, columnIndex, new Object[] { param });
  484. }
  485. /**
  486. * 查询某一条记录,并将指定列的数据转换为Object
  487. *
  488. * @param sql
  489. * sql语句
  490. * @param columnIndex
  491. * 列索引
  492. * @param params
  493. * 参数数组
  494. * @return 结果对象
  495. */
  496. public Object findBy(String sql, int columnIndex, Object[] params) {
  497. queryRunner = new QueryRunner(dataSource);
  498. Object object = null;
  499. try {
  500. if (params == null) {
  501. object = queryRunner.query(sql, new ScalarHandler(columnIndex));
  502. } else {
  503. object = queryRunner.query(sql, new ScalarHandler(columnIndex), params);
  504. }
  505. } catch (SQLException e) {
  506. e.printStackTrace();
  507. LOG.error("findBy.错误" + sql, e);
  508. }
  509. return object;
  510. }
  511. /**
  512. *
  513. * @param <T>分页查询
  514. * @param beanClass
  515. * @param sql
  516. * @param page
  517. * @param count
  518. * @param params
  519. * @return
  520. */
  521. public <T> List<T> findPage(Class<T> beanClass, String sql, int page, int pageSize, Object... params) {
  522. if (page <= 1) {
  523. page = 0;
  524. }
  525. return query(beanClass, sql + " LIMIT ?,?", ArrayUtils.addAll(params, new Integer[] { page, pageSize }));
  526. }
  527. public <T> List<T> query(Class<T> beanClass, String sql, Object... params) {
  528. try {
  529. queryRunner = new QueryRunner(dataSource);
  530. return (List<T>) queryRunner.query(sql, isPrimitive(beanClass) ? columnListHandler : new BeanListHandler(
  531. beanClass), params);
  532. } catch (SQLException e) {
  533. e.printStackTrace();
  534. }
  535. returnnull;
  536. }
  537. private List<Class<?>> PrimitiveClasses = new ArrayList<Class<?>>() {
  538. {
  539. add(Long.class);
  540. add(Integer.class);
  541. add(String.class);
  542. add(java.util.Date.class);
  543. add(java.sql.Date.class);
  544. add(java.sql.Timestamp.class);
  545. }
  546. };
  547. // 返回单一列时用到的handler
  548. privatefinalstatic ColumnListHandler columnListHandler = new ColumnListHandler() {
  549. @Override
  550. protected Object handleRow(ResultSet rs) throws SQLException {
  551. Object obj = super.handleRow(rs);
  552. if (obj instanceof BigInteger)
  553. return ((BigInteger) obj).longValue();
  554. return obj;
  555. }
  556. };
  557. // 判断是否为原始类型
  558. privateboolean isPrimitive(Class<?> cls) {
  559. return cls.isPrimitive() || PrimitiveClasses.contains(cls);
  560. }
  561. // map
  562. }
public class DBUtilsTemplate {

	private DataSource dataSource;
	private QueryRunner queryRunner;
	private static final Log LOG = LogFactory.getLog(DBUtilsTemplate.class);

	public DBUtilsTemplate(DataSource dataSources) {
		this();
	}

	public DBUtilsTemplate() {
		dataSource = MyDataSource.getdataSource();
	}

	/**
	 * 
	 * @param sql
	 *            插入sql语句
	 * @param params
	 *            插入参数
	 * @return 返回影响行数
	 */
	public int insert(String sql, Object[] params) {
		queryRunner = new QueryRunner(dataSource);
		int affectedRows = 0;
		try {
			if (params == null) {
				affectedRows = queryRunner.update(sql);
			} else {
				affectedRows = queryRunner.update(sql, params);
			}
		} catch (SQLException e) {
			e.printStackTrace();
			LOG.error("insert.插入记录错误:" + sql, e);
		}
		return affectedRows;
	}

	/**
	 * 插入数据库,返回自动增长的主键
	 * 
	 * @param sql -
	 *            执行的sql语句
	 * @return 主键 注意;此方法没关闭资源
	 */
	public int insertForKeys(String sql, Object[] params) {
		int key = 0;
		Connection conn = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			conn = dataSource.getConnection();
			stmt = conn.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);
			ParameterMetaData pmd = stmt.getParameterMetaData();
			if (params.length < pmd.getParameterCount()) {
				throw new SQLException("参数错误:" + pmd.getParameterCount());
			}
			for (int i = 0; i < params.length; i++) {
				stmt.setObject(i + 1, params[i]);
			}
			stmt.executeUpdate();
			rs = stmt.getGeneratedKeys();
			if (rs.next()) {
				key = rs.getInt(1);
			}
		} catch (SQLException e) {
			e.printStackTrace();
			LOG.error("insertForKey.插入返回主键错误:" + sql, e);
		} finally {
			if (rs != null) { // 关闭记录集
				try {
					rs.close();
				} catch (SQLException e) {
					e.printStackTrace();
				}
			}
			if (stmt != null) { // 关闭声明
				try {
					stmt.close();
				} catch (SQLException e) {
					e.printStackTrace();
				}
			}
			if (conn != null) { // 关闭连接对象
				try {
					conn.close();
				} catch (SQLException e) {
					e.printStackTrace();
				}
			}
		}
		return key;
	}

	private ScalarHandler scalarHandler = new ScalarHandler() {
		@Override
		public Object handle(ResultSet rs) throws SQLException {
			Object obj = super.handle(rs);
			if (obj instanceof BigInteger)
				return ((BigInteger) obj).longValue();
			return obj;
		}
	};

	public long count(String sql, Object... params) {
		Number num = 0;
		try {
			queryRunner = new QueryRunner(dataSource);
			if (params == null) {
				num = (Number) queryRunner.query(sql, scalarHandler);
			} else {
				num = (Number) queryRunner.query(sql, scalarHandler, params);
			}
		} catch (SQLException e) {
			e.printStackTrace();
			LOG.error("count.统计数量错误" + sql, e);
		}
		return (num != null) ? num.longValue() : -1;
	}

	/**
	 * 执行sql语句
	 * 
	 * @param sql
	 *            sql语句
	 * @return 受影响的行数
	 */
	public int update(String sql) {
		return update(sql, null);
	}

	/**
	 * 单条修改记录
	 * 
	 * @param sql
	 *            sql语句
	 * @param param
	 *            参数
	 * @return 受影响的行数
	 */
	public int update(String sql, Object param) {
		return update(sql, new Object[] { param });
	}

	/**
	 * 单条修改记录
	 * 
	 * @param sql
	 *            sql语句
	 * @param params
	 *            参数数组
	 * @return 受影响的行数
	 */
	public int update(String sql, Object[] params) {
		queryRunner = new QueryRunner(dataSource);
		int affectedRows = 0;
		try {
			if (params == null) {
				affectedRows = queryRunner.update(sql);
			} else {
				affectedRows = queryRunner.update(sql, params);
			}
		} catch (SQLException e) {
			e.printStackTrace();
			LOG.error("update.单条修改记录错误:" + sql, e);
		}
		return affectedRows;
	}

	/**
	 * 批量修改记录
	 * 
	 * @param sql
	 *            sql语句
	 * @param params
	 *            二维参数数组
	 * @return 受影响的行数的数组
	 */
	public int[] batchUpdate(String sql, Object[][] params) {
		queryRunner = new QueryRunner(dataSource);
		int[] affectedRows = new int[0];
		try {
			affectedRows = queryRunner.batch(sql, params);
		} catch (SQLException e) {
			e.printStackTrace();
			LOG.error("update.批量修改记录错误:" + sql, e);
		}
		return affectedRows;
	}

	/**
	 * 执行查询,将每行的结果保存到一个Map对象中,然后将所有Map对象保存到List中
	 * 
	 * @param sql
	 *            sql语句
	 * @return 查询结果
	 */
	public List<Map<String, Object>> find(String sql) {
		return find(sql, null);
	}

	/**
	 * 执行查询,将每行的结果保存到一个Map对象中,然后将所有Map对象保存到List中
	 * 
	 * @param sql
	 *            sql语句
	 * @param param
	 *            参数
	 * @return 查询结果
	 */
	public List<Map<String, Object>> find(String sql, Object param) {
		return find(sql, new Object[] { param });
	}

	/**
	 * 执行查询,将每行的结果保存到一个Map对象中,然后将所有Map对象保存到List中
	 * 
	 * @param sql
	 *            sql语句
	 * @param params
	 *            参数数组
	 * @return 查询结果
	 */
	@SuppressWarnings("unchecked")
	public List<Map<String, Object>> findPage(String sql, int page, int count, Object... params) {
		sql = sql + " LIMIT ?,?";
		queryRunner = new QueryRunner(dataSource);
		List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
		try {
			if (params == null) {
				list = (List<Map<String, Object>>) queryRunner.query(sql, new MapListHandler(), new Integer[] { page,
						count });
			} else {
				list = (List<Map<String, Object>>) queryRunner.query(sql, new MapListHandler(), ArrayUtils.addAll(
						params, new Integer[] { page, count }));
			}
		} catch (SQLException e) {
			e.printStackTrace();
			LOG.error("map 数据分页查询错误", e);
		}
		return list;
	}

	/**
	 * 执行查询,将每行的结果保存到一个Map对象中,然后将所有Map对象保存到List中
	 * 
	 * @param sql
	 *            sql语句
	 * @param params
	 *            参数数组
	 * @return 查询结果
	 */
	@SuppressWarnings("unchecked")
	public List<Map<String, Object>> find(String sql, Object[] params) {
		queryRunner = new QueryRunner(dataSource);
		List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
		try {
			if (params == null) {
				list = (List<Map<String, Object>>) queryRunner.query(sql, new MapListHandler());
			} else {
				list = (List<Map<String, Object>>) queryRunner.query(sql, new MapListHandler(), params);
			}
		} catch (SQLException e) {
			e.printStackTrace();
			LOG.error("map 数据查询错误", e);
		}
		return list;
	}

	/**
	 * 执行查询,将每行的结果保存到Bean中,然后将所有Bean保存到List中
	 * 
	 * @param entityClass
	 *            类名
	 * @param sql
	 *            sql语句
	 * @return 查询结果
	 */
	public <T> List<T> find(Class<T> entityClass, String sql) {
		return find(entityClass, sql, null);
	}

	/**
	 * 执行查询,将每行的结果保存到Bean中,然后将所有Bean保存到List中
	 * 
	 * @param entityClass
	 *            类名
	 * @param sql
	 *            sql语句
	 * @param param
	 *            参数
	 * @return 查询结果
	 */
	public <T> List<T> find(Class<T> entityClass, String sql, Object param) {
		return find(entityClass, sql, new Object[] { param });
	}

	/**
	 * 执行查询,将每行的结果保存到Bean中,然后将所有Bean保存到List中
	 * 
	 * @param entityClass
	 *            类名
	 * @param sql
	 *            sql语句
	 * @param params
	 *            参数数组
	 * @return 查询结果
	 */
	@SuppressWarnings("unchecked")
	public <T> List<T> find(Class<T> entityClass, String sql, Object[] params) {
		queryRunner = new QueryRunner(dataSource);
		List<T> list = new ArrayList<T>();
		try {
			if (params == null) {
				list = (List<T>) queryRunner.query(sql, new BeanListHandler(entityClass));
			} else {
				list = (List<T>) queryRunner.query(sql, new BeanListHandler(entityClass), params);
			}
		} catch (SQLException e) {
			e.printStackTrace();
			LOG.error("Error occured while attempting to query data", e);
		}
		return list;
	}

	/**
	 * 查询出结果集中的第一条记录,并封装成对象
	 * 
	 * @param entityClass
	 *            类名
	 * @param sql
	 *            sql语句
	 * @return 对象
	 */
	public <T> T findFirst(Class<T> entityClass, String sql) {
		return findFirst(entityClass, sql, null);
	}

	/**
	 * 查询出结果集中的第一条记录,并封装成对象
	 * 
	 * @param entityClass
	 *            类名
	 * @param sql
	 *            sql语句
	 * @param param
	 *            参数
	 * @return 对象
	 */
	public <T> T findFirst(Class<T> entityClass, String sql, Object param) {
		return findFirst(entityClass, sql, new Object[] { param });
	}

	/**
	 * 查询出结果集中的第一条记录,并封装成对象
	 * 
	 * @param entityClass
	 *            类名
	 * @param sql
	 *            sql语句
	 * @param params
	 *            参数数组
	 * @return 对象
	 */
	@SuppressWarnings("unchecked")
	public <T> T findFirst(Class<T> entityClass, String sql, Object[] params) {
		queryRunner = new QueryRunner(dataSource);
		Object object = null;
		try {
			if (params == null) {
				object = queryRunner.query(sql, new BeanHandler(entityClass));
			} else {
				object = queryRunner.query(sql, new BeanHandler(entityClass), params);
			}
		} catch (SQLException e) {
			LOG.error("返回一条记录错误:findFirst" + e.getMessage());
			e.printStackTrace();
		}
		return (T) object;
	}

	/**
	 * 查询出结果集中的第一条记录,并封装成Map对象
	 * 
	 * @param sql
	 *            sql语句
	 * @return 封装为Map的对象
	 */
	public Map<String, Object> findFirst(String sql) {
		return findFirst(sql, null);
	}

	/**
	 * 查询出结果集中的第一条记录,并封装成Map对象
	 * 
	 * @param sql
	 *            sql语句
	 * @param param
	 *            参数
	 * @return 封装为Map的对象
	 */
	public Map<String, Object> findFirst(String sql, Object param) {
		return findFirst(sql, new Object[] { param });
	}

	/**
	 * 查询出结果集中的第一条记录,并封装成Map对象
	 * 
	 * @param sql
	 *            sql语句
	 * @param params
	 *            参数数组
	 * @return 封装为Map的对象
	 */
	@SuppressWarnings("unchecked")
	public Map<String, Object> findFirst(String sql, Object[] params) {
		queryRunner = new QueryRunner(dataSource);
		Map<String, Object> map = null;
		try {
			if (params == null) {
				map = (Map<String, Object>) queryRunner.query(sql, new MapHandler());
			} else {
				map = (Map<String, Object>) queryRunner.query(sql, new MapHandler(), params);
			}
		} catch (SQLException e) {
			e.printStackTrace();
			LOG.error("findFirst.查询一条记录错误" + sql, e);
		}
		return map;
	}

	/**
	 * 查询某一条记录,并将指定列的数据转换为Object
	 * 
	 * @param sql
	 *            sql语句
	 * @param columnName
	 *            列名
	 * @return 结果对象
	 */
	public Object findBy(String sql, String params) {
		return findBy(sql, params, null);
	}

	/**
	 * 查询某一条记录,并将指定列的数据转换为Object
	 * 
	 * @param sql
	 *            sql语句
	 * @param columnName
	 *            列名
	 * @param param
	 *            参数
	 * @return 结果对象
	 */
	public Object findBy(String sql, String columnName, Object param) {
		return findBy(sql, columnName, new Object[] { param });
	}

	/**
	 * 查询某一条记录,并将指定列的数据转换为Object
	 * 
	 * @param sql
	 *            sql语句
	 * @param columnName
	 *            列名
	 * @param params
	 *            参数数组
	 * @return 结果对象
	 */
	public Object findBy(String sql, String columnName, Object[] params) {
		queryRunner = new QueryRunner(dataSource);
		Object object = null;
		try {
			if (params == null) {
				object = queryRunner.query(sql, new ScalarHandler(columnName));
			} else {
				object = queryRunner.query(sql, new ScalarHandler(columnName), params);
			}
		} catch (SQLException e) {
			e.printStackTrace();
			LOG.error("findBy。错误" + sql, e);
		}
		return object;
	}

	/**
	 * 查询某一条记录,并将指定列的数据转换为Object
	 * 
	 * @param sql
	 *            sql语句
	 * @param columnIndex
	 *            列索引
	 * @return 结果对象
	 */
	public Object findBy(String sql, int columnIndex) {
		return findBy(sql, columnIndex, null);
	}

	/**
	 * 查询某一条记录,并将指定列的数据转换为Object
	 * 
	 * @param sql
	 *            sql语句
	 * @param columnIndex
	 *            列索引
	 * @param param
	 *            参数
	 * @return 结果对象
	 */
	public Object findBy(String sql, int columnIndex, Object param) {
		return findBy(sql, columnIndex, new Object[] { param });
	}

	/**
	 * 查询某一条记录,并将指定列的数据转换为Object
	 * 
	 * @param sql
	 *            sql语句
	 * @param columnIndex
	 *            列索引
	 * @param params
	 *            参数数组
	 * @return 结果对象
	 */
	public Object findBy(String sql, int columnIndex, Object[] params) {
		queryRunner = new QueryRunner(dataSource);
		Object object = null;
		try {
			if (params == null) {
				object = queryRunner.query(sql, new ScalarHandler(columnIndex));
			} else {
				object = queryRunner.query(sql, new ScalarHandler(columnIndex), params);
			}
		} catch (SQLException e) {
			e.printStackTrace();
			LOG.error("findBy.错误" + sql, e);
		}
		return object;
	}

	/**
	 * 
	 * @param <T>分页查询
	 * @param beanClass
	 * @param sql
	 * @param page
	 * @param count
	 * @param params
	 * @return
	 */
	public <T> List<T> findPage(Class<T> beanClass, String sql, int page, int pageSize, Object... params) {
		if (page <= 1) {
			page = 0;
		}
		return query(beanClass, sql + " LIMIT ?,?", ArrayUtils.addAll(params, new Integer[] { page, pageSize }));
	}

	public <T> List<T> query(Class<T> beanClass, String sql, Object... params) {
		try {
			queryRunner = new QueryRunner(dataSource);
			return (List<T>) queryRunner.query(sql, isPrimitive(beanClass) ? columnListHandler : new BeanListHandler(
					beanClass), params);
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return null;
	}

	private List<Class<?>> PrimitiveClasses = new ArrayList<Class<?>>() {
		{
			add(Long.class);
			add(Integer.class);
			add(String.class);
			add(java.util.Date.class);
			add(java.sql.Date.class);
			add(java.sql.Timestamp.class);
		}
	};
	// 返回单一列时用到的handler
	private final static ColumnListHandler columnListHandler = new ColumnListHandler() {
		@Override
		protected Object handleRow(ResultSet rs) throws SQLException {
			Object obj = super.handleRow(rs);
			if (obj instanceof BigInteger)
				return ((BigInteger) obj).longValue();
			return obj;
		}

	};

	// 判断是否为原始类型
	private boolean isPrimitive(Class<?> cls) {
		return cls.isPrimitive() || PrimitiveClasses.contains(cls);
	}
	// map

}

 

第二部分:

Java代码 复制代码 收藏代码
  1. publicclass PageHelp {
  2. privateint pageSize;
  3. privateint totalCount;
  4. privateint currentPage;
  5. privateint startIndex;
  6. privateint[] indexes = newint[0];
  7. privateint nextIndex;
  8. privateint previousIndex;
  9. privateint pageCount;
  10. private List items;
  11. privateint lastIndex;
  12. private String currentUrl;
  13. public String getCurrentUrl() {
  14. return currentUrl;
  15. }
  16. publicvoid setCurrentUrl(String currentUrl) {
  17. this.currentUrl = currentUrl;
  18. }
  19. public PageHelp(List items, int totalCount, int startIndex) {
  20. pageSize = Constants.PAGE_SIZE;
  21. setPageSize(pageSize);
  22. setTotalCount(totalCount);
  23. setItems(items);
  24. setStartIndex(startIndex);
  25. }
  26. publicvoid setTotalCount(int totalCount) {
  27. if (totalCount > 0) {
  28. this.totalCount = totalCount;
  29. int count = totalCount / pageSize;
  30. if (totalCount % pageSize > 0) {
  31. count++;
  32. }
  33. indexes = newint[count];
  34. for (int i = 0; i < count; i++) {
  35. indexes[i] = pageSize * i;
  36. }
  37. } else {
  38. this.totalCount = 0;
  39. }
  40. }
  41. /**
  42. * 得到总记录数
  43. *
  44. * @return
  45. */
  46. publicint getTotalCount() {
  47. return totalCount;
  48. }
  49. publicvoid setIndexes(int[] indexes) {
  50. this.indexes = indexes;
  51. }
  52. /**
  53. * 得到分页索引的数组
  54. *
  55. * @return
  56. */
  57. publicint[] getIndexes() {
  58. return indexes;
  59. }
  60. publicvoid setStartIndex(int startIndex) {
  61. if (totalCount <= 0) {
  62. this.startIndex = 0;
  63. } elseif (startIndex >= totalCount) {
  64. this.startIndex = indexes[indexes.length - 1];
  65. } elseif (startIndex < 0) {
  66. this.startIndex = 0;
  67. } else {
  68. this.startIndex = indexes[startIndex / pageSize];
  69. }
  70. }
  71. /**
  72. * 当前页
  73. *
  74. * @return
  75. */
  76. publicint getStartIndex() {
  77. return startIndex;
  78. }
  79. publicvoid setNextIndex(int nextIndex) {
  80. this.nextIndex = nextIndex;
  81. }
  82. /**
  83. * 下一页
  84. *
  85. * @return
  86. */
  87. publicint getNextIndex() {
  88. int nextIndex = getStartIndex() + pageSize;
  89. if (nextIndex >= totalCount) {
  90. return getStartIndex();
  91. } else {
  92. return nextIndex;
  93. }
  94. }
  95. publicvoid setPreviousIndex(int previousIndex) {
  96. this.previousIndex = previousIndex;
  97. }
  98. /**
  99. * 上一页
  100. *
  101. * @return
  102. */
  103. publicint getPreviousIndex() {
  104. int previousIndex = getStartIndex() - pageSize;
  105. if (previousIndex < 0) {
  106. return0;
  107. } else {
  108. return previousIndex;
  109. }
  110. }
  111. publicvoid setPageCount(int pageCount) {
  112. this.pageCount = pageCount;
  113. }
  114. publicint getPageCount() {
  115. int count = totalCount / pageSize;
  116. if (totalCount % pageSize > 0)
  117. count++;
  118. return count;
  119. }
  120. publicint getCurrentPage() {
  121. return getStartIndex() / pageSize + 1;
  122. }
  123. publicvoid setCurrentPage(int currentPage) {
  124. this.currentPage = currentPage;
  125. }
  126. publicvoid setLastIndex(int lastIndex) {
  127. this.lastIndex = lastIndex;
  128. }
  129. publicint getLastIndex() {
  130. if (indexes.length == 0) {
  131. return0;
  132. } else {
  133. return indexes[indexes.length - 1];
  134. }
  135. }
  136. publicint getPageSize() {
  137. return pageSize;
  138. }
  139. publicvoid setPageSize(int pageSize) {
  140. this.pageSize = pageSize;
  141. }
  142. /**
  143. * 得到已分页好的结果集
  144. *
  145. * @return
  146. */
  147. public List getItems() {
  148. return items;
  149. }
  150. publicvoid setItems(List items) {
  151. this.items = items;
  152. }
public class PageHelp {
	private int pageSize;
	private int totalCount;
	private int currentPage;
	private int startIndex;
	private int[] indexes = new int[0];
	private int nextIndex;
	private int previousIndex;
	private int pageCount;
	private List items;
	private int lastIndex;
	private String currentUrl;

	public String getCurrentUrl() {
		return currentUrl;
	}

	public void setCurrentUrl(String currentUrl) {
		this.currentUrl = currentUrl;
	}

	public PageHelp(List items, int totalCount, int startIndex) {
		pageSize = Constants.PAGE_SIZE;
		setPageSize(pageSize);
		setTotalCount(totalCount);
		setItems(items);
		setStartIndex(startIndex);

	}

	public void setTotalCount(int totalCount) {
		if (totalCount > 0) {
			this.totalCount = totalCount;
			int count = totalCount / pageSize;
			if (totalCount % pageSize > 0) {
				count++;
			}
			indexes = new int[count];
			for (int i = 0; i < count; i++) {
				indexes[i] = pageSize * i;
			}
		} else {
			this.totalCount = 0;
		}
	}

	/**
	 * 得到总记录数
	 * 
	 * @return
	 */
	public int getTotalCount() {
		return totalCount;
	}

	public void setIndexes(int[] indexes) {
		this.indexes = indexes;
	}

	/**
	 * 得到分页索引的数组
	 * 
	 * @return
	 */
	public int[] getIndexes() {
		return indexes;
	}

	public void setStartIndex(int startIndex) {
		if (totalCount <= 0) {
			this.startIndex = 0;
		} else if (startIndex >= totalCount) {
			this.startIndex = indexes[indexes.length - 1];
		} else if (startIndex < 0) {
			this.startIndex = 0;
		} else {
			this.startIndex = indexes[startIndex / pageSize];
		}
	}

	/**
	 * 当前页
	 * 
	 * @return
	 */
	public int getStartIndex() {
		return startIndex;
	}

	public void setNextIndex(int nextIndex) {
		this.nextIndex = nextIndex;
	}

	/**
	 * 下一页
	 * 
	 * @return
	 */
	public int getNextIndex() {
		int nextIndex = getStartIndex() + pageSize;
		if (nextIndex >= totalCount) {
			return getStartIndex();
		} else {
			return nextIndex;
		}
	}

	public void setPreviousIndex(int previousIndex) {
		this.previousIndex = previousIndex;
	}

	/**
	 * 上一页
	 * 
	 * @return
	 */
	public int getPreviousIndex() {
		int previousIndex = getStartIndex() - pageSize;
		if (previousIndex < 0) {
			return 0;
		} else {
			return previousIndex;
		}
	}

	public void setPageCount(int pageCount) {
		this.pageCount = pageCount;
	}

	public int getPageCount() {
		int count = totalCount / pageSize;
		if (totalCount % pageSize > 0)
			count++;
		return count;
	}

	public int getCurrentPage() {
		return getStartIndex() / pageSize + 1;
	}

	public void setCurrentPage(int currentPage) {
		this.currentPage = currentPage;
	}

	public void setLastIndex(int lastIndex) {
		this.lastIndex = lastIndex;
	}

	public int getLastIndex() {
		if (indexes.length == 0) {
			return 0;
		} else {
			return indexes[indexes.length - 1];
		}
	}

	public int getPageSize() {
		return pageSize;
	}

	public void setPageSize(int pageSize) {
		this.pageSize = pageSize;
	}

	/**
	 * 得到已分页好的结果集
	 * 
	 * @return
	 */
	public List getItems() {
		return items;
	}

	public void setItems(List items) {
		this.items = items;
	}

 

 

使用方法:

 

考虑到分层的话可以这样使用:

Java代码 复制代码 收藏代码
  1. publicclass CommonDaoImpl extends DBUtilsTemplate implements CommonDao
public class CommonDaoImpl extends DBUtilsTemplate implements CommonDao 

 

还可以直接new DBUtilsTemplate () 使用。

 

分页使用方法:

 

Java代码 复制代码 收藏代码
  1. //(String sql, int page, int count, Object... params);
  2. List list= ucd.findPage(sql, p, Constants.PAGE_SIZE, "y");
  3. int totalRows=总记录数
  4. returnnew PageHelp(list, totalRows, p);
//(String sql, int page, int count, Object... params);	
List list= ucd.findPage(sql, p, Constants.PAGE_SIZE, "y");
int totalRows=总记录数
return new PageHelp(list, totalRows, p);

 

在jsp中显示分页方法:

 

 

Java代码 复制代码 收藏代码
  1. <table width="100%" border="0" align="center" cellpadding="0"
  2. cellspacing="0">
  3. <tr align="center">
  4. <td>
  5. <a href="${pageList.currentUrl}&page=0">第一页</a>&nbsp;&nbsp;&nbsp;&nbsp;
  6. <a href="${pageList.currentUrl}&page=${pageList.previousIndex}">上一页</a>&nbsp;&nbsp;&nbsp;&nbsp;
  7. <c:forEach items="${pageList.indexes}" var="itempage"
  8. varStatus="stuts">
  9. <c:choose>
  10. <c:when test="${pageList.currentPage ==stuts.index+1}">
  11. <a style="color: red"> ${stuts.index+1}</a>
  12. </c:when>
  13. <c:otherwise>
  14. </c:otherwise>
  15. </c:choose>
  16. </c:forEach>
  17. &nbsp;&nbsp;&nbsp;&nbsp;
  18. <a href="${pageList.currentUrl}&page=${pageList.nextIndex}">
  19. 下一页</a> &nbsp;&nbsp;&nbsp;&nbsp;
  20. <a href="${pageList.currentUrl}&page=${pageList.lastIndex}">最后页</a>
  21. &nbsp;&nbsp;&nbsp;&nbsp;总数: ${ pageList.totalCount}
  22. &nbsp;&nbsp;&nbsp;&nbsp;总页数: ${ pageList.pageCount}
  23. </td>
  24. </tr>
  25. </table>
<table width="100%" border="0" align="center" cellpadding="0"
						cellspacing="0">
						<tr align="center">
							<td>
								<a href="${pageList.currentUrl}&page=0">第一页</a>&nbsp;&nbsp;&nbsp;&nbsp;
								<a href="${pageList.currentUrl}&page=${pageList.previousIndex}">上一页</a>&nbsp;&nbsp;&nbsp;&nbsp;
								<c:forEach items="${pageList.indexes}" var="itempage"
									varStatus="stuts">
									<c:choose>
										<c:when test="${pageList.currentPage ==stuts.index+1}">
											<a style="color: red"> ${stuts.index+1}</a>
										</c:when>
										<c:otherwise>
										</c:otherwise>
									</c:choose>
								</c:forEach>
								&nbsp;&nbsp;&nbsp;&nbsp;
								<a href="${pageList.currentUrl}&page=${pageList.nextIndex}">
									下一页</a> &nbsp;&nbsp;&nbsp;&nbsp;
								<a href="${pageList.currentUrl}&page=${pageList.lastIndex}">最后页</a>
								&nbsp;&nbsp;&nbsp;&nbsp;总数: ${ pageList.totalCount}
								&nbsp;&nbsp;&nbsp;&nbsp;总页数: ${ pageList.pageCount}
							</td>
						</tr>
					</table>

 

解释:currentUrl 是在action中 获取PageHelp 对象后,对他的属性currentUrl 重新赋值(即:当前请求url)

 

放上去一个效果图吧:

dbutils通用类,dbutils分页查询

 

 

补充:数据源,使用的是dbcp

 

Java代码 复制代码 收藏代码
  1. publicclass MyDataSource {
  2. privatestatic Properties properties;
  3. privatestatic DataSource dataSource;
  4. static {
  5. try {
  6. properties = new Properties();
  7. properties.load(MyDataSource.class.getResourceAsStream("/dbcpconfig.properties"));
  8. BasicDataSourceFactory b = new BasicDataSourceFactory();
  9. dataSource = b.createDataSource(properties);
  10. } catch (Exception e) {
  11. e.printStackTrace();
  12. }
  13. }
  14. publicstatic DataSource getdataSource() {
  15. return dataSource;
  16. }
  17. }
public class MyDataSource {
	private static Properties properties;
	private static DataSource dataSource;
	static {
		try {
			properties = new Properties();
			properties.load(MyDataSource.class.getResourceAsStream("/dbcpconfig.properties"));
			BasicDataSourceFactory b = new BasicDataSourceFactory();
			dataSource = b.createDataSource(properties);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	public static DataSource getdataSource() {
		return dataSource;
	}
}

 

数据源配置文件:

 

Java代码 复制代码 收藏代码
  1. #连接设置
  2. driverClassName=com.mysql.jdbc.Driver
  3. url=jdbc:mysql://localhost:3306/cc
  4. username=root
  5. password=cc
  6. #初始化连接
  7. initialSize=5
  8. #最大连接数量
  9. maxActive=40
  10. #最大空闲连接
  11. maxIdle=20
  12. #最小空闲连接
  13. minIdle=5
  14. #超时等待时间以毫秒为单位 6000毫秒/1000等于60
  15. maxWait=10000
  16. #JDBC驱动建立连接时附带的连接属性属性的格式必须为这样:[属性名=property;]
  17. #注意:"user""password" 两个属性会被明确地传递,因此这里不需要包含他们。
  18. connectionProperties=useUnicode=true;characterEncoding=UTF-8
  19. #指定由连接池所创建的连接的自动提交(auto-commit)状态。
  20. defaultAutoCommit=true
  21. #driver default 指定由连接池所创建的连接的只读(read-only)状态。
  22. #如果没有设置该值,则“setReadOnly”方法将不被调用。(某些驱动并不支持只读模式,如:Informix)
  23. defaultReadOnly=
  24. #是否自动回收超时连接(一般是忘了释放的)
  25. removeAbandoned=true
  26. # 将被遗弃的数据库连接的回收记入日志。
  27. logAbandoned=true
  28. # 数据库连接过多长时间不用将被视为被遗弃而收回连接池中。
  29. removeAbandonedTimeout=30
  30. #driver default 指定由连接池所创建的连接的事务级别(TransactionIsolation)。
  31. #可用值为下列之一:(详情可见javadoc。)NONE,READ_UNCOMMITTED, READ_COMMITTED, REPEATABLE_READ, SERIALIZABLE
  32. #defaultTransactionIsolation=REPEATABLE_READ
  33. #db.pool.default.whenExhaustedAction=grow
  34. #新增参数,用于8小时问题
  35. testOnBorrow=true
  36. testOnReturn=false
  37. testWhileIdle=true
  38. validationQuery=select 1
0
0
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics