MyBatis动态SQL实现前端指定返回字段

问题描述
在使用ClickHouse时,遇到需要根据业务需求,动态返回指定字段,从而充分利用ClickHouse列式存储的优势。

解决方案
可用MyBatis的动态SQL进行数据返回;故可在业务层将指定返回的列传入数据层,利用foreach标签进行遍历返回数据。

代码实现
1.请求参数

@Data
public class QueryDTO {

    /**
     * 返回值
     */
    private Set<String> targetFields;
}

2.mapper接口

	/**
     * 查询数据
     * @param record
     * @return
     */
    List<ResourceTotal> query(QueryDTO record);

3.mapper.xml实现

  <sql id="Base_Result_Column">
    resourceId, platformCount, createUserId
  </sql>

  <select id="query" parameterType="cn.example.module.data.test.QueryDTO" resultMap="BaseResultMap">
    select
    <foreach collection="targetFields" item="item" separator=",">
      ${item}
    </foreach>
    ,
    <include refid="Base_Result_Column"/>
    from resource_total
    where 1 = 1
  </select>

4.注意事项
a.使用动态返回字段时,不可使用预先编译,故foreach中使用‘$’符号,而不使用‘#’;
b.foreach标签后若还有其他固定字段返回,记得用逗号‘,’分隔。

### 实现MyBatis分页并返回前端的数据处理 在现代Web应用程序中,随着数据量的增长,一次性加载大量数据不仅会消耗过多资源,还会影响用户体验。因此,在服务端实现高效的数据分页机制变得至关重要。对于采用MyBatis作为持久层框架的应用程序而言,利用PageHelper插件可以极大简化这一过程。 #### PageHelper 插件简介 PageHelper是一个专为解决MyBatis分页难题设计的强大工具[^2]。该插件能够在不改变原始SQL语句的前提下,自动为其添加必要的LIMIT和OFFSET子句来完成分页逻辑。更重要的是,由于其实现方式基于AOP(面向切面编程),所以几乎不影响现有业务代码结构,从而降低了维护成本的同时提高了开发效率。 #### 使用PageHelper进行分页查询 为了演示如何使用PageHelper配合MyBatis执行分页查询并将结果集传递给前端展示,下面给出了一段简单的Java代码片段: ```java // 导入所需包 import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageInfo; public class UserService { private UserMapper userMapper; // 假设已经注入了UserMapper实例 public PageInfo<User> getUsersByPage(int pageNum, int pageSize){ // 设置分页参数pageNum表示当前页数;pageSize每页显示记录条数 PageHelper.startPage(pageNum, pageSize); // 执行查询操作,注意这里不需要对原SQL做任何改动 List<User> userList = userMapper.selectAllUsers(); // 将List转换成PageInfo对象以便于后续处理 return new PageInfo<>(userList); } } ``` 上述方法`getUsersByPage()`接收两个整型参数分别代表请求的具体页面编号以及期望获取的最大项数量。通过调用静态方法`startPage()`,可以在接下来的一次查询中启用分页特性。最终得到的结果会被封装到`PageInfo<T>`类里,其中包含了关于总记录数目、实际取得的对象集合以及其他有用的信息。 #### 向前端发送分页后的JSON响应 为了让客户端能够理解服务器传回的数据格式,通常会选择以JSON字符串的形式传输整个`PageInfo`实体或者仅提取部分重要字段组合而成的新POJO(Plain Old Java Object)再序列化输出。以下是构建RESTful API接口的一个例子: ```java @RestController @RequestMapping("/api/users") public class UserController { @Autowired private UserService userService; @GetMapping("/page") public ResponseEntity<Map<String,Object>> getUserPages(@RequestParam Integer page,@RequestParam Integer size){ try{ // 调用service层的方法获得分页信息 PageInfo<User> pageInfo=userService.getUsersByPage(page,size); Map<String,Object> map=new HashMap<>(); // 添加分页详情至map容器准备转化为json串 map.put("total",pageInfo.getTotal()); // 总记录数 map.put("pages",pageInfo.getPages()); // 总页码 map.put("list",pageInfo.getList()); // 当前页数据 return ResponseEntity.ok(map); // 成功则返回HTTP状态码200及body体中的data }catch(Exception e){ log.error(e.getMessage(),e); return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).build(); // 失败则抛出500错误 } } } ``` 此API路径接受GET请求,并解析URL Query String里的`page`与`size`键对应的值用于指定目标页位置及其容量大小。成功后将以标准的HTTP Response形式携带包含有总数目(`total`)、总页数(`pages`)和具体项目列表(`list`)在内的JSON文档回应给浏览器或其他消费者应用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值