- 浏览: 697792 次
- 性别:
- 来自: 长沙
文章分类
- 全部博客 (364)
- quick start (57)
- bboss aop (43)
- bboss mvc (48)
- bboss persistent (96)
- bboss taglib (30)
- bboss event (10)
- bbossgroups (52)
- bboss (32)
- bboss会话共享 (17)
- bboss rpc (7)
- bboss 国际化 (5)
- bboss 序列化 (9)
- bboss cxf webservice (8)
- bboss hessian (3)
- bboss 安全认证SSO (15)
- bboss 工作流 (6)
- 平台 (18)
- bboss quartz (3)
- 杂谈 (5)
- 大数据 (1)
- bboss elastic (24)
- bboss http (1)
- bboss kafka (1)
- Elasticsearch Scroll和Slice Scroll查询API使用案例 (1)
最新评论
-
qianhao123:
...
采用gradle构建和发布bboss方法介绍 -
qianhao123:
[img][/img]
采用gradle构建和发布bboss方法介绍 -
yin_bp:
欢迎大家参与working
高性能elasticsearch ORM开发库使用介绍 -
qq641879434:
万分感谢
bboss 持久层sql xml配置文件编写和加载方法介绍 -
yin_bp:
qq641879434 写道怎么设置配置文件 可以查看执行的S ...
bboss 持久层sql xml配置文件编写和加载方法介绍
bboss持久层快速上手
bboss持久层分页接口比较有特色,提供了四种Style的分页接口:
第一种Style 根据sql语句直接分页,这种风格是bboss 3.6.0及之前版本一直沿用的接口
第二种Style 根据sql语句和外部传入的总记录数进行分页,这是bboss 3.6.1及之后版本提供的接口
第三种Style 根据sql语句和外部传入的总记录数sql语句进行分页,这是bboss 3.6.1及之后版本提供的接口
第四种Style 使用数据库row_number() over()分析函数结合排序条件实现数据库物理分页
前三种style的支持oracle,mysql,maradb,sqlite,postgres四个主流数据库的高效物理分页,其他数据采用游标机制实现分页(效率相对较低);第4种风格支持oracle,mysql,maradb,sqlite,postgres,derby,ms sql server 2008,db2数据库的高效物理分页(其他类型数据库请采用前面三种风格进行分页)
还有一种不返回总记录数的高效分页查询方法,参考文档:bboss持久层More分页查询API使用介绍
我们根据查询参数的传入方式,分别下面举例介绍四种Style。
1.准备工作-编写一个sql语句配置文件
com/frameworkset/sqlexecutor/purchaseApply.xml
内容如下,用来演示四种Style
说明:
queryMaterialList为分页sql
queryCountMaterialList为查总记录数sql
2.分页查询方法示例代码
举例完毕,如有疑问,请留言进一步探讨。
补充说明一下:ListInfo对象包含当页记录集和总记录数以及每页最多纪录数,如果是more分页查询,还包含了more分页标识
bboss持久层分页接口比较有特色,提供了四种Style的分页接口:
第一种Style 根据sql语句直接分页,这种风格是bboss 3.6.0及之前版本一直沿用的接口
第二种Style 根据sql语句和外部传入的总记录数进行分页,这是bboss 3.6.1及之后版本提供的接口
第三种Style 根据sql语句和外部传入的总记录数sql语句进行分页,这是bboss 3.6.1及之后版本提供的接口
第四种Style 使用数据库row_number() over()分析函数结合排序条件实现数据库物理分页
前三种style的支持oracle,mysql,maradb,sqlite,postgres四个主流数据库的高效物理分页,其他数据采用游标机制实现分页(效率相对较低);第4种风格支持oracle,mysql,maradb,sqlite,postgres,derby,ms sql server 2008,db2数据库的高效物理分页(其他类型数据库请采用前面三种风格进行分页)
还有一种不返回总记录数的高效分页查询方法,参考文档:bboss持久层More分页查询API使用介绍
我们根据查询参数的传入方式,分别下面举例介绍四种Style。
1.准备工作-编写一个sql语句配置文件
com/frameworkset/sqlexecutor/purchaseApply.xml
内容如下,用来演示四种Style
<?xml version="1.0" encoding="UTF-8"?> <properties> <property name="queryMaterialList"> <![CDATA[ select * from td_app_bom where id=#[id] ]]> </property> <property name="queryCountMaterialList"> <![CDATA[ select count(1) from td_app_bom where id=#[id] ]]> </property> <property name="queryMaterialListbindParam"> <![CDATA[ select * from td_app_bom where id=? ]]> </property> <property name="queryCountMaterialListbindParam"> <![CDATA[ select count(1) from td_app_bom where id=? ]]> </property> <property name="testsqlinfo"><![CDATA[select * from TD_APP_BOM]]></property> <property name="ROW_NUMBERquery"><![CDATA[select * from TD_APP_BOM where 1=1 #if($bm && !$bm.equals("")) and bm = #[bm] #end #if($app_name_en && !$app_name_en.equals("")) and app_name_en like #[app_name_en] #end #if($app_name && !$app_name.equals("")) and app_name like #[app_name] #end #if($soft_level && !$soft_level.equals("")) and soft_level=#[soft_level] #end #if($state && !$state.equals("")) and state=#[state] #end #if($rd_type && !$rd_type.equals("")) and rd_type=#[rd_type] #end ]]></property> <property name="ROW_NUMBERquery_orderby"><![CDATA[ #if($sortKey && !$sortKey.equals("")) order by $sortKey #if($sortDESC ) desc #else asc #end #else order by bm #end]]></property> </properties>
说明:
queryMaterialList为分页sql
queryCountMaterialList为查总记录数sql
2.分页查询方法示例代码
public class ApplyService { private com.frameworkset.common.poolman.ConfigSQLExecutor executor = new ConfigSQLExecutor("com/frameworkset/sqlexecutor/purchaseApply.xml"); /*******************************以bean方式传递查询条件开始*******************************/ public ListInfo queryMaterailListInfoFirstStyleBean(int offset, int pagesize ,PurchaseApplyCondition condition) throws Exception { //执行分页查询,queryMaterialList对应分页查询语句, //根据sql语句在分页方法内部执行总记录数查询操作,这种风格使用简单,效率相对较低 //condition参数保存了查询条件 return executor.queryListInfoBean(HashMap.class, "queryMaterialList", offset, pagesize,condition); } public ListInfo queryMaterailListInfoSecondStyleBean(int offset, int pagesize ,PurchaseApplyCondition condition) throws Exception { //执行总记录查询并存入totalSize变量中,queryCountMaterialList对应一个优化后的总记录查询语句 //condition参数保存了查询条件 long totalSize = executor.queryObjectBean(long.class, "queryCountMaterialList", condition); //执行总记分页查询,queryMaterialList对应分页查询语句,通过totalsize参数从外部传入总记录数, //这样在分页方法内部无需执行总记录数查询操作,以便提升系统性能,这种风格使用简单,效率相对第一种风格较高,但是要额外配置总记录数查询sql //condition参数保存了查询条件 return executor.queryListInfoBean(HashMap.class, "queryMaterialList", offset, pagesize,totalSize ,condition); } public ListInfo queryMaterailListInfoThirdStyleBean(int offset, int pagesize ,PurchaseApplyCondition condition) throws Exception { //根据sql语句和外部传入的总记录数sql语句进行分页,这种风格使用简单,效率最高,但是要额外配置总记录数查询sql ListInfo list = executor.queryListInfoBeanWithDBName(HashMap.class, "bspf","queryMaterialList", 0, 10,"queryCountMaterialList" ,condition); return list; } /*******************************以bean方式传递查询条件结束*******************************/ /*******************************以传统绑定变量方式传递查询条件开始*******************************/ public ListInfo queryMaterailListInfoFirstStyle(int offset, int pagesize ,String id) throws Exception { //执行分页查询,queryMaterialList对应分页查询语句, //根据sql语句在分页方法内部执行总记录数查询操作,这种风格使用简单,效率相对较低 //id参数保存了查询条件 return executor.queryListInfo(HashMap.class, "queryMaterialListbindParam", offset, pagesize,id); } public ListInfo queryMaterailListInfoSecondStyle(int offset, int pagesize ,String id) throws Exception { //执行总记录查询并存入totalSize变量中,queryCountMaterialList对应一个优化后的总记录查询语句 //id参数保存了查询条件 long totalSize = executor.queryObject(long.class, "queryCountMaterialListbindParam",id); //执行总记分页查询,queryMaterialList对应分页查询语句,通过totalsize参数从外部传入总记录数, //这样在分页方法内部无需执行总记录数查询操作,以便提升系统性能,这种风格使用简单,效率相对第一种风格较高,但是要额外配置总记录数查询sql //id参数保存了查询条件 return executor.queryListInfoWithTotalsize(HashMap.class, "queryMaterialListbindParam", offset, pagesize,totalSize,id ); } public ListInfo queryMaterailListInfoThirdStyle(int offset, int pagesize ,String id) throws Exception { //根据sql语句和外部传入的总记录数sql语句进行分页,这种风格使用简单,效率最高,但是要额外配置总记录数查询sql,id参数保存了查询条件 ListInfo list = executor.queryListInfoWithDBName2ndTotalsizesql(HashMap.class, "bspf","queryMaterialListbindParam", 0, 10,"queryCountMaterialListbindParam",id ); return list; } /*******************************以传统绑定变量方式传递查询条件结束*******************************/ /********************************第四种风格测试用例开始******/ public @Test void testoraclerownumoverorderby() throws Exception { testsqlinfoorderby("oracle"); } public @Test void testmysqlrownumoverorderby() throws Exception { testsqlinfoorderby("mysql"); } public @Test void testderbyrownumoverorderby() throws Exception { testsqlinfoorderby("derby"); } public @Test void testsqliterownumoverorderby() throws Exception { testsqliteorderby("sqlite"); } public @Test void testdb2rownumoverorderby() throws Exception { testsqlinfoorderby("db2"); } public @Test void testpostgresrownumoverorderby() throws Exception { testsqlinfoorderby("postgres"); } public @Test void testmssqlrownumoverorderby() throws Exception { testsqlinfoorderby("mssql"); } public void testsqlinfoorderby(String dbname) throws Exception { //读取配置文件中的原生sql(select * from TD_APP_BOM where bm like ?),通过PlainPagineOrderby(原生排序条件封装对象)对象构造函数传入分页排序条件order by bm,分页pageisize=10参数和PlainPagineOrderby之间的是其他绑定变量参数条件 ListInfo list = executor.queryListInfoWithDBName (HashMap.class, dbname,"testsqlinfo", 0, 10,'%c%',new PlainPagineOrderby("order by bm")); Map params = new HashMap(); params.put("app_name_en", "%C%"); //读取配置文件中的模板sql,通过PlainPagineOrderby(原生排序条件封装对象)对象传入分页排序条件order by bm和其他模板变量参数条件对象 list = executor.queryListInfoBeanWithDBName (HashMap.class, dbname,"ROW_NUMBERquery", 0, 10,new PlainPagineOrderby("order by bm",params)); StringBuilder orderby = new StringBuilder(); orderby.append(" #if($sortKey && !$sortKey.equals(\"\"))") .append(" order by $sortKey ") .append(" #if($sortDESC )") .append(" desc ") .append(" #else") .append(" asc") .append(" #end") .append(" #else") .append(" order by bm ") .append(" #end"); //读取配置文件中的模板sql,通过PagineOrderby(模板动态排序条件封装对象)对象传入分页动态排序条件和其他模板变量参数条件对象 list = executor.queryListInfoBeanWithDBName (HashMap.class, dbname,"ROW_NUMBERquery", 0, 10,new PagineOrderby(orderby.toString(),params)); params.put("sortKey", "id"); params.put("sortDESC", true); //调整排序字段为id,设置排序顺序为降序,读取配置文件中的模板sql,通过ConfigPagineOrderby(模板动态排序条件封装对象,但是只是指定了一个排序条件的名称,实际是从配置文件读取的)对象传入分页动态排序条件和其他模板变量参数条件对象 list = executor.queryListInfoBeanWithDBName (HashMap.class, dbname,"ROW_NUMBERquery", 0, 10,new ConfigPagineOrderby("ROW_NUMBERquery_orderby",params)); //三个SQLExecutor排序分页接口使用用法,除了没有ConfigPagineOrderby分页封装方式外,使用方法与ConfigSQLExecutor使用方法一致 //SQLExecutor直接操作原生sql(select * from TD_APP_BOM where bm like ?)做分页查询,通过PlainPagineOrderby(原生排序条件封装对象)对象构造函数传入分页排序条件order by bm,分页pageisize=10参数和PlainPagineOrderby之间的是其他绑定变量参数条件, list = SQLExecutor.queryListInfoWithDBName (HashMap.class, dbname,"select * from TD_APP_BOM", 0, 10,new PlainPagineOrderby("order by bm")); StringBuilder testsqlinfoorderby = new StringBuilder(); testsqlinfoorderby.append("select * from TD_APP_BOM where 1=1") .append(" #if($bm && !$bm.equals(\"\"))") .append(" and bm = #[bm]") .append(" #end") .append(" #if($app_name_en && !$app_name_en.equals(\"\"))") .append(" and app_name_en like #[app_name_en]") .append(" #end") .append(" #if($app_name && !$app_name.equals(\"\"))") .append(" and app_name like #[app_name]") .append(" #end") .append(" #if($soft_level && !$soft_level.equals(\"\"))") .append(" and soft_level=#[soft_level]") .append(" #end") .append(" #if($state && !$state.equals(\"\"))") .append(" and state=#[state]") .append(" #end") .append(" #if($rd_type && !$rd_type.equals(\"\"))") .append(" and rd_type=#[rd_type]") .append(" #end"); list = SQLExecutor.queryListInfoBeanWithDBName (HashMap.class, dbname,testsqlinfoorderby.toString(), 0, 10,new PlainPagineOrderby("order by bm",params)); list = SQLExecutor.queryListInfoBeanWithDBName (HashMap.class, dbname,testsqlinfoorderby.toString(), 0, 10,new PagineOrderby(orderby.toString(),params)); return ; } public void testsqliteorderby(String dbname) throws Exception { //根据sql语句和外部传入的总记录数sql语句进行分页,这种风格使用简单,效率最高,但是要额外配置总记录数查询sql ListInfo list = null; Map params = new HashMap(); params.put("moudleName", "%t%"); StringBuilder orderby = new StringBuilder(); orderby.append(" #if($sortKey && !$sortKey.equals(\"\"))") .append(" order by $sortKey ") .append(" #if($sortDESC )") .append(" desc ") .append(" #else") .append(" asc") .append(" #end") .append(" #else") .append(" order by moudleName ") .append(" #end"); list = SQLExecutor.queryListInfoWithDBName (HashMap.class, dbname,"select * from BBOSS_GENCODE", 0, 3,new PlainPagineOrderby("order by moudleName")); StringBuilder testsqlinfoorderby = new StringBuilder(); testsqlinfoorderby.append("select * from BBOSS_GENCODE where 1=1") .append(" #if($DBNAME && !$DBNAME.equals(\"\"))") .append(" and DBNAME = #[DBNAME]") .append(" #end") .append(" #if($moudleName && !$moudleName.equals(\"\"))") .append(" and moudleName like #[moudleName]") .append(" #end") ; list = SQLExecutor.queryListInfoBeanWithDBName (HashMap.class, dbname,testsqlinfoorderby.toString(), 0, 3,new PlainPagineOrderby("order by moudleName",params)); params.put("sortKey", "id"); params.put("sortDESC", true); list = SQLExecutor.queryListInfoBeanWithDBName (HashMap.class, dbname,testsqlinfoorderby.toString(), 0, 3,new PagineOrderby(orderby.toString(),params)); return ; } /********************************第四种风格测试用例结束******/ }
举例完毕,如有疑问,请留言进一步探讨。
补充说明一下:ListInfo对象包含当页记录集和总记录数以及每页最多纪录数,如果是more分页查询,还包含了more分页标识
发表评论
-
bboss 持久层数据源引用外部属性配置介绍
2018-12-29 21:47 1099bboss 持久层数据源外部属性配置引用介绍 bboss持久 ... -
bboss持久层开启和关闭自带主键机制
2017-08-17 11:56 755bboss持久层开启和关闭自带主键机制 请访问文档: bbos ... -
bboss高性能db批处理功能使用方法介绍
2017-05-14 21:28 2148bboss持久层在v5.0.3.5中新增简单的高效的db批处理 ... -
bboss持久层公共sql片段定义和引用方法说明
2017-03-03 13:05 1130bboss持久层公共sql片段定义和引用方法说明 在配置sq ... -
最新版本mysql jdbc驱动包获取表定义信息空指针异常处理方法
2016-12-15 10:24 1366在使用最新的mysql-connector-java 6.0. ... -
持久层快速入门系列一
2016-08-19 13:00 1266持久层快速入门 先在应用中导入bboss 持久层(bboss ... -
bboss与spring中配置和引用bboss数据源和bboss dao组件方法说明
2016-08-10 16:04 922首先在项目中导入bboss 持久层包: maven坐标 & ... -
bboss 持久层sql xml配置文件编写和加载方法介绍
2016-04-05 13:14 1699bboss 持久层sql xml配置文件编写和加载方法介绍 通 ... -
bboss持久层设置数据库查询fetchsize参数方法
2015-11-06 11:54 1018bboss持久层设置数据库查询fetchsize参数方法 j ... -
bboss持久层快速入门教程
2015-09-19 13:49 1594bboss持久层快速入门教程,快速搭建bboss持久层的开 ... -
bboss持久层数据库适配器编写和注册方法
2015-02-06 15:21 978bboss持久层数据库适配器编写和注册方法 bboss持久层默 ... -
bboss模糊查询、动态sql、批处理资料荟萃
2015-01-30 12:03 2375bboss模糊查询、动态sql、批处理资料荟萃 bboss持 ... -
bboss持久层查询元数据缓存机制开启方法
2014-11-18 12:03 1024bboss持久层为了提升数据库查询操作性能,提供了对查 ... -
bboss内置数据源apache dbcp与druid数据源切换方法
2014-09-23 09:59 1391bboss内置数据源与druid数据源切换方法 bboss内置 ... -
bboss持久层多数据源配置及多数据库事务控制使用方法
2014-05-11 20:24 2980bboss持久层多数据源配置及使用方法,持久层框架及demo下 ... -
bboss持久层demo使用说明
2014-03-11 09:38 1219持久层案例可以用svn客户端下载eclipse工程,导入ecl ... -
bboss持久层More分页查询API使用介绍
2013-10-18 16:17 1486为了更好地提高数据库分页查询的效率,bboss持久层在Conf ... -
bboss持久层操作Clob和Blob字段示例
2013-09-09 13:29 1232bboss持久层操作Clob和Blob非常方便,基于bboss ... -
bboss持久层ormaping机制详解
2013-09-04 21:04 1161bboss持久层针对db操作即提供了原始sql语句的支持,又提 ... -
bboss持久层改进支持模块sql配置文件引用其它模块sql配置文件中sql语句
2013-09-01 22:23 936bboss持久层改进支持模块sql配置文件引用其它模块sql配 ...
相关推荐
bboss-plugins project.包含kafka、log4j、spring、dubbo、activemq、word转pdf、pdf转swf项目,持久层hibernate/hibernate4插件
在`demo`这个文件中,可能包含了使用bboss操作Elasticsearch的基本示例代码。例如,创建索引、插入文档、执行查询等。通常,这些示例会展示如何初始化bboss客户端,如何构造和执行DSL查询,以及如何处理返回结果。 ...
该项目为bboss插件集的Java设计源码,总计277个文件,涵盖163个Java源文件、22个XML配置文件、14个Gradle构建脚本、13个Git忽略规则、13个属性文件以及少量的JavaScript、HTML、CSS和Shell脚本,主要用于文档转换和...
除了`<property-placeholder>`标签,BBoss还支持使用`<context:property-placeholder>`标签,它是Spring框架的一部分,也可以与BBoss集成使用。这种方式的配置类似,但提供了更多的选项,如默认值、忽略未定义的属性...
在“bboss mvc开发手册.doc”中,我们可能会找到关于如何使用BBoss MVCDemo进行开发的详细指南。 首先,让我们深入了解BBoss MVCDemo的核心特性: 1. **模型(Model)**:BBoss MVCDemo支持多种数据访问方式,如JDBC...
最后,bboss会话共享的逻辑架构要求遵循Servlet 2/3规范API,通过HttpSession接口获取会话数据。通过这样的实现,bboss会话共享不仅在技术层面解决了会话管理的难题,还确保了与业界主流技术的兼容性,提高了系统的...
2. **数据库操作**:BBoss提供了便捷的数据访问层(DAO),支持SQL动态生成、事务管理以及多种数据库的兼容性,使得数据库操作变得简单且高效。 3. **服务治理**:框架内置了服务注册与发现机制,可以实现微服务...
本实例是一个基于bboss es spring boot starter的demo maven工程,可供spring boot项目集成bboss elasticsearch rest client参考 展示了通过spring boot管理单集群功能和管理多集群功能 单集群测试用例:...
**Elasticsearch 开发环境搭建与 BBoss 入门教程** ...通过提供的视频教程和源码示例,你可以逐步学习到环境配置、基本操作以及一些进阶技能,从而在实际项目中更有效地利用 Elasticsearch 和 BBoss。
弹性Tran老板数据交换模块使用文档: : Bboss是一个很好的Elasticsearch Java Rest客户端。 它运行并访问像mybatis这样的elasticsearch来关联数据库。环境要求JDK要求:JDK 1.7+ Elasticsearch版本要求:1.X,2.X,5...
3. `bboss-util-5.5.0.jar`和`bboss-persistent-5.5.0.jar`:这是BBoss框架的核心组件,提供了许多实用工具类和持久化操作支持,如数据库连接、事务管理等,为Elasticsearch的数据导入提供底层支持。 4. `...
**bboss-datatran** 是一个由 **bboss** 社区开源的高效数据处理工具,专注于数据采集、数据清洗转换以及数据入库等任务。...通过深入学习和使用bboss-datatran,用户可以提升数据处理效率,更好地挖掘数据的价值。
压缩包中的`db-elasticsearch-tool`可能包含了框架的核心库、示例代码、文档和配置文件,帮助用户快速理解和使用这个框架。通过阅读源码、查看示例和文档,开发人员可以深入理解BBoss-DB-Elasticsearch-Tool的工作...
springboot集成ElasticsearchBboss调用Elasticsearch的案例分享
BBoss Persistent是一个轻量级的持久层框架,它提供了方便的方式来处理这些大字段。本文将深入探讨在BBoss Persistent 1.0.2中如何高效地管理CLOB和BLOB数据。 首先,CLOB用于存储大量的文本数据,如长篇文章或XML...
BBoss安全认证过滤器是Java Web开发中一种用于实现用户身份验证和权限控制的重要组件。在Web应用程序中,过滤器(Filter)是Servlet规范的一部分,它允许开发者在请求到达目标Servlet或JSP之前进行预处理,以及在...
提供的"bboss+easyui帮助文档"应该包含了这两个框架的详细使用指南、示例代码以及常见问题解答。文档通常会涵盖以下内容: 1. **BBoss框架入门**:介绍如何安装配置BBoss,以及创建第一个项目的基本步骤。 2. **...
bboss功能涵盖ioc,mvc,jsp自定义标签库,持久层,全局事务托管,安全认证,SSO,web会话共享,cxfwebservice服务发布和管理,hessian服务发布和管理等功能。另外还提供了符合中国式自由流的bboss activiti工作流...