DbOracle.java 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155
  1. package jnpf.database.source.impl;
  2. import com.baomidou.mybatisplus.annotation.DbType;
  3. import jnpf.database.constant.DbConst;
  4. import jnpf.database.model.dbfield.DbFieldModel;
  5. import jnpf.database.model.entity.DbLinkEntity;
  6. import jnpf.database.source.DbBase;
  7. import jnpf.database.sql.model.DbStruct;
  8. import jnpf.database.util.ConnUtil;
  9. import jnpf.exception.DataException;
  10. import jnpf.util.JsonUtil;
  11. import jnpf.util.StringUtil;
  12. import jnpf.util.TenantHolder;
  13. import java.sql.Connection;
  14. import java.sql.ResultSet;
  15. import java.util.Map;
  16. import java.util.Properties;
  17. /**
  18. * Oracle模型
  19. *
  20. * @author JNPF开发平台组 YY
  21. * @version V3.2.0
  22. * @copyright 引迈信息技术有限公司
  23. * @date 2021/10/06
  24. */
  25. public class DbOracle extends DbBase {
  26. /*================Oracle4种数据库连接url=================*/
  27. /**
  28. * SID
  29. * 或:jdbc:oracle:thin:@{host}:{port}/{SID}
  30. */
  31. private static final String SID_URL = "jdbc:oracle:thin:@{host}:{port}:{schema}";
  32. private static final String SID_SIGN = "SID";
  33. /**
  34. * SERVICE:服务名
  35. */
  36. private static final String SERVICE_URL = "jdbc:oracle:thin:@//{host}:{port}/{schema}";
  37. private static final String SERVICE_SIGN = "SERVICE";
  38. /**
  39. * SCHEMA:模式
  40. */
  41. private static final String SCHEMA_URL =
  42. "jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST={host})(PORT={port})))(CONNECT_DATA=(SERVICE_NAME={schema})))";
  43. private static final String SCHEMA_SIGN = "SCHEMA";
  44. /**
  45. * TNS
  46. */
  47. private static final String TNS_URL = "jdbc:oracle:thin:@{schema}";
  48. private static final String TNS_SIGN = "TNS";
  49. public static final String ORACLE_SERVICE = "oracleService";
  50. /**
  51. * 连接扩展参数
  52. */
  53. public static final String ORACLE_LINK_TYPE = "oracleLinkType";
  54. public static final String ORACLE_ROLE = "oracleRole";
  55. @Override
  56. protected void init() {
  57. setInstance(
  58. ORACLE,
  59. DbType.ORACLE,
  60. com.alibaba.druid.DbType.oracle,
  61. "1521",
  62. "sys",
  63. "oracle",
  64. "oracle.jdbc.OracleDriver",
  65. "");
  66. }
  67. @Override
  68. public String getConnUrl(String prepareUrl, String host, Integer port, DbStruct struct) {
  69. String schema = struct.getOracleDbSchema();
  70. if(StringUtil.isNotEmpty(struct.getOracleParam()) && StringUtil.isEmpty(prepareUrl)) {
  71. Map<String, Object> oracleParamMap = JsonUtil.stringToMap(struct.getOracleParam());
  72. if (oracleParamMap.size() > 0) {
  73. schema = oracleParamMap.get(DbOracle.ORACLE_SERVICE).toString();
  74. String urlType = oracleParamMap.get(DbOracle.ORACLE_LINK_TYPE).toString();
  75. switch (urlType) {
  76. case SID_SIGN:
  77. prepareUrl = SID_URL;
  78. break;
  79. case SERVICE_SIGN:
  80. prepareUrl = SERVICE_URL;
  81. break;
  82. case SCHEMA_SIGN:
  83. prepareUrl = SCHEMA_URL;
  84. break;
  85. case TNS_SIGN:
  86. prepareUrl = TNS_URL;
  87. break;
  88. default:
  89. // throw new DataException("Oracle连接类型指定失败");
  90. break;
  91. }
  92. }
  93. }
  94. if(StringUtil.isEmpty(prepareUrl)){
  95. prepareUrl = SID_URL;
  96. }
  97. return super.getConnUrl(prepareUrl, host, port, null).replace(DbConst.DB_SCHEMA, schema);
  98. }
  99. @Override
  100. protected String getDynamicTableName(String tableName) {
  101. return TenantHolder.getDatasourceName().toUpperCase()+"."+tableName;
  102. }
  103. public void setPartFieldModel(DbFieldModel model, ResultSet result) throws Exception{
  104. if(model.getDataType().toUpperCase().contains("TIMESTAMP")){
  105. model.setDataType("TIMESTAMP");
  106. }
  107. super.setPartFieldModel(model, result);
  108. }
  109. /**
  110. * Oracle特殊添加数据连接方式
  111. */
  112. public Connection getOracleConn(DbLinkEntity dsd, String url) throws DataException {
  113. String logonUser = "";
  114. if(StringUtil.isNotEmpty(dsd.getOracleParam())){
  115. Map<String, Object> oracleParamMap = JsonUtil.stringToMap(dsd.getOracleParam());
  116. if(oracleParamMap.size() > 0){
  117. logonUser = oracleParamMap.get(DbOracle.ORACLE_ROLE).toString();
  118. }
  119. }
  120. return createOracleConn(driver, logonUser, dsd.getUserName(), dsd.getPassword(), url);
  121. }
  122. private static Connection createOracleConn(String driver, String logonUser, String userName, String password, String url) throws DataException {
  123. //Oracle登录角色设置(Default,SYSDBA,SYSOPER)
  124. Properties conProps = DbOracle.setConnProp(logonUser, userName, password);
  125. return ConnUtil.ConnCommon.createConnByProp(driver, conProps.getProperty("user"), password, url, conProps);
  126. }
  127. public static Properties setConnProp(String logonUser, String userName, String password){
  128. Properties conProps = new Properties();
  129. // 使用角色登录:userName + :@{角色}
  130. if(!logonUser.isEmpty()){
  131. //defaultRowPrefetch:从服务器预取的默认行数(默认值为“10”) String (containing integer value)
  132. conProps.put("defaultRowPrefetch", "15");
  133. /* 这里有一个风险:由于客户userName中含有一个或多个:@导致连接失败 */
  134. //internal_logon:允许您作为sys登录的权限,如sysdba或sysoper
  135. conProps.put("internal_logon", logonUser);
  136. conProps.put("user", userName);
  137. }
  138. conProps.put("user", userName);
  139. conProps.setProperty("password", password);
  140. return conProps;
  141. }
  142. }