文档章节

JdbcDao 兼容 mysql 和oracle的 分页 方法,

打杂uu
 打杂uu
发布于 2014/08/15 17:17
字数 1118
阅读 95
收藏 2
@Repository("jdbcDao")
public class JdbcDao extends SimpleJdbcTemplate {

 /**
  * 数据库类型
  */
 public static final String DATABSE_TYPE_MYSQL = "mysql";
 public static final String DATABSE_TYPE_POSTGRE = "postgresql";
 public static final String DATABSE_TYPE_ORACLE = "oracle";
 public static final String DATABSE_TYPE_SQLSERVER = "sqlserver";
 /**
  * 分页SQL
  */
 public static final String MYSQL_SQL = "select * from ( {0}) sel_tab00 limit {1},{2}"; // mysql
 public static final String POSTGRE_SQL = "select * from ( {0}) sel_tab00 limit {2} offset {1}";// postgresql
 
 
 
 public static final String ORACLE_SQL =
 "select * from (select row_.*,rownum rownum_ from ({0}) row_ where rownum <= {1}) where rownum_>{2}"; // oracle

 
 
 public static final String SQLSERVER_SQL = 
 "select * from ( select row_number() over(order by tempColumn) tempRowNumber, * from (select top {1} tempColumn = 0, {0}) t ) tt where tempRowNumber > {2}"; // sqlserver

 @Autowired
 public JdbcDao(DataSource dataSource) {
 super(dataSource);
 }

 /**
  * 根据sql语句,返回对象集合
  * 
  * @param  sql语句
  *            (参数用冒号加参数名,例如select * from tb where id=:id)
  * @param  clazz类型
  * @param  parameters参数集合
  *            (key为参数名,value为参数值)
  * @return bean对象集合
  */
 public List find(String sql, Class clazz, Map parameters) {
 return super.find(sql, clazz, parameters);
 }

 /**
  * 根据sql语句,返回对象
  * 
  * @param sql语句
  *            (参数用冒号加参数名,例如select * from tb where id=:id)
  * @param clazz类型
  * @param parameters参数集合
  *            (key为参数名,value为参数值)
  * @return bean对象
  */
 public Object findForObject(String sql, Class clazz, Map parameters) {
 return super.findForObject(sql, clazz, parameters);
 }

 /**
  * 根据sql语句,返回数值型返回结果
  * 
  * @param sql语句
  *            (参数用冒号加参数名,例如select count(*) from tb where id=:id)
  * @param parameters参数集合
  *            (key为参数名,value为参数值)
  * @return bean对象
  */
 public long findForLong(String sql, Map parameters) {
 return super.findForLong(sql, parameters);
 }

 /**
  * 根据sql语句,返回Map对象,对于某些项目来说,没有准备Bean对象,则可以使用Map代替Key为字段名,value为值
  * 
  * @param sql语句
  *            (参数用冒号加参数名,例如select count(*) from tb where id=:id)
  * @param parameters参数集合
  *            (key为参数名,value为参数值)
  * @return bean对象
  */
 public Map findForMap(String sql, Map parameters) {
 return super.findForMap(sql, parameters);
 }

 /**
  * 根据sql语句,返回Map对象集合
  * 
  * @see findForMap
  * @param sql语句
  *            (参数用冒号加参数名,例如select count(*) from tb where id=:id)
  * @param parameters参数集合
  *            (key为参数名,value为参数值)
  * @return bean对象
  */
 public List<Map<String, Object>> findForListMap(String sql, Map parameters) {
 return super.findForListMap(sql, parameters);
 }

 /**
  * 执行insert,update,delete等操作<br>
  * 例如insert into users (name,login_name,password)
  * values(:name,:loginName,:password)<br>
  * 参数用冒号,参数为bean的属性名
  * 
  * @param sql
  * @param bean
  */
 public int executeForObject(String sql, Object bean) {
 return super.executeForObject(sql, bean);
 }

 /**
  * 执行insert,update,delete等操作<br>
  * 例如insert into users (name,login_name,password)
  * values(:name,:login_name,:password)<br>
  * 参数用冒号,参数为Map的key名
  * 
  * @param sql
  * @param parameters
  */
 public int executeForMap(String sql, Map parameters) {
 return super.executeForMap(sql, parameters);
 }

 /*
  * 批量处理操作 例如:update t_actor set first_name = :firstName, last_name =
  * :lastName where id = :id 参数用冒号
  */
 public int[] batchUpdate(final String sql, List<Object[]> batch) {
 return super.batchUpdate(sql, batch);
 }

 /**
  * 使用指定的检索标准检索数据并分页返回数据
  */
 public List<Map<String, Object>> findForJdbc(String sql, int page, int rows) {
 // 封装分页SQL
 sql = jeecgCreatePageSql(sql, page, rows);
 return this.jdbcTemplate.queryForList(sql);
 }

 public List<Map<String, Object>> findForJdbc(String sql, Object... objs) {
 return this.jdbcTemplate.queryForList(sql, objs);
 }

 /**
  * 使用指定的检索标准检索数据并分页返回数据
  * 
  * @throws IllegalAccessException
  * @throws InstantiationException
  */
 public List<T> findObjForJdbc(String sql, int page, int rows, Class<T> clazz) {
 List<T> rsList = new ArrayList<T>();
 // 封装分页SQL
 sql = jeecgCreatePageSql(sql, page, rows);
 List<Map<String, Object>> mapList = jdbcTemplate.queryForList(sql);

 T po = null;
 for (Map<String, Object> m : mapList) {
 try {
 po = clazz.newInstance();
 MyBeanUtils.copyMap2Bean_Nobig(po, m);
 rsList.add(po);
 } catch (Exception e) {
 e.printStackTrace();
 }
 }
 return rsList;
 }

 /**
  * 使用指定的检索标准检索数据并分页返回数据-采用预处理方式
  * 
  * @param criteria
  * @param firstResult
  * @param maxResults
  * @return
  * @throws DataAccessException
  */
 public List<Map<String, Object>> findForJdbcParam(String sql, int page,
 int rows, Object... objs) {
 // 封装分页SQL
 sql = jeecgCreatePageSql(sql, page, rows);
 return jdbcTemplate.queryForList(sql, objs);
 }

 public Map<String, Object> findOneForJdbc(String sql, Object... objs) {
 try {
 return this.jdbcTemplate.queryForMap(sql, objs);
 } catch (EmptyResultDataAccessException e) {
 return null;
 }
 }

 /**
  * 使用指定的检索标准检索数据并分页返回数据For JDBC
  */
 public Long getCountForJdbc(String sql) {
 return jdbcTemplate.queryForLong(sql);
 }

 /**
  * 使用指定的检索标准检索数据并分页返回数据For JDBC-采用预处理方式
  * 
  */
 public Long getCountForJdbcParam(String sql, Object... objs) {
 return jdbcTemplate.queryForLong(sql, objs);
 }

 public Integer executeSql2(String sql, List<Object> param) {
 return this.jdbcTemplate.update(sql, param);
 }

 public Integer executeSql(String sql, Object... param) {
 return this.jdbcTemplate.update(sql, param);
 }

 public Integer countByJdbc(String sql, Object... param) {
 return this.jdbcTemplate.queryForInt(sql, param);
 }

 /**
  * 按照数据库类型,封装SQL
  */
 public static String jeecgCreatePageSql(String sql, int page, int rows) {
 int beginNum = (page - 1) * rows;
 String[] sqlParam = new String[3];
 sqlParam[0] = sql;
 sqlParam[1] = beginNum + "";
 sqlParam[2] = rows + "";
 if (ResourceUtil.getJdbcUrl().indexOf(DATABSE_TYPE_MYSQL) != -1) {
 sql = MessageFormat.format(MYSQL_SQL, sqlParam);
 } else if (ResourceUtil.getJdbcUrl().indexOf(DATABSE_TYPE_POSTGRE) != -1) {
 sql = MessageFormat.format(POSTGRE_SQL, sqlParam);
 } else {
 int beginIndex = (page - 1) * rows;
 int endIndex = beginIndex + rows;
 sqlParam[2] = Integer.toString(beginIndex);
 sqlParam[1] = Integer.toString(endIndex);
 if (ResourceUtil.getJdbcUrl().indexOf(DATABSE_TYPE_ORACLE) != -1) {
 sql = MessageFormat.format(ORACLE_SQL, sqlParam);
 } else if (ResourceUtil.getJdbcUrl()
 .indexOf(DATABSE_TYPE_SQLSERVER) != -1) {
 sqlParam[0] = sql.substring(getAfterSelectInsertPoint(sql));
 sql = MessageFormat.format(SQLSERVER_SQL, sqlParam);
 }
 }
 return sql;
 }

 private static int getAfterSelectInsertPoint(String sql) {
 int selectIndex = sql.toLowerCase().indexOf("select");
 int selectDistinctIndex = sql.toLowerCase().indexOf("select distinct");
 return selectIndex + (selectDistinctIndex == selectIndex ? 15 : 6);
 }
}


© 著作权归作者所有

打杂uu

打杂uu

粉丝 41
博文 103
码字总数 89809
作品 0
天津
程序员
私信 提问
Mybatis Generator Plus

1.介绍: MyBatis generator plus 基于mybatis-generator-core v.1.3.2 扩展,增加如下主要特性: 生成支持Oracle、Mysql、Sqlserver分页查询的代码: //分页查询demoOperateLogExample relatio...

handosme_w
2017/01/20
0
2
Mybatis 分页插件 3.1.0 发布

使用方式 在Mybatis的配置xml中配置拦截器插件: 这里的PageHelper要使用完整的类路径,需要加上包路径。 增加dialect属性,使用时必须指定该属性,可选值为oracle和mysql,该参数没有默认值,...

Liuzh_533
2014/05/23
3.9K
48
通用数据库访问层--dexcoder-dal

核心组件dexcoder-dal使用说明 如果你不喜欢用Hibernate、Mybaits这类ORM框架,喜欢JdbcTemplate或DbUtils,那么可以试试这个封装的通用dal,这可能是目前封装的最方便易用的通用dal层了。 ...

首席的哥队长
2015/12/24
1K
6
数据库查询返回特定结果即分页查询

1 几种不同数据库的不同的分页写法: a mysql a) 查询前n条记录select * from table_name limit 0,nb) 查询第n条到第m条select * from table_name limit n,m b oracle a)查询前n条记录selec...

王小明123
2013/06/08
0
0
Mybatis 分页插件 PageHelper 4.2.0 发布

Mybatis分页插件 - PageHelper 如果你也在用Mybatis,建议尝试该分页插件,这一定是最方便使用的分页插件。 分页插件支持任何复杂的单表、多表分页,部分特殊情况请看重要提示。 想要使用分页...

Liuzh_533
2016/12/09
6.1K
18

没有更多内容

加载失败,请刷新页面

加载更多

GMTC2019|闲鱼-基于Flutter的架构演进与创新

作者:闲鱼技术-宗心 2012年应届毕业加入阿里巴巴,主导了闲鱼基于Flutter的新混合架构,同时推进了Flutter在闲鱼各业务线的落地。未来将持续关注终端技术的演变及趋势 Flutter的优势与挑战 ...

阿里云云栖社区
14分钟前
2
0
迪蒙人工智能共享停车吸引国际关注

  近来,华为创始人任正非多次提及人工智能。即便在华为生死攸关的关键时刻,任正非依旧不忘强调教育的重要性,“如果不重视教育,实际上我们会重返贫穷的,因为这个社会,最终是要走向人工智能的...

琴殇的
15分钟前
0
0
iOS开发之EventKitUI框架的应用

iOS开发之EventKitUI框架的应用 前面博客,有介绍EventKit这个框架的使用,使用EventKit可以与系统的日历和提醒应用进行交互,读写用户的日程事件。EventKitUI,顾名思义,其实基于EventKit框...

珲少
23分钟前
0
0
从MySQL源码看其网络IO模型

从MySQL源码看其网络IO模型 前言 MySQL是当今最流行的开源数据库,阅读其源码是一件大有裨益的事情(虽然其代码感觉比较凌乱)。而笔者阅读一个Server源码的习惯就是先从其网络IO模型看起。于是...

无毁的湖光-Al
24分钟前
0
0
WebService学习笔记

什么是Web Services? Web Services 是应用程序组件 Web Services 使用开放协议进行通信 Web Services 是独立的(self-contained)并可自我描述 Web Services 可通过使用UDDI来发现 Web Serv...

榴莲黑芝麻糊
40分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部