概述
平台实现对数据库的访问,主要是采用Mybatis与Mybatis plus 实现对数据库的表的读写。
Mybatis的版本与Mybatis plus 的版本如下所示:
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.1</version>
</dependency>
因Mybatis的自带Mybatis的版本与本平台使用的版本有差别,因此在使用Mybatis plus时,需要排除其mybatis的版本。
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<exclusions>
<exclusion>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
</exclusion>
</exclusions>
</dependency>
ORM 封装模块
数据库的访问在不同的应用的子模块均需要使用该模块,为了简化在不同的模块的使用,把该模块进行了抽取,实现了分布式的事务的声明,不同的类型的数据库的访问,包括多数据源的切换访问,参考jpaas-db-spring-boot-starter的实现。
应用模块引入
在应用模块若需要实现ORM的模块的引用,即只需要在应用的pom文件引入:
<dependency>
<groupId>com.redxun</groupId>
<artifactId>jpaas-db-spring-boot-starter</artifactId>
<version>1.2.RELEASE</version>
</dependency>
应用使用示例
application.yml
在该文件中主要是配置数据源,分布式事务,mybatis映射文件的扫描路径等,如:
server:
port: 7301
## 缺省的数据源
defaultDs:
string:
url: ${bpm.datasource.url}
username: ${bpm.datasource.username}
password: ${bpm.datasource.password}
driver-class-name: ${bpm.datasource.driver}
connection-init-sqls: ${bpm.datasource.connection}
validationQuery: select 1
filters: stat
int:
initialSize: 5
minIdle: 5
maxActive: 10
maxPoolPreparedStatementPerConnectionSize: 20
long:
maxWait: 60000
timeBetweenEvictionRunsMillis: 60000
minEvictableIdleTimeMillis: 300000
boolean:
testWhileIdle: true
testOnBorrow: false
testOnReturn: false
poolPreparedStatements: true
# Mybatis的映射文件路径
mybatis:
mapper-locations: classpath:/mapper/**/*Mapper.xml
# 分布式事务的配置
seata:
enabled: true
application-id: ${spring.application.name}
tx-service-group: bpm_tx_group
enable-auto-data-source-proxy: true
registry:
type: nacos
nacos:
application: seata-server
server-addr: ${nacos.address}
group: DEFAULT_GROUP
userName: nacos
password: nacos
config:
type: nacos
nacos:
namespace:
serverAddr: ${nacos.address}
group: SEATA_GROUP
cluster: default
userName: nacos
password: nacos
Mybatis数据库访问映射文件
不同的表对应的mybatis的文件放置在resources/mappper目录下,如:
如BpmDef的Mapper的文件如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.redxun.bpm.core.mapper.BpmDefMapper">
<sql id="fields">
DEF_ID_,TREE_ID_,NAME_,KEY_,DESCP_ ,ACT_DEF_ID_,ACT_DEP_ID_ ,STATUS_ ,VERSION_ ,IS_MAIN_ , MAIN_DEF_ID_,
BO_DEF_IDS_ ,ICON_ ,COLOR_,FORMAL_,TENANT_ID_ ,CREATE_DEP_ID_,CREATE_BY_ ,CREATE_TIME_ ,UPDATE_BY_ ,UPDATE_TIME_
</sql>
<select id="query" resultType="com.redxun.bpm.core.entity.BpmDef" parameterType="java.util.Map">
select <include refid="fields"></include>
from bpm_def
<where>
<if test="@rx.Ognl@isNotEmpty(w.whereSql)">
${w.whereSql}
</if>
</where>
<if test="@rx.Ognl@isNotEmpty(w.orderBySql)">
ORDER BY ${w.orderBySql}
</if>
<if test="@rx.Ognl@isEmpty(w.orderBySql)">
ORDER BY DEF_ID_ DESC
</if>
</select>
<select id="getMainByKey" resultType="com.redxun.bpm.core.entity.BpmDef" parameterType="java.util.Map">
select <include refid="fields"></include> from bpm_def where key_=#{key} and is_main_='YES'
</select>
<select id="getMaxVersion" parameterType="java.util.Map" resultType="java.lang.Integer">
select max(version_) from bpm_def where key_=#{key}
</select>
<update id="updateMainDefIdIsMain" parameterType="java.util.Map">
update bpm_def set is_main_=#{w.isMain,jdbcType=VARCHAR}, main_def_id_=#{w.newMainDefId,jdbcType=VARCHAR} where main_def_id_=#{w.oldMainDefId,jdbcType=VARCHAR}
</update>
<select id="getAllVersionsByMainDefId" resultType="com.redxun.bpm.core.entity.BpmDef" parameterType="java.util.Map">
select * from bpm_def where main_def_id_=#{mainDefId} order by version_ desc
</select>
</mapper>
Mapper访问类定义
基于Mybatis新的定义,可以只需要定义访问接口即可,但需要映射以上Mappper的xml文件的Key,如下所示:
package com.redxun.bpm.core.mapper;
import com.redxun.bpm.core.entity.BpmDef;
import org.apache.ibatis.annotations.Mapper;
import com.redxun.common.base.db.BaseDao;
import org.apache.ibatis.annotations.Param;
import java.util.List;
import java.util.Map;
/**
* 流程定义数据库访问层
*/
@Mapper
public interface BpmDefMapper extends BaseDao<BpmDef> {
/**
* 获得某个流程的主版本
* @param key
* @return
*/
BpmDef getMainByKey(String key);
/**
* 更新流程定义
* @param params
*/
void updateMainDefIdIsMain(@Param("w") Map<String, Object> params);
/**
* 获取当前流程中最大的版本
* @param mainDefId
* @return
*/
Integer getMaxVersion(String mainDefId);
/**
* 根据流程Id获得流程的所有版本号与DefId
* @param mainDefId
* @return
*/
List<BpmDef> getAllVersionsByMainDefId(String mainDefId);
}
【说明】:
在需要定义参数的Key,需要在参数中使用@Param(“参数Key”)进行定义。
方法名必须与Mapper中的xml中的id一致
在业务类中使用Mapper类
/**
* [流程定义]业务服务类
*/
@Service
@Slf4j
public class BpmDefService extends SuperServiceImpl<BpmDefMapper, BpmDef> implements BaseService<BpmDef> {
@Resource
private BpmDefMapper bpmDefMapper;
//...
}
文档更新时间: 2021-07-19 18:39 作者:zyg