当前位置: 首页 > news >正文

MyBatisPlus查询数据库中所有表的数据(AI)

简介

提供一个完整的解决方案,使用MyBatisPlus查询数据库中所有表的数据,并通过Vue前端展示。

代码

DatabaseExplorerApplication.java


@SpringBootApplication
public class DatabaseExplorerApplication {public static void main(String[] args) {SpringApplication.run(DatabaseExplorerApplication.class, args);}
}

TableInfoController.java

@RestController
@RequestMapping("/api/tables")
public class TableInfoController {@Autowiredprivate DataSource dataSource;@GetMapping("/list")public List<String> listTables() throws SQLException {List<String> tables = new ArrayList<>();try (Connection connection = dataSource.getConnection()) {DatabaseMetaData metaData = connection.getMetaData();ResultSet rs = metaData.getTables(null, null, "%", new String[]{"TABLE"});while (rs.next()) {tables.add(rs.getString("TABLE_NAME"));}}return tables;}@GetMapping("/data/{tableName}")public Map<String, Object> getTableData(@PathVariable String tableName,@RequestParam(defaultValue = "1") int page,@RequestParam(defaultValue = "10") int size) {Page<Map<String, Object>> pageInfo = new Page<>(page, size);SqlRunner sqlRunner = SqlRunner.db();String countSql = "SELECT COUNT(*) FROM " + tableName;String dataSql = "SELECT * FROM " + tableName + " LIMIT " + pageInfo.getSize() + " OFFSET " + (pageInfo.getCurrent() - 1) * pageInfo.getSize();Map<String, Object> result = new HashMap<>();result.put("total", sqlRunner.selectOne(countSql));result.put("records", sqlRunner.selectList(dataSql));return result;}
}

DatabaseExplorer.vue

<template><div class="container mx-auto p-4"><h1 class="text-2xl font-bold mb-4">数据库浏览器</h1><div class="flex gap-4"><div class="w-1/4 bg-gray-100 p-4 rounded"><h2 class="text-lg font-semibold mb-2">表列表</h2><ul class="space-y-1"><li v-for="table in tables" :key="table" @click="selectTable(table)"class="p-2 hover:bg-blue-100 cursor-pointer rounded":class="{ 'bg-blue-200': selectedTable === table }">{{ table }}</li></ul></div><div class="w-3/4"><div v-if="selectedTable" class="bg-white p-4 rounded shadow"><h2 class="text-lg font-semibold mb-4">{{ selectedTable }} 数据</h2><div class="overflow-x-auto"><table class="min-w-full border"><thead><tr class="bg-gray-50"><th v-for="column in columns" :key="column" class="px-4 py-2 text-left border-b">{{ column }}</th></tr></thead><tbody><tr v-for="(row, index) in tableData" :key="index"><td v-for="(value, key) in row" :key="key" class="px-4 py-2 border-b">{{ value }}</td></tr></tbody></table></div><div class="mt-4 flex justify-between items-center"><div>{{ total }} 条记录</div><div class="flex gap-2"><button @click="prevPage" :disabled="currentPage === 1"class="px-3 py-1 bg-gray-200 rounded disabled:opacity-50">上一页</button><span>{{ currentPage }}</span><button @click="nextPage":disabled="currentPage * pageSize >= total"class="px-3 py-1 bg-gray-200 rounded disabled:opacity-50">下一页</button></div></div></div></div></div></div>
</template><script>
import axios from 'axios';export default {data() {return {tables: [],selectedTable: null,tableData: [],columns: [],currentPage: 1,pageSize: 10,total: 0};},async created() {await this.fetchTables();},methods: {async fetchTables() {const response = await axios.get('/api/tables/list');this.tables = response.data;},async selectTable(table) {this.selectedTable = table;this.currentPage = 1;await this.fetchTableData();},async fetchTableData() {const response = await axios.get(`/api/tables/data/${this.selectedTable}`, {params: {page: this.currentPage,size: this.pageSize}});this.tableData = response.data.records;this.total = response.data.total;if (this.tableData.length > 0) {this.columns = Object.keys(this.tableData[0]);}},prevPage() {if (this.currentPage > 1) {this.currentPage--;this.fetchTableData();}},nextPage() {if (this.currentPage * this.pageSize < this.total) {this.currentPage++;this.fetchTableData();}}}
};
</script>

总结

  1. 后端实现使用MyBatisPlus的SqlRunner直接执行SQL查询
  2. 通过DatabaseMetaData获取数据库所有表信息
  3. 前端使用Vue3和TailwindCSS构建响应式界面
  4. 实现表列表展示和表数据分页查询功能
  5. 支持点击表名查看表数据并分页浏览
  6. 自动识别表字段并动态生成表格列
  7. 包含完整的分页导航功能
http://www.lryc.cn/news/611082.html

相关文章:

  • GPU 基础矩阵精规组织教程:从基础作用到实战应用
  • Redis里面什么是sdshdr,可以详细介绍一下吗?
  • 用 Spark 找出最大值:高性能计算的正确姿势
  • 8XC552 系列单片机的定时器 T2 和捕捉比较逻辑是什么
  • 如何通过视觉+自动化组合拳提升UI测试的质量
  • Centos-Stream 10 安装教程(2025版图文教程)
  • Vue2博客项目笔记(第一天)
  • SpringBoot集成STOMP
  • CS231n Lecture11 目标检测和图像分割笔记
  • mq_timedsend系统调用及示例
  • 浮动路由和BFD配置
  • 智能体架构与风险全景:从LLM工作流到OWASP Top 10安全浅谈
  • 本地使用uv管理的python项目怎么部署到服务器?
  • Web存储技术详解:sessionStorage、localStorage与Cookie
  • 每日五个pyecharts可视化图表-bars(4)
  • 手绘风格制图新选择:如何用Excalidraw+cpolar构建你的视觉化工作流?
  • 一次完整的 Docker 启动失败排错之旅:从 `start-limit` 到 `network not found
  • Docker Desktop
  • 利用DeepSeek编写带缓冲输出的V语言程序
  • P1103《书本整理》精讲
  • PowerBI VS QuickBI 实现图表的动态配色
  • linux-系统日志查看指令systemctl
  • 37.【.NET8 实战--孢子记账--从单体到微服务--转向微服务】--扩展功能--增加Github Action
  • STM32U575低功耗调试
  • Rust进阶-part3-生命周期
  • DAY 36 复习日
  • C++进阶—特殊类设计
  • 国产三防平板电脑是什么?三防平板推荐
  • Prometheus 监控平台部署 (云原生环境)
  • C语言基础_补充知识、数据类型转换、选择结构