事务
1.把事务打开 begin;
2.写你要执行语句
3.把事务进行提交 commit;
4.把事务回滚 遇到断电 事务没有提交 那么事务会自动回滚 rollback;
原子性:指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。
一致性:事务必须使数据库从一个一致性状态变换到另外一个一致性状态。
隔离性:事务的隔离性是多个用户并发访问数据库时,数据库为每一个用户开启的事务,不能被其他事务的操作数据所干扰,多个并发事务之间要相互隔离。
持久性:指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来即使数据库发生故障也不应该对其有任何影响
事务的隔离级别
赃读:指一个事务读取了另一个事务未提交的数据。
不可重复读:在一个事务内读取表中的某一行数据,多次读取结果不同。一个事务读取到了另一个事务提交后的数据。
虚读(幻读):是指在一个事务内读取到了别的事务插入的数据,导致前后读取不一致。
数据库通过设置事务的隔离级别防止以上情况的发生:
1.READ UNCOMMITTED: 赃读、不可重复读、虚读都有可能发生。
2.READ COMMITTED: 避免赃读。不可重复读、虚读都有可能发生。(oracle默认的)
3.REPEATABLE READ:避免赃读、不可重复读。虚读有可能发生。(mysql默认)
4.SERIALIZABLE: 避免赃读、不可重复读、虚读。
级别越高,性能越低,数据越安全
mysql中:
查看当前的事务隔离级别:SELECT @@TX_ISOLATION;
更改当前的事务隔离级别:SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED四个级别之一。
hibernate
1.导入框架
required文件夹下的所有包
jpa-metamodel-generator文件夹下的包
mysql的驱动包
2.创建hibernate的主配置文件
默认src下
名字默认 hibernate.cfg.xml
3.创建实体类
数据库字段名和对象属性名 相同
4.创建实体类 对应的 配置文件
命名规范: 实体类名.hbm.xml
作用:配置实体类与数据库表的映射关系
5.从主配置文件中 配置 映射文件的路径
<session-factory >
<!-- hibernate数据库配置 -->
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/hibernate01</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">123456</property>
<!-- 加载mysql的方言包 core->dialect -->
<property name="hibernate.dialect">org.hibernate.dialect.MySQL5InnoDBDialect</property>
<!-- 开启打印sql语句 -->
<property name="hibernate.show_sql">true</property>
<!-- 开启格式化sql语句 -->
<property name="hibernate.format_sql">true</property>
<!-- 自动更新表结构 没有表会帮你创建出来表-->
<property name="hibernate.hbm2ddl.auto">update</property>
<!-- 映射数据库表对应 映射文件的路径
注意:路径从包名开始 并且中间使用反斜杠相隔
-->
<mapping resource="com/lanou3g/User.hbm.xml"/>
</session-factory>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<!-- 配置表与实体类的关系
name:实体类的全类名
table:表名
package:包名 填上后 全类名可以省略包名
-->
<hibernate-mapping package="com.lanou3g">
<class name="User" table="user">
<!-- id:表示主键 注意:没有主键不能使用hibernate name:类中的成员变量名 column:成员变量代表的表中的字段名 -->
<id name="id" column="id">
<!--主键生成策略 主键自增策略 -->
<generator class="native"></generator>
</id>
<!--property 表示除主键意外的属性 -->
<property name="username" column="username"></property>
<property name="password" column="password"></property>
</class>
</hibernate-mapping>
流程
//1.读取主配置文件
//默认读取src下的hibernate.cfg.xml文件
Configuration configuration=new Configuration().configure();
//2.创建session工厂
//相当于数据库连接池
SessionFactory sessionFactory = configuration.buildSessionFactory();
//3.从session工厂 获取session对象
//获取一个全新的session对象
Session session = sessionFactory.openSession();
//通过session操作数据库
//4.开启事务
Transaction transaction = session.beginTransaction();
//5.操作数据库
//向数据库插入一条数据(一条记录)
User user=new User();
user.setUsername("wanglong");
user.setPassword("123");
//将对象保存到数据库中
session.save(user);
//6.提交事务
transaction.commit();
//7.关闭资源
session.close();
sessionFactory.close();
操作数据库部分的语句
1.
//向数据库插入一条数据(一条记录)
User user=new User();
user.setUsername("wanglong");
user.setPassword("123");
//将对象保存到数据库中
session.save(user);
2.
User user = session.get(User.class, 1);
System.out.println(user);
3.
//使用load方法查询
User load = session.load(User.class, 1);
System.out.println(load);
4.
//修改对象 根据id
//根据id把对象查出来
User user = session.get(User.class, 1);
user.setUsername("wamg");
session.update(user);
5.
//删除对象 根据id
User user=new User();
user.setId(1);
session.delete(user);
6.
//查询数据库中的所有user对象
//Query<User> query = session.createQuery("from com.lanou3g.User");
Query<User> query = session.createQuery("from User",User.class );
//从查询的结果集中取出数据 并且取出的是个集合
List<User> list = query.list();
for (User user : list) {
System.out.println(user);
}
7.
//使用原生sql语句查询
NativeQuery<Object[]> query = session.createNativeQuery("select * from user where username=?");
//替换占位符
//参数1 占位符的索引 从1开始
//参数2 要替换的值
query.setParameter(1,"wanglong");
List<Object[]> list = query.list();
for (Object[] objects : list) {
for (Object object : objects) {
System.out.print(object+" ");
}
System.out.println();