发表于: 2019-10-18 18:43:13
1 1088
一、今天完成的事情
- 首先,Java应用需要创建并建立与特定数据库的连接。这可以通过Driven Manager完成,比如,接口java.sql.DriveManager的实例;或者直接通过JDBC数据源进行连接。接口javax.sq.DataSource可以用来建立JDBC数据源连接。后面的章节会详细介绍这些组件。
- 一旦连接到数据库,我们就可以使用java.sql.Connection来执行CRUD (创建-create, 读取-read, 更新-update, 删除delete) SQL 语句或操作。后面的章节会详细介绍这些语句。
- 数据库组件:
- 为了执行这些操作,程序员可以使用基于java.sql.Statement and java.sql.PreparedStatement 的类。需要多次执行相同的语句,后者会更高效一些,另外它也提供了一些我们将会在本教程后面章节提到的优点。接口JDBC连接提供了很多机制来创建statement实例:
- PreparedStatement countriesStatement = connection.prepareStatement("UPDATE COUNTRIES SET NAME = ? WHERE ID = ?");countriesStatement.setString(1, "Spain");countriesStatement.setInt(2, 123456789);
- 插入、更新和删除操作会返回所改变的记录行数:
- // countriesStatement belongs to the class Statement, returning number of updated rowsint n = countriesStatement.executeUpdate();
- 选择操作(查询)会通过java.sql.ResultSet返回很多数据行;遍历这些记录时可以通过列名或行号;查询结果的元数据也可以获取得到:
1234// countriesStatement belongs to the class StatementResultSet rs = countriesStatement.executeQuery("SELECT NAME, POPULATION FROM COUNTRIES");//rs contains the results in rows plus some metadata...- 通常情况下,JDBC使用连接池来管理数据库连接。连接池有很多不同的实现方式,比如C3P0或DBCP。数据库连接池是一组JDBC连接,当应用程序请求连接时,它会分配一个空闲连接;当应用中有任务终结时,它会释放相应的连接。有很多文档介绍了如果使用和配置JDBC连接池,这个有个不错的教程http://docs.oracle.com/cd/E13222_01/wls/docs81/ConsoleHelp/jdbc_connection_pools.html 。
- JDBC还有一些其它功能:存储过程(Stored Procedure)、可调用声明(Callable Statements), 批处理(Batch Processing)… 本教程会一一讲解这些概念。
- 数据库连接:
我们通过java.sql.Connection 对象来连接到数据库,具体方法是调用java.sql.DriverManager类的getConnection()方法。这个方法的参数包括数据库主机名和登录信息。
如下代码片段展示了如何创建本地MySQL数据库的连接。
12345//MySQL driver is loadedClass.forName( "com.mysql.jdbc.Driver" );//Connection object is created using the db host and credentialsConnection connect = DriverManager.getConnection("jdbc:mysql://localhost/countries?"+ "user=root&password=root" );数据库连接对象使得程序员可以做如下操作:
- 创建JDBC Statement:使用已建立的连接,可以创建Statement, PreparedStatement 或CallableStatement 实例,然后通过这些实例提供的各种方法来执行不同的SQL语句。举个例子说明如何创建PreparedStatement:
12//the connection conn is used to create a prepared statement with the given sql operationPreparedStatement updateStmt = conn.prepareStatement( sql );这个Statement可以执行通过参数传入的更新SQL语句。
- 可以提交或者回退指定的事务。JDBC连接支持两种工作方式:autocommit=true 和 autocommit=false. 第一种方式直接提交所有事务至数据库;第二种方式需要执行一条特殊命令来提交或者回退这些事务。我们会在后面的相关章节中更详细的讲解这个特性。下面以一小段代码为例来说明如何更改JDBC连接的自动提交模式:
12//it changes the mode to auto commit=falseconnect.setAutoCommit( false );- 提供了功能可以获得所使用的数据库的元信息。
- 其它一些功能例如批处理(batch processing)、存储过程(stored procedure)等等。
- 数据库:
JDBC能够支持相当多的数据库。它高度抽象出数据库的共性和工作方式,使得可以通过不同的驱动程序来支持它们。类DriverManager负责加载合适的数据库驱动,加载完毕后,那些用来读取和修改数据的代码基本是跨数据库通用的(或许会有一点点差异)。
这里有个链接可以查看JDBC支持的数据库列表(已在Oracle官方注册的): http://www.oracle.com/technetwork/java/index-136695.html。
MySQL 示例:
0102030405060708091011121314151617181920212223242526272829303132333435363738public static void main( String[] args ) throws ClassNotFoundException, SQLException{// connection to JDBC using mysql driverClass.forName( "com.mysql.jdbc.Driver" );Connection connect = DriverManager.getConnection("jdbc:mysql://localhost/countries?"+ "user=root&password=root" );selectAll( connect );// close resources, in case of exception resources are not properly cleared...}/*** select statement and print out results in a JDBC result set** @param conn* @throws SQLException*/private static void selectAll( java.sql.Connection conn ) throws SQLException{Statement statement = conn.createStatement();ResultSet resultSet = statement.executeQuery( "select * from COUNTRIES" );while( resultSet.next() ){String name = resultSet.getString( "NAME" );String population = resultSet.getString( "POPULATION" );System.out.println( "NAME: " + name );System.out.println( "POPULATION: " + population );}}- 二、明天要做的事情
- 继续往下学习
三、遇到的困难
四、收获
深入了解JDBC
评论