原生的JDBC编程主要分一下几个步骤:

(原生的JDBC编程指,仅应用java.sql包下的接口和数据库驱动类编程,而不借助任何框架)

1. 加载JDBC驱动程序;

2. 负责管理JDBC驱动程序的类 DriverManager 会识别加载的驱动程序,用 DriverManager 类的方法 getConnection()来创建一个数据库连接类的实例对象;

3. 获取Connection对象的实例,用Connection对象的方法创建一个 Statement 对象实例,执行标准的SQL语句,对数据库、表进行相关操作。

4. 返回的结果用 ResultSet 类来处理。

5、出现异常时,对事物进行回滚。

示例:

数据库表:

CREATE TABLE `person` (
`id` int(10) NOT NULL auto_increment,
`name` varchar(20) default NULL,
`age` int(4) default NULL,
PRIMARY KEY (`id`)
)

插入和查询Service类:

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 */
}
}
}
} }

测试类:

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对事务的支持

在JDBC的数据库操作中,一项事务是由一条或是多条表达式所组成的一个不可分割的工作单元。我们通过提交commit()或是回退rollback()来结束事务的操作。关于事务操作的方法都位于接口java.sql.Connection中。

首先我们要注意,在JDBC中,事务操作默认是自动提交。也就是说,一条对数据库的更新表达式代表一项事务操作。操作成功后,系统将自动调用commit()来提交,否则将调用rollback()来回退。

其次,在JDBC中,可以通过调用setAutoCommit(false)来禁止自动提交。之后就可以把多个数据库操作的表达式作为一个事务,在操作完成后调用commit()来进行整体提交。倘若其中一个表达式操作失败,都不会执行到commit(),并且将产生相应的异常。此时就可以在异常捕获时调用rollback()进行回退。这样做可以保持多次更新操作后,相关数据的一致性。

上面示例代码中的save()方法,就是应用了这种方式。

从上面的代码中,我们可以体会到,应用原生的JDBC访问数据库的代码冗长、重复,容易忘记某一步骤从而导致出错,并且需要显示的控制事务。后面,我们将介绍应用spring、hibernate框架提供一种更完善的数据库访问的解决方案。

参考:http://fzfx88.iteye.com/blog/110295

最新文章

  1. C# Rotating Oval
  2. 【转载】pyqt QTableWidget的使用
  3. css required,focus,valid和invalid介绍
  4. linuxlcd驱动程序编写 mini2440(w35)
  5. wordcount数据流过程解析
  6. gVim 配置方案 采用Vundle管理插件
  7. Hibernate 、多表关联映射 - 多对多关系映射(many-to-many)
  8. IController控制器的创建过程
  9. hdu--1026--Ignatius and the Princess I(bfs搜索+dfs(打印路径))
  10. JDBC中的Statement和PreparedStatement的差别
  11. 第一个RESTful API
  12. Dotspatial 空间要素选择
  13. 使用MUI/html5plus集成微信支付需要注意的几点问题
  14. 串口USB单一映射及重命名
  15. 第一次软件工程作业(One who wants to wear the crown, Bears the crown.)
  16. Mybatis表关联多对一
  17. zabbix日常监控Apache2.4
  18. Splunk安装部署基础篇
  19. 【转】Java中的String,StringBuilder,StringBuffer三者的区别
  20. [转]matlab中squeeze函数的用法,numel的用法

热门文章

  1. [ASP.NET]关于DOT NET的IIS配置LocalHost访问和127.0.0.1访问的区别
  2. Java编程中获取键盘输入实现方法及注意事项
  3. Windows下安装NTP服务器
  4. ueditor图片上传插件的使用
  5. Debug Dart at External Terminal
  6. IAP远程在线升级
  7. 因子和(luoguP1593)(等比数列求和+逆元)
  8. Stack栈类与、Queue队列与线性表的区别和联系
  9. 一个自动换行,不可以滚动的 textview
  10. 调用百度地图开发平台的JavascriptAPI实现将市县位置转换成坐标