Hibernate事务操作
事务相关概念
1 什么是事务 事务是操作中最基本的单元,表示一组操作要么都成功,有一个失败那么所有都失败。最典型的场景:银行转账 2 事务特性 原子性 一致性 隔离性 持久性 3 不考虑隔离性产生读问题 (1)脏读 (2)不可重复读 (3)虚读 4 设置事务隔离级别 (1)mysql默认隔离级别 repeatable read |
Hibernate事务代码规范写法
1 代码结构 try { 开启事务 提交事务 }catch() { 回滚事务 }finally { 关闭 } /**
* 事务规范代码
*/
@Test
public void testTx() {
SessionFactory sessionFactory = null;
Session session = null;
Transaction tx = null;
try{
sessionFactory = HibernateUtils.getSessionFactory();
session = sessionFactory.openSession();
//开启事务
tx = session.beginTransaction();
//添加
User user = new User();
user.setUsername("小马");
user.setPassword("666");
user.setAddress("美国");
session.save(user);
int i = 10/0;
//提交事务
tx.commit();
}catch(Exception e) {
e.printStackTrace();
//回滚事务
tx.rollback();
}finally {
//关闭操作
session.close();
sessionFactory.close();
}
}
|
Hibernate绑定session
1 session类似于jdbc的connection,之前web阶段学过 ThreadLocal,与本地线程绑定 2 框架帮实现与本地线程绑定session 3 获取与本地线程session (1)在hibernate核心配置文件中配置 (2)调用sessionFactory里面的方法得到 sessionFactory不用自己关闭了 4 获取与本地线程绑定session时候,关闭session报错,不需要手动关闭了 |
Hibernate的api使用
Query对象
1 使用query对象,不需要写sql语句,但是写hql语句 (1)hql:hibernate query language,hibernate提供查询语言,这个hql语句和普通sql语句很相似 (2)hql和sql语句区别: - 使用sql操作表和表字段 - 使用hql操作实体类和属性 2 查询所有hql语句: (1)from 实体类名称 3 Query对象使用 (1)创建Query对象 (2)调用query对象里面的方法得到结果 public class HibernateQueryData {
//使用query对象
@Test
public void testQuery() {
SessionFactory sessionFactory = null;
Session session = null;
Transaction tx = null;
try{
sessionFactory = HibernateUtils.getSessionFactory();
//与本地线程绑定的session
session = HibernateUtils.getSessiononObject();
//开启事务
tx = session.beginTransaction();
//1.创建Query对象
//方法里面写hql语句
Query query = session.createQuery("from User");
//2.调用query对象里面的方法得到结果
List<User> list = query.list();
for(User user : list) {
System.out.println(user);
}
//提交事务
tx.commit();
}catch(Exception e) {
e.printStackTrace();
//回滚事务
tx.rollback();
}finally {
//关闭操作
session.close();
sessionFactory.close();
}
}
}
|
Criteria对象
1 使用这个对象查询操作,但是使用这个对象时候,不需要写语句,直接调用方法实现 2 实现过程 (1)创建criteria对象 (2)调用对象里面的方法得到结果 //使用Criteria对象
@Test
public void testCriteria() {
SessionFactory sessionFactory = null;
Session session = null;
Transaction tx = null;
try{
sessionFactory = HibernateUtils.getSessionFactory();
//与本地线程绑定的session
session = HibernateUtils.getSessiononObject();
//开启事务
tx = session.beginTransaction();
//1.创建Criteria对象
//方法里面参数是实体类class
Criteria criteria= session.createCriteria(User.class);
//2.调用方法得到结果
List<User> list = criteria.list();
for (User user : list) {
System.out.println(user);
}
//提交事务
tx.commit();
}catch(Exception e) {
e.printStackTrace();
//回滚事务
tx.rollback();
}finally {
//关闭操作
session.close();
sessionFactory.close();
}
}
|
SQLQuery对象
1 使用hibernate时候,调用底层sql实现 2 实现过程 (1)创建对象 (2)调用对象的方法得到结果 //使用SQLQuery对象
@Test
public void testSQLQuery() {
SessionFactory sessionFactory = null;
Session session = null;
Transaction tx = null;
try{
sessionFactory = HibernateUtils.getSessionFactory();
//与本地线程绑定的session
session = HibernateUtils.getSessiononObject();
//开启事务
tx = session.beginTransaction();
//1.创建SQLQuery对象
//参数是普通sql语句
SQLQuery sqlQuery = session.createSQLQuery("select * from t_user");
//调用sqlQuery里面的方法
//返回list集合,默认里面每部分数组结构
List<Object[]> list = sqlQuery.list();
for (Object[] objects : list) {
//把数组作为字符串输出
System.out.println(Arrays.toString(objects));
}
//提交事务
tx.commit();
}catch(Exception e) {
e.printStackTrace();
//回滚事务
tx.rollback();
}finally {
//关闭操作
session.close();
sessionFactory.close();
}
}
返回list集合每部分是数组
返回list中每部分是对象形式
|