数据源 java_Java读取数据源相关信息

一、采用读取数据源配置文件的方式

package com.ofsp.utils;

import java.io.IOException;

import java.io.InputStream;

import java.sql.Connection;

import java.sql.DatabaseMetaData;

import java.sql.DriverManager;

import java.sql.ResultSet;

import java.sql.SQLException;

import java.util.ArrayList;

import java.util.List;

import java.util.Properties;

public class DataSourceUtil {

public static final String DATASOURCE_FILENAME ="jdbc.properties"; //连接数据库的数据源文件

public static final String DATASOURCE_URL = "jdbc.url"; //数据源文件里url的key

public static final String DATASOURCE_USERNAME = "jdbc.username";//数据源文件里用户名的key

public static final String DATASOURCE_PASSWORD = "jdbc.password";//数据源文件里密码的key

/**

* 读取配置文件信息

* @return Properties 配置文件信息

* @throws Exception

*/

public static Properties getProperties() throws Exception {

InputStream in = null;

if (in == null) {

//Class.getResourceAsStream() 会指定要加载的资源路径与当前类所在包的路径一致。例如你写了一个MyTest类在包com.test.mycode 下,那么MyTest.class.getResourceAsStream("name") 会在com.test.mycode包下查找相应的资源。如果这个name是以 '/' 开头的,那么就会从classpath的根路径下开始查找。 ClassLoader.getResourceAsStream()  无论要查找的资源前面是否带'/' 都会从classpath的根路径下查找。

in = Thread.currentThread().getContextClassLoader().getResourceAsStream(DATASOURCE_FILENAME); //路径是 classpath的相对路径, classpath是指WEB-INF文件夹下的classes目录

if(in == null){

throw new Exception("找不到路径为"+DATASOURCE_FILENAME+"的数据源配置文件。");

}

}

Properties properties = new Properties();

try {

properties.load(in);

} catch (IOException e) {

e.printStackTrace();

}

return properties;

}

/**

* 读取配置文件获取连接数据库的数据库url

* @return String 数据库名

* @throws Exception

*/

public static String getDatabaseURL() throws Exception {

Properties p = getProperties();

return p.getProperty(DATASOURCE_URL);

}

/**

* 读取配置文件获取连接数据库的用户名

* @return String 用户名

* @throws Exception

*/

public static String getUserOfDatabase() throws Exception {

Properties p = getProperties();

return p.getProperty(DATASOURCE_USERNAME);

}

/**

* 读取配置文件获取连接数据库的密码

* @return String 密码

* @throws Exception

*/

public static String getPasswordOfDatabase() throws Exception {

Properties p = getProperties();

return p.getProperty(DATASOURCE_PASSWORD);

}

/**

* 获取数据库Connection

* @return

* @throws Exception

*/

public static Connection getConnection() throws Exception{

Properties p = getProperties();

String url = p.getProperty(DATASOURCE_URL);

String username = p.getProperty(DATASOURCE_USERNAME);

String password = p.getProperty(DATASOURCE_PASSWORD);

return DriverManager.getConnection(url, username, password);

}

/**

* 获取指定数据库和用户的所有表名

* @param conn 连接数据库对象

* @param user 用户

* @param database 数据库名

* @return

*/

public static List getAllTableNames(Connection conn,String database,String schem,String tableName) {

List tableNames = new ArrayList();

if (conn != null) {

try {

DatabaseMetaData metadata = conn.getMetaData();

// 表名列表

ResultSet rest = metadata.getTables(database, schem.toUpperCase(), tableName.toUpperCase(), new String[] {"TABLE"});

while (rest.next()) {

tableNames.add(rest.getString("TABLE_NAME"));

}

} catch (SQLException e) {

e.printStackTrace();

}

}

return tableNames;

}

}

二、如果采用Spring框架的话,还可以从Spring的配置文件中获取当前数据源:

数据源文件配置在spring-context.xml文件中,部分片断截取:

6586168.html

DruidDataSource dataSource = ApplicationContextHelper.getBean("dataSource");//获取数据源

Connection connection = dataSource.getConnection();//获取连接

String user = dataSource.getUsername();//获取用户名

注意:connection用完后一定要及时close掉,否则会出现溢出错误。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,下面是 Java 注解实现动态数据源切换的实例代码: 首先,我们需要定义一个注解 `@DataSource`,用于标记需要使用的数据源: ``` @Target({ElementType.TYPE, ElementType.METHOD}) @Retention(RetentionPolicy.RUNTIME) public @interface DataSource { String value() default "default"; } ``` 然后,我们需要定义一个数据源切换的切面 `DataSourceAspect`,在该切面中,我们可以通过读取注解中的值,来切换到相应的数据源: ``` @Aspect @Component public class DataSourceAspect { @Around("@annotation(dataSource)") public Object around(ProceedingJoinPoint point, DataSource dataSource) throws Throwable { String dataSourceName = dataSource.value(); DynamicDataSource.setDataSource(dataSourceName); try { return point.proceed(); } finally { DynamicDataSource.clearDataSource(); } } } ``` 在上面的代码中,我们通过 `@Around` 注解定义了一个环绕通知,通过 `@annotation(dataSource)` 表示该通知绑定在标记了 `@DataSource` 注解的方法上面。在通知中,我们首先读取注解中的值 `dataSource.value()`,然后调用 `DynamicDataSource.setDataSource()` 方法来切换数据源,在方法执行完成后,我们再调用 `DynamicDataSource.clearDataSource()` 方法来清除当前线程的数据源信息。 最后,我们需要定义一个 `DynamicDataSource` 类,用于存储当前线程所使用的数据源: ``` public class DynamicDataSource extends AbstractRoutingDataSource { private static final ThreadLocal<String> dataSourceHolder = new ThreadLocal<>(); public static void setDataSource(String dataSourceName) { dataSourceHolder.set(dataSourceName); } public static void clearDataSource() { dataSourceHolder.remove(); } @Override protected Object determineCurrentLookupKey() { return dataSourceHolder.get(); } } ``` 在上面的代码中,我们继承了 Spring 的 `AbstractRoutingDataSource` 类,并重写了其中的 `determineCurrentLookupKey()` 方法,该方法返回当前线程所使用的数据源名称。在 `setDataSource()` 方法中,我们将当前线程要使用的数据源名称存入了 `ThreadLocal` 中,在 `clearDataSource()` 方法中,则是清除了该值。 以上就是 Java 注解实现动态数据源切换的实例代码,希望对你有所帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值