概述

平台实现对数据库的访问,主要是采用Mybatis与Mybatis plus 实现对数据库的表的读写。

Mybatis的版本与Mybatis plus 的版本如下所示:

  1. <dependency>
  2. <groupId>org.mybatis</groupId>
  3. <artifactId>mybatis</artifactId>
  4. <version>3.5.1</version>
  5. </dependency>

因Mybatis的自带Mybatis的版本与本平台使用的版本有差别,因此在使用Mybatis plus时,需要排除其mybatis的版本。

  1. <dependency>
  2. <groupId>com.baomidou</groupId>
  3. <artifactId>mybatis-plus-boot-starter</artifactId>
  4. <exclusions>
  5. <exclusion>
  6. <groupId>org.mybatis</groupId>
  7. <artifactId>mybatis</artifactId>
  8. </exclusion>
  9. </exclusions>
  10. </dependency>

ORM 封装模块

数据库的访问在不同的应用的子模块均需要使用该模块,为了简化在不同的模块的使用,把该模块进行了抽取,实现了分布式的事务的声明,不同的类型的数据库的访问,包括多数据源的切换访问,参考jpaas-db-spring-boot-starter的实现。

应用模块引入

在应用模块若需要实现ORM的模块的引用,即只需要在应用的pom文件引入:

  1. <dependency>
  2. <groupId>com.redxun</groupId>
  3. <artifactId>jpaas-db-spring-boot-starter</artifactId>
  4. <version>1.2.RELEASE</version>
  5. </dependency>

应用使用示例

application.yml

在该文件中主要是配置数据源,分布式事务,mybatis映射文件的扫描路径等,如:

  1. server:
  2. port: 7301
  3. ## 缺省的数据源
  4. defaultDs:
  5. string:
  6. url: ${bpm.datasource.url}
  7. username: ${bpm.datasource.username}
  8. password: ${bpm.datasource.password}
  9. driver-class-name: ${bpm.datasource.driver}
  10. connection-init-sqls: ${bpm.datasource.connection}
  11. validationQuery: select 1
  12. filters: stat
  13. int:
  14. initialSize: 5
  15. minIdle: 5
  16. maxActive: 10
  17. maxPoolPreparedStatementPerConnectionSize: 20
  18. long:
  19. maxWait: 60000
  20. timeBetweenEvictionRunsMillis: 60000
  21. minEvictableIdleTimeMillis: 300000
  22. boolean:
  23. testWhileIdle: true
  24. testOnBorrow: false
  25. testOnReturn: false
  26. poolPreparedStatements: true
  27. # Mybatis的映射文件路径
  28. mybatis:
  29. mapper-locations: classpath:/mapper/**/*Mapper.xml
  30. # 分布式事务的配置
  31. seata:
  32. enabled: true
  33. application-id: ${spring.application.name}
  34. tx-service-group: bpm_tx_group
  35. enable-auto-data-source-proxy: true
  36. registry:
  37. type: nacos
  38. nacos:
  39. application: seata-server
  40. server-addr: ${nacos.address}
  41. group: DEFAULT_GROUP
  42. userName: nacos
  43. password: nacos
  44. config:
  45. type: nacos
  46. nacos:
  47. namespace:
  48. serverAddr: ${nacos.address}
  49. group: SEATA_GROUP
  50. cluster: default
  51. userName: nacos
  52. password: nacos

Mybatis数据库访问映射文件

不同的表对应的mybatis的文件放置在resources/mappper目录下,如:

如BpmDef的Mapper的文件如下所示:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  3. <mapper namespace="com.redxun.bpm.core.mapper.BpmDefMapper">
  4. <sql id="fields">
  5. DEF_ID_,TREE_ID_,NAME_,KEY_,DESCP_ ,ACT_DEF_ID_,ACT_DEP_ID_ ,STATUS_ ,VERSION_ ,IS_MAIN_ , MAIN_DEF_ID_,
  6. BO_DEF_IDS_ ,ICON_ ,COLOR_,FORMAL_,TENANT_ID_ ,CREATE_DEP_ID_,CREATE_BY_ ,CREATE_TIME_ ,UPDATE_BY_ ,UPDATE_TIME_
  7. </sql>
  8. <select id="query" resultType="com.redxun.bpm.core.entity.BpmDef" parameterType="java.util.Map">
  9. select <include refid="fields"></include>
  10. from bpm_def
  11. <where>
  12. <if test="@rx.Ognl@isNotEmpty(w.whereSql)">
  13. ${w.whereSql}
  14. </if>
  15. </where>
  16. <if test="@rx.Ognl@isNotEmpty(w.orderBySql)">
  17. ORDER BY ${w.orderBySql}
  18. </if>
  19. <if test="@rx.Ognl@isEmpty(w.orderBySql)">
  20. ORDER BY DEF_ID_ DESC
  21. </if>
  22. </select>
  23. <select id="getMainByKey" resultType="com.redxun.bpm.core.entity.BpmDef" parameterType="java.util.Map">
  24. select <include refid="fields"></include> from bpm_def where key_=#{key} and is_main_='YES'
  25. </select>
  26. <select id="getMaxVersion" parameterType="java.util.Map" resultType="java.lang.Integer">
  27. select max(version_) from bpm_def where key_=#{key}
  28. </select>
  29. <update id="updateMainDefIdIsMain" parameterType="java.util.Map">
  30. 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}
  31. </update>
  32. <select id="getAllVersionsByMainDefId" resultType="com.redxun.bpm.core.entity.BpmDef" parameterType="java.util.Map">
  33. select * from bpm_def where main_def_id_=#{mainDefId} order by version_ desc
  34. </select>
  35. </mapper>

Mapper访问类定义

基于Mybatis新的定义,可以只需要定义访问接口即可,但需要映射以上Mappper的xml文件的Key,如下所示:

  1. package com.redxun.bpm.core.mapper;
  2. import com.redxun.bpm.core.entity.BpmDef;
  3. import org.apache.ibatis.annotations.Mapper;
  4. import com.redxun.common.base.db.BaseDao;
  5. import org.apache.ibatis.annotations.Param;
  6. import java.util.List;
  7. import java.util.Map;
  8. /**
  9. * 流程定义数据库访问层
  10. */
  11. @Mapper
  12. public interface BpmDefMapper extends BaseDao<BpmDef> {
  13. /**
  14. * 获得某个流程的主版本
  15. * @param key
  16. * @return
  17. */
  18. BpmDef getMainByKey(String key);
  19. /**
  20. * 更新流程定义
  21. * @param params
  22. */
  23. void updateMainDefIdIsMain(@Param("w") Map<String, Object> params);
  24. /**
  25. * 获取当前流程中最大的版本
  26. * @param mainDefId
  27. * @return
  28. */
  29. Integer getMaxVersion(String mainDefId);
  30. /**
  31. * 根据流程Id获得流程的所有版本号与DefId
  32. * @param mainDefId
  33. * @return
  34. */
  35. List<BpmDef> getAllVersionsByMainDefId(String mainDefId);
  36. }

【说明】:

在需要定义参数的Key,需要在参数中使用@Param(“参数Key”)进行定义。
方法名必须与Mapper中的xml中的id一致

在业务类中使用Mapper类

  1. /**
  2. * [流程定义]业务服务类
  3. */
  4. @Service
  5. @Slf4j
  6. public class BpmDefService extends SuperServiceImpl<BpmDefMapper, BpmDef> implements BaseService<BpmDef> {
  7. @Resource
  8. private BpmDefMapper bpmDefMapper;
  9. //...
  10. }
文档更新时间: 2021-07-19 18:39   作者:zyg