1、JDBC概述
    JDBC是一种可以执行SQL语句并可返回结果的Java API,其全称是Java DataBase Connectivity,也是一套面向对象的应用程序接口API,它由一组用Java编程语言编写的类和接口组成,制定了统一的访问各类关系数据库的标准接口,为各种常用数据库提供了标准接口的实现,通过它可访问各类关系数据库,使开发者能够用纯Java API来编写数据库应用程序。JDBC API中定义了一些Java类,分别用来表示与数据库的连接(Connections)、SQL语句(SQL Statements)、结果集(Result Set)以及其他的数据库对象,使得Java程序能方便地与数据库交互并处理所得的结果。
    
2、JDBC数据类型
JDBC类型 Java类型
CAHR String
VARCHAR String
LONGVARCHAR String
NUMERIC java.math.BigDecimal
DECIMAL java.math.BigDecimal
BIT Boolean
BOOLEAN Boolean
TINYINT byte
SMALLINT short
INTEGET int
BIGINT long
REAL float
FLOAT double
BOUBLE double
BINARY byte[]
VARBONARY byte[]
LONGVARBINARY byte[]
DATE java.sql.Date
TIME java.sql.Time
TIMESTAMP java.sql.Timestamp
CLOB Clob
BLOB Blob
ARRAY Array
DISTINCT mapping of underlying type
STRUCT struct
REF Ref
DATALINK java.net.URL
JAVA_OBJECT underlying Java class
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3、JDBC连接数据库
1)加载JDBC驱动程序
    通过java.lang.Class类的静态方法forName(String className)实现。
 try{
Class.forName("com.mysql.jdbc.Driver");
}catch(ClassNotFoundException e){
System.out.println("找不到驱动程序类");
e.printStackTrace();
}
 当成功加载后,会将Driver类的实例注册到DriverManager类中。
 
2)提供JDBC连接的URL
    连接URL定义了连接数据库时的协议、子协议、数据源标识。协议在JDBC中总是以jdbc开始;子协议是连接的驱动程序或是数据库管理系统的名称,例如MYSQL就是mysql;数据源标识就是找出数据库来源的地址和连接端口。
jdbc:mysql://localhost:3306/test?userUnicode=true&characterEncoding=gbk.
        useUnicode=true表示使用Unicode字符集,如果参数characterEncoding设置为gb2312或GBK,本参数必须设置为true。
 
3)创建数据库的连接
    要连接数据库,可以向java.sql.DriverManager 请求并获得 Connection对象,该对象就代表一个数据库连接,可以使用DriverManger的getConnection(String url,String userName, String password)方法传入指定的欲连接的数据库的路径、数据库的用户名和密码来获得。
 String url = "jdbc:mysql://localhost:3306/test?userUnicode=true&characterEncoding=gbk";
String userName = "root";
String password = "123456";
try{
Connection conn = DriverManager.getConnection(url,userName,password);
}catch(SQLException e){
System.out.println("Failed to get connection: "+e.getMessage());
e.printStackTrace();
}
 
4)创建一个Statement
    要执行SQL语句,必须获得java.sql.Statement实例,Statement实例又可以分为以下3种类型:
        · 执行静态SQL语句,通常通过Statement实例实现;
        · 执行动态SQL语句,通常通过PreparedStatement实例实现;
        · 执行数据库存储过程,通常通过CallableStatement实例实现。
Statement stmt = conn.createStatement();
PreparedStatement pstmt = conn.preparedStatement(sql);
CallableStatement cstmt = conn.prepareCall("{CALL demoSp(?,?)}");

5)执行SQL语句

    Statement接口提供了三种执行SQL语句的方法:executeQuery、executeUpdate和execute,具体事宜哪一个,由SQL语句所产生的内容来决定。
    1)ResultSet executeQuery(String sqlString):执行查询数据库的SQL,如SELECT语句,返回一个结果集(ResultSet)对象。
    2)int executeUpdate(String sqlString):用于执行INSET、UPDATE或DELETE语句以及SQL DDL(数据定义语言)语句,例如CREATE TABLE和DROP TABLE。INSET、UPDATE或DELETE的效果是修改表中零行或多行中的一列或多列,所以executeUpdate的返回值是一个整数,表示受影响的行数(即更新及数)。对于CREATE TABLE或DROP TABLE等不操作行的语句,executeUpdate的返回值总为零。
    3)execute(sqlString):用于执行返回多个结果集、多个更新技术或二者组合的语句。
ResultSet rs = stmt.executeQuery("SELECT * FROM ...");
int rows = stmt.executeUpdate("INSERT INTO ...");
boolean flag = stmt.execute(String sqlString);
 
6)处理结果
    执行的结果可能会出现如下两种情况:
        · 执行更新返回的是本次操作影响到的记录数;
        · 执行查询返回的结果是一个ResultSet对象。
    ResultSet包含符合SQL语句中条件的所有行,并且它通过一套get方法提供了对这些行中数据的访问。
    (1)使用结果集(ResultSet)对象的访问方法获取数据。
        · next():用于移动到ResultSet中的下一行,使下一行成为当前行;
        · first():将光标移动到此ResultSet对象的第一行;
        · last():将光标移到到此ResultSet对象的最后一行;
        · previous():将光标移动到此ResultSet对象的上一行。
    (2)通过字段名或列索引取得数据:
String name = rs.getString("name");
String pass = rs.getString(1);
     (3)使用行和光标。ResultSet维护指向当前数据行的光标。每调用一次next()方法,光标向下移动一行,初始化位置为第一行记录之前,因此第一次应先调用next()将光标置于第一行上,使它成为当前行。随着每次调用next(),导致光标向下移动一行,按照从上到下的顺序获得ResultSet行。在ResultSet对象或Statement对象关闭之前,光标一直保持有效。       
 
7)关闭JDBC对象
    在操作完成之后,要把所使用的JDBC对象全部关闭,以释放JDBC资源,关闭的顺序是声明顺序的反序。
    1)关闭记录集;
    2)关闭声明;
    3)关闭连接对象。
finally{
//关闭记录集
if (null != rs){
try{
rs.close();
}catch (SQLException e){
e.printStackTrace();
}
}
//关闭声明
if (null != stmt){
try {
stmt.close();
}catch (SQLException e){
e.printStackTrace();
}
}
//关闭连接对象
if (null != conn){
try{
conn.close();
}catch (SQLException e){
e.printStackTrace();
}
}
}
 
4、JDBC事务控制
    所谓事务,是指一组原子操作(一组SQL语句的执行)的工作单元。这个工作单元中的所有原子操作在进行期间,与其他事务隔离,免于因数据来源的交相更新而发生混乱,事务中的所有原子操作要么全部执行成功,要么全部失败。
    1)设置事务的提交方式为非自动提交:
conn.setAutoCommit(false);

 2)将需要添加事务的代码放在try、catch块中:

try{
//需要添加事务的业务代码
...
}catch(SQLException e){
...
}

3)在try块内添加提交操作,表示操作无异常,提交事务:

conn.commit(); 

4)在catch块内添加回滚事务,表示操作出现异常,撤销事务:

conn.rollback();

5)设置事务提交方式为自动提交:

conn.setAutoCommit(true);

  在JDBC处理事务的过程中,也可以设置事务的回滚点,当事务回滚的时候,自动回滚到保存点。

Savepoint savepoint = conn.setSavepoint();
conn.rollback(savepoint);
stmt.releaseSavepoint(savepoint);

   注意:如要数据表支持事务,则在MySQL中建立的表类型为InnoDB。

package com.yyq;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
/**
* Created by gao on 16-4-12.
*/
public class Transaction {
public static final String Driver = "com.mysql.jdbc.Driver";
public static final String URL = "jdbc:mysql://localhost:3306/test";
public static final String USER_NAME = "root";
public static final String PASSWORD = "123456";
public static void main(String[] args) {
Connection conn = null;
PreparedStatement pstmt = null;
String sql = "INSERT INTO student(name,score,class) values(?,null,null)";
String sql2 = "delete from student where id = 69";
try {
Class.forName(Driver);
conn = DriverManager.getConnection(URL, USER_NAME, PASSWORD);
conn.setAutoCommit(false);
pstmt = conn.prepareStatement(sql);
pstmt.setString(1,"testing");
System.out.println("第一条语句执行....");
pstmt.executeUpdate();
pstmt = conn.prepareStatement(sql2);
System.out.println("第二条语句执行....");
pstmt.executeQuery();
conn.commit();
System.out.println("提交事务");
}catch (ClassNotFoundException e){
System.out.println("找不到驱动程序类");
e.printStackTrace();
}catch (SQLException e){
try{
conn.rollback();
System.out.println("回退事务....");
e.printStackTrace();
}catch (SQLException e1){
e1.printStackTrace();
}
}finally {
try{
conn.setAutoCommit(true);
}catch (SQLException e){
e.printStackTrace();
}
if (null != pstmt){
try{
pstmt.close();
}catch (SQLException e){
e.printStackTrace();
}
}
if (null != conn){
try {
conn.close();
}catch (SQLException e){
e.printStackTrace();
}
}
}
}
}
5、JDBC批量处理
    Statement的execute()等方法一次只能执行一条SQL语句,如果同时有多条SQL语句要执行的话,可以实现addBatch()方法将要执行的SQL语句加入进来,然后执行executeBatch()方法,这样就可以在一次方法调用中执行多条SQL语句,以提高执行效率。但是批处理中执行的语句只能是更新语句(inset、delete、update),否则会抛出异常。
try {
conn.setAutoCommit(false);
Statement stmt = conn.createStatement();
stmt.addBatch("....");
stmt.addBatch("....");
.....
stmt.executeBatch();
conn.commit();
}catch (SQLException e){
try {
conn.rollback();
}catch (SQLException e1){
e1.printStackTrace();
}
e.printStackTrace();
}finally {
try {
conn.setAutoCommit(true);
}catch (SQLException e){
e.printStackTrace();
}
//关闭资源
}

JDBC学习总结(一)的更多相关文章

  1. JDBC学习笔记(2)——Statement和ResultSet

    Statement执行更新操作 Statement:Statement 是 Java 执行数据库操作的一个重要方法,用于在已经建立数据库连接的基础上,向数据库发送要执行的SQL语句.Statement ...

  2. JDBC学习笔记(1)——JDBC概述

    JDBC JDBC API是一个Java API,可以访问任何类型表列数据,特别是存储在关系数据库中的数据.JDBC代表Java数据库连接. JDBC库中所包含的API任务通常与数据库使用: 连接到数 ...

  3. 【转】JDBC学习笔记(2)——Statement和ResultSet

    转自:http://www.cnblogs.com/ysw-go/ Statement执行更新操作 Statement:Statement 是 Java 执行数据库操作的一个重要方法,用于在已经建立数 ...

  4. 【转】JDBC学习笔记(1)——JDBC概述

    转自:http://www.cnblogs.com/ysw-go/ JDBC JDBC API是一个Java API,可以访问任何类型表列数据,特别是存储在关系数据库中的数据.JDBC代表Java数据 ...

  5. jdbc学习总结

    jdbc学习总结:   一.简介: jdbc,直译为java连接数据库.实际为java为很好的操作数据库而提供的一套接口,接口的实现(即驱动)由各个数据库厂商提供.   二.知识要点: 连接5要素,3 ...

  6. JDBC 学习笔记(十一)—— JDBC 的事务支持

    1. 事务 在关系型数据库中,有一个很重要的概念,叫做事务(Transaction).它具有 ACID 四个特性: A(Atomicity):原子性,一个事务是一个不可分割的工作单位,事务中包括的诸操 ...

  7. JDBC 学习笔记(十)—— 使用 JDBC 搭建一个简易的 ORM 框架

    1. 数据映射 当我们获取到 ResultSet 之后,显然这个不是我们想要的数据结构. 数据库中的每一个表,在 Java 代码中,一定会有一个类与之对应,例如: package com.gerrar ...

  8. JDBC 学习笔记(六)—— PreparedStatement

    1. 引入 PreparedStatement PreparedStatement 通过 Connection.createPreparedStatement(String sql) 方法创建,主要用 ...

  9. JDBC学习笔记二

    JDBC学习笔记二 4.execute()方法执行SQL语句 execute几乎可以执行任何SQL语句,当execute执行过SQL语句之后会返回一个布尔类型的值,代表是否返回了ResultSet对象 ...

  10. JDBC学习笔记一

    JDBC学习笔记一 JDBC全称 Java Database Connectivity,即数据库连接,它是一种可以执行SQL语句的Java API. ODBC全称 Open Database Conn ...

随机推荐

  1. flex 监听网络连接情况

    NativeApplication.nativeApplication.addEventListener(Event.NETWORK_CHANGE, onNetworkChange); private ...

  2. 基于WCF的API实现

    本文程序基于VS2013.EF6.1.WCF WCF有2种方式,一是SOAP,一种是Restful 由于程序是基于PCL(可移植类库)的,所以不能用直接引入WCF服务的方式 网上的Restful方式的 ...

  3. Google protobuf安装

    1:需要安装sudo apt-get install x11-apps libwayland-ltst-client0 libtxc-dxtn-s2tc0 x11-session-utils  x11 ...

  4. php必看六本书

    php和mysql web开发 PHP高级程序设计_模式.框架与测试.pdf  PHP专业项目实例开发.pdf PHP5高级应用开发实践.pdf [深入PHP面向对象.模式与实践(第2版)].(美)赞 ...

  5. 深入PHP EOF(heredoc)用法详解

    介绍下使用EOF heredoc方式,输出长段内容的方法, <?php $name = '姓名'; print <<<EOT <html> <head> ...

  6. Java Day 05

    数组第二种定义 数组-遍历 数组操作的核心思想就是对角标的操作: 数组-求最值 1.循环 比较 排序 选择排序 把原始数组分割成了两个数组,至少有一个是有序的 冒泡排序 相邻元素比较 位置置换代码提取 ...

  7. 音频播放、录音、视频播放、拍照、视频录制-b

    随着移动互联网的发展,如今的手机早已不是打电话.发短信那么简单了,播放音乐.视频.录音.拍照等都是很常用的功能.在iOS中对于多媒体的支持是非常强大的,无论是音视频播放.录制,还是对麦克风.摄像头的操 ...

  8. 写一个EF的CodeFirst的Demo

    写一个EF的CodeFirst的Demo 今天打算写一个关于EF的CodeFirs的一个小Demo.先略说一个EF的三种与数据库,怎么说,叫映射么,好吧,那就这么叫吧,就是一个是ModelFirst就 ...

  9. c++ 哪些自定义的数据类型

    http://www.cnblogs.com/ShaneZhang/archive/2013/06/21/3147648.html 这些数据类型是 C99 中定义的,具体定义在:/usr/includ ...

  10. JS中删除字符串中的空格

    问题描述:         在进行字符串操作时,由于字符串中存在较多的空格,因此需要考虑取消字符串中的空格 问题解决:       (1)删除字符串中的前导空格(字符串的前面的空格): 注意:这里使用 ...