目录
前言:
记录一个小笔记而已,
创建数据库和表
配置数据源和 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
);
在项目中配置一个数据源,对应 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);
}
}
根据业务模块或表的类型,将相应的字段分别保存到不同的表中。在 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);
}
}
在数据库配置中,使用事务管理器来开启事务。在 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 时,就使用了对应的数据源进行操作。
在第三步中,分别编写了 UserMapper
和 OrderMapper
,并在其中定义了插入和查询的 SQL 语句。在 UserService
和 OrderService
中注入对应的 Mapper,并使用对应的方法进行操作。这样,就实现了不同业务模块对应的数据操作。
在第四步中,配置了事务管理器,使用 @Transactional
注解开启事务。这里使用了一个事务管理器,将用户表和订单表的操作统一在一个事务中进行,保证了数据的一致性。
综上,通过将不同的业务模块的数据保存在不同的表中,并使用对应的数据源进行操作,实现了垂直分表