原生的JDBC编程主要分一下几个步骤:java
(原生的JDBC编程指,仅应用java.sql包下的接口和数据库驱动类编程,而不借助任何框架)mysql
1. 加载JDBC驱动程序;spring
2. 负责管理JDBC驱动程序的类 DriverManager 会识别加载的驱动程序,用 DriverManager 类的方法 getConnection()来建立一个数据库链接类的实例对象;sql
3. 获取Connection对象的实例,用Connection对象的方法建立一个 Statement 对象实例,执行标准的SQL语句,对数据库、表进行相关操做。数据库
4. 返回的结果用 ResultSet 类来处理。编程
五、出现异常时,对事物进行回滚。框架
数据库表:测试
CREATE TABLE `person` ( `id` int(10) NOT NULL auto_increment, `name` varchar(20) default NULL, `age` int(4) default NULL, PRIMARY KEY (`id`) )
插入和查询Service类:url
package edu.shao.jdbc; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; public class UserService { public Connection getConnection() throws ClassNotFoundException, SQLException { // 加载MySQL的JDBC的驱动 Class.forName("com.mysql.jdbc.Driver"); String url = "jdbc:mysql://127.0.0.1:3306/test"; String username = "root"; String password = "123456"; // 建立与MySQL数据库的链接类的实例 Connection conn = DriverManager.getConnection(url, username, password); System.out.println("Database connection established"); return conn; } public void save() throws Exception { Connection conn = getConnection(); try { // 禁用自动提交 conn.setAutoCommit(false); System.out.println("默认的事务隔离级别:" + conn.getTransactionIsolation()); // 用conn建立Statement对象类实例 Statement sql_statement = conn.createStatement(); // 插入数据 sql_statement.executeUpdate("insert person values(10,'aabb', 88)"); System.out.println("Insert success"); //错误的插入 sql_statement.executeUpdate("insert person values(11,'aabb', 'error')"); System.out.println("Insert success"); //提交事务 conn.commit(); } catch (Exception e) { e.printStackTrace(); if (conn != null){ //事务回滚 conn.rollback(); } } finally { if (conn != null) { // 关闭链接 try { conn.close(); System.out.println("Database connection terminated"); } catch (Exception e) { /* ignore close errors */ } } } } public void query() throws Exception { Connection conn = getConnection(); try { // 用conn建立Statement对象类实例 Statement sql_statement = conn.createStatement(); // 执行查询,用ResultSet类的对象,返回查询的结果 String query = "select * from person"; ResultSet result = sql_statement.executeQuery(query); // 处理结果 while (result.next()) { int id = result.getInt("id"); String name = result.getString("name"); String age = result.getString("age"); System.out.println("id: " + id + " name: " + name + " age: " + age); } } catch (Exception e) { e.printStackTrace(); } finally { if (conn != null) { // 关闭链接 try { conn.close(); System.out.println("Database connection terminated"); } catch (Exception e) { /* ignore close errors */ } } } } }
测试类:spa
package edu.shao.jdbc; import org.junit.Test; public class JdbcTest { @Test public void testSave() throws Exception{ UserService service=new UserService(); service.save(); } @Test public void testQuery() throws Exception{ UserService service=new UserService(); service.query(); } }
save()方法中,第一个insert操做正确,第二个insert操做是人为的错误,咱们catch了第二个错误,而且把事务回滚。
在数据库的操做中,事务是一个重要的概念,举个例子:
大概每一个人都有转帐的经历。当咱们从A账户向B账户转100元后,银行的系统会从A账户上扣除100而在B账户上加100,这是通常的正常现象。
可是一旦系统出错了怎么办呢,这里咱们假设可能会发生两种状况:
(1)A账户上少了100元,可是B账户却没有多100元。
(2)B账户多了100元钱,可是A账户上却没有被扣钱。
这种错误一旦发生会形成很严重的后果,好比转帐金额是100万...
那么有没有什么方法保证一旦A账户上没有被扣钱而B账户上也没有被加钱;或者A账户扣了100元而B账户准确无误的加上100元呢。也就是说要么转帐顺利的成功进行,要么不转帐呢? 这就是数据库事务机制所要起到的做用和作的事情。
在JDBC的数据库操做中,一项事务是由一条或是多条表达式所组成的一个不可分割的工做单元。咱们经过提交commit()或是回退rollback()来结束事务的操做。关于事务操做的方法都位于接口java.sql.Connection中。
首先咱们要注意,在JDBC中,事务操做默认是自动提交。也就是说,一条对数据库的更新表达式表明一项事务操做。操做成功后,系统将自动调用commit()来提交,不然将调用rollback()来回退。
其次,在JDBC中,能够经过调用setAutoCommit(false)来禁止自动提交。以后就能够把多个数据库操做的表达式做为一个事务,在操做完成后调用commit()来进行总体提交。假若其中一个表达式操做失败,都不会执行到commit(),而且将产生相应的异常。此时就能够在异常捕获时调用rollback()进行回退。这样作能够保持屡次更新操做后,相关数据的一致性。
上面示例代码中的save()方法,就是应用了这种方式。
从上面的代码中,咱们能够体会到,应用原生的JDBC访问数据库的代码冗长、重复,容易忘记某一步骤从而致使出错,而且须要显示的控制事务。后面,咱们将介绍应用spring、hibernate框架提供一种更完善的数据库访问的解决方案。