SourceUtil.java 4.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. package jnpf.base.util;
  2. import com.baomidou.mybatisplus.annotation.DbType;
  3. import com.baomidou.mybatisplus.generator.config.DataSourceConfig;
  4. import com.baomidou.mybatisplus.generator.config.converts.MySqlTypeConvert;
  5. import com.baomidou.mybatisplus.generator.config.querys.MySqlQuery;
  6. import com.baomidou.mybatisplus.generator.config.querys.PostgreSqlQuery;
  7. import com.baomidou.mybatisplus.generator.keywords.MySqlKeyWordsHandler;
  8. import com.baomidou.mybatisplus.generator.query.SQLQuery;
  9. import jnpf.database.model.entity.DbLinkEntity;
  10. import jnpf.database.source.DbBase;
  11. import jnpf.database.source.impl.DbPostgre;
  12. import jnpf.database.util.*;
  13. import jnpf.util.StringUtil;
  14. import jnpf.util.TenantHolder;
  15. /**
  16. * @author JNPF开发平台组
  17. * @version V3.1.0
  18. * @copyright 引迈信息技术有限公司
  19. * @date 2021/3/12 15:31
  20. */
  21. public class SourceUtil {
  22. public static DataSourceConfig dbConfig(String dbName, DataSourceUtil linkEntity) {
  23. DbType mpDbType;
  24. String userName;
  25. String password;
  26. String dbSchema;
  27. String url;
  28. if (linkEntity == null) {
  29. if(TenantDataSourceUtil.isTenantAssignDataSource()){
  30. linkEntity = TenantDataSourceUtil.getTenantAssignDataSource(TenantHolder.getDatasourceId()).toDbLink(new DbLinkEntity());
  31. }else{
  32. linkEntity = DynamicDataSourceUtil.dataSourceUtil.init();
  33. }
  34. if (!"KingbaseES".equals(linkEntity.getDbType()) && !"PostgreSQL".equals(linkEntity.getDbType()) && StringUtil.isNotEmpty(dbName)) {
  35. linkEntity.setDbName(dbName);
  36. }
  37. }
  38. try {
  39. DbBase dbBase = DbTypeUtil.getDb(linkEntity);
  40. mpDbType = dbBase.getMpDbType();
  41. userName = linkEntity.getUserName();
  42. password = linkEntity.getPassword();
  43. dbSchema = linkEntity.getDbSchema();
  44. // oracle 默认 schema = username
  45. if (StringUtil.isEmpty(dbSchema) && (
  46. mpDbType.getDb().equalsIgnoreCase(DbType.ORACLE.getDb())
  47. || mpDbType.getDb().equalsIgnoreCase(DbType.KINGBASE_ES.getDb())
  48. || mpDbType.getDb().equalsIgnoreCase(DbType.DM.getDb())
  49. )) {
  50. dbSchema = linkEntity.getUserName();
  51. if(StringUtil.isNotEmpty(dbName)){
  52. dbSchema = dbName;
  53. }
  54. }
  55. //postgre默认 public
  56. if (mpDbType.getDb().equalsIgnoreCase(DbType.POSTGRE_SQL.getDb())) {
  57. if (StringUtil.isNotEmpty(dbName)) {
  58. dbSchema = dbName;
  59. } else if (StringUtil.isNotEmpty(linkEntity.getDbSchema())) {
  60. dbSchema = linkEntity.getDbSchema();
  61. } else {
  62. dbSchema = DbPostgre.DEF_SCHEMA;
  63. }
  64. }
  65. //兼容 SQL_SERVER 默认dbo模式
  66. if (StringUtil.isEmpty(dbSchema) && mpDbType.getDb().equalsIgnoreCase(DbType.SQL_SERVER.getDb())) {
  67. dbSchema = "dbo";
  68. }
  69. url = ConnUtil.getUrl(linkEntity);
  70. DataSourceConfig dsc =new DataSourceConfig.Builder(url,userName,password)
  71. .schema(dbSchema)
  72. .keyWordsHandler(new MySqlKeyWordsHandler())
  73. .build();
  74. return dsc;
  75. } catch (Exception e) {
  76. e.getStackTrace();
  77. }
  78. return null;
  79. }
  80. static class MyPostgreSqlQuery extends PostgreSqlQuery {
  81. @Override
  82. public String tableFieldsSql() {
  83. return "SELECT A.attname AS name,format_type (A.atttypid,A.atttypmod) AS type,col_description (A.attrelid,A.attnum) AS comment,\n" +
  84. "(CASE WHEN (SELECT COUNT (*) FROM pg_constraint AS PC WHERE PC.conrelid = C.oid AND A.attnum = PC.conkey[1] AND PC.contype = 'p') > 0 THEN 'PRI' ELSE '' END) AS key \n" +
  85. "FROM pg_class AS C,pg_attribute AS A WHERE A.attrelid='%s'::regclass AND A.attrelid= C.oid AND A.attnum> 0 AND NOT A.attisdropped ORDER BY A.attnum";
  86. }
  87. }
  88. }