Javaweb基础入门(二)之 JDBC以及事务总结

一、JDBC

- 定义:

一种用于执行sql语句的java API,可以为多种关系数据库提供统一访问,由一组用java语言编写的类和接口组成。

- 特点:

Java 具有坚固、安全、易于使用、易于理解和可从网络上自动下载等特性,是编写数据库应用程序的杰出语言。所需要的只是
Java应用程序与各种不同数据库之间进行对话的方法。

  • 使用到的类、接口以及方法:

(1)DriverManager 类 管理jdbc驱动程序的基本服务

 static Connection getConnection(String url)
                            试图建立到给定数据库 URL 的连接。 
static Connection getConnection(String url, Properties info) 
                            试图建立到给定数据库 URL 的连接。 
static Connection getConnection(String url, String user, String password) 
                        试图建立到给定数据库 URL 的连接。

(2) Connection 接口 与特定数据库连接(会话)

Statement createStatement() 
           创建一个 Statement 对象来将 SQL 语句发送到数据库。

(3)Statement 接口 用于执行静态 SQL 语句并返回它所生成结果的对象。

ResultSet executeQuery(String sql) 
          执行给定的 SQL 语句,该语句返回单个 ResultSet 对象。 
int executeUpdate(String sql) 
         执行给定 SQL 语句,该语句可能为 INSERTUPDATEDELETE                语句, 或者不返回任何内容的 SQL 语句(如 SQL DDL 语句)
boolean execute(String sql)  
          执行给定的 SQL 语句,该语句可能返回多个结果。 可以执行任何sql语句根据返回值结果不同 表示执行的是不同的语句  
如果返回 true 表示 执行的是查询语句  使用 getResultSet()方法 来获取结果集
如果返回 false 表示 执行的是更新语句或者DDL语句 使用 getUpdateCount()方法 获取影响的行数

(4)ResultSet 接口 表示数据库结果集的数据表,通常通过执行查询数据库的语句生成。

boolean next()  throws SQLException
     将光标从当前位置向前移一行。ResultSet 光标最初位于第一行之前;第一次调用 next 方法使第一行成为当前行;第二次调用使第二行成为当前行,依此类推。 
int getInt(int columnIndex) 
以 Java 编程语言中 int 的形式获取此 ResultSet 对象的当前行中指定列的值。
int getInt(String columnLabel) 
以 Java 编程语言中 int 的形式获取此 ResultSet 对象的当前行中指定列的值。

- 连接数据库步骤:

(1) 导包:驱动
(2) 加载驱动
(3) DriverManager类中的getConnection()获得Connection对象
(4) 编写sql语句
(5) Connection对象中的createStatement()方法获得statement对象
(6) 执行sql
(7) 遍历结果集
(8) 关闭资源

  • PreparedStatement 和Statement区别:

(1)PreparedStatement 性能更高,防止sql注入
(2)PreparedStatement 把sql语句预编译
(3)PreparedStatement sql语句中的参数发生变化 过滤掉用户输入的关 键字
(4)CallStatement 调用存储过程

  • 封装数据库工具类
  • 用途:

介于一个项目的开发 都会使用同一个数据库 数据库 连接地址 用户名 密码都是通用的 那么我们可以将这些重复的代码进行抽取 放到一个配置文件中
可以提高代码的复用性而且 如果需要修改连接 只需要修改一个配置文件就可以了

  • 步骤:

在src目录下创建配置文件 xxx.properties 创建数据库工具类
用来加载驱动 获取连接 释放资源

  • java.util.Date 和 java.sql.Date 转换

(1).将 util.Date 转成 sql.Date

>  java.sql.Date sqlDate = new  java.sql.Date(utilDate.getTime()); 

(2)使用Calendar 日历 的 getTime()方法 返回一个Date对象 然后调用 Date的getTime() 返回毫秒值 long

>  lo =Calendar.getInstance().getTime().getTime(); 

(3)将字符串 转换为 sql.Date

 SimpleDateFormat sdf = new  SimpleDateFormat("yyyy-MM-dd HH:mm:ss");       
 java.util.Date d =sdf.parse(s);        
 java.sql.Date sqlDate = new java.sql.Date(d.getTime());
  • 批处理
  • 定义:

批量处理允许您将相关的SQL语句分组到批处理中,并通过对数据库的一次调用提交它们。当您一次向数据库发送多个SQL语句时,可以减少连接数据库的开销,从而提高性能。

  • 使用Statement对象进行批处理操作步骤:

(1) 使用createStatement()方法创建Statement对象。
(2) 使用addBatch()方法在创建的语句对象上添加您喜欢的SQL语句到批处理中。
(3) 在创建的语句对象上使用executeBatch()方法执行所有SQL 语句。

  • PrepareStatement对象进行批处理操作步骤:

(1) 使用占位符创建SQL语句。
(2) 使用prepareStatement()方法创建PrepareStatement对象。
(3) 使用addBatch()方法在创建的语句对象上添加您喜欢的SQL语句到批处理中。
(4) 在创建的语句对象上使用executeBatch()方法执行所有SQL语句。

二、事务

  • 定义:

一组要么同时执行成功,要么同时执行失败的SQL语句。是数据库操作的一个执行单元。

  • 事务的四大特点(ACID)

(1) actomicity(原子性)** 表示一个事务内的所有操作是一个整体,要么全部成功,要么全部失败
(2) consistency(一致性) 表示一个事务内有一个操作失败时,所有的更改过的数据都必须回滚到修改前状态
(3) isolation(隔离性)
事务查看数据时数据所处的状态,要么是另一并发事务修改它之前的状态, 要么是另一事务修改它之后的状态,事务不会查看中间状态的数据。
(4) durability(持久性) 持久性事务完成之后,它对于系统的影响是永久性的。
  

  • 事务的隔离级别

(1) Read Uncommitted读取未提交内容)
在该隔离级别,所有事务都可以看到其他未提交事务的执行结果。读取未提交的数据,也被称之为脏读(Dirty Read)。
(2) Read Committed(读取提交内容)
这是大多数数据库系统的默认隔离级别(但不是MySQL默认的)。它满足了隔离的简单定义:一个事务只能看见已经提交事务所做的改变。这种隔离级别
也支持所谓的不可重复读(Nonrepeatable Read)
不可重复读:同一个事务下,两条查询语句结果不一致(读取到了另一个事务修改后的数据)
(3) Repeatable Read可重读
这是MySQL的默认事务隔离级别,这会导致另一个棘手的问题:幻读(Phantom Read)。
幻读指当用户读取某一范围的数据行时,另一个事务又在该范围内插入了新行,当用户再读取该范围的数据行时,会发现有新的“幻影” 行。
(4) Serializable 可串行化
这是最高的隔离级别,它通过强制事务排序,使之不可能相互冲突,从而解决幻读问题。简言之,它是在每个读的数据行上加上共享锁。在这个级别,可能导致大量的超时现象和锁竞争。
(5) Mysql中的查看方式
查看当前的事务隔离级别:SELECT @@TX_ISOLATION;
更改当前的事务隔离级别:SET TRANSACTION ISOLATION LEVEL 四个级别之一。

  • 注意

设置隔离级别必须在事务之前
read uncommitted: 不能避免脏读,不可重复读,幻读(虚读)
read committed:避免脏读,不可避免不可重复,幻读。
Repeatable Read:避免脏读,不可重复读,不能避免幻读
Serializable: 都能避免

  • 事务的应用

1、要取消掉JDBC的自动提交:void setAutoCommit(boolean autoCommit)
2、执行各个SQL语句,加入到批处理之中
3、如果所有语句执行成功,则提交事务 commit();
如果出现了错误,则回滚:rollback()

猜你喜欢

转载自blog.csdn.net/xueer_z/article/details/81874145