[用户指南]
HP-SOA 的 hp-soa-starter-data-mysql 模块提供MySQL接入功能,整合了 mybatis-plus 和 dynamic-datasource,简化了数据库访问操作并提供动态数据源、多数据源访问能力;同时也整合了Druid,可以通过Druid实施数据库监控;另外,hp-soa-starter-data-mysql 支持全局事务管理,只需在配置文件中开启全局事务管理功能即可(该功能默认关闭)。
(以 hp-demo-infra-mysql-service Demo 为例)
1. 引入 hp-soa-starter-data-mysql 依赖
- pom.xml 中添加 hp-soa-starter-data-mysql 依赖:
<dependencies>
<!-- 引用 hp-soa-starter-data-mysql-->
<dependency>
<groupId>io.github.hpsocket</groupId>
<artifactId>hp-soa-starter-data-mysql</artifactId>
</dependency>
</dependencies>
MySQL配置分为全局配置和应用配置两部分,多个项目共享的配置(如:mybatis-plus配置、数据库监控配置)抽取到全局配置文件中,各个项目的特定配置(如:数据源配置)则放到应用配置文件中。应用配置优先级高于全局配置。
- 全局配置(参考:mysql.yml)
- 应用配置(参考:hp-demo-infra-mysql-service.yml)
- 指定 Mybatis Mapper 扫描包
hp-soa-starter-data-mysql 默认会把 ${hp.soa.data.mysql.mapper-scan.base-package}
配置项的值作为 Mybatis Mapper 扫描包,如果不配置 ${hp.soa.data.mysql.mapper-scan.base-package}
,则可以在配置类中声明 @MapperScan
注解指定 Mybatis Mapper 扫描包。
/* 指定 Mybatis Mapper 扫描包 */
@AutoConfiguration
/* default mybatis mapper scan package -> ${hp.soa.data.mysql.mapper-scan.base-package} */
@MapperScan("io.github.hpsocket.demo.infra.mysql.mapper")
public class AppConfig
{
}
- 创建数据库实体类
hp-soa-starter-data-mysql 的 io.github.hpsocket.soa.starter.data.mysql.entity
包中提供了以下数据库实体基类,应用程序的数据库实体类可根据需要从其中之一继承:
- BaseEntity 数据库实体的基类,定义了 id、createTime、updateTime 字段
- BaseLogicDeleteEntity 支持逻辑删除的数据库实体基类,定义了逻辑删除字段 deleted
- BaseVersioningEntity 支持乐观锁的数据库实体基类,定义了乐观锁字段 version
- BaseLogicDeleteVersioningEntity 支持逻辑删除与乐观锁的数据库实体基类,定义了逻辑删除字段 deleted,乐观锁字段 version
/* 数据库表 t_user 实体类 */
@Getter
@Setter
@SuppressWarnings("serial")
public class User extends BaseLogicDeleteVersioningEntity
{
private String name;
private Integer age;
}
- 创建Mapper接口
Mapper一般继承于BaseMapper<T>
,自动获得CRUD能力。
/* User实体Mapper接口 */
public interface UserMapper extends BaseMapper<User>
{
}
- 通过Mapper接口访问数据库
服务实现类中可以直接注入Mapper接口,或继承 ServiceImpl<M extends BaseMapper<T>, T>
间接注入Mapper接口访问数据库。
/* 服务实现类 */
@Slf4j
@RefreshScope
@DubboService
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService
{
@Autowired
private UserConverter userConverter;
@Override
public UserBo getDefaultUser()
{
User user = getOne(Wrappers.<User>lambdaQuery().eq(User::getId, 1L));
return userConverter.toBo(user);
}
@Override
@DS("master")
public UserBo getMasterUser()
{
User user = getOne(Wrappers.<User>lambdaQuery().eq(User::getId, 1L));
return userConverter.toBo(user);
}
@Override
@DS("slave")
public UserBo getSlaveUser()
{
User user = getOne(Wrappers.<User>lambdaQuery().eq(User::getId, 1L));
return userConverter.toBo(user);
}
@Override
@DS("slave_01")
public UserBo getSlave1User()
{
User user = getOne(Wrappers.<User>lambdaQuery().eq(User::getId, 1));
return userConverter.toBo(user);
}
@Override
@DS("slave_02")
public UserBo getSlave2User()
{
User user = getOne(Wrappers.<User>lambdaQuery().eq(User::getId, 1));
return userConverter.toBo(user);
}
@Override
@Transactional(isolation = Isolation.READ_COMMITTED, rollbackFor = Exception.class)
public boolean saveUser(UserBo userBo)
{
User user = userConverter.fromBo(userBo);
if(user.getId() != null)
{
User user2 = getOne(Wrappers.<User>lambdaQuery().eq(User::getId, user.getId()));
if(user2 != null)
{
user.setVersion(user2.getVersion());
return updateById(user);
}
}
return save(user);
}
}
全局事务管理配置类为 SoaGlobalTransactionConfig,应用程序可以覆盖其中的Bean定义修改默认配置。
- 全局事务管理配置文件:
## 全局事务管理配置
hp.soa.data.mysql.global-transaction-management:
# 全局事务管理开启标识(默认:不开启)
enabled: false
# 普通事务超时(毫秒,默认:3000)
timeout: 3000
# 普通事务隔离级别(默认:ISOLATION_READ_COMMITTED)
isolation: ISOLATION_READ_COMMITTED
# 普通事务传播属性(默认:PROPAGATION_REQUIRED)
propagation: PROPAGATION_REQUIRED
# 普通事务回滚异常(默认:java.lang.Exception)
rollback-for: java.lang.Exception
# 只读事务超时(毫秒,默认:3000)
read-only-timeout: 3000
# 只读事务隔离级别(默认:ISOLATION_READ_COMMITTED)
read-only-isolation: ISOLATION_READ_COMMITTED
# 只读事务传播属性(默认:PROPAGATION_REQUIRED)
read-only-propagation: PROPAGATION_REQUIRED
# 注入全局事务管理的方法签名格式
pointcut-expression: "execution(* ${hp.soa.web.component-scan.base-package}..service..*.*(..))"
hp-soa-starter-data-mysql 通过 dynamic-datasource 实现动态数据源、多数据源访问功能,具体细节可参考相关文档。
[用户指南]