需求背景

  • 运维交付平台里包含着产品包的升级计划,升级计划 是产品迭代的核心草案,但是在之前的过程中,升级计划与 缺陷管理平台中的bug记录 无相关性,导致该升级解决了哪些BUG,实现了哪些增补是无从感知,或者需要人工再次统计,十分的不便使用。

    实现目标

  • 创建升级计划的同时关联到 缺陷记录。并提供对应的crud关联展示。

    配置

    ```java

=== itsm db

spring.datasource.itsm.jdbc-url=jdbc:mysql://172.16.100.xxx:3306/dt_itsm_dev?serverTimezone=Asia/Shanghai&useSSL=false&allowPublicKeyRetrieval=true spring.datasource.itsm.username=root spring.datasource.itsm.password=abc123 spring.datasource.itsm.driver-class-name=com.mysql.cj.jdbc.Driver

=== zentao db

spring.datasource.zentao.jdbc-url=jdbc:mysql://rm-xxx.mysql.rds.aliyuncs.com:3306/zentao spring.datasource.zentao.username=xxx spring.datasource.zentao.password=Y)g)xx spring.datasource.zentao.driver-class-name=com.mysql.cj.jdbc.Driver

  1. - 对两个数据源进行分别配置,这里选择使用配置类的方式
  2. ```java
  3. package com.dtstack.itsm.base.config;
  4. import org.apache.ibatis.session.SqlSessionFactory;
  5. import org.mybatis.spring.SqlSessionFactoryBean;
  6. import org.mybatis.spring.SqlSessionTemplate;
  7. import org.mybatis.spring.annotation.MapperScan;
  8. import org.mybatis.spring.boot.autoconfigure.SpringBootVFS;
  9. import org.springframework.beans.factory.annotation.Autowired;
  10. import org.springframework.beans.factory.annotation.Qualifier;
  11. import org.springframework.boot.context.properties.ConfigurationProperties;
  12. import org.springframework.boot.jdbc.DataSourceBuilder;
  13. import org.springframework.context.annotation.Bean;
  14. import org.springframework.context.annotation.Configuration;
  15. import org.springframework.context.annotation.Primary;
  16. import org.springframework.core.env.Environment;
  17. import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
  18. import org.springframework.jdbc.datasource.DataSourceTransactionManager;
  19. import javax.sql.DataSource;
  20. /*
  21. * @Author shihu
  22. * @Description 运维交付平台db配置类
  23. * @Date 4:42 下午 2021/8/18
  24. * @Param
  25. * @return
  26. **/
  27. @Configuration
  28. @MapperScan(basePackages = "com.dtstack.itsm.mapper", sqlSessionFactoryRef = "db1SqlSessionFactory") //basePackages db1的数据库的dao层的地址
  29. public class MybatisItsmConfig {
  30. @Autowired
  31. private Environment env;
  32. @Primary // 表示这个数据源是默认数据源, 这个注解必须要加,因为不加的话spring将分不清楚那个为主数据源(默认数据源)
  33. @Bean("db1DataSource")
  34. @ConfigurationProperties(prefix = "spring.datasource.itsm") //读取application.yml中的配置参数映射成为一个对象
  35. public DataSource getDb1DataSource(){
  36. return DataSourceBuilder.create().build();
  37. }
  38. @Primary
  39. @Bean("db1SqlSessionFactory")
  40. public SqlSessionFactory db1SqlSessionFactory(@Qualifier("db1DataSource") DataSource dataSource) throws Exception {
  41. SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
  42. bean.setDataSource(dataSource);
  43. // mapper的xml形式文件位置必须要配置,不然将报错:no statement (这种错误也可能是mapper的xml中,namespace与项目的路径不一致导致) 映射地址一定要正确,不然会报invalid bound statement (not found)错误
  44. bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath*:mapper/*Mapper.xml"));
  45. bean.setVfs(SpringBootVFS.class);
  46. bean.setTypeAliasesPackage(env.getProperty("mybatis.type-aliases-package"));
  47. return bean.getObject();
  48. }
  49. @Primary
  50. @Bean("db1SqlSessionTemplate")
  51. public SqlSessionTemplate db1SqlSessionTemplate(@Qualifier("db1SqlSessionFactory") SqlSessionFactory sqlSessionFactory){
  52. return new SqlSessionTemplate(sqlSessionFactory);
  53. }
  54. }
  55. ------ 禅道数据库
  56. package com.dtstack.itsm.base.config;
  57. import org.apache.ibatis.session.SqlSessionFactory;
  58. import org.mybatis.spring.SqlSessionFactoryBean;
  59. import org.mybatis.spring.SqlSessionTemplate;
  60. import org.mybatis.spring.annotation.MapperScan;
  61. import org.mybatis.spring.boot.autoconfigure.SpringBootVFS;
  62. import org.springframework.beans.factory.annotation.Autowired;
  63. import org.springframework.beans.factory.annotation.Qualifier;
  64. import org.springframework.boot.context.properties.ConfigurationProperties;
  65. import org.springframework.boot.jdbc.DataSourceBuilder;
  66. import org.springframework.context.annotation.Bean;
  67. import org.springframework.context.annotation.Configuration;
  68. import org.springframework.context.annotation.Primary;
  69. import org.springframework.core.env.Environment;
  70. import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
  71. import javax.sql.DataSource;
  72. @Configuration
  73. @MapperScan(basePackages = "com.dtstack.zentao.mapper", sqlSessionFactoryRef = "db2SqlSessionFactory") //basePackages db1的数据库的dao层的地址
  74. public class MybatisZentaoConfig {
  75. @Autowired
  76. private Environment env;
  77. @Bean("db2DataSource")
  78. @ConfigurationProperties(prefix = "spring.datasource.zentao")
  79. public DataSource getDb1DataSource(){
  80. return DataSourceBuilder.create().build();
  81. }
  82. @Bean("db2SqlSessionFactory")
  83. public SqlSessionFactory db1SqlSessionFactory(@Qualifier("db2DataSource") DataSource dataSource) throws Exception {
  84. SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
  85. bean.setDataSource(dataSource);
  86. bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath*:mapper/*Mapper.xml"));
  87. bean.setVfs(SpringBootVFS.class);
  88. bean.setTypeAliasesPackage(env.getProperty("mybatis.type-aliases-package"));
  89. return bean.getObject();
  90. }
  91. @Bean("db2SqlSessionTemplate")
  92. public SqlSessionTemplate db1SqlSessionTemplate(@Qualifier("db2SqlSessionFactory") SqlSessionFactory sqlSessionFactory){
  93. return new SqlSessionTemplate(sqlSessionFactory);
  94. }
  95. }
  • 之所以选择直连db的方式是因为禅道的api太tm难用了,又臭又长又烂。
  • 目录结构

image.png

  • 之后对于db的使用同常规方式一样,domain mapper service 安排即可,不再进行赘述