Java 数据源、JDBC 数据源示例

Java DataSource and JDBC DataSource programming is the way to work with database in our java programs. We have already seen that JDBC DriverManager can be used to get relational database connections. But when it comes to actual programming, we want more than just connections. Java DataSource, JDBC DataSource, JDBC DataSource Example, MysqlDataSource, OracleDataSource

Java 数据源

大多数时候,我们正在寻找连接的松散连接,以便我们可以轻松切换数据库,连接组合用于交易管理和分布式系统支持。 JDBC DataSource是您在应用程序中寻找任何这些功能的首选方法。

JDBC数据源

例如,MySQL JDBC 驅動程式為「com.mysql.jdbc.jdbc2.optional.MysqlDataSource」類別提供「DataSource」接口的基本實施,而 Oracle 資料庫驅動程式則為「oracle.jdbc.pool.OracleDataSource」類別提供「DataSource」接口的基本實施。

  • 缓存 PreparedStatement 以进行更快的处理
  • 连接时间设置
  • 记录功能
  • 结果集最大尺寸门槛

JDBC数据源示例

Let's create a simple JDBC DataSource example project and learn how to use MySQL and Oracle DataSource basic implementation classes to get the database connection. Our final project will look like below image. JDBC DataSource Example, Java DataSource, JDBC DataSource

Java JDBC 数据源 - 数据库设置

在我们进入我们的示例程序之前,我们需要一些数据库设置与表和样本数据。安装MySQL或Oracle数据库不在本教程的范围内,所以我只会继续和设置表与样本数据。

 1--Create Employee table
 2CREATE TABLE `Employee` (
 3  `empId` int(10) unsigned NOT NULL,
 4  `name` varchar(10) DEFAULT NULL,
 5  PRIMARY KEY (`empId`)
 6) ENGINE=InnoDB DEFAULT CHARSET=utf8;
 7
 8-- insert some sample data
 9INSERT INTO `Employee` (`empId`, `name`)
10VALUES
11    (1, 'Pankaj'),
12    (2, 'David');
13
14commit;
 1CREATE TABLE "EMPLOYEE"
 2  (
 3    "EMPID"   NUMBER NOT NULL ENABLE,
 4    "NAME"    VARCHAR2(10 BYTE) DEFAULT NULL,
 5    PRIMARY KEY ("EMPID")
 6  );
 7
 8Insert into EMPLOYEE (EMPID,NAME) values (10,'Pankaj');
 9Insert into EMPLOYEE (EMPID,NAME) values (5,'Kumar');
10Insert into EMPLOYEE (EMPID,NAME) values (1,'Pankaj');
11commit;

现在让我们继续我们的Java程序. 为了数据库配置松散结合,我会从属性文件中阅读它们. db.properties文件:

 1#mysql DB properties
 2MYSQL_DB_DRIVER_CLASS=com.mysql.jdbc.Driver
 3MYSQL_DB_URL=jdbc:mysql://localhost:3306/UserDB
 4MYSQL_DB_USERNAME=pankaj
 5MYSQL_DB_PASSWORD=pankaj123
 6
 7#Oracle DB Properties
 8ORACLE_DB_DRIVER_CLASS=oracle.jdbc.driver.OracleDriver
 9ORACLE_DB_URL=jdbc:oracle:thin:@localhost:1521:orcl
10ORACLE_DB_USERNAME=hr
11ORACLE_DB_PASSWORD=oracle

请确保上述配置与本地设置相匹配,并确保您在项目的构建路径中包含 MySQL 和 Oracle DB JDBC 插槽。

Java JDBC 数据源 - MySQL, Oracle 示例

让我们写一个我们可以使用的工厂类来获取MySQL或Oracle DataSource。

 1package com.journaldev.jdbc.datasource;
 2
 3import java.io.FileInputStream;
 4import java.io.IOException;
 5import java.sql.SQLException;
 6import java.util.Properties;
 7
 8import javax.sql.DataSource;
 9
10import oracle.jdbc.pool.OracleDataSource;
11
12import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;
13
14public class MyDataSourceFactory {
15
16    public static DataSource getMySQLDataSource() {
17    	Properties props = new Properties();
18    	FileInputStream fis = null;
19    	MysqlDataSource mysqlDS = null;
20    	try {
21    		fis = new FileInputStream("db.properties");
22    		props.load(fis);
23    		mysqlDS = new MysqlDataSource();
24    		mysqlDS.setURL(props.getProperty("MYSQL_DB_URL"));
25    		mysqlDS.setUser(props.getProperty("MYSQL_DB_USERNAME"));
26    		mysqlDS.setPassword(props.getProperty("MYSQL_DB_PASSWORD"));
27    	} catch (IOException e) {
28    		e.printStackTrace();
29    	}
30    	return mysqlDS;
31    }
32    
33    public static DataSource getOracleDataSource(){
34    	Properties props = new Properties();
35    	FileInputStream fis = null;
36    	OracleDataSource oracleDS = null;
37    	try {
38    		fis = new FileInputStream("db.properties");
39    		props.load(fis);
40    		oracleDS = new OracleDataSource();
41    		oracleDS.setURL(props.getProperty("ORACLE_DB_URL"));
42    		oracleDS.setUser(props.getProperty("ORACLE_DB_USERNAME"));
43    		oracleDS.setPassword(props.getProperty("ORACLE_DB_PASSWORD"));
44    	} catch (IOException e) {
45    		e.printStackTrace();
46    	} catch (SQLException e) {
47    		e.printStackTrace();
48    	}
49    	return oracleDS;
50    }
51    	
52}

请注意,Oracle 和 MySQL DataSource 实现类都非常相似,让我们写一个简单的测试程序来使用这些方法并运行一些测试。

 1package com.journaldev.jdbc.datasource;
 2
 3import java.sql.Connection;
 4import java.sql.ResultSet;
 5import java.sql.SQLException;
 6import java.sql.Statement;
 7
 8import javax.sql.DataSource;
 9
10public class DataSourceTest {
11
12    public static void main(String[] args) {
13    	
14    	testDataSource("mysql");
15    	System.out.println("**********");
16    	testDataSource("oracle");
17
18    }
19
20    private static void testDataSource(String dbType) {
21    	DataSource ds = null;
22    	if("mysql".equals(dbType)){
23    		ds = MyDataSourceFactory.getMySQLDataSource();
24    	}else if("oracle".equals(dbType)){
25    		ds = MyDataSourceFactory.getOracleDataSource();
26    	}else{
27    		System.out.println("invalid db type");
28    		return;
29    	}
30    	
31    	Connection con = null;
32    	Statement stmt = null;
33    	ResultSet rs = null;
34    	try {
35    		con = ds.getConnection();
36    		stmt = con.createStatement();
37    		rs = stmt.executeQuery("select empid, name from Employee");
38    		while(rs.next()){
39    			System.out.println("Employee ID="+rs.getInt("empid")+", Name="+rs.getString("name"));
40    		}
41    	} catch (SQLException e) {
42    		e.printStackTrace();
43    	}finally{
44    			try {
45    				if(rs != null) rs.close();
46    				if(stmt != null) stmt.close();
47    				if(con != null) con.close();
48    			} catch (SQLException e) {
49    				e.printStackTrace();
50    			}
51    	}
52    }
53
54}

请注意,客户端类完全独立于任何数据库特定类别,这有助于我们从客户端程序中隐藏潜在的实现细节,从而获得松散的连接和抽象效益。

1Employee ID=1, Name=Pankaj
2Employee ID=2, Name=David
3**********
4Employee ID=10, Name=Pankaj
5Employee ID=5, Name=Kumar
6Employee ID=1, Name=Pankaj

Apache Commons DBCP 示例

如果你看上面的Java DataSource工厂类别,它有两个主要问题。

1.创建 MySQL 和 Oracle DataSource 的工厂类方法与相应的驱动程序 API 密切相关. 如果我们想在未来取消对 Oracle 数据库的支持,或者想添加一些其他数据库支持,则需要代码更改 2.获取 MySQL 和 Oracle DataSource 的代码大多是相似的,唯一的不同是我们正在使用的实现类

Apache Commons DBCP API 通过提供 Java DataSource 实现来帮助我们摆脱这些问题,它在我们的程序和不同的 JDBC 驱动程序之间作为抽象层工作。 Apache DBCP 库依赖于 Commons Pool 库,所以请确保它们都位于图像中所示的构建路径中。

 1package com.journaldev.jdbc.datasource;
 2
 3import java.io.FileInputStream;
 4import java.io.IOException;
 5import java.util.Properties;
 6
 7import javax.sql.DataSource;
 8
 9import org.apache.commons.dbcp.BasicDataSource;
10
11public class DBCPDataSourceFactory {
12
13    public static DataSource getDataSource(String dbType){
14    	Properties props = new Properties();
15    	FileInputStream fis = null;
16    	BasicDataSource ds = new BasicDataSource();
17    	
18    	try {
19    		fis = new FileInputStream("db.properties");
20    		props.load(fis);
21    	}catch(IOException e){
22    		e.printStackTrace();
23    		return null;
24    	}
25    	if("mysql".equals(dbType)){
26    		ds.setDriverClassName(props.getProperty("MYSQL_DB_DRIVER_CLASS"));
27            ds.setUrl(props.getProperty("MYSQL_DB_URL"));
28            ds.setUsername(props.getProperty("MYSQL_DB_USERNAME"));
29            ds.setPassword(props.getProperty("MYSQL_DB_PASSWORD"));
30    	}else if("oracle".equals(dbType)){
31    		ds.setDriverClassName(props.getProperty("ORACLE_DB_DRIVER_CLASS"));
32            ds.setUrl(props.getProperty("ORACLE_DB_URL"));
33            ds.setUsername(props.getProperty("ORACLE_DB_USERNAME"));
34            ds.setPassword(props.getProperty("ORACLE_DB_PASSWORD"));
35    	}else{
36    		return null;
37    	}
38    	
39    	return ds;
40    }
41}

正如你可以看到的,取决于用户输入,或创建了MySQL或Oracle DataSource。如果你在应用程序中仅支持一个数据库,那么你甚至不需要这些逻辑。只需改变属性,你可以从一个数据库服务器切换到另一个。通过Apache DBCP提供抽象的关键点是 _setDriverClassName()_方法。这里是客户端程序使用上面的工厂方法获得不同类型的连接。

 1package com.journaldev.jdbc.datasource;
 2
 3import java.sql.Connection;
 4import java.sql.ResultSet;
 5import java.sql.SQLException;
 6import java.sql.Statement;
 7
 8import javax.sql.DataSource;
 9
10public class ApacheCommonsDBCPTest {
11
12    public static void main(String[] args) {
13    	testDBCPDataSource("mysql");
14    	System.out.println("**********");
15    	testDBCPDataSource("oracle");
16    }
17
18    private static void testDBCPDataSource(String dbType) {
19    	DataSource ds = DBCPDataSourceFactory.getDataSource(dbType);
20    	
21    	Connection con = null;
22    	Statement stmt = null;
23    	ResultSet rs = null;
24    	try {
25    		con = ds.getConnection();
26    		stmt = con.createStatement();
27    		rs = stmt.executeQuery("select empid, name from Employee");
28    		while(rs.next()){
29    			System.out.println("Employee ID="+rs.getInt("empid")+", Name="+rs.getString("name"));
30    		}
31    	} catch (SQLException e) {
32    		e.printStackTrace();
33    	}finally{
34    			try {
35    				if(rs != null) rs.close();
36    				if(stmt != null) stmt.close();
37    				if(con != null) con.close();
38    			} catch (SQLException e) {
39    				e.printStackTrace();
40    			}
41    	}
42    }
43
44}

当您在程序上运行时,输出将与以前的程序相同。如果您查看Java JDBC DataSource和以上的使用情况,它也可以用正常的DriverManager做。Java DataSource的主要好处是当它在一个背景和JNDI中使用时。使用简单的配置,我们可以创建一个数据库连接池,由容器本身维护。大多数服务器容器,如Tomcat和JBoss,都提供自己的Java DataSource实现,我们所需要的只是通过简单的XML基于配置来配置它,然后使用JNDI背景搜索来获取Java DataSource并与它一起工作。这有助于我们从我们的应用程序到服务器侧进行连接和管理,从而给我们更多的时间来编写应用程序的业务逻辑。在下一个教程中,我们将学习

Published At
Categories with 技术
Tagged with
comments powered by Disqus