[Java 实现垂直分表 ]

目录

前言:

   记录一个小笔记而已,

创建数据库和表

配置数据源和 MyBatis

编写 Mapper 和 Service

配置事务管理器

以上代码展示了垂直分表的实现。具体来说:


前言:

   记录一个小笔记而已.....有问题欢迎提出来

垂直分表是指将一个大的表按照业务模块或表的类型进行划分,将不同的业务模块或表分别保存到不同的表中。

创建数据库和表

假设有一个电商系统,包括用户表和订单表。首先创建一个数据库 ecommerce,并在其中创建用户表 user 和订单表 order

CREATE DATABASE ecommerce;

USE ecommerce;
CREATE TABLE user (
    id INT PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(50) NOT NULL,
    age INT NOT NULL,
    address VARCHAR(100) NOT NULL,
    phone VARCHAR(20) NOT NULL
);

CREATE TABLE order (
    id INT PRIMARY KEY AUTO_INCREMENT,
    user_id INT NOT NULL,
    amount DECIMAL(10,2) NOT NULL,
    created_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    status INT NOT NULL
);
  1. 配置数据源和 MyBatis

在项目中配置一个数据源,对应 ecommerce 数据库。在 MyBatis 中,可以使用 @Mapper 注解和 @Qualifier 注解来指定数据源和使用对应的 mapper。

@Configuration
@MapperScan(basePackages = {"com.example.ecommerce.mapper"}, annotationClass = Mapper.class,
        sqlSessionTemplateRef = "ecommerceSqlSessionTemplate")
public class EcommerceDatabaseConfig {
    @Bean
    @ConfigurationProperties(prefix = "spring.datasource.ecommerce")
    public DataSource ecommerceDataSource() {
        return DataSourceBuilder.create().build();
    }

    @Bean
    public SqlSessionFactory ecommerceSqlSessionFactory(@Qualifier("ecommerceDataSource") DataSource dataSource) throws Exception {
        SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
        bean.setDataSource(dataSource);
        return bean.getObject();
    }

    @Bean
    public SqlSessionTemplate ecommerceSqlSessionTemplate(@Qualifier("ecommerceSqlSessionFactory") SqlSessionFactory sqlSessionFactory) {
        return new SqlSessionTemplate(sqlSessionFactory);
    }
}
  1. 编写 Mapper 和 Service

根据业务模块或表的类型,将相应的字段分别保存到不同的表中。在 Mapper 中定义对应的 SQL 语句,对不同的表进行操作。在 Service 中注入对应的 Mapper 进行操作。

@Mapper
public interface UserMapper {
    @Insert("INSERT INTO user(name, age, address, phone) VALUES(#{name}, #{age}, #{address}, #{phone})")
    int insert(User user);

    @Select("SELECT * FROM user WHERE id=#{id}")
    User selectById(int id);
}

@Mapper
public interface OrderMapper {
    @Insert("INSERT INTO order(user_id, amount, status) VALUES(#{userId}, #{amount}, #{status})")
    int insert(Order order);

    @Select("SELECT * FROM order WHERE id=#{id}")
    Order selectById(int id);
}

@Service
public class UserService {
    @Autowired
    private UserMapper userMapper;

    public int insert(User user) {
        return userMapper.insert(user);
    }

    public User selectById(int id) {
        return userMapper.selectById(id);
    }
}

@Service
public class OrderService {
    @Autowired
    private OrderMapper orderMapper;

    public int insert(Order order) {
        return orderMapper.insert(order);
    }

    public Order selectById(int id) {
        return orderMapper.selectById(id);
    }
}
  1. 配置事务管理器

在数据库配置中,使用事务管理器来开启事务。在 Service 中使用 @Transactional 注解开启事务。

@Configuration
@EnableTransactionManagement
public class EcommerceDatabaseConfig {
    @Bean
    public DataSourceTransactionManager ecommerceTransactionManager(@Qualifier("ecommerceDataSource") DataSource dataSource) {
        return new DataSourceTransactionManager(dataSource);
    }
}

@Service
public class UserService {
    @Autowired
    private UserMapper userMapper;

    @Transactional(transactionManager = "ecommerceTransactionManager")
    public int insert(User user) {
        return userMapper.insert(user);
    }

    @Transactional(transactionManager = "ecommerceTransactionManager", readOnly = true)
    public User selectById(int id) {
        return userMapper.selectById(id);
    }
}

@Service
public class OrderService {
    @Autowired
    private OrderMapper orderMapper;

    @Transactional(transactionManager = "ecommerceTransactionManager")
    public int insert(Order order) {
        return orderMapper.insert(order);
    }

    @Transactional(transactionManager = "ecommerceTransactionManager", readOnly = true)
    public Order selectById(int id) {
        return orderMapper.selectById(id);
    }
}

以上代码展示了垂直分表的实现。具体来说:

  • 在第一步中创建了 ecommerce 数据库,并在其中创建了用户表 user 和订单表 order。这里将不同业务模块的数据保存在了不同的表中,实现了垂直分表。

  • 在第二步中,使用了一个数据源对应 ecommerce 数据库,并通过 MyBatis 的 @Mapper 注解和 @Qualifier 注解将不同的 Mapper 映射到不同的数据源上。这样,在 Service 中注入对应的 Mapper 时,就使用了对应的数据源进行操作。

  • 在第三步中,分别编写了 UserMapperOrderMapper,并在其中定义了插入和查询的 SQL 语句。在 UserServiceOrderService 中注入对应的 Mapper,并使用对应的方法进行操作。这样,就实现了不同业务模块对应的数据操作。

  • 在第四步中,配置了事务管理器,使用 @Transactional 注解开启事务。这里使用了一个事务管理器,将用户表和订单表的操作统一在一个事务中进行,保证了数据的一致性。

综上,通过将不同的业务模块的数据保存在不同的表中,并使用对应的数据源进行操作,实现了垂直分表

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/27916.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Mysql中联合索引的最左匹配

联合索引 通过将多个字段组合成一个索引,该索引就被称为联合索引。 比如,将商品表中的 product_no 和 name 字段组合成联合索引(product_no, name),创建联合索引的方式如下: CREATE INDEX index_product_no_name ON product(pr…

剑指 Offer 09: 用两个栈实现队列

简单明了,带你直接看懂题目和例子。 输入: ["CQueue","appendTail","deleteHead","deleteHead"] 这里是要执行的方法,从左到右执行 [[],[3],[],[]]对应上面的方法,是上面方法的参数。CQ…

docker资源控制cgroup

一、CPU控制 cgroups,是一个非常强大的linux内核工具,他不仅可以限制被namespace隔离起来的资源, 还可以为资源设置权重、计算使用量、操控进程启停等等。所以cgroups (Control groups) 实现了对资源的配额和度量。 cgroups有四大功能: 资源限制:可以…

前后端交互三、Ajax加强

零、文章目录 前后端交互三、Ajax加强 1、XMLHttpRequest的基本使用 (1)什么XMLHttpRequest XMLHttpRequest(简称 xhr)是浏览器提供的 Javascript 对象,通过它,可以请求服务器上的数据资源。jQuery 中的…

企业电子招标采购系统源码java 版本 Spring Cloud + Spring Boot

项目说明 随着公司的快速发展,企业人员和经营规模不断壮大,公司对内部招采管理的提升提出了更高的要求。在企业里建立一个公平、公开、公正的采购环境,最大限度控制采购成本至关重要。符合国家电子招投标法律法规及相关规范,以及…

JVM原理:JVM垃圾回收算法(通俗易懂)

目录 前言正文垃圾标记算法引用类型强引用软引用弱引用虚引用 引用计数法循环引用问题 根可达性分析法虚拟机栈(栈帧的局部变量表)中的引用方法区中类静态属性引用方法区中常量引用本地方法栈(Native方法)引用 垃圾回收算法标记清…

InstructGPT:Training language models to follow instructions with human feedback

Training language models to follow instructions with human feedback 通过人类反馈的微调,在广泛的任务中使语言模型与用户的意图保持一致 aligning language models with user intent on a wide range of tasks by fine-tuning with human feedback 实验动机 …

AssetStudio工程导入VS各种报错解决

AssetStudio下载地址:https://github.com/Perfare/AssetStudio 工程导入,生成解决方案,然后报了一堆错。让我们来一个一个的解决 这个错误,是缺少System.Runtime.InteropServices.RuntimeInformation.dll文件,下载并添…

20230612 set1打卡

哈希表理论基础 242.有效的字母异位词 349. 两个数组的交集 202. 快乐数 1. 两数之和

【leetcode】189.轮转数组

方法1: 先把原数组拷贝一份,然后先将原数组的后k个拷贝,再将前numsSize-k个拷贝 void rotate(int* nums, int numsSize, int k) {//可能存在k>numsSize的情况,先处理kk k % numsSize;//拷贝数组int arr[numsSize];int i 0;in…

计算机网络 | socket IPC(本地套接字domain)

欢迎关注博主 Mindtechnist 或加入【Linux C/C/Python社区】一起学习和分享Linux、C、C、Python、Matlab,机器人运动控制、多机器人协作,智能优化算法,滤波估计、多传感器信息融合,机器学习,人工智能等相关领域的知识和…

大模型研究方向0611

文章目录 1. 大模型自身角度认知角度2.大模型的成本角度3. 大模型的评测角度4.大模型的安全角度5. 大模型结构角度 附上刘知远老师的见解:https://hub.baai.ac.cn/view/27283 1. 大模型自身角度认知角度 即大模型的理解,现在,大众普遍认为L…

0202性能分析-索引-MySQL

1 索引语法 创建索引 CREATE [UNIQUE|FULLTEXT] INDEX index_name ON table_name(index_column_name,...);Index_name:规范为idx_表名_字段名... 查看索引 SHOW INDEX FROM table_name;删除索引 DROP INDEX index_name ON table_name;按照下列要求,创建…

V5.0.X版本 EMQX安装、卸载 以及使用

V5.0.X版本 EMQX安装、卸载 以及使用 一、卸载二、下载安装2.1 下载2.2 安装2.2.1 rpm安装2.2.2 tar安装 2.3 测试启动 三、EMQX使用 回到目录    回到末尾 EMQX为大规模分布式物联网 MQTT 消息服务器。提供高效可靠连接海量物联网设备,实时处理分发消息与事件流数…

leangoo领歌敏捷工具中,如何快速查看项目内所有任务卡片

项目管理员能不能快捷的查看整个项目内的所有任务? 能不能快捷查看项目内某一个成员的所有任务? 能不能快捷的在项目内通过一些条件选择查看任务? 可以导出项目内某一个人的所有任务吗?方便做一些统计 等等... 这些现在Leang…

武职301班-day01

实现永和小票页面 效果图 问题分析 把一个大的开发任务,先进行任务分析,把完成这个任务需要的技术点和开发步骤写出来。 开发分析 特点: htmlcss实现 1)小票有宽度限制 2)字体大小不一样,大部分字体大小…

解决获取taro全局配置文件失败,找不到配置文件失败问题

问题:这会导致项目初始化不成功,即要用vuets生成项目的话,依旧是wxml,js的文件,而不是vue文件 解决一:首先找到配置文件目录 删除taro开头的三项文件,再去node_modules下删除tarojs 然后去终…

Python的基础语法知识

1、变量 变量是一个代号,它代表的是一个数据。 在Python中,定义一个变量的操作包含两个步骤: ①为变量起一个名字 ②为变量指定其所代表的数据 这两个步骤在同一行代码中完成。 1.1 变量的命名规则 变量名可以由任意数量的字母、数字、下划…

实验五 标准ACL的配置【网络安全】

实验五 标准ACL的配置【网络安全】 前言推荐实验五 标准ACL的配置问题方案步骤 最后 前言 2023-6-8 18:54:22 以下内容源自《【网络安全】》 仅供学习交流使用 推荐 配置标准ACL 实验五 标准ACL的配置 问题 络调通后,保证网络是通畅的。同时也很可能出现未经…

vscode Delete `␍⏎·····`

在公司电脑首次拉取代码的时候,好多代码报错,在网上查了博客,确定是换行导致,但是参考网上的解决办法,没有解决,不管是设置 auto 还是命令行执行什么什么的,都不管用 下面介绍我的办法 首先&a…
最新文章