手机网站内容规划seo网站培训优化怎么做

news/2025/10/2 4:06:22/文章来源:
手机网站内容规划,seo网站培训优化怎么做,深圳网页设计培训中心,rs232国产在本文中#xff0c;我们提供了全面的JDBC教程#xff08;Java数据库连接性#xff09;#xff0c;这是Oracle提供的一种API#xff0c;允许程序员处理Java应用程序中的不同数据库#xff1a;它允许开发人员建立与数据库的连接#xff0c;定义特定的客户端如何访问给定的… 在本文中我们提供了全面的JDBC教程Java数据库连接性这是Oracle提供的一种API允许程序员处理Java应用程序中的不同数据库它允许开发人员建立与数据库的连接定义特定的客户端如何访问给定的客户端。数据库提供了用于读取插入更新和删除数据库中数据条目的机制并负责处理由不同SQL语句组成的事务。 在本文中我们将解释主要的JDBC组件例如语句结果集或存储过程。 JDBC需要程序员可能要使用的不同数据库的驱动程序。 我们将对此进行详细说明并提供一些示例。 JDBC从一开始就与Java一起出现。 1997年2月第一个发行版随JDK 1.1一起发布此后JDBC一直是Java的重要组成部分。 包含JDBC的主要软件包是http://docs.oracle.com/javase/8/docs/api/java/sql/package-summary.html和http://docs.oracle.com/javase/8/ docs / api / javax / sql / package-summary.html 。 有关最新的JDBC版本4.2及其开发和维护的所有信息可以在JSR 221中找到。 本文中显示的所有示例都是使用Java 8更新0_25和Eclipse SDK版本Luna 4.4实现的。 在本文末尾您可以下载所有这些示例以及更多示例 目录 1.组成 2.连接 3.数据类型 4.驱动程序 5.数据库 6.结果集 7.存储过程 8.陈述 9.批处理命令 10.交易 11. CRUD命令 12. Java 8 13.基于JDBC构建的Sql库 14.单元测试 15.总结 16.下载 17.链接 1.组成 JDBC API允许程序员和Java应用程序与数据库进行交互。 它支持执行不同的SQL语句并处理来自不同数据源的结果。 在本节中我们将尝试总结并列出每个Java应用程序中最重要的JDBC组件所有这些组件将在下一章中进行详细说明。 首先Java应用程序需要创建和建立特定数据库的连接。 使用驱动程序管理器例如接口java.sql.DriverManager一个实例或直接通过JDBC数据源完成此操作。 为此可以使用接口javax.sql.DataSource 。 如前所述我们将在下一章中更详细地解释这些组件。 连接到数据库后就可以使用java.sql.Connection执行CRUD创建读取更新删除SQL语句或操作。 这些说明将在本教程中进行解释。 为了执行这些操作程序员可以使用基于java.sql.Statement和java.sql.PreparedStatement的类。 最后几次在多次执行同一条语句时效率更高并提供了我们将在本教程中列出的其他好处。 JDBC接口连接提供了创建语句实例的机制 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 rows int n countriesStatement.executeUpdate(); 选择操作查询以java.sql.ResultSet内部的行java.sql.ResultSet返回结果。 按名称或数字检索行 结果元数据也可用 // countriesStatement belongs to the class Statement ResultSet 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时还可以使用其他功能存储过程可调用语句批处理…所有这些都将在本教程中进行描述。 2.连接 为了连接到数据库我们需要使用java.sql.Connection对象。 我们可以使用java.sql.DriverManager类的getConnection()方法来完成此操作。 此方法接收数据库主机和凭据作为参数。 此代码段显示了如何为本地MySQL数据库创建连接。 //MySQL driver is loaded Class.forName( com.mysql.jdbc.Driver ); //Connection object is created using the db host and credentials Connection connect DriverManager.getConnection(jdbc:mysql://localhost/countries? userrootpasswordroot ); 连接对象允许程序员执行以下操作 JDBC语句的创建使用连接对象可以创建提供提供执行不同SQL语句方法的Statement PreparedStatement或CallableStatement实例。 这是创建PreparedStatement的示例 //the connection conn is used to create a prepared statement with the given sql operation PreparedStatement updateStmt conn.prepareStatement( sql ); 该语句可以执行作为参数传递的sql更新。 提供提交或回滚给定事务的可能性。 JDBC连接支持两种不同的工作方式 autocommittrue和autocommitfalse 。 第一个将所有事务直接提交到数据库第二个需要特殊命令才能提交或回滚事务。 我们将在本教程的相关章节中看到更多详细信息。 以下代码展示了如何更改JDBC连接的自动提交模式 //it changes the mode to auto commitfalse connect.setAutoCommit( false ); 可能获取有关已使用数据库的元信息。 其他选项例如批处理存储过程等。 我们将详细解释所有这些功能目前最好知道什么是JDBC连接以及使用JDBC连接可以完成的操作。 3.数据类型 JDBC将Java数据类型转换为适当的JDBC类型然后再在数据库中使用它们。 Java和JDBC数据类型之间存在默认映射该映射提供了数据库实现和驱动程序之间的一致性。 下表包含这些映射 的SQL JDBC / Java 二传手 吸气剂 VARCHAR java.lang.String setString getString 焦炭 java.lang.String setString getString LONGVARCHAR java.lang.String setString getString 比特 布尔值 setBoolean getBoolean 数字 大十进制 setBigDecimal getBigDecimal 天音 字节 setByte getByte SMALLINT 短 setShort getShort 整数 整型 setInt getInt 比金特 长 setLong getLong 真实 浮动 setFloat getFloat 浮动 浮动 setFloat getFloat 双 双 setDouble getDouble VARBINARY 字节[] setBytes getBytes 二进制 字节[] setBytes getBytes 日期 java.sql.Date 设置日期 getDate 时间 java.sql.Time 设置时间 getTime 时间戳 java.sql.Timestamp setTimestamp getTimestamp CLOB java.sql.Clob setClob getClob BLOB java.sql.Blob setBlob getBlob 阵列 java.sql.Array setARRAY getARRAY 参考 java.sql.Ref SetRef getRef 结构 java.sql.Struct SetStruct getStruct 在SQL和Java中空值的处理方式有所不同。 在Java中使用SQL空值进行处理时最好遵循一些最佳做法例如避免使用基本类型因为它们不能为空但可以转换为默认值例如int为0booleans为false等。 取而代之的是建议对原始类型使用包装器类。 ResultSet类包含一个名为wasNull()的方法在这些情况下非常有用。 这是一个用法示例 Statement stmt conn.createStatement( ); String sql SELECT NAME, POPULATION FROM COUNTRIES; ResultSet rs stmt.executeQuery(sql);int id rs.getInt(1); if( rs.wasNull( ) ) {id 0; }4.驱动程序 JDBC驱动程序管理器java.sql.DriverManager是JDBC API最重要的元素之一。 它是处理JDBC驱动程序列表的基本服务。 它包含允许Java应用程序连接到所需JDBC驱动程序的机制和对象。 它负责管理不同类型的JDBC数据库驱动程序。 总结驱动程序管理器的主要任务是了解可用驱动程序的列表并处理特定选定驱动程序和数据库之间的连接。 此类中最常用的方法是DriverManager.getConnetion() 。 此方法建立与数据库的连接。 这是一个用法示例 // Create the connection with the default credentials java.sql.Connection conn DriverManager.getConnection(jdbc:hsqldb:mem:mydb, SA, ); 我们可以使用DriverManager.registerDriver().方法注册驱动程序DriverManager.registerDriver(). new org.hsqldb.jdbc.JDBCDriver(); DriverManager.registerDriver( new org.hsqldb.jdbc.JDBCDriver() ); 我们还可以通过调用Class.forName()方法来加载驱动程序 // Loading the HSQLDB JDBC driver Class.forName( org.hsqldb.jdbc.JDBCDriver );...// connection to JDBC using mysql driver Class.forName( com.mysql.jdbc.Driver ); 主要区别在于方法registerDriver()需要驱动程序在编译时可用加载驱动程序类不需要驱动程序在编译时可用。 在JDBC 4之后不需要真正调用这些方法并且应用程序不需要单独注册驱动程序也不需要加载驱动程序类。 也建议不要使用registerDriver()方法手动注册驱动程序。 DriverManager类的其他有趣方法是getDriver(String url) 它尝试通过给定的字符串查找驱动程序而getDrivers()返回先前已在Driver Manager中注册的所有驱动程序的枚举 Enumeration drivers DriverManager.getDrivers(); while( drivers.hasMoreElements() ) {Driver driver drivers.nextElement();System.out.println( driver.getClass() ); }5.数据库 JDBC支持大量数据库。 它通过使用不同的驱动程序来抽象其差异和工作方式。 DriverManager类负责加载正确的数据库在加载正确的数据库之后用于访问数据库以查询和修改数据的代码将保持或多或少不变。 以下是JDBC在Oracle中正式注册受支持的数据库的列表 http : //www.oracle.com/technetwork/java/index-136695.html 。 在本章中我们将展示如何使用不同的数据库MySQL和HSQLDB。 第一个是程序员众所周知的且已被广泛使用第二个是HSQLDB它是一个非常有用的测试数据库具有内存功能。 我们将看到如何同时使用这两种方法并且会发现除了加载适当的JDBC驱动程序之外应用程序的其余部分保持不变 MySQL示例 public 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? userrootpasswordroot );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 );}} 内存中HSQLDB示例 public static void main( String[] args ) throws ClassNotFoundException, SQLException{// Loading the HSQLDB JDBC driverClass.forName( org.hsqldb.jdbc.JDBCDriver );// Create the connection with the default credentialsjava.sql.Connection conn DriverManager.getConnection( jdbc:hsqldb:mem:mydb, SA, );// Create a table in memoryString countriesTableSQL create memory table COUNTRIES (NAME varchar(256) not null primary key, POPULATION varchar(256) not null);;// execute the statement using JDBC normal StatementsStatement st conn.createStatement();st.execute( countriesTableSQL );// nothing is in the database because it is just in memory, non persistentselectAll( conn );// after some insertions, the select shows something different, in the next execution these// entries will not be thereinsertRows( conn );selectAll( conn );}.../*** 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 );}} 正如我们在最后的程序中看到的那样 selectAll方法的代码完全相同只是JDBC驱动程序的加载和连接创建发生了变化。 您可以想象在不同环境下工作时它的功能多么强大。 HSQLDB版本的代码还包含负责创建内存数据库并插入一些行的代码但这只是出于显示和清晰的目的可以用不同的方式完成。 6.结果集 类java.sql.ResultSet表示数据库表的结果集。 通常它是创建的 通过执行SQL查询使用Statement或PreparedStatement的select语句。 它包含数据行数据存储在该行中。 这些数据可以通过索引以1开头或属性名称进行访问 // creating the result setResultSet resultSet statement.executeQuery( select * from COUNTRIES );// iterating through the results rowswhile( resultSet.next() ){// accessing column values by index or nameString name resultSet.getString( NAME );int population resultSet.getInt( POPULATION );System.out.println( NAME: name );System.out.println( POPULATION: population );// accessing column values by index or nameString name resultSet.getString( 1 );int population resultSet.getInt( 2 );System.out.println( NAME: name );System.out.println( POPULATION: population );} 如前所示ResultSets包含用于获取不同Java类型的列值的getter方法。 它还包含一个指向当前数据行的光标。 最初光标指向第一行之前。 next方法将光标移动到下一行 java.sql.ResultSet.next() 。 可以使用默认属性例如只能向前移动且不可更新的光标创建ResultSets。 如果程序员想使用其他类型的属性则可以在创建Statement时指定以便通过更改传递的参数来生成结果集 /** * indicating result sets properties that will be created from this statement: type, * concunrrency and holdability */ Statement statement conn.createStatement( ResultSet. TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE, ResultSet.CLOSE_CURSORS_AT_COMMIT ); 使用这种结果集可以在两个方向上移动光标并以此目的将结果集更新或插入新数据到数据库中。 7.存储过程 在本章中我们将解释什么是存储过程以及如何在JDBC中使用它们。 对于示例我们将使用基于MySQL的存储过程。 存储过程是作为执行逻辑单元的一部分并执行定义的任务的SQL语句集。 当封装一组要在数据库上执行的操作时它们非常有用。 首先我们将在MySQL数据库中创建一个过程以下脚本将帮助我们完成此任务 delimiter //CREATE PROCEDURE spanish (OUT population_out INT)BEGINSELECT COUNT(*) INTO population_out FROM countries;END//delimiter ;CALL simpleproc(a); 基本上以上脚本创建了一个名为Spanish的过程该过程具有一个类型为int且没有输入参数的输出属性。 该过程返回数据库中所有国家的计数。 一旦创建了过程就可以从Java应用程序中使用它。要调用存储过程我们需要使用接口java.sql.CallableStatement特殊语句这些语句允许程序员执行存储过程以指示输出属性和要使用的输入参数。 在我们的简单示例中仅配置了输出属性。 这是一个例子 CallableStatement callableStatement null;// the procedure should be created in the databaseString spanishProcedure {call spanish(?)};// callable statement is usedcallableStatement connect.prepareCall( spanishProcedure );// out parameters, also in parameters are possible, not in this casecallableStatement.registerOutParameter( 1, java.sql.Types.VARCHAR );// execute using the callable statement method executeUpdatecallableStatement.executeUpdate();// attributes are retrieved by indexString total callableStatement.getString( 1 );System.out.println( amount of spanish countries total ); 我们将欣赏如何使用java.sql.PreparedStatement.executeUpdate()方法指示该过程的输出存储在何处以及如何执行该过程。 大多数数据库都支持存储过程但是它们的语法和行为可能有所不同这就是Java处理存储过程的Java应用程序可能有所不同的原因具体取决于存储过程的数据库。 8.陈述 如本教程中已经提到的JDBC使用接口java.sql.Statement来执行不同的SQL查询和操作例如插入更新或删除。 这是基本接口包含所有基本方法例如java.sql.Statement.executeQuery(String)或java.sql.Statement.executeUpdate(String) 。 当程序员不需要多次执行相同的查询或不需要对查询和语句进行参数化时建议使用此接口的实现。 通常我们可以说该接口适合于执行DDL语句CreateAlterDrop。 这些语句通常不会多次执行并且不需要支持不同的参数。 如果程序员在重复SQL查询或参数化时需要更好的效率则应使用java.sql.PreparedStatement 。 该接口继承了前面提到的基本语句接口并提供了参数化。 由于此功能此接口可更安全地防止SQL注入攻击。 这是一段代码显示了此接口的示例 System.out.println( Updating rows for name ... );String sql UPDATE COUNTRIES SET POPULATION? WHERE NAME?;PreparedStatement updateStmt conn.prepareStatement( sql );// Bind values into the parameters. updateStmt.setInt( 1, 10000000 ); // population updateStmt.setString( 2, name ); // name// update prepared statement using executeUpdate int numberRows updateStmt.executeUpdate();System.out.println( numberRows rows updated... ); 使用准备好的语句的另一个好处是可以通过使用setObject()方法来处理非标准对象。 这是一个例子 PreparedStatement updateStmt2 conn.prepareStatement( sql );// Bind values into the parameters using setObject, can be used for any kind and type of// parameter.updateStmt2.setObject( 1, 10000000 ); // populationupdateStmt2.setObject( 2, name ); // name// update prepared statement using executeUpdatenumberRows updateStmt2.executeUpdate();System.out.println( numberRows rows updated... );updateStmt2.close(); 就像在与存储过程有关的章节中提到的那样为此目的可以使用另一个接口它称为java.sql.CallableStatement并扩展了PreparedStatement。 9.批处理命令 JDBC提供了成批执行SQL语句列表的可能性即全部成一行。 取决于程序员使用哪种类型的语句代码可能有所不同但总体思路是相同的。 在下一个代码片段中显示了如何对java.sql.Statement使用批处理 Statement statement null;statement connect.createStatement();// adding batchs to the statement statement.addBatch( update COUNTRIES set POPULATION9000000 where NAMEUSA ); statement.addBatch( update COUNTRIES set POPULATION9000000 where NAMEGERMANY ); statement.addBatch( update COUNTRIES set POPULATION9000000 where NAMEARGENTINA );// usage of the executeBatch method int[] recordsUpdated statement.executeBatch();int total 0; for( int recordUpdated : recordsUpdated ) {total recordUpdated; }System.out.println( total records updated by batch total ); 并使用java.sql.PreparedStatement String sql update COUNTRIES set POPULATION? where NAME?;PreparedStatement preparedStatement null;preparedStatement connect.prepareStatement( sql );preparedStatement.setObject( 1, 1000000 );preparedStatement.setObject( 2, SPAIN );// adding batchespreparedStatement.addBatch();preparedStatement.setObject( 1, 1000000 );preparedStatement.setObject( 2, USA );// adding batchespreparedStatement.addBatch();// executing all batchsint[] updatedRecords preparedStatement.executeBatch();int total 0;for( int recordUpdated : updatedRecords ){total recordUpdated;}System.out.println( total records updated by batch total ); 我们可以看到这些区别基本上是使用SQL查询参数的方式以及如何构建查询的但是在一行上执行多个语句的想法是相同的。 在第一种情况下使用方法java.sql.Statement.executeBatch() 在第二种情况下使用java.sql.PreparedStatement.addBatch()和java.sql.Statement.executeBatch() 。 10.交易 JDBC支持事务并包含实现基于事务的应用程序的方法和功能。 我们将在本章中列出最重要的那些。 java.sql.Connection.setAutoCommit(boolean) 此方法接收布尔值作为参数如果为true这是默认行为则所有SQL语句将自动保存在数据库中。 如果为false将不会自动保留更改这将通过使用java.sql.Connection.commit()方法来完成。 java.sql.Connection.commit() 。 仅当自动提交设置为false或禁用时才可以使用此方法。 也就是说它仅适用于非自动提交模式。 执行此方法时自上次提交/回滚以来的所有更改都将保留在数据库中。 java.sql.Connection.rollback() 。 仅当禁用自动提交时才可以使用此方法。 它撤消或还原当前事务中完成的所有更改。 这是一个用法示例在此示例中我们可以看到如何使用setAutoCommit(false)方法禁用自动提交模式。 调用commit()时将commit()所有更改并使用rollback()方法rollback()当前事务更改 Class.forName( com.mysql.jdbc.Driver ); Connection connect null; try {// connection to JDBC using mysql driverconnect DriverManager.getConnection( jdbc:mysql://localhost/countries? userrootpasswordroot );connect.setAutoCommit( false );System.out.println( Inserting row for Japan... );String sql INSERT INTO COUNTRIES (NAME,POPULATION) VALUES (JAPAN, 45000000);PreparedStatement insertStmt connect.prepareStatement( sql );// insert statement using executeUpdateinsertStmt.executeUpdate( sql );connect.rollback();System.out.println( Updating row for Japan... );// update statement using executeUpdate - will cause an error, update will not be// executed becaues the row does not existsql UPDATE COUNTRIES SET POPULATION1000000 WHERE NAMEJAPAN;PreparedStatement updateStmt connect.prepareStatement( sql );updateStmt.executeUpdate( sql );connect.commit();} catch( SQLException ex ) {ex.printStackTrace();//undoes all changes in current transactionconnect.rollback(); } finally {connect.close(); }11. CRUD命令 CRUD来自创建读取更新和删除。 JDBC支持所有这些操作和命令在本章中我们将展示执行所有这些操作的Java代码的不同片段 创建语句。 可以使用JDBC创建数据库这是创建内存数据库的示例 // Create a table in memory String countriesTableSQL create memory table COUNTRIES (NAME varchar(256) not null primary key, POPULATION varchar(256) not null);;// execute the statement using JDBC normal Statements Statement st conn.createStatement(); st.execute( countriesTableSQL ); 插入语句。 JDBC支持插入。 程序员可以使用普通的SQL语法并将它们传递给JDBC提供的不同的语句类例如Statement PreparedStatement或CallableStatement 。 以下是几个示例 Statement insertStmt conn.createStatement();String sql INSERT INTO COUNTRIES (NAME,POPULATION) VALUES (SPAIN, 45Mill); insertStmt.executeUpdate( sql );sql INSERT INTO COUNTRIES (NAME,POPULATION) VALUES (USA, 200Mill); insertStmt.executeUpdate( sql );sql INSERT INTO COUNTRIES (NAME,POPULATION) VALUES (GERMANY, 90Mill); insertStmt.executeUpdate( sql ); 这些语句返回插入的行数。 这同样适用于update语句这是如何更新数据库中的一组行的示例 System.out.println( Updating rows for name ... );Statement updateStmt conn.createStatement();// update statement using executeUpdateString sql UPDATE COUNTRIES SET POPULATION10000000 WHERE NAME name ;int numberRows updateStmt.executeUpdate( sql );System.out.println( numberRows rows updated... ); 输出为 Updating rows for SPAIN... 4 rows updated... 选择对帐单。 可以使用JDBC语句执行任何几乎种类的SQL查询。 这是一个非常简单的示例该示例读取给定表的所有行并在标准控制台中将它们打印出来 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 ); } 其输出为取决于数据库状态 NAME: GERMANY POPULATION: 90Mill NAME: SPAIN POPULATION: 45Mill NAME: USA POPULATION: 200Mill 删除语句。 最后JDBC支持删除行以及删除表和其他SQL元素。 这是一个片段显示删除具有特定条件的所有行在这种情况下名称必须为“ JAPAN” System.out.println( Deleting rows for JAPAN... ); String sql DELETE FROM COUNTRIES WHERE NAMEJAPAN; PreparedStatement deleteStmt connect.prepareStatement( sql );// delete statement using executeUpdate int numberRows deleteStmt.executeUpdate( sql );System.out.println( numberRows rows deleted... ); Delete语句返回受影响的行数在这种情况下输出将是取决于数据库状态 Deleting rows for JAPAN... 0 rows deleted... 这些例子都是非常简单的例子。 它们是出于学习目的而编写的但是您可以想象只需更改传递给executeQuery()或executeUpdate()方法的参数就可以执行更复杂的SQL查询。 12. Java 8 Java 8不包含与JDBC或JDBC框架相关的任何重大更改。 但是在使用JDBC时可以应用Java 8的几种功能效果非常好。 我们将展示其中的一些。 例如可以像过去一样以完全不同的方式执行选择查询。 这是一个没有Java 8功能的情况下的示例它与本文中所有示例中的操作大致相同 // we always need to write this code System.out.println( using Java 7 ); // connection to JDBC using mysql driver Class.forName( com.mysql.jdbc.Driver ); Connection connect DriverManager.getConnection( jdbc:mysql://localhost/countries? userrootpasswordroot );// select query PreparedStatement statement connect.prepareStatement( select * from COUNTRIES ); ResultSet resultSet statement.executeQuery();// iterating results while( resultSet.next() ) {// access via nameObject name resultSet.getObject( 1 );Object population resultSet.getObject( 2 );System.out.println( Name: name );System.out.println( Population: population ); }// close resources, in case of exception resources are not properly cleared resultSet.close(); statement.close(); connect.close(); 这是一个使用Lambdas的相同版本。 // select method is called and lambda expression is provided, this expression will be used // in the handle method of the functional interface select( connect, select * from COUNTRIES, ( resultSet ) - {System.out.println( resultSet.getObject( 1 ) );System.out.println( resultSet.getObject( 2 ) ); } ); 上面显示的这段代码包含一个select方法调用其中第一个参数是Connection对象第二个参数是SQL查询第三个参数是Lambda表达式。 此Lambda表达式接收一个参数 ResultSet实例并打印出其前两个属性但是使用Lambda表达式主体中的该结果集可以完成任何操作。 这是select()方法的实现 public static void select( Connection connect, String sql, ResultSetHandler handler ) throws SQLException{PreparedStatement statement connect.prepareStatement( sql );try (ResultSet rs statement.executeQuery()){while( rs.next() ){handler.handle( rs );}}} 和功能接口ResultSetHandler FunctionalInterface public interface ResultSetHandler {/*** This method will be executed by the lambda expression* * param resultSet* throws SQLException*/public void handle( ResultSet resultSet ) throws SQLException;} 我们在这里可以看到使用某些Java 8新功能时代码更加清晰而且大幅减少或不减少。 13.基于JDBC构建的Sql库 几个著名的Java库使用JDBC来构建它们的API。 在本节中我们将列出其中一些 HSQLDB超SQL数据库是一种关系数据库管理系统可提供内存和持久性存储。 它具有JDBC驱动程序如某些示例所示。 它具有非持久性功能并且几乎支持所有SQL核心功能因此对测试非常有用。 有关更多信息请访问http://hsqldb.org/ DBUnit是JUnit的扩展。 当涉及数据库时它对于单元测试非常有用。 该框架负责测试之间的数据库状态并在测试时抽象出几个数据库属性。 要下载源代码和更多文档请访问http://www.dbunit.org DBUtils是一个Apache Commons库旨在简化JDBC的使用。 该库包含的一些功能包括清理资源减少代码数量更轻松自动填充结果集。 该库小巧透明且快速应由希望直接使用JDBC的开发人员使用。 使用此库需要Java 1.6或更高版本。 有关更多文档请访问http://commons.apache.org/proper/commons-dbutils/ Spring Data还包含一个与JDBC相关的模块。 它称为Spring Data JDBC Extensions。 它提供了对JDBC最常用功能的支持。 它提供了使用Oracle数据库的特殊功能。 如果您想了解有关此库的更多信息请访问http://projects.spring.io/spring-data-jdbc-ext/ JOOQ是使用JDBC的公司数据仓库中非常有趣的框架。 它从SQL数据库生成Java代码并提供API以建立JDBC连接查询数据并以简单的方式处理结果。 有关更多信息请访问其git hub帐户 https : //github.com/jOOQ/jOOL 。 14.单元测试 当涉及到单元测试和数据库时总是存在几个问题 我们使用什么环境进行测试 我们是否用真实数据进行测试 还是我们使用合成的生成数据 如果没有适当的凭据我们如何测试数据库 几个库可以帮助我们完成这些任务。 在本章中我们将列出其中一些并提供一些有用的链接在这些链接中可以找到更多信息 DBUnit如前所述DBUnit是一个与Junit协作的测试框架。 有关更多信息请访问http://dbunit.org。 TestNG此测试框架涵盖许多测试场景例如单元测试功能测试集成测试等。它基于注释。 有关此框架的更多信息请访问其网站 http : //testng.org/doc/index.html JOOQ。 该框架提供了JDBC模拟和测试功能。 它有很好的文档记录易于使用。 有关更多信息请访问http://jooq.org 15.总结 JDBCJava数据库连接性是用于Java与大量数据库和数据源从基于SQL的数据库到Excel电子表格之间的数据库连接的标准API。 在本教程中我们试图解释JDBC体系结构以及如何使用它。 我们列出了JDBC使用的主要组件并列出了用于广泛使用的不同数据库如MySql的一些驱动程序。 要记住的最重要的几点是 驱动程序是使Java应用程序能够与数据库一起使用的组件。 JDBC需要每个特定数据库的驱动程序。 可以在http://www.oracle.com/technetwork/java/index-136695.html上找到JDBC可用驱动程序的列表。 每次都将SQL语句直接发送到数据库服务器。 JDBC包含一种称为PreparedStatement的机制该机制具有预定的执行路径该机制可提高效率并更好地利用资源。 结果集是用于查询中的行的表示形式。 存储过程是组合在一起的一组SQL语句可以按名称调用它们而不必分别调用它们。 事务是一组SQL语句。 当调用commit()或rollback()时事务结束。 这种分组允许不同的并行工作。 CRUD命令是create read update和delete命令。 JDBC提供了执行这些命令的机制。 本教程包含一些与Java 8有关的与JDBC有关的新可能性的信息例如JOOQ。 我们还提到了一些使用JDBC实现的重要库例如Spring-Data或Apache DBUtils。 16.下载JDBC教程源代码 下载 您可以在此处下载本教程的完整源代码 jdbc_ultimate_tutorial 。 17.链接 除了本文中指出的所有链接和资源之外如果您想了解有关JDBC API及其功能和机制的更多信息可以在Oracle官方网站上找到最新的最佳信息源 http://docs.oracle.com/javase/8/docs/api/javax/sql/package-summary.html http://docs.oracle.com/javase/8/docs/api/javax/sql/package-summary.html 翻译自: https://www.javacodegeeks.com/2015/02/jdbc-tutorial.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/924539.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

网站的新闻栏与产品栏如何做北京seo排名方法

this 关键字是 Java 常用的关键字,可用于任何实例方法内指向当前对象,也可指向对其调用当前方法的对象,或者在需要当前类型对象引用时使用。 this.属性名 大部分时候,普通方法访问其他方法、成员变量时无须使用 this 前缀&#…

做网站选择系统牡丹江做网站的公司

项目有个简单的小需求就是在考试时间结束后把待考的用户状态修改为缺考,可以利用TimerTask来实现,在java中实现定时执行任务的功能,主要用到Timer和TimerTask类。其中Timer是用来在一个后台线程按指定的计划来执行指定的任务。 在新增考试的…

校园网站建设管理及责任表邵阳市城乡建设厅网站

1. tomcat下载 官网:https://tomcat.apache.org/ 镜像地址:https://mirrors.huaweicloud.com/apache/tomcat/ 1、选择一个版本下载,官网下载速度缓慢,推荐镜像 2、对压缩包进行解压,无需进行安装,解压放…

tuzicms做企业手机网站如何wordpress 安装主题后

一、消息队列消息队列中间件是分布式系统中重要的组件,主要解决应用耦合、异步消息、流量削锋等问题,实现高性能、高可用、可伸缩和最终一致性架构,是大型分布式系统不可缺少的中间件。目前在生产环境中使用较多的消息队列有ActiveMQ、Rabbit…

最适合seo的网站源码检测一个网站用什么软件做的方法

柔性数组 1. 什么是柔性数组2. 柔性数组的特点3. 柔性数组的使用4. 柔性数组的优势 1. 什么是柔性数组 也许你从来没有听说过柔性数组这个概念,但是它确实是存在的。 C99中,结构体中的最后⼀个元素允许是未知大小的数组,这就叫做柔性数组成员…

海南手机网站建设公司哪家好仿cnzz 网站 源码

1、问题 回显的value和选项value类型不同 form中v-model"form.userId"是字符串类型 option中:value“item.userId” 选项id是数字类型 2、办法 :value“item.userId” 改为 :value“item.iduserId‘’”&#xff08;转换成字符串&#xff09; <el-form-item l…

软件管理app如何优化购物网站建设

网易科技讯 10 月 19 日消息&#xff0c;2019 世界 VR 产业大会在江西省南昌市举行。华为轮值董事长郭平发表了《打造 VR/AR 信息高速公路&#xff0c;支撑产业繁荣》的主题演讲。郭平认为&#xff0c;VR/AR 将成为 5G 时代的首批应用&#xff0c;与 5G 产业发展节奏高度匹配并…

做网站需要购买地域名吗哈密网站制作公司-哈密网站建设|哈密网络公司|哈密做网站

Canvas容器: canvas标签用来定义图像的容器&#xff0c;必须配合脚本来绘制图像&#xff0c;canvas也运用于游戏开发。注意&#xff1a;canvas绘制图时会出现线条模糊情况&#xff0c;这是因为显示屏像素和canvas中定义的一个点不完全重合&#xff08;相差0.5&#xff09;导致…

tp5 基础nginx伪静态

location ~* (runtime|application)/{ return 403; } location / { if (!-e $request_filename){ rewrite ^(.*)$ /index.php?s=$1 last; break; } }

深圳商城网站建设公司吉林省建设工程造价信息网

近期有个WEB项目需要改造。业主找第三方搞了一个集成站点&#xff0c;将多个应用站点的链接集中放在一个导航页面。由于进入集成站点时已经登录过了&#xff0c;业主要求点击这些应用站点的链接时就不必再登录。 以前做过类似项目&#xff0c;用的是单点登录。大家都用同一个登…

苏州网站建设排名wordpress修改页面组件

文章目录 前言一、提供者与消费者1. 服务调用关系 二、远程调用的问题三、eureka 原理分析1. eureka 的作用 四、Eureka 案例1. 搭建 eureka 服务1. 服务注册1.1 注册 user-service1.2 启动 user-service3. order-service 完成服务注册 3. 服务发现1. 在 order-service 完成服务…

临沂住房和城乡建设厅网站菏泽外贸网站建设公司

10. 灾后重建 Pear市一共有N&#xff08;<50000&#xff09;个居民点&#xff0c;居民点之间有M&#xff08;<200000&#xff09;条双向道路相连。这些居民点两两之间都可以通过双向道路到达。这种情况一直持续到最近&#xff0c;一次严重的地震毁坏了全部M条道路。 震后…

做网站域名的成本中小企业网站建设行情

必须要5.7以上版本才能使用 写在开头 mysql json 的功能很强大,只是用来当一个储存数据的字段 就没什么意义了。 使用proto做交互的话,只要JSON 写得好 用proro.Unmarshal() 就可以很方便的转换类型 可以精简很多代码 JSON path 是以 $ 开头,之后就是JSON的层级使用。$ $[0]…

网站建设与管理书籍徐州库云平台

本文解决的问题&#xff1a;双系统装完后需要删除ubuntu的分区&#xff0c;但是EFI系统分区无法删除。 第一步&#xff1a;cmd中输入命令 diskpart 并回车&#xff0c;如图中①&#xff1b; 第二步&#xff1a;在弹出窗口②中依次输入如下命令即可删除EFI分区&#xff1b; /…

网站后台登录界面惠州外贸网站建设公司

参考资料&#xff1a;活用pandas库 1、字符串格式化 &#xff08;1&#xff09;格式化字符串 要格式化字符串&#xff0c;需要编写一个带有特殊占位符的字符串&#xff0c;并在字符串上调用format方法向占位符插入值。 # 案例1 varflesh wound s"Its just a {}" p…

异或运算的一个小等式

异或运算的一个小等式昨天打CF时题目想不出来,发现原来是一个常用的等式不会用,现在来记录一下$$ x+y=x\oplus y+2(x & y)$$ 题目来源C - XOR and Triangle 貌似Problem - 2085C - Codeforces这个题目也会用到这…

企业网站怎么建设公司亚马逊店铺怎么注册流程

Vue 渐进式JavaScript 框架 基于Vue2的学习笔记 - Vue 响应式渲染 - 列表布局和v-html 目录 列表布局 简单渲染列表 显示索引值 点击变色 V-html 作用 注意 采用策略 应用 总结 列表布局 简单渲染列表 Data中设置状态&#xff0c;是一个数组格式的默认信息。 然后…

网站推广费用价格网上暴利赚钱项目

项目场景&#xff1a; 在电商、支付等领域&#xff0c;往往会有这样的场景&#xff0c;用户下单后放弃支付了&#xff0c;那这笔订单会在指定的时间段后进行关闭操作&#xff0c;细心的你一定发现了像某宝、某东都有这样的逻辑&#xff0c;而且时间很准确&#xff0c;误差在1s内…

河北住房和城乡建设局网站东莞网站设计制作公司

今日已办 PPT制作 答辩流程 概述&#xff1a;对项目背景、架构进行介绍&#xff08;体现我们分组的区别和需求&#xff09;人员&#xff1a;小组成员进行简短的自我介绍和在项目中的定位&#xff0c;分工进展&#xff1a;对项目进展介绍&#xff0c;其中a、b两组的区别和工作…

AI元人文:“现实与价值”的生态——走向一种基于博弈与演化的协同智能

AI元人文:“现实与价值”的生态——走向一种基于博弈与演化的协同智能 序言:从“规训”到“对话”的范式革命 我们正站在智能演进的历史节点上。传统的人工智能伦理致力于一种“价值规训”范式:试图将一套预设的、通…