[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 注解开启事务。这里使用了一个事务管理器,将用户表和订单表的操作统一在一个事务中进行,保证了数据的一致性。

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

你可能感兴趣的:(粉丝栏,数据库)