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. JS对Json对象Distinct

    Json对象去重 今日有一个需求如下: 从数据库中取出数据源转化成json字符串绑定到隐藏域中,取出的json字符串如下: string data="[{"CompanyName& ...

  2. Linux nmon 监控工具使用

    Linux 系统下监控指标及指标查看 一.工具介绍     Linux 系统下资源监控使用nmon 工具.它可以帮助在一个屏幕上显示所有重要的性能优化信息,并动态地对其进行更新且并不会消耗大量的CPU ...

  3. php微型mvc框架创建步骤

    创建数据库和表结构,并且添加模拟数据: 新建models.views.controllers.utilities和include五个文件夹:models:模型层     model.php:模型基类  ...

  4. C++中的struct和class的区别

    C++中的struct对C中的struct进行了扩充,它已经不再只是一个包含不同数据类型的数据结构了,它已经获取了太多的功能.struct能包含成员函数吗? 能!struct能继承吗? 能!!stru ...

  5. iOS多线程编程Part 2/3 - NSOperation

    多线程编程Part 1介绍了NSThread以及NSRunLoop,这篇Blog介绍另一种并发编程技术:NSOPeration. NSOperation & NSOperationQueue ...

  6. ThinkPHP/Common/extend.php

    <?php // +---------------------------------------------------------------------- // | ThinkPHP [ ...

  7. .NET基础之:i++和i=i+1和++i的区别

    i++ 一定等同于 i=i+1吗? 大家都知道,i++通常情况都是等同于i=i+1,在编译时,clr会自动向上转换 比如说   int t =1;   t++;   等同于 t=t+1;  //1 是 ...

  8. iOS的影片播放 MediaPlayer 和 AVPlayer(转)

    分类: Iphone2013-01-28 16:19 5230人阅读 评论(0) 收藏 举报 在iOS開發上,如果遇到需要播放影片,如開機動畫…,我們很習慣地會使用MediaPlayer來播放影片,因 ...

  9. c#之委托总结

    1.委托的声明和编译原理 声明委托: delegate void Translate(string str); 通过反编译之后可得下面代码 private sealed class Translate ...

  10. Week1 Team Homework #2: Introduction of each team member

    王洛书 我是来自浙江的王洛书.热爱历史,热爱美食,热爱代码,热爱博物馆.很喜欢软件工程这门课的上课方式,也很喜欢组里的这些同学.希望能大家一起努力,在这门课上真正地收获能力上的提升!   陈睿翊