JDBC

来源:互联网 发布:ubuntu安装飞秋 编辑:程序博客网 时间:2024/06/14 21:03

JDBC 总结

JDBC 简介

JDBC 全称为: Java Data Base Connectivity ( java 数据库连接),它主要由接口组成。

组成 JDBC 的2个包:

  java.sql

  javax.sql

开发 JDBC 应用需要以上 2 个包的支持外,还需要导入相应 JDBC 的数据库实现 ( 即数据库驱动 ) 。

第一个 JDBC 程序

编写一个程序,这个程序从 user 表中读取数据,并打印在命令行窗口中。

一、搭建实验环境 :

1 、在 mysql 中创建一个库,并创建 user 表和插入表的数据。

2 、新建一个 Java 工程,并导入数据驱动。

二、编写程序,在程序中加载数据库驱动

Class.forName( “ com.mysql.jdbc.Driver ” );

DriverManager. registerDriver(Driver?driver)

三、建立连接 (Connection)

Connection conn = DriverManager.getConnection(url,user,pass);

四、创建用于向数据库发送 SQL 的 Statement 对象,并发送 sql

Statement st = conn.createStatement();

ResultSet rs = st.excuteQuery(sql);

五、从代表结果集的 ResultSet 中取出数据,打印到命令行窗口

六、断开与数据库的连接,并释放相关资源 Jdbc 程序中的 Connection ,它用于代表数据库的链接, Collection 是数据库编程中最重要的一个对象,客户端与数据库所有交互都是通过 connection 对象完成的,这个对象的常用方法:

createStatement() :创建向数据库发送 sql 的 statement 对象。

prepareStatement(sql) :创建向数据库发送预编译 sql 的 PrepareSatement 对象。

prepareCall(sql) :创建执行存储过程的 callableStatement 对象。

setAutoCommit(boolean?autoCommit) :设置事务是否自动提交。

commit() :在链接上提交事务。

rollback() :在此链接上回滚事务。 Jdbc 程序中的 Statement 对象用于向数据库发送 SQL 语句, Statement 对象常用方法:

execute(String sql) :用于向数据库发送任意 sql 语句

executeQuery(String?sql) :只能向数据发送查询语句。

executeUpdate(String?sql) :只能向数据库发送 insert 、 update 或 delete 语句

addBatch(String?sql) :把多条 sql 语句放到一个批处理中。

executeBatch() :向数据库发送一批 sql 语句执行。 CRUD 操作 -create

Statement st = conn.createStatement();

String sql = "insert into user( … .) values( … ..) ";

int num = st.executeUpdate(sql);

if(num>0){

System.out.println(" 插入成功!!! ");

}

PreperedStatement 是 Statement 的孩子,它的实例对象可以通过调用 Connection.preparedStatement() 方法获得,相对于 Statement 对象而言:

PreperedStatement 可以避免 SQL 注入的问题。

Statement 会使数据库频繁编译 SQL ,可能造成数据库缓冲区溢出。 PreparedStatement 可对 SQL 进行预编译,从而提高数据库的执行效率。

并且 PreperedStatement 对于 sql 中的参数,允许使用占位符的形式进行替换,简化 sql 语句的编写。

练习:使用 PreparedStatement 改写 UserDao

select * from (

select rownum r_, row_.* from (

select * from student order by id

) row_ where rownum <=5

) where r_>=1

1 位置:起始索引位置。

5 位置:结束索引位置。

使用 JDBC 处理大数据

基本概念:大数据也称之为 LOB(Large Objects) , LOB 又分为: clob 和 blob

clob 用于存储大文本。 Text

blob 用于存储二进制数据,例如图像、声音、二进制文等。

对于 MySQL 中的 Text 类型,可调用如下方法设置: PreparedStatement.setCharacterStream(index, reader, length);

// 注意 length 长度须设置,并且设置为 int 型

对 MySQL 中的 Text 类型,可调用如下方法获取: reader = resultSet. getCharacterStream(i);

reader = resultSet.getClob(i).getCharacterStream();

string s = resultSet.getString(i);

对于 MySQL 中的 BLOB 类型,可调用如下方法设置:

PreparedStatement. setBinaryStream(i, inputStream, length);

对 MySQL 中的 BLOB 类型,可调用如下方法获取:

InputStream in = resultSet.getBinaryStream(i);

InputStream in = resultSet.getBlob(i).getBinaryStream();

实现批处理有两种方式,第一种方式:

Statement.addBatch(sql) list

执行批处理 SQL 语句

executeBatch() 方法:执行批处理命令

clearBatch() 方法:清除批处理命令

采用 Statement.addBatch(sql) 方式实现批处理:

优点:可以向数据库发送多条不同的SQL语句。

缺点:

SQL 语句没有预编译。

当向数据库发送多条语句相同,但仅参数不同的 SQL 语句时,需重复写上很多条 SQL 语句。

实现批处理的第二种方式:

PreparedStatement.addBatch()

JDBC 调用存储过程

编写存储过程(参看 mysql 文档)

得到 CallableStatement ,并调用存储过程:

CallableStatement cStmt = conn.prepareCall("{call demoSp(?, ?)}");

设置参数,注册返回值,得到输出 cStmt.setString(1, "abcdefg");

cStmt.registerOutParameter(2, Types.VARCHAR);

cStmt.execute();

System.out.println(cStmt.getString(2));

事务的概念

事务指逻辑上的一组操作,组成这组操作的各个单元,要不全部成功,要不全部不成功。

例如: A —— B 转帐,对应于如下两条 sql 语句

update from account set money=money+100 where name= ‘ b ’ ;

update from account set money=money-100 where name= ‘ a ’ ;

数据库开启事务命令

start transaction 开启事务

Rollback 回滚事务

Commit 提交事务

设置事务回滚点

Savepoint sp = conn.setSavepoint();

Conn.rollback(sp);

Conn.commit(); // 回滚后必须要提交

创建 JDBC 的事务主要分以下步骤

1. 设置事务的提交方式为非自动提交:

conn.setAutoCommit(false);

2. 将需要添加事务的代码放入 try , catch 块中。

3. 在 try 块内添加事务的提交操作,表示操作无异常,提交事务。

conn.commit();

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

conn.rollback();

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

conn.setAutoCommit(true);

原子性( Atomicity ) 
原子性是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。 ?

一致性( Consistency ) 
事务必须使数据库从一个一致性状态变换到另外一个一致性状态。

隔离性( Isolation ) 
事务的隔离性是多个用户并发访问数据库时,数据库为每一个用户开启的事务,不能被其他事务的操作数据所干扰,多个并发事务之间要相互隔离。

持久性( Durability ) 
持久性是指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来即使数据库发生故障也不应该对其有任何影响。

数据库共定义了四种隔离级别:

Serializable :可避免脏读、不可重复读、虚读情况的发生。(串行化) ( 序列化 )

Repeatable read :可避免脏读、不可重复读情况的发生。(可重复读)

Read committed :可避免脏读情况发生(读已提交)。

Read uncommitted :最低级别,以上情况均无法保证。 ( 读未提交 )

set transaction isolation level 设置事务隔离级别

select @@tx_isolation 查询当前事务隔离级别

原创粉丝点击