三种数据库访问——原生JDBC
原生的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
三种数据库访问——原生JDBC的更多相关文章
- 三种数据库访问——Spring JDBC
本篇随笔是上两篇的延续:三种数据库访问——原生JDBC:数据库连接池:Druid Spring的JDBC框架 Spring JDBC提供了一套JDBC抽象框架,用于简化JDBC开发. Spring主要 ...
- 三种数据库访问——Spring3.2 + Hibernate4.2
前三篇随笔中介绍了 用原生的JDBC访问数据库.一种高效的数据库连接池druid.用Spring的JDBC框架访问数据库. 本文继续介绍第三种数据库访问的解决方案:Spring3.2 + Hibern ...
- qlserver、Mysql、Oracle三种数据库的优缺点总结
这篇文章主要介绍了sqlserver.Mysql.Oracle三种数据库的优缺点总结,需要的朋友可以参考下 一.sqlserver优点:易用性.适合分布式组织的可伸缩性.用于决策支持的数据仓库功能 ...
- MySQL - 常见的三种数据库存储引擎
原文:MySQL - 常见的三种数据库存储引擎 数据库存储引擎:是数据库底层软件组织,数据库管理系统(DBMS)使用数据引擎进行创建.查询.更新和删除数据.不同的存储引擎提供不同的存储机制.索引技巧. ...
- MySQL、SqlServer、Oracle 三种数据库的优缺点
MySQL.SqlServer.Oracle 三种数据库的优缺点 一.MySQL 优点: 缺点: 二.SqlServer 优点: 缺点: 三.Oracle 优点: 缺点: 一.MySQL 优点: 体积 ...
- MySQL、SqlServer、Oracle,这三种数据库的优缺点,你知道吗?
盘点MySQL.SqlServer.Oracle 三种数据库优缺点 MySQL SqlServer Oracle 一.MySQL 优 点 体积小.速度快.总体拥有成本低,开源:支持多种操作系统:是开源 ...
- 浅淡Webservice、WSDL三种服务访问的方式(附案例)
Webservice Webservice是使应用程序以与平台和编程语言无关的方式进行相互通信技术. eg:站点提供访问的数据接口:新浪微博.淘宝. 官方解释:它是一种构建应用程序的普遍模型,可以在任 ...
- MySQL、SQLServer2000(及SQLServer2005)和ORCALE三种数据库实现分页查询的方法
在这里主要讲解一下MySQL.SQLServer2000(及SQLServer2005)和ORCALE三种数据库实现分页查询的方法. 可能会有人说这些网上都有,但我的主要目的是把这些知识通过我实际的应 ...
- Kubernetes的三种外部访问方式:NodePort、LoadBalancer和Ingress(转发)
原文 http://cloud.51cto.com/art/201804/570386.htm Kubernetes的三种外部访问方式:NodePort.LoadBalancer和Ingress 最近 ...
随机推荐
- DBCC--CHECKDB--不可被替代的原因
CHECKSUM不能发现的两类问题 1. 发生在内存中的页错误,如内存损坏+第三方程序修改等 2. MS SQL Server潜在BUG导致的逻辑错误,该类错误可以使用重建索引或重建约束来修复 CHE ...
- UEditor编辑器两个版本任意文件上传漏洞分析
0x01 前言 UEditor是由百度WEB前端研发部开发的所见即所得的开源富文本编辑器,具有轻量.可定制.用户体验优秀等特点 ,被广大WEB应用程序所使用:本次爆出的高危漏洞属于.NET版本,其它的 ...
- NetCore入门篇:(二)Net Core项目创建
一.新建项目 1.选择菜单:文件 -> 新建 -> 项目 2.选择模板:NET Core -> ASP.NET Core Web 应用程序,输入名称 3.选择框架:ASP.NET C ...
- Day 29 _模块二 -hashlib_configparse_logging
一.hashlib Python的hashlib提供了常见的摘要算法,如MD5,SHA1等等. 什么是摘要算法呢?摘要算法又称哈希算法.散列算法.它通过一个函数,把任意长度的数据转换为一个长度固定的数 ...
- 1002. Find Common Characters
Given an array A of strings made only from lowercase letters, return a list of all characters that s ...
- LOJ#3088. 「GXOI / GZOI2019」旧词(树剖+线段树)
题面 传送门 题解 先考虑\(k=1\)的情况,我们可以离线处理,从小到大对于每一个\(i\),令\(1\)到\(i\)的路径上每个节点权值增加\(1\),然后对于所有\(x=i\)的询问查一下\(y ...
- 源码编译安装lnmp环境(nginx-1.14.2 + mysql-5.6.43 + php-5.6.30 )------踩了无数坑,重装了十几次服务器才会的,不容易啊!
和LAMP不同的是,LNMP中的N指的是Nginx(类似于Apache的一种web服务软件),并且php是作为一个独立服务存在的,这个服务叫做php-fpm,Nginx直接处理静态请求,动态请求会转发 ...
- FunDA(4)- 数据流内容控制:Stream data element control
上节我们探讨了通过scalaz-stream-fs2来驱动一套数据处理流程,用fs2的Pipe类型来实现对数据流的逐行操作.本篇讨论准备在上节讨论的基础上对数据流的流动和元素操作进行优化完善.如数据流 ...
- 日志分析与splunk浅谈
难易程度:★★★ 阅读点:linux;python;web安全;日志分析; 文章作者:xiaoye 文章来源:i春秋 关键字:网络渗透技术 前言 linux下的日志分析对企业来说非常重要,对我们分析p ...
- Storm Trident详解
Trident是基于Storm进行实时留处理的高级抽象,提供了对实时流4的聚集,投影,过滤等操作,从而大大减少了开发Storm程序的工作量.Trident还提供了针对数据库或则其他持久化存储的有状态的 ...