事务
是指作为单个逻辑工作单元执行的一系列操作,通过将一组相关操作组合为一个要么全部成功要么全部失败的单元,可以简化错误恢复并使应用程序更加可靠。
使用事务(用事务的sql语句(事务开始和事务提交) 包裹住 你要执行语句)
1.把事务打开 -begin
2.写你要执行语句
3.把事务进行提交 commit
4.把事务回滚(rollback;) 遇到断电 事务没有提交 那么事务会自动回滚
四个特性
1.原子性:指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。
2.一致性:事务必须使数据库从一个一致性状态变换到另外一个一致性状态。
3.隔离性:事务的隔离性是多个用户并发访问数据库时,数据库为每一个用户开启的事务,不能被其他事务的操作数据所干扰,多个并发事务之间要相互隔离。
4.持久性:指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来即使数据库发生故障也不应该对其有任何影响
事务的隔离级别
赃读:指一个事务读取了另一个事务未提交的数据。
不可重复读:在一个事务内读取表中的某一行数据,多次读取结果不同。一个事务读取到了另一个事务提交后的数据。
虚读(幻读):是指在一个事务内读取到了别的事务插入的数据,导致前后读取不一致。(insert)
数据库通过设置事务的隔离级别防止以上情况的发生:
1、READ UNCOMMITTED: 赃读、不可重复读、虚读都有可能发生。
2、READ COMMITTED: 避免赃读。不可重复读、虚读都有可能发生。(oracle默认的)
4、REPEATABLE READ:避免赃读、不可重复读。虚读有可能发生。(mysql默认)
8、SERIALIZABLE: 避免赃读、不可重复读、虚读。
级别越高,性能越低,数据越安全
mysql中:
查看当前的事务隔离级别:SELECT @@TX_ISOLATION;
更改当前的事务隔离级别:SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
四个级别之一。
设置隔离级别必须在事务之前
– mysql默认是自动提交事务 要想手动管理需要
UPDATE account SET money=money-100 WHERE name='aaa';
– 开启事务
BEGIN;
– 开启事务后 执行成功 但是数据没有发生变化
– 没有提交的话 断电等等 会自动回滚
UPDATE account SET money=money-100 WHERE name='aaa';
– 提交
COMMIT;
– 回滚
ROLLBACK;
Hibernate (避免使用繁琐的sql语句去操作数据)
操作数据的 对象关系型数据库
使用 面向对象 的思想 去增删改查 直接插入一个User对象
修改数据 先获取要修改的对象 在sava
根据你使用方法的不同 自动给你生成sql语句HQL Hibernate特有的sql语句
auto schema export
自动导出表结构. 自动建表
hibernate.hbm2ddl.auto create
自动建表.每次框架运行都会创建新的表.以前表将会被覆盖,表数据会丢失.(开发环境中测试使用)
hibernate.hbm2ddl.auto create-drop
自动建表.每次框架运行结束都会将所有表删除.(开发环境中测试使用)
hibernate.hbm2ddl.auto update
(推荐使用) 自动生成表.如果已经存在不会再生成.如果表有变动.自动更新表(不会删除任何数据)
hibernate.hbm2ddl.auto validate
校验.不自动生成表.每次启动会校验数据库中表是否正确.校验失败
添加对象到数据库
1.加载配置文件
直接调用 configure() 方法,系统会默认读取hibernate.cfg.xml 这个文件
2.获取 sessionFactory 对象,相当于获取连接池对象
3.从工厂中获取一个 session 对象openSession() 获取的是一个全新的 session
4.向数据库插入对象
5.使用 session 对象开启一个事物(返回一个事物对象)包裹的要执行的任务
6.提交事物
7.关闭资源
修改对象
user.setUsername("zhangsan");
//把对象保存一遍
//注意: 修改的时候就是用update
session.update(user);
查询
1.get查
User user = session.get(User.class, 1);
System.out.println(user);
2.load查询
User user = session.load(User.class, 1);
System.out.println(user);
get和load方法的区别
相同: 都能进行对象的查询
不同: load方式的查询方式 是 懒加载(延迟加载)
load方法被执行时 不会跟get方法一样 立即生成sql语句和执行
而是生成一个代理对象 直接返回
这时才会去生成sql语句 查询数据
利用延迟加载 提高了hibernate的执行效率
3.HQL查询
返回的是 保存查询结果的对象
Query<User> query = session.createQuery("from com.lanou3g.User");
Query<User> query = session.createQuery("from User",User.class);
List<User> list = query.list();
System.out.println(list);
4.SQL语句查询
直接使用sql语句查询
NativeQuery nativeQuery = session.createNativeQuery("select * from user");
List<Object[]> list = nativeQuery.list();
for (Object[] objects : list) {
System.out.println(Arrays.toString(objects));
}
删除(按id删除)
1.先查对象 把该对象删除
User user = session.get(User.class, 1);
session.delete(user);
2.创建一个对象 只赋值id 然后删除
User user = new User();
user.setId(2);
session.delete(user);