目录

1. 数据库层面

MySQL

方法

具体样例

SQL实现方式

第一种写法:Mybatis中mapper.xml可直接用

第二种写法:sql 查询可用, Mybatis中mapper.xml不可用

Mybatis应用

PostgreSQL/SQL Server

Oracle

2. MyBatis 映射器中使用

3. 在服务层或控制器层添加序号

4. 使用MyBatis插件

5. 前端处理


在MyBatis中,为查询结果添加序号通常意味着在返回的结果集中为每一行添加一个唯一的序列号。这个序列号通常是从1开始的整数,用于在展示数据时保持记录的顺序。以下是一些在MyBatis中添加序号的方法:

1. 数据库层面

在SQL查询中直接使用数据库提供的功能来生成序列号。不同的数据库有不同的方法来实现这一点。

MySQL

方法

使用`SET`变量或窗口函数(MySQL 8.0+)。

  SET @row_number = 0;
  SELECT (@row_number:=@row_number + 1) AS row_number, t.*
  FROM (SELECT * FROM your_table) t;

或者使用窗口函数(如果是MySQL 8.0及以上版本):

  SELECT ROW_NUMBER() OVER (ORDER BY some_column) AS row_number, *
  FROM your_table;

具体样例

 mybatis查询结果添加序号效果图

SQL实现方式

第一种写法:Mybatis中mapper.xml可直接用
SELECT
    @i:= @i+ 1 AS row,
    u.create_time
FROM
    user u,
    ( SELECT @i:= 0 ) r

第二种写法:sql 查询可用, Mybatis中mapper.xml不可用
SET @i := 0;
SELECT
	( @i := @i + 1 ) row,
	u.create_time
FROM
	user u

Mybatis应用
SELECT
@i:= @i+ 1 AS ROW,
DATE_FORMAT( u.create_time, '%Y-%m-%d' ) createTime1,
DATE_FORMAT( u.create_time, '%Y-%m' ) createTime2,
DATE_FORMAT( u.create_time, '%Y' ) createTime3
FROM
sf_user u,
( SELECT @i:= 0 ) r

PostgreSQL/SQL Server

使用`ROW_NUMBER()`窗口函数。

  SELECT ROW_NUMBER() OVER (ORDER BY some_column) AS row_number, *
  FROM your_table;

Oracle

使用`ROWNUM`或`ROW_NUMBER()`。

  SELECT ROWNUM, t.*
  FROM (SELECT * FROM your_table ORDER BY some_column) t;

2. MyBatis 映射器中使用 `<resultMap>`

在MyBatis的`<resultMap>`中定义一个额外的字段来处理序号,然后在Java代码中为每条记录设置序号。

<resultMap id="exampleResultMap" type="ExampleType">
  <result property="rowNumber" column="rowNumber"/>
  <!-- 其他字段映射 -->
</resultMap>

然后在Java代码中:

List<ExampleType> results = mapper.getResults();
int rowNumber = 1;
for (ExampleType result : results) {
  result.setRowNumber(rowNumber++);
}

3. 在服务层或控制器层添加序号

在MyBatis查询结果返回之后,在服务层或控制器层遍历结果集合,为每个对象添加序号。

List<YourObject> list = yourMapper.selectYourObjects();
int rowNumber = 1;
for (YourObject obj : list) {
  obj.setRowNumber(rowNumber++);
}

4. 使用MyBatis插件

创建一个MyBatis插件来拦截结果集的处理,为每个结果对象添加序号。这是一个高级的方法,需要对MyBatis插件体系有一定的了解。

@Intercepts({
  @Signature(
    type = ResultSetHandler.class,
    method = "handleResultSets",
    args = {Statement.class}
  )
})
public class RowNumberInterceptor implements Interceptor {
  // 实现插件逻辑
}

5. 前端处理

如果序号仅用于显示,并不需要在服务端处理,可以在前端通过JavaScript等方式在展示数据时动态添加序号, 直接使用索引即可。

data.forEach((item, index) => {
  item.rowNumber = index + 1;
});

Table 组件提供了单选的支持,只需要配置highlight-current-row属性即可实现单选。之后由current-change事件来管理选中时触发的事件,它会传入currentRow,oldCurrentRow。如果需要显示索引,可以增加一列el-table-column,设置type属性为index即可显示从 1 开始的索引号。

<template>
  <el-table
    ref="singleTable"
    :data="tableData"
    highlight-current-row
    @current-change="handleCurrentChange"
    style="width: 100%">
    <el-table-column
      type="index"
      width="50">
    </el-table-column>
    <el-table-column
      property="date"
      label="日期"
      width="120">
    </el-table-column>
    <el-table-column
      property="name"
      label="姓名"
      width="120">
    </el-table-column>
    <el-table-column
      property="address"
      label="地址">
    </el-table-column>
  </el-table>
  <div style="margin-top: 20px">
    <el-button @click="setCurrent(tableData[1])">选中第二行</el-button>
    <el-button @click="setCurrent()">取消选择</el-button>
  </div>
</template>

<script>
  export default {
    data() {
      return {
        tableData: [{
          date: '2016-05-02',
          name: '王小虎',
          address: '上海市普陀区金沙江路 1518 弄'
        }, {
          date: '2016-05-04',
          name: '王小虎',
          address: '上海市普陀区金沙江路 1517 弄'
        }, {
          date: '2016-05-01',
          name: '王小虎',
          address: '上海市普陀区金沙江路 1519 弄'
        }, {
          date: '2016-05-03',
          name: '王小虎',
          address: '上海市普陀区金沙江路 1516 弄'
        }],
        currentRow: null
      }
    },

    methods: {
      setCurrent(row) {
        this.$refs.singleTable.setCurrentRow(row);
      },
      handleCurrentChange(val) {
        this.currentRow = val;
      }
    }
  }
</script>

选择哪种方法取决于你的具体需求和项目的结构。数据库层面的解决方案通常更为高效,但在某些情况下,可能需要在应用程序层面处理,特别是当结果集的排序不是由数据库查询决定的时候。

有用请点赞,养成良好习惯!

疑问、交流、鼓励请留言!

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐