引用
提供不一樣數據源和方言實現智能分頁,因Spring單例模式,能夠利用Cglib實現動態數據源切換方案,基礎東西不講了,直接看代碼。
引用
持久超接口,獲取操做模板,能夠是JdbcTemplate、SqlSessionTemplate等
Java代碼
- package com.sunshine.basic.dao;
-
- public interface SuperDao<T> {
-
- /**
- * 獲取操做模板
- * @return
- */
- T getTemplate();
-
- }
引用
查詢+分頁操做接口
Java代碼
- package com.sunshine.basic.dao;
-
- import java.sql.SQLException;
- import java.util.List;
- import java.util.Map;
-
- import org.springframework.jdbc.core.JdbcTemplate;
-
- import com.sunshine.basic.dao.page.PagingParameter;
- import com.sunshine.basic.exception.DaoAccessException;
-
- /**
- * 查詢+分頁操做接口
- * @author OY
- * @since 2016/01/20
- * @see V2.0.0
- */
- public interface JdbcQueryDao extends SuperDao<JdbcTemplate>{
-
- /***
- * 查詢單個字段值
- * 採用?佔位符,如 name=?
- * @param sql
- * @param paras
- * @return
- * @throws DaoAccessException
- */
- Object getField(String sql, Object...paras) throws DaoAccessException;
- /**
- * 查詢單個字段值
- * 採用?佔位符
- * @param sql
- * @param paras
- * @return
- * @throws DaoAccessException
- */
- Object getField(String sql, List<Object> paras) throws DaoAccessException;
- /**
- * 查詢單個字段值
- * 採用名稱佔位符,如 name=:name
- * @param sql
- * @param paras key與佔位符名稱一致
- * @return
- * @throws DaoAccessException
- */
- Object getField(String sql, Map<String, Object> paras) throws DaoAccessException;
- //===================================================================================
- /**
- * 查詢單個對象
- * 採用?佔位符,如 name=?
- * @param sql
- * @param paras
- * @return
- */
- Map<String, Object> getObject(String sql, Object...paras) throws DaoAccessException;
- /**
- * 查詢單個對象
- * 採用?佔位符,如 name=?
- * @param sql
- * @param paras
- * @return
- * @throws DaoAccessException
- */
- Map<String, Object> getObject(String sql, List<Object> paras) throws DaoAccessException;
- /**
- * 查詢單個對象
- * 採用名稱佔位符,如 name=:name
- * @param sql
- * @param paras key與佔位符名稱一致
- * @return
- * @throws DaoAccessException
- */
- Map<String, Object> getObject(String sql, Map<String, Object> paras) throws DaoAccessException;
-
- /**
- * 查詢單個對象(封裝)
- * 採用?佔位符,如 name=?
- * @param sql
- * @param classz
- * @param paras
- * @return
- */
- <T> T getObject(String sql, Class<T> classz, Object...paras) throws DaoAccessException;
- /**
- * 查詢單個對象(封裝)
- * 採用?佔位符,如 name=?
- * @param sql
- * @param classz
- * @param paras
- * @return
- * @throws DaoAccessException
- */
- <T> T getObject(String sql, Class<T> classz, List<Object> paras) throws DaoAccessException;
- /**
- * 查詢單個對象(封裝)
- * 採用名稱佔位符,如 name=:name
- * @param sql
- * @param classz
- * @param paras key與佔位符名稱一致
- * @return
- * @throws DaoAccessException
- */
- <T> T getObject(String sql, Class<T> classz, Map<String, Object> paras) throws DaoAccessException;
-
- //====================================================================================================
- /**
- * 查詢列表
- * 採用?佔位符,如 name=?
- * @param sql SQL語句
- * @param paras 參數
- * @return
- * @throws DaoAccessException
- */
- List<Map<String, Object>> getList(String sql, Object...paras) throws DaoAccessException;
- /**
- * 查詢列表
- * 採用?佔位符,如 name=?
- * @param sql
- * @param paras
- * @return
- * @throws DaoAccessException
- */
- List<Map<String, Object>> getList(String sql, List<Object> paras) throws DaoAccessException;
- /**
- * 查詢列表
- * @param sql
- * @param paras
- * @return
- * @throws DaoAccessException
- */
- List<Map<String, Object>> getList(String sql, Map<String, Object> paras) throws DaoAccessException;
-
-
- /**
- * 查詢列表(封裝)
- * 採用?佔位符,如 name=?
- * @param sql SQL語句
- * @param classz 結果封裝類
- * @param paras 參數
- * @return
- * @throws DaoAccessException
- */
- <T> List<T> getList(String sql, Class<T> classz, Object...paras) throws DaoAccessException;
- /**
- * 查詢列表(封裝)
- * 採用?佔位符,如 name=?
- * @param sql
- * @param classz
- * @param paras
- * @return
- * @throws DaoAccessException
- */
- <T> List<T> getList(String sql, Class<T> classz, List<Object> paras) throws DaoAccessException;
- /**
- * 查詢列表(封裝)
- * 採用名稱佔位符,如 name=:name
- * @param sql
- * @param classz
- * @param paras key與佔位符名稱一致
- * @return
- * @throws DaoAccessException
- */
- <T> List<T> getList(String sql, Class<T> classz, Map<String, Object> paras) throws DaoAccessException;
-
-
- //====================================================================================================
-
-
- /**
- * 查詢總記錄數
- * 採用?佔位符,如 name=?
- * @param sql 查詢SQL
- * @param limit 查詢限制,limit=0查詢不受限制
- * @return
- * @throws SQLException
- * @throws DaoAccessException
- */
- public int getRecordCounts(String sql, int limit, Object...paras)throws DaoAccessException;
- /**
- * 查詢記錄總數
- * 採用?佔位符,如 name=?
- * @param sql
- * @param limit
- * @param paras
- * @return
- * @throws DaoAccessException
- */
- public int getRecordCounts(String sql, int limit, List<Object> paras)throws DaoAccessException;
- /**
- * 查詢記錄總數
- * 採用名稱佔位符,如 name=:name
- * @param sql
- * @param limit
- * @param paras key與佔位符名稱一致
- * @return
- * @throws DaoAccessException
- */
- public int getRecordCounts(String sql, int limit, Map<String, Object> paras)throws DaoAccessException;
-
- /**
- * 查詢分頁列表
- * 採用?佔位符,如 name=?
- * @param sql 查詢SQL
- * @param pagingParameter 分頁對象,pagingParameter=null或無參數構分頁對象,不作分頁
- * @return
- * @throws SQLException
- * @throws DaoAccessException
- */
- public List<Map<String, Object>> getRecordData(String sql, PagingParameter pagingParameter, Object...paras)throws DaoAccessException;
- /**
- * 查詢分頁列表
- * 採用?佔位符,如 name=?
- * @param sql
- * @param pagingParameter
- * @param paras
- * @return
- * @throws DaoAccessException
- */
- public List<Map<String, Object>> getRecordData(String sql, PagingParameter pagingParameter, List<Object> paras)throws DaoAccessException;
- /**
- * 查詢分頁列表
- * 採用名稱佔位符,如 name=:name
- * @param sql
- * @param pagingParameter
- * @param paras key與佔位符名稱一致
- * @return
- * @throws DaoAccessException
- */
- public List<Map<String, Object>> getRecordData(String sql, PagingParameter pagingParameter, Map<String, Object> paras)throws DaoAccessException;
-
- /**
- * 查詢分頁列表(封裝)
- * 採用?佔位符,如 name=?
- * @param <T>
- * @param sql 查詢SQL
- * @param pagingParameter 分頁對象,pagingParameter=null或無參數構分頁對象,不作分頁
- * @param classz
- * @return
- * @throws SQLException
- * @throws DaoAccessException
- */
- public <T> List<T> getRecordData(String sql, Class<T> classz, PagingParameter pagingParameter, Object...paras)throws DaoAccessException;
- /**
- * 查詢分頁列表(封裝)
- * 採用?佔位符,如 name=?
- * @param sql
- * @param classz
- * @param pagingParameter
- * @param paras
- * @return
- * @throws DaoAccessException
- */
- public <T> List<T> getRecordData(String sql, Class<T> classz, PagingParameter pagingParameter, List<Object> paras)throws DaoAccessException;
- /**
- * 查詢分頁列表(封裝)
- * 採用名稱佔位符,如 name=:name
- * @param sql
- * @param classz
- * @param pagingParameter
- * @param paras key與佔位符名稱一致
- * @return
- * @throws DaoAccessException
- */
- public <T> List<T> getRecordData(String sql, Class<T> classz, PagingParameter pagingParameter, Map<String, Object> paras)throws DaoAccessException;
-
- //==================================================================================================================
- /**
- * 分頁查詢結果
- * 採用?佔位符,如 name=?
- * @param sql
- * @param curPage
- * @param pageSize
- * @param paras
- * @return
- */
- public Map<String, Object> getPageForMap(String sql, int curPage, int pageSize, Object...paras)throws DaoAccessException;
- /**
- * 分頁查詢結果
- * 採用?佔位符,如 name=?
- * @param sql
- * @param curPage
- * @param pageSize
- * @param paras
- * @return
- * @throws DaoAccessException
- */
- public Map<String, Object> getPageForMap(String sql, int curPage, int pageSize, List<Object> paras)throws DaoAccessException;
- /**
- * 分頁查詢結果
- * 採用名稱佔位符,如 name=:name
- * @param sql
- * @param curPage
- * @param pageSize
- * @param paras key與佔位符名稱一致
- * @return
- * @throws DaoAccessException
- */
- public Map<String, Object> getPageForMap(String sql, int curPage, int pageSize, Map<String, Object> paras)throws DaoAccessException;
-
- /**
- * 分頁查詢結果(封裝)
- * 採用?佔位符,如 name=?
- * @param sql
- * @param curPage
- * @param pageSize
- * @param clazz
- * @param paras
- * @return
- */
- public Map<String, Object> getPageForMap(String sql, int curPage, int pageSize, Class<?> clazz, Object...paras)throws DaoAccessException;
- /**
- * 分頁查詢結果(封裝)
- * 採用?佔位符,如 name=?
- * @param sql
- * @param curPage
- * @param pageSize
- * @param clazz
- * @param paras
- * @return
- * @throws DaoAccessException
- */
- public Map<String, Object> getPageForMap(String sql, int curPage, int pageSize, Class<?> clazz, List<Object> paras)throws DaoAccessException;
- /**
- * 分頁查詢結果(封裝)
- * 採用名稱佔位符,如 name=:name
- * @param sql
- * @param curPage
- * @param pageSize
- * @param clazz
- * @param paras key與佔位符名稱一致
- * @return
- * @throws DaoAccessException
- */
- public Map<String, Object> getPageForMap(String sql, int curPage, int pageSize, Class<?> clazz, Map<String, Object> paras)throws DaoAccessException;
-
- }
Java代碼
- /*更新接口*/
- package com.sunshine.basic.dao;
-
- import java.util.List;
- import java.util.Map;
-
- import org.springframework.jdbc.core.JdbcTemplate;
-
- import com.sunshine.basic.exception.DaoAccessException;
-
-
- public interface JdbcUpdateDao extends SuperDao<JdbcTemplate>{
-
- void update(String sql, Object...paras) throws DaoAccessException;
-
- void update(String sql, List<Object> paras) throws DaoAccessException;
-
- void update(String sql, Map<String, Object> paras) throws DaoAccessException;
-
- }
Java代碼
- /*插入接口*/
- package com.sunshine.basic.dao;
-
- import java.util.List;
- import java.util.Map;
-
- import org.springframework.jdbc.core.JdbcTemplate;
-
- import com.sunshine.basic.exception.DaoAccessException;
-
-
- public interface JdbcInsertDao extends SuperDao<JdbcTemplate>{
-
- void insert(String sql, Object...paras) throws DaoAccessException;
-
- void insert(String sql, List<Object> paras) throws DaoAccessException;
-
- void insert(String sql, Map<String, Object> paras) throws DaoAccessException;
-
- }
引用
操做實現,暫未實現更新、插入。定義模板獲取方法、SQL解析器由子類實現(設計模式之模板模式)
Java代碼
- package com.sunshine.basic.dao;
-
- import java.util.ArrayList;
- import java.util.Arrays;
- import java.util.Collections;
- import java.util.HashMap;
- import java.util.List;
- import java.util.Map;
-
- import org.apache.log4j.Logger;
- import org.springframework.dao.EmptyResultDataAccessException;
- import org.springframework.jdbc.core.BeanPropertyRowMapper;
- import org.springframework.jdbc.core.JdbcTemplate;
- import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;
-
- import com.sunshine.basic.dao.page.DataStore;
- import com.sunshine.basic.dao.page.PagingParameter;
- import com.sunshine.basic.dao.parser.AbstractParser;
- import com.sunshine.basic.dao.parser.Dialect;
- import com.sunshine.basic.dao.parser.Parser;
- import com.sunshine.basic.exception.DaoAccessException;
- /**
- * 持久操做
- * @author OY
- * @since 2016/01/20
- * @see V2.0.0
- */
- public abstract class AbstractJdbcCommDao implements JdbcQueryDao, JdbcInsertDao, JdbcUpdateDao{
-
- private Logger log = Logger.getLogger(getClass());
-
- private NamedParameterJdbcTemplate nameJdbTemplate;
-
- private JdbcTemplate jdbcTemplate;
-
- public NamedParameterJdbcTemplate getNamedJdbcTemplate(){
- nameJdbTemplate = new NamedParameterJdbcTemplate(
- getTemplate());
- return nameJdbTemplate;
- }
- /**
- * 子類實現獲取JdbcTemplate
- * @return
- * @throws DaoAccessException
- */
- public abstract JdbcTemplate getSubJdbcTemplate() throws DaoAccessException ;
- /**
- * 子類實現解析器(根據方言構造分頁語句)
- * @return
- * @throws DaoAccessException
- */
- public abstract Parser getParser() throws DaoAccessException;
-
- @Override
- public final JdbcTemplate getTemplate() {
- try {
- jdbcTemplate = getSubJdbcTemplate();
- if(jdbcTemplate == null) {
- log.info("jdbcTemplate is not exits!");
- throw new IllegalAccessException("jdbcTemplate is not exits!");
- //return SpringApplicationContext.getBean(DEFAULT_JDBC_TEMPLATE, JdbcTemplate.class);
- }
- } catch (Exception e) {
- log.error("jdbcTemplate is not exits!");
- e.printStackTrace();
- }
- return jdbcTemplate;
- }
-
- @Override
- public Object getField(String sql, Object... paras)
- throws DaoAccessException {
- log.info("jcbksql-" + sql);
- Object result = null;
- try{
- result = getTemplate().queryForObject(sql, paras, Object.class);
- }catch(EmptyResultDataAccessException e){
- //不作處理
- }
- return result;
- }
-
- @Override
- public Object getField(String sql, List<Object> paras)
- throws DaoAccessException {
- log.info("jcbksql-" + sql);
- return getField(sql, paras.toArray());
- }
-
- @Override
- public Object getField(String sql, Map<String, Object> paras)
- throws DaoAccessException {
- log.info("jcbksql-" + sql);
- Object result = null;
- try{
- result = getNamedJdbcTemplate().queryForObject(sql, paras, Object.class);
- }catch(EmptyResultDataAccessException e){
- //不作處理
- }
- return result;
- }
-
- @Override
- public Map<String, Object> getObject(String sql, Object... paras)
- throws DaoAccessException {
- log.info("jcbksql-" + sql);
- Map<String, Object> result = null;
- try{
- result = getTemplate().queryForMap(sql, paras);
- }catch(EmptyResultDataAccessException e){
- //不作處理
- }
- return result;
- }
-
- @Override
- public Map<String, Object> getObject(String sql, List<Object> paras)
- throws DaoAccessException {
- log.info("jcbksql-" + sql);
- return getObject(sql, paras.toArray());
- }
-
- @Override
- public Map<String, Object> getObject(String sql, Map<String, Object> paras)
- throws DaoAccessException {
- log.info("jcbksql-" + sql);
- Map<String, Object> result = null ;
- try{
- result = getNamedJdbcTemplate().queryForMap(sql, paras);
- }catch(EmptyResultDataAccessException e){
- //不作處理
- }
- return result;
- }
-
- @Override
- public <T> T getObject(String sql, Class<T> classz, Object... paras)
- throws DaoAccessException {
- log.info("jcbksql-" + sql);
- T result = null;
- try{
- result = getTemplate().queryForObject(sql, paras, new BeanPropertyRowMapper<T>(classz));
- }catch(EmptyResultDataAccessException e){
- //不作處理
- }
- return result;
- }
-
- @Override
- public <T> T getObject(String sql, Class<T> classz, List<Object> paras)
- throws DaoAccessException {
- log.info("jcbksql-" + sql);
- return getObject(sql, classz, paras.toArray());
- }
-
- @Override
- public <T> T getObject(String sql, Class<T> classz,
- Map<String, Object> paras) throws DaoAccessException {
- log.info("jcbksql-" + sql);
- T result = null;
- try{
- result = getNamedJdbcTemplate().queryForObject(sql, paras, new BeanPropertyRowMapper<T>(classz));
- }catch(EmptyResultDataAccessException e){
- //不作處理
- }
- return result;
- }
-
- @Override
- public List<Map<String, Object>> getList(String sql, Object... paras)
- throws DaoAccessException {
- log.info("jcbksql-" + sql);
- return getTemplate().queryForList(sql, paras);
- }
-
- @Override
- public List<Map<String, Object>> getList(String sql, List<Object> paras)
- throws DaoAccessException {
- log.info("jcbksql-" + sql);
- return getList(sql, paras.toArray());
- }
-
- @Override
- public List<Map<String, Object>> getList(String sql,
- Map<String, Object> paras) throws DaoAccessException {
- log.info("jcbksql-" + sql);
- return getNamedJdbcTemplate().queryForList(sql, paras);
- }
-
- @Override
- public <T> List<T> getList(String sql, Class<T> classz, Object... paras)
- throws DaoAccessException {
- log.info("jcbksql-" + sql);
- return getTemplate().query(sql, paras, new BeanPropertyRowMapper<T>(classz));
- }
-
- @Override
- public <T> List<T> getList(String sql, Class<T> classz, List<Object> paras)
- throws DaoAccessException {
- log.info("jcbksql-" + sql);
- return getList(sql, classz, paras.toArray());
- }
-
- @Override
- public <T> List<T> getList(String sql, Class<T> classz,
- Map<String, Object> paras) throws DaoAccessException {
- log.info("jcbksql-" + sql);
- return getNamedJdbcTemplate().query(sql, paras, new BeanPropertyRowMapper<T>(classz));
- }
-
-
- @Override
- public int getRecordCounts(String sql, int limit, Object... paras)
- throws DaoAccessException {
- log.info("jcbksql-" + sql);
- String cSql = getParser().getCountSql(sql);
- log.info("jcbksql-count-" + cSql);
- Object result = getField(cSql, paras);
- return Integer.valueOf((result == null)?"0":String.valueOf(result));
- }
-
- @Override
- public int getRecordCounts(String sql, int limit, List<Object> paras)
- throws DaoAccessException {
-
- return getRecordCounts(sql, limit, paras.toArray());
- }
-
- @Override
- public int getRecordCounts(String sql, int limit, Map<String, Object> paras)
- throws DaoAccessException {
- log.info("jcbksql-" + sql);
- String cSql = getParser().getCountSql(sql);
- log.info("jcbksql-count-" + cSql);
- Object result = getField(cSql, paras);
- return Integer.valueOf((result==null)?"0":String.valueOf(result));
- }
-
-
- /**
- * 增長分頁參數(分頁啓始行、頁大小)
- */
- private List<Object> addPageParameters(List<Object> paras, PagingParameter pagingParameter, Parser parser){
- List<Object> plist = new ArrayList<Object>(2);
- /* 結束行或頁大小 */
- plist.add(pagingParameter.getEndRow(parser.getDialect()));
- /* 開始 */
- plist.add(pagingParameter.getStartRow());
- Dialect dialect = parser.getDialect();
- switch (dialect) {
- case mysql:
- Collections.reverse(plist); /*MYSQL*/
- break;
- default:
- break;
- }
- if(paras != null){
- List<Object> temp = Collections.synchronizedList(paras);
- plist.addAll(0, temp);
- }
- return plist;
- }
-
- /**
- * 增長分頁參數(分頁啓始行、頁大小)
- */
- private Map<String, Object> addPageParameters(Map<String, Object> paras, PagingParameter pagingParameter, Parser parser){
- Map<String, Object> pMap = new HashMap<String, Object>(2);
- pMap.put(AbstractParser.START_INDEX_NAME, pagingParameter.getStartRow());
- pMap.put(AbstractParser.END_INDEX_NAME, pagingParameter.getEndRow(parser.getDialect()));
- if(paras != null){
- paras.putAll(pMap);
- return paras;
- }
- return pMap;
- }
-
- @Override
- public List<Map<String, Object>> getRecordData(String sql,
- PagingParameter pagingParameter, Object... paras)
- throws DaoAccessException {
-
- return getRecordData(sql, pagingParameter, Arrays.asList(paras));
- }
-
- @Override
- public List<Map<String, Object>> getRecordData(String sql,
- PagingParameter pagingParameter, List<Object> paras)
- throws DaoAccessException {
- log.info("jcbksql-" + sql);
- Parser parser = getParser();
- String pSql = parser.getPageSql(sql);
- log.info("jcbksql-page-" + pSql + " dialect-" + parser.getDialect().toString());
- List<Object> _paras = addPageParameters(paras, pagingParameter, parser);
- return getList(pSql, _paras);
- }
-
- @Override
- public List<Map<String, Object>> getRecordData(String sql,
- PagingParameter pagingParameter, Map<String, Object> paras)
- throws DaoAccessException {
- log.info("jcbksql-" + sql);
- Parser parser = getParser();
- String pSql = parser.getPageSqlForPlace(sql);
- log.info("jcbksql-page-" + pSql + " dialect-" + parser.getDialect().toString());
- Map<String, Object> _paras = addPageParameters(paras, pagingParameter, parser);
- return getList(pSql, _paras);
- }
-
- @Override
- public <T> List<T> getRecordData(String sql, Class<T> classz,
- PagingParameter pagingParameter, Object... paras)
- throws DaoAccessException {
-
- return getRecordData(sql, classz, pagingParameter, Arrays.asList(paras));
- }
-
- @Override
- public <T> List<T> getRecordData(String sql, Class<T> classz,
- PagingParameter pagingParameter, List<Object> paras)
- throws DaoAccessException {
- log.info("jcbksql-" + sql);
- Parser parser = getParser();
- String pSql = parser.getPageSqlForPlace(sql);
- log.info("jcbksql-page-" + pSql + " dialect-" + parser.getDialect().toString());
- List<Object> _paras = addPageParameters(paras, pagingParameter, parser);
- return getList(pSql, classz, _paras);
- }
-
- @Override
- public <T> List<T> getRecordData(String sql, Class<T> classz,
- PagingParameter pagingParameter, Map<String, Object> paras)
- throws DaoAccessException {
- log.info("jcbksql-" + sql);
- Parser parser = getParser();
- String pSql = parser.getPageSqlForPlace(sql);
- log.info("jcbksql-page-" + pSql + " dialect-" + parser.getDialect().toString());
- Map<String, Object> _paras = addPageParameters(paras, pagingParameter, parser);
- return getList(pSql, classz, _paras);
- }
-
- @Override
- public Map<String, Object> getPageForMap(String sql, int curPage,
- int pageSize, Object... paras) throws DaoAccessException {
-
- return getPageForMap(sql, curPage, pageSize, Arrays.asList(paras));
- }
-
- @Override
- public Map<String, Object> getPageForMap(String sql, int curPage,
- int pageSize, List<Object> paras) throws DaoAccessException {
- int total = getRecordCounts(sql, 0, paras);
- PagingParameter pp = new PagingParameter(curPage, pageSize, total);
- List<Map<String, Object>> list = getRecordData(sql, pp, paras);
- return new DataStore(total,list).getEntity();
- }
-
- @Override
- public Map<String, Object> getPageForMap(String sql, int curPage,
- int pageSize, Map<String, Object> paras) throws DaoAccessException {
- int total = getRecordCounts(sql, 0, paras);
- PagingParameter pp = new PagingParameter(curPage, pageSize, total);
- List<Map<String, Object>> list = getRecordData(sql, pp, paras);
- return new DataStore(total,list).getEntity();
- }
-
- @Override
- public Map<String, Object> getPageForMap(String sql, int curPage,
- int pageSize, Class<?> clazz, Object... paras)
- throws DaoAccessException {
-
- return getPageForMap(sql, curPage, pageSize, clazz, Arrays.asList(paras));
- }
-
- @Override
- public Map<String, Object> getPageForMap(String sql, int curPage,
- int pageSize, Class<?> clazz, List<Object> paras)
- throws DaoAccessException {
- int total = getRecordCounts(sql, 0, paras);
- PagingParameter pp = new PagingParameter(curPage, pageSize, total);
- List<?> list = getRecordData(sql, clazz, pp, paras);
- return new DataStore(total,list).getEntity();
- }
-
- @Override
- public Map<String, Object> getPageForMap(String sql, int curPage,
- int pageSize, Class<?> clazz, Map<String, Object> paras)
- throws DaoAccessException {
- int total = getRecordCounts(sql, 0, paras);
- PagingParameter pp = new PagingParameter(curPage, pageSize, total);
- List<?> list = getRecordData(sql, clazz, pp, paras);
- return new DataStore(total,list).getEntity();
- }
-
- @Override
- public void update(String sql, Object... paras) throws DaoAccessException {
- // TODO Auto-generated method stub
- throw new DaoAccessException("暫不支持該操做!");
- }
-
- @Override
- public void update(String sql, List<Object> paras)
- throws DaoAccessException {
- // TODO Auto-generated method stub
- throw new DaoAccessException("暫不支持該操做!");
- }
-
- @Override
- public void update(String sql, Map<String, Object> paras)
- throws DaoAccessException {
- // TODO Auto-generated method stub
- throw new DaoAccessException("暫不支持該操做!");
- }
-
- @Override
- public void insert(String sql, Object... paras) throws DaoAccessException {
- // TODO Auto-generated method stub
- throw new DaoAccessException("暫不支持該操做!");
- }
-
- @Override
- public void insert(String sql, List<Object> paras)
- throws DaoAccessException {
- // TODO Auto-generated method stub
- throw new DaoAccessException("暫不支持該操做!");
- }
-
- @Override
- public void insert(String sql, Map<String, Object> paras)
- throws DaoAccessException {
- // TODO Auto-generated method stub
- throw new DaoAccessException("暫不支持該操做!");
- }
- }
Java代碼
- /*爲了實現動態修改數據源名稱,增長了適配類*/
- package com.sunshine.basic.dao;
-
- import org.springframework.beans.BeansException;
- import org.springframework.jdbc.core.JdbcTemplate;
-
- import com.sunshine.basic.dao.AbstractJdbcCommDao;
- import com.sunshine.basic.dao.parser.AbstractParser;
- import com.sunshine.basic.dao.parser.Dialect;
- import com.sunshine.basic.dao.parser.Parser;
- import com.sunshine.basic.exception.DaoAccessException;
- import com.sunshine.basic.tools.ApplicationContextTools;
-
- /**
- * 利用JdbcAdapterDaoProxy生成子類代理,而後修改數據源名稱
- * @see com.sunshine.monitor.comm.dao.adapter.JdbcAdapterDaoProxy
- * @author OY
- *
- */
- public abstract class AbstractJdbcAdapterDao extends AbstractJdbcCommDao {
-
- /* 靜態數據源 */
- private String jdbcTemplateName;
-
- private Dialect dialect;
-
- /**
- * 子類實現靜態JdbcTemplate操做模板及方言
- * @param jdbcTemplateName
- * @param dialect
- */
- public AbstractJdbcAdapterDao(String jdbcTemplateName, Dialect dialect){
-
- this.jdbcTemplateName = jdbcTemplateName;
-
- this.dialect = dialect;
- }
- /*動態修改數據源名稱*/
- public final void setJdbcTemplateName(String jdbcTemplateName){
-
- this.jdbcTemplateName = jdbcTemplateName;
- }
-
- @Override
- public final JdbcTemplate getSubJdbcTemplate() throws DaoAccessException {
- JdbcTemplate jdbcTemplate = null;
- try {
- jdbcTemplate = ApplicationContextTools.getBean(
- this.jdbcTemplateName, JdbcTemplate.class);
- if(jdbcTemplate == null)
- throw new DaoAccessException("JdbcTemplate實例訪問失敗!");
- } catch (BeansException e) {
- e.printStackTrace();
- throw new DaoAccessException("JdbcTemplate實例訪問失敗!");
- }
- return jdbcTemplate;
- }
-
- @Override
- public Parser getParser() throws DaoAccessException {
-
- return AbstractParser.newParser(this.dialect);
- }
- }
Java代碼
- /*Oracle實現類*/
- package com.sunshine.basic.dao.jdbc;
-
- import org.springframework.stereotype.Repository;
-
- import com.sunshine.basic.dao.AbstractJdbcAdapterDao;
- import com.sunshine.basic.dao.parser.Dialect;
-
- @Repository("oracleJdbcDao")
- public class OracleJdbcDao extends AbstractJdbcAdapterDao {
-
- public OracleJdbcDao(){
- super("jdbcTemplate", Dialect.of("oracle"));
- }
- }
Java代碼
- /*GreenPum實現類*/
- package com.sunshine.basic.dao.jdbc;
-
- import org.springframework.stereotype.Repository;
-
- import com.sunshine.basic.dao.AbstractJdbcAdapterDao;
- import com.sunshine.basic.dao.parser.Dialect;
-
- /**
- * @author oy
- *
- */
- @Repository("greenPlumJdbcDao")
- public class GreenPlumJdbcDao extends AbstractJdbcAdapterDao {
-
- public GreenPlumJdbcDao(){
- super("gpJdbcTemplate",Dialect.of("postgresql"));
- }
-
- }
Java代碼
- package com.sunshine.basic.dao.proxy;
-
- import java.lang.reflect.Method;
- import net.sf.cglib.proxy.Enhancer;
- import net.sf.cglib.proxy.MethodInterceptor;
- import net.sf.cglib.proxy.MethodProxy;
- /**
- * 生成代理對象
- * @author oy
- *
- */
- public class JdbcAdapterDaoProxy implements MethodInterceptor{
-
- private Object target;
-
- public JdbcAdapterDaoProxy(){
-
- }
-
- public Object createInstance(Object target){
- this.target = target;
- Enhancer enhancer = new Enhancer();
- enhancer.setSuperclass(this.target.getClass());
- // 回調方法
- enhancer.setCallback(this);
- // 建立代理對象
- return enhancer.create();
- }
-
- @Override
- public Object intercept(Object obj, Method method, Object[] args,
- MethodProxy proxy) throws Throwable {
-
- return proxy.invokeSuper(obj, args);
- }
-
- }
引用
數據庫方言及SQL智能分頁
Java代碼
- package com.sunshine.basic.dao.parser;
-
- public interface Parser {
-
- /**
- * 獲取總數sql - 若是要支持其餘數據庫,修改這裏就能夠
- *
- * @param sql 原查詢sql
- * @return 返回count查詢sql
- */
- String getCountSql(String sql);
-
- /**
- * 獲取分頁sql - 若是要支持其餘數據庫,修改這裏就能夠
- *
- * @param sql 原查詢sql
- * @return 返回分頁sql
- */
- String getPageSql(String sql);
-
- /**
- *
- * @param sql
- * @return
- */
- String getPageSqlForPlace(String sql);
-
- /**
- * 獲取方言
- * @return
- */
- Dialect getDialect();
-
- /**
- * 設置方言
- * @param dialect
- */
- void setDialect(Dialect dialect);
-
- }
Java代碼
- package com.sunshine.basic.dao.parser;
-
- import com.sunshine.basic.dao.parser.impl.MysqlParser;
- import com.sunshine.basic.dao.parser.impl.OracleParser;
- import com.sunshine.basic.dao.parser.impl.PostgreSQLParser;
-
- public abstract class AbstractParser implements Parser{
-
- //處理SQL
- public static final SqlParser sqlParser = new SqlParser();
-
- private Dialect dialect;
-
- public static final String END_INDEX_NAME="endIndex";
-
- public static final String START_INDEX_NAME = "startIndex";
-
- public Dialect getDialect(){
-
- return dialect;
- }
-
- public void setDialect(Dialect dialect){
-
- this.dialect = dialect;
- }
-
- public static Parser newParser(Dialect dialect) {
- Parser parser = null;
- switch (dialect) {
- case postgresql:
- parser = new PostgreSQLParser();
- break;
- case mysql:
- parser = new MysqlParser();
- break;
- case oracle:
- parser = new OracleParser();
- break;
- default:
- break;
- }
- if(parser != null)
- parser.setDialect(dialect);
- return parser;
- }
-
- public String getCountSql(final String sql) {
-
- return sqlParser.getSmartCountSql(sql);
- }
-
- public abstract String getPageSql(String sql);
-
- }
Java代碼
- package com.sunshine.basic.dao.parser.impl;
-
- import com.sunshine.basic.dao.parser.AbstractParser;
-
- public class OracleParser extends AbstractParser {
-
- @Override
- public String getPageSql(String sql) {
- StringBuilder sqlBuilder = new StringBuilder(sql.length() + 120);
- sqlBuilder.append("select * from ( select tmp_page.*, rownum row_id from ( ");
- sqlBuilder.append(sql);
- sqlBuilder.append(" ) tmp_page where rownum <= ? ) where row_id > ?");
- return sqlBuilder.toString();
- }
-
- @Override
- public String getPageSqlForPlace(String sql) {
- StringBuilder sqlBuilder = new StringBuilder(sql.length() + 120);
- sqlBuilder.append("select * from ( select tmp_page.*, rownum row_id from ( ");
- sqlBuilder.append(sql);
- sqlBuilder.append(" ) tmp_page where rownum <= :");
- sqlBuilder.append(END_INDEX_NAME);
- sqlBuilder.append(") where row_id > :");
- sqlBuilder.append(START_INDEX_NAME);
- return sqlBuilder.toString();
- }
- }
Java代碼
- /*方言*/
- package com.sunshine.basic.dao.parser;
-
- public enum Dialect {
-
- mysql, oracle, postgresql;
-
- public static Dialect of(String dialect) {
- try {
- Dialect d = Dialect.valueOf(dialect);
- return d;
- } catch (IllegalArgumentException e) {
- String dialects = null;
- for (Dialect d : Dialect.values()) {
- if (dialects == null) {
- dialects = d.toString();
- } else {
- dialects += "," + d;
- }
- }
- throw new IllegalArgumentException("分頁dialect參數值錯誤,可選值爲[" + dialects + "]");
- }
- }
-
- public static String[] dialects() {
- Dialect[] dialects = Dialect.values();
- String[] ds = new String[dialects.length];
- for (int i = 0; i < dialects.length; i++) {
- ds[i] = dialects[i].toString();
- }
- return ds;
- }
-
- public static String fromJdbcUrl(String jdbcUrl) {
- String[] dialects = dialects();
- for (String dialect : dialects) {
- if (jdbcUrl.indexOf(":" + dialect + ":") != -1) {
- return dialect;
- }
- }
- return null;
- }
- }