You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
pageRequest.resetOrder("fo", map)必须写,重置sort里面的order对象,第一个参数为主表别名,没有别名写为fd_organization,第二个参数为map映射关系。主表别名的作用是如果sort=id,asc,会在上面的sql末尾拼接 order by fo.id asc,如果要还想按project_id排序,只能放map里面,用 map.put("projectId", "fp.id")的形式实现。
设置完pageRequest后调用PageHelper.doPageAndSort()方法即可。
<selectid="list"databaseId="mysql"resultMap="user">
select * from user limit 10
</select>
<selectid="list"databaseId="oracle"resultMap="user">
<![CDATA[ select * from user where ROWNUM <= 10]]>
</select>
choerodon-starter-mybatis-mapper
mybatis基础工具包,集成通用Mapper和PageHelper两个开源项目,对源代码根据自身业务逻辑需求进行了精简和修改,扩展了审计字段、多语言功能,并修改了分页插件,添加了插入或更新指定列等功能。
Choerodon微服务里有数据库操作的都使用了这个工具包
Feature
PageHelper嵌套结果查询分页处理,分页查询通用方法抽象。
To get the code
git clone https://rdc.hand-china.com/gitlab/io.choerodon/choerodon-starter-parent.git
Installation and Getting Started
Documentation
通用Mapper原作者文档
PageHelper原作者使用方法
通用Mapper实现原理的介绍
Usage
通用Mapper用法:
新建user表:
对应的dataobject如下:
choerodon-starter-mybatis-mapper
设置了扫描项目下以mapper结尾的文件夹,因此mapper文件和对应的xml文件应放倒mapper文件夹下面,iam结构如下:mapper文件如下:
继承了
BaseMapper
的mapper接口包含了绝大多数单表的增删改查操作,可以满足大多数的简单数据库操作,不用手写sql。如果有复杂的业务逻辑需要手写sql,需要在resource下的mapper文件夹创建与mapper class同名的xml文件,本例中就新建
UserMapper.xml
,id与方法名相同目前为止就可以在reposity里面调用userMapper做增删改查操作了。
同时我们还新建了BaseService类,以组合的方式封装了BaseMapper的方法。需要注意的是
insertOptional
和updateOptional
两个方法,他们都有一个可变参数,用来传如数据库对应的列,只插入或更新指定列的数据。如果不使用BaseService里面的
insertOptional
和updateOptional
方法,而是直接调用userMapper.insertOptional(userDO)
,如下:PageHelper用法:
假如有如下请求
http://localhost:8030/v1/organization/1/users?page=0&size=10&sort=id,desc&sort=organizationId,phone,asc
page是起始页,默认值为0,size是当前页数显示记录数,默认值为20。sort为排序字段,权重从左向右递减,上例表示该查询先按id降序排列,id相同按organizationId升序排列,organizationId相同按phone升序排列。
controller如下:
PageRequest对象对前端传入的page,size和sort参数进行封装。分页查询使用
PageHelper
对象调用分页方法。关于排序的用法下面做详细介绍:
1.单表情况:
单表查询操作不牵扯别名问题,用法简单。controller写法如下:
在controller参数中使用pageRequest对象接收url中的page、size和sort字段。
@SortDefault
注解value为默认排序字段,如果是驼峰,拼接sql会转为下划线;direction为升序(Sort.Direction.ASC
)和降序(Sort.Direction.DESC
)。page和size不传分配默认值,sort不传如果controller配置有@SortDefault
注解,则以注解生成默认值,如果没有配置注解则sort为null。方法调用如下:
2.关联多表查询(只适合简单的关联表查询,如果是极复杂查询请自己写sql):
由于organization和project表都有code和name字段,如果要对organization表的code字段和project表的code字段进行排序,前端url对sort字段传参要做区分,假如是
sort=organizationCode,projectCode,desc
,由于sql中存在别名现象且前端传入的排序字段名也存在认为命名的因素,所以需要建立一个HashMap进行key-value映射,organizationCode指向fo.code,projectCode指向fp.code。这里将fo定义为主表,fp定义为从表。下例是按照organization表的code、name字段和project表的code、name字段排序:
pageRequest.resetOrder("fo", map)
必须写,重置sort里面的order对象,第一个参数为主表别名,没有别名写为fd_organization
,第二个参数为map映射关系。主表别名的作用是如果sort=id,asc
,会在上面的sql末尾拼接order by fo.id asc
,如果要还想按project_id排序,只能放map里面,用map.put("projectId", "fp.id")
的形式实现。设置完pageRequest后调用
PageHelper.doPageAndSort()
方法即可。PageRequest在feign调用时传递
feign调用传递分页参数的�时候,传递
PageRequest
对象,feign会把这个对象当成body,调用post方法请求。但PageRequest
解析器是从url里的?后面截取参数然后放到�PageRequest
对象里,默认的feign编码器会导致调用的时候分页参数丢失,所以mapper里面提供了一个�PageRequestQueryEncoder
,在客户端服务做feign配置如下:feign调用的时候直接传PageRequest对象即可:
xml中存在不兼容的数据库方言怎么处理
mapper提供了一些�常用的DatabaseIdProvider
对于一些不兼容的sql,比如分页方言(这里只是做举例),mysql/oracle/sqlserver都不相同,这个时候只需要在xml里面提供
databaseId
即可注意:
单表动态排序有字段校验,如果传入字段不是数据库字段,抛异常。
多表动态排序暂时没有非法字段校验,如果字段非法,只有在执行sql的时候抛SqlGrammarException,但可以防止sql注入。
这种在sql后面拼order by的操作只能在sql语句的末尾拼接,如果有分页参数,就是在sql语句末尾,分页参数之前拼接。不支持嵌套结果查询在sql的中间部分拼接order by。如果要自定义order by位置目前只能自己手动写sql,把排序字段以参数的形式传入。
Dependencies
Reporting Issues
If you find any shortcomings or bugs, please describe them in the Issue.
How to Contribute
Pull requests are welcome! Follow this link for more information on how to contribute.
Note
不是表中字段的属性必须加
@Transient
注解,这样生成动态sql就不会获取到该列在实体类要在类前面加
@MultiLanguage
注解,开启多语言支持,多语言字段需要加@MultiLanguageField
注解通用 Mapper 不支持 devtools 热加载,devtools 排除实体类包即可,配置方式参考:sing-boot-devtools-customizing-classload
只有紧跟在PageHelper.startPage方法后的第一个Mybatis的查询(Select)方法会被分页。
请不要配置多个分页插件
请不要在系统中配置多个分页插件(使用Spring时,mybatis-serviceConfig.xml和Spring配置方式,请选择其中一种,不要同时配置多个分页插件)!
分页插件不支持带有for update语句的分页
对于带有for update的sql,会抛出运行时异常,对于这样的sql建议手动分页,毕竟这样的sql需要重视。
分页插件不支持嵌套结果映射,由于嵌套结果方式会导致结果集被折叠,因此分页查询的结果在折叠后总数会减少,所以无法保证分页结果数量正确。
The text was updated successfully, but these errors were encountered: