JDBC高级
发布日期:2021-07-22 10:54:26 浏览次数:3 分类:技术文章

本文共 4657 字,大约阅读时间需要 15 分钟。

JDBC高级

JDBC的事务支持:

1.当一个业务需要涉及到N个DML操作的时候,这个业务(或者是N个DML操作,当成一个整体来处理)。在处理的过程中,如果有失败或者异常,我们要回到业务开始时,如果处理成功,我们在将数据持久化到磁盘中,这样一个过程称为一个事务,事物具有原子性,不可切割总结:事务是指逻辑上的一组操作,组成这组操作的各个单元要么全成功,要么全不成功关键字:    commit    rollback    savepoint
事务的特性:atomicity(原子性):事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生consistency(一致性):事务必须使数据库从一个一致性状态变换到另一个一致性状态。isolation(隔离性):事务的隔离性是多个用户之间并发访问数据库时,数据库为每一个用户开启的事务,	不能被其他事务的操作数据所干扰,多个并发事务之间要相互隔离durability(持久性):指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来即使数据库发生故障也不应该对其有任何影响

MySQL事务:

默认情况下,MySQL每执行一条SQL语句,都是一个单独的事物如果需要在一个事务中包含多条SQL语句,那么需要开启事务和结束事务	开启事务:start transaction	结束事务:commit或rollback事务开始于:	连接到数据库上,并执行一条DML语句insert,update,delete	前一个事务结束后,又输入了另外一条DML语句事务结束于:	执行commit或者rollback语句	执行一条DDL语句,例如create table语句,这时,会自动执行commit语句	执行一条DDL语句,例如grant语句,这种情况下,会自动执行commit	断开与数据库的连接	执行一条DML语句,该语句却失败了,这种情况下,会为这个无效的DML语句执行rollback语句

示例:

-- 开启事务START TRANSACTION;UPDATE account SET salary = salary+1000 WHERE NAME = '张三'; -- 6000ROLLBACK;-- 5000  -- 提交情况START TRANSACTION;UPDATE account SET salary = salary+2000 WHERE NAME = '张三'; -- 7000COMMIT; -- 7000
多事务的情况:	脏读:事务A读取了事务B刚更新的数据,但是事务B回滚了,这样就导致了事务A读取的是脏数据,我们称之脏读。    (例如,公司某财务人员更新公司入账报表的时候,在DML语句中的数字后面少添了一个0,但是未提交,然后吃饭,吃饭回来发现了自己的错误,然后更正做了提交,但是同事看到的数据却是少了个0的数据,这就是脏读)    不可重复读:事务A读取同一条记录两次,但是在两次之间,事务B对该条记录进行了修改提交,导致事务A两次读取的数据不一致。它和脏读的区别就是:脏读是事务A读取了事务B未提交的脏数据,而不可重复读时事务A读取了事务B已提交的数据。    (多数情况,不可重复读并不是问题,因为我们多次查询某个数据时,当然要以最后的查询得到的结果为主,但在另外一些情况下,就有可能发生问题,比如,老板让B和C分别对事务A进行操作,结果不同,老板应该相信谁呢?)    幻读:事务A在修改全表的数据,比如将字段age全部修改为0岁,在未提交时,事务B向表中插入一条age为25的数据,这样导致了事务A读取的数据与需要修改的数据不一致,就像幻觉一样。    (幻读和不可重复读的相同点:都是针对于另外一个已经提交的事务而言,不同点:不可重复读是针对于同一条记录来说的(delete或者update同一条记录),而幻读是针对于一批数据来说的(insert))

总结:数据库通过设置事务的隔离级别防止以上情况发生

隔离机制:

1.未提交读:就是不做隔离控制,可以读到脏数据,可能发生不可重复读,也可能发生幻读2.提交读:提交读就是不允许读取事务没有提交的数据,显然这种级别可以避免脏读问题,但是还是可	能发生不可重复读,幻读等,这个隔离级别是大多数数据库(除了mysql)的默认隔离级别3.可重复读:为了避免提交读级别不可重复读的问题,在事务中对符合条件的的记录上“排他锁”,这样	 其他事务不能对该事务操作的数据进行修改,可以避免不可重复读的问题产生,由于只对操作数据进   的操作,所以当其他事务插入或者删除数据时,会出现幻读的问题,这种隔离级别是mysql默认的隔	离级别4.序列化:在事务中对表上锁, 这样在事务结束之前,其他事物都不能对表数据进行操作(包括新	   增,删除,修改),这样避免了脏读,不可重复读和幻读是最安全的隔离级别,但是由于该操作是	   阻塞的,因此会严重影响性能

注意点:

1.oracle的隔离级别是:read committed

2.mysql的隔离级别是:repeatable read

3.级别越高,性能越低,数据越安全

4.设置隔离级别必须在事务之前

JDBC控制事务在Connection接口的隔离级别:

TRANSACTION_READ_COMMITTED:TRANSACTION_READ_UNCOMMITTED:TRANSACTION_REPEATABLE_READ:TRANSACTION_SERIALIZABLE:设置隔离级别的方法:    Connection.setTransactionIsolation(int level)

数据库连接池技术:

连接池技术出现的原因:在与数据库进行连接的过程中,会非常消耗内存,性能大打折扣,如果每次都去重新连接数据库,那么宕机的几率很早

连接池技术原理和优势:原理:	连接池对象在初始化阶段,一次性创建N个对象,这些连接对象存储在连接池对象中,当有请求过来时,先从连接池中寻找空闲连接对象并使用,当使用完后,将连接对象归还给连接池,不是真正意义上的断开连接优势:	这样可以满足成千上万个请求,解决建立数据库连接耗费的资源和时间过多的问题,提高性能

常用的连接池技术:

dbcp:是apache组织旗下的一个数据库连接池技术产品c3p0:是一个开源的连接池技术druid:是阿里的数据库连接池技术

DAO设计模式:

DAO简介:DAO是数据访问对象(Date Access Object)的简写 、建立在数据库与业务逻辑层之间,封装所有对数据的访问操作,我们也可以称为持久层目的:将数据访问逻辑和业务逻辑分开
一个DAO设计模式包含了以下内容:1.定义实体类:	通过对象关系映射(ORM)将数据库的表结构映射成java类型;表中的每一条记录映射成类的实例,用于数据传输2.定义一个接口:	在此接口中,定义应用程序对此表的所有访问操作,如,增,删,改,查等方法3.定义接口的实现类:	实现接口中的所有抽象方法4.定义一个DAO工厂类型:	用于返回接口实例	这样,开发人员只需要使用DAO接口即可,具体逻辑就变得透明了,无需了解内部的细节

DbUtils第三方工具类的使用:

作用:	DbUtils是java编程中的数据库操作实用工具,小巧简单实用	DbUtils封装了Dao层(持久层),减少了开发周期1.对于数据表的读操作,他可以将结果转换称List,Array,Set等java集合,便于程序员操作2.对于数据表的写操作,也可以变得很简单,只需要写sql语句3.可以使用数据源,使用JNDI,数据库连接池等技术来优化性能---重用已经构建好的数据库连接对象jar包---commons-dbutils-1.7.jar常用API:1.QueryRunner类型:可以直接使用连接池技术来操作数据库,进行增删改查	构造器:QueryRunner(DAtaSource ds)		返回一个指定数据库连接池得QueryRunner对象	非静态方法:query(String sql,ResultSetHandle
resultSetHandle) 它主要有三个方法: query():用于执行select update():用于执行insert,update,delete batch():批处理2.ResultSetHandler:关于结果集的一个接口,用于定义select操作后,封装结果集 举例: BeanHandler:将查询到的数据的第一条封装成实体类对象 BeanListHandler:将查询到的数据的第一条封装成实体类对象的集合

xml与json的区别:

xml:可扩展标记语言,里面的标记都是用户自己定义的,标记都是成对的,作用是用来存储数据和传输数据,特别适合网络传输

语法:文档说明:必须写在xml文档的第一行写法
属性:version:版本号,固定值1.0encoding:指定文档的码表,默认值是iso-8859-1standalone:指定文档是否独立,yes或者no元素:xml文档中的标签文档中必须有且仅有一个根元素元素需要正确闭合
元素需要正确嵌套元素名称需要遵守: 元素名称区分大小写 数字不能开头文本:特殊符号:<:>:&:":':CDATA:里面的数据回原样显示属性:属性值必须用括号引起来,单双引号均可以处理指令:不用
<书架>
<书 出版社="呵呵">
<书名>
金瓶梅
<作者>
陈冠希
<单价>
10
<批发价>
20
<书>
<书名>
葵花宝典
<作者>
东方不败
<单价>
10

功能:

数据存储

配置文件:

作为配置文件存在,xml中主要配置的一些具有复杂的层级关系的数据

Properties文件中主要配置的是一些key和value这样的数据

数据传输:

大部分使用json

json格式:{user:[{},{}],address:北京}

{}代表map []代表数组

数据显示:

可以使用html和xml,但是html主要用于网页显示

与HTML区别:

xml是可扩展的标记语言,而html是超文本标记语言

xml里的标记是用户自己定义的,html都是预定义的

xml用于存储和传输,html用于显示数据

html语法松散,xml语法严格

Json字符串:

就是用特殊的字符串,需要使用双引号

传输数据时多以json串的形式传递数据,可读性性差,但是效率要比xml高

表示对象:必须要使用{}

var json = “{‘city’:‘hangzhou’,‘bestjindian’:‘xihu’,‘secondjingdian’:‘leifengta’}”

表示数组:必须使用[]

var json = ‘[{“city”:“hangzhou”},{“city”:“beijing”},{“city”:“shanghai”}]’

转载地址:https://blog.csdn.net/m0_56433040/article/details/118251998 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:SpringzBoot项目踩雷:
下一篇:JDBC编程入门

发表评论

最新留言

留言是一种美德,欢迎回访!
[***.207.175.100]2024年04月14日 07时26分02秒