JDBC

来源:互联网 发布:淘宝运费险是怎么算的 编辑:程序博客网 时间:2024/05/21 05:17

JDBC简介

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

组成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);

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

      Statement st = conn.createStatement();

      ResultSet rs = st.excuteQuery(sql);

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

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

createStatement():创建向数据库发送sqlstatement对象。

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

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

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

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

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

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

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

executeUpdate(String?sql):只能向数据库发送insertupdatedelete语句

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("插入成功!!!");

      }

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

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

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

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

练习:使用PreparedStatement改写UserDao

select * from (

                 select rownum r_, row_.*  from (

                            select * fromstudent order by id

                 ) row_ where rownum <=5

                 ) where r_>=1

1位置:起始索引位置。

5位置:结束索引位置。

 

 

 

使用JDBC处理大数据

基本概念:大数据也称之为LOB(Large Objects)LOB又分为:clobblob

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类型,可调用如下方法获取:

InputStreamin  = resultSet.getBinaryStream(i);

InputStreamin  =resultSet.getBlob(i).getBinaryStream();

 

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

Statement.addBatch(sql)  list

执行批处理SQL语句

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

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

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

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

缺点:

SQL语句没有预编译。

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

 

 

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

PreparedStatement.addBatch()

 

JDBC调用存储过程

 

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

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

CallableStatementcStmt = 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 wherename=b;

  update from account set money=money-100 wherename=a;

数据库开启事务命令

starttransaction  开启事务

Rollback  回滚事务

Commit   提交事务

 

 

 

设置事务回滚点

Savepoint sp =conn.setSavepoint();

Conn.rollback(sp);

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

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

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

   conn.setAutoCommit(false);

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

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      查询当前事务隔离级别

原创粉丝点击