shikeying
2024-01-11 3b67e947e36133e2a40eb2737b15ea375e157ea0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
package com.walker.jdbc.ds;
 
import com.alibaba.druid.pool.DruidDataSource;
import com.walker.db.DatabaseType;
import com.walker.infrastructure.ApplicationRuntimeException;
import com.walker.infrastructure.utils.StringUtils;
import com.walker.jdbc.Constants;
import com.walker.jdbc.DataSourceMeta;
import com.walker.jdbc.util.TextUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
 
/**
 * 包装阿里 <code>DruidDataSource</code> 数据源,形成自己的类型,隔离依赖。
 * @author 时克英
 * @date 2023-03-15
 */
public class MyDruidDataSource extends DruidDataSource implements DataSourceMeta {
 
    protected final transient Logger logger = LoggerFactory.getLogger(this.getClass());
 
    @Override
    public DatabaseType getDatabaseType() {
        return this.databaseType;
    }
 
    @Override
    public String getDatabaseName() {
        return this.databaseName;
    }
 
    @Override
    public String getIp() {
        return this.ip;
    }
 
    @Override
    public int getPort() {
        return this.port;
    }
 
    @Override
    public String getUsername() {
        return username;
    }
    @Override
    public String getPassword() {
        return password;
    }
    @Override
    public String getUrl() {
        return this.jdbcUrl;
    }
 
    @Override
    public void setPassword(String password) {
        this.password = password;
    }
    @Override
    public void setUsername(String username) {
        this.username = username;
    }
 
    /**
     * 重写druid设置url方法,初始化数据源。
     * @param jdbcUrl
     * @date 2023-03-15
     */
    @Override
    public void setUrl(String jdbcUrl) {
        super.setUrl(jdbcUrl);
        logger.info("jdbcUrl = " + jdbcUrl);
 
        // 解析ip、端口、数据库名称
        String[] ipAndPortAndService = TextUtils.parseIpAndPortFromUrl(jdbcUrl);
        if(ipAndPortAndService != null){
            this.ip = ipAndPortAndService[0];
            this.port = Integer.parseInt(ipAndPortAndService[1]);
            this.databaseName = ipAndPortAndService[2];
        }
 
        String[] values = jdbcUrl.split(StringUtils.SEPARATOR_COLON);
        if(values == null || values.length <=1){
            throw new ApplicationRuntimeException("DataSource set jdbcUrl error: " + jdbcUrl);
        }
 
        for(String v : values){
            if(v.equalsIgnoreCase(DatabaseType.NAME_MYSQL)){
                this.databaseType = DatabaseType.MYSQL;
                return;
            } else if(v.equalsIgnoreCase(DatabaseType.NAME_ORACLE)){
                this.databaseType = DatabaseType.ORACLE;
                return;
            } else if(v.equalsIgnoreCase(DatabaseType.NAME_POSTGRES) || v.equalsIgnoreCase(DatabaseType.NAME_POSTGRESQL)){
                this.databaseType = DatabaseType.POSTGRES;
                return;
            } else if(v.equalsIgnoreCase(DatabaseType.NAME_SQLITE)){
                this.databaseType = DatabaseType.SQLITE;
                return;
            } else if(v.equalsIgnoreCase(DatabaseType.NAME_DAMENG)){
                this.databaseType = DatabaseType.DAMENG;
                return;
            } else {
                //
            }
        }
 
        if(this.databaseType == null){
            throw new UnsupportedOperationException("不支持的数据库URL参数:" + jdbcUrl);
        }
        logger.info("数据库类型:" + this.databaseType.name());
    }
 
    /**
     * 重写druid设置url方法,初始化数据源。
     * @param driverClassName
     * @date 2023-03-15
     */
    @Override
    public void setDriverClassName(String driverClassName){
        super.setDriverClassName(driverClassName);
        logger.debug("driverClassName = " + driverClassName);
    }
 
    private DatabaseType databaseType = null;
    private String username;
    private String password;
    private String databaseName;
 
    //=============================================================================================
    // 以下代码用于手动创建独立数据源使用,比如:采集模块动态创建: DatabaseConnector,2022-09-09,时克英
    //=============================================================================================
 
    protected String ip;
    protected int port = 0;
 
    public void setIp(String ip) {
        assert (StringUtils.isNotEmpty(ip));
        this.ip = ip;
    }
 
    public void setPort(int port) {
        assert(port > 0 && port < Integer.MAX_VALUE);
        this.port = port;
    }
 
    public void setDatabaseType(int databaseTypeValue) {
        this.databaseType = DatabaseType.getType(databaseTypeValue);
        String driverName = Constants.getDriverClassName(this.databaseType);
        this.setDriverClassName(driverName);
    }
 
    public void setDatabaseName(String databaseName) {
        if(StringUtils.isEmpty(databaseName)){
            throw new IllegalArgumentException("databaseName 必须填写!");
        }
        if(databaseType == null){
            throw new IllegalArgumentException("databaseType must be set firstly!");
        }
        if(databaseType != DatabaseType.DERBY && StringUtils.isEmpty(ip)){
            throw new IllegalArgumentException("ip or port must be set firstly!");
        }
        String url = Constants.getJdbcUrl(this.databaseType, databaseName, this.ip, this.port);
        this.setUrl(url);
    }
}