事务相关概念
hibernate中配置事务隔离级别
在config核心配置文件中配置
<property name="hibernate.connection.isolation">4</property>
1、什么是事务
2、事务特性
3、不考虑隔离性产生问题
(1)脏读
(2)不可重复读
(3)虚读(幻读)
4、设置事务隔离级别
(1)MySQL默认隔离级别 repeatable read
HIbernate事务代码规范写法
1、代码结构
@Test
public void testTx() {
SessionFactory sessionFactory = null;
Session session = null;
Transaction tr = null;
try {
sessionFactory = HibernateUtils.getSessionFactory();
session = sessionFactory.openSession();
tr = session.beginTransaction();
User user = new User();
user.setUsername("axin");
user.setPassword("password");
session.save(user);
tr.commit();
} catch (Exception e) {
tr.rollback();
} finally {
session.close();
sessionFactory.close();
}
}
Hibernate绑定session
1.session类似于jdbc的connection,,,threadLocal
2.帮实现与本地线程绑定session
3.获取与本地线程session
(1)在hibernate核心配置文件中配置
<property name="hibernate.current_session_context_class">thread</property>
(2)调用sessionFactory里面的方法得到(在工具类中进行的配置,必须要在核心配置中配置了上面的thread)
public static Session getSessionObject() {
return sessionFactory.getCurrentSession();
}
4.获取与本地线程绑定session时候,关闭session报错,不需要手动关闭了
@Test
public void testTx() {
Session session = null;
Transaction tr = null;
try {
session = HibernateUtils.getSessionObject();
tr = session.beginTransaction();
User user = new User();
user.setUsername("axin");
user.setPassword("password");
session.save(user);
tr.commit();
} catch (Exception e) {
tr.rollback();
} finally {
session.close();
}
}
Hibernate的api使用
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对象里面的方法得到结果
@Test
public void testTx() {
SessionFactory sessionFactory = null;
Session session = null;
Transaction tx = null;
try {
sessionFactory = HibernateUtils.getSessionFactory();
session = sessionFactory.openSession();
tx = session.beginTransaction();
Query query = session.createQuery("from User");
List<User> list = query.list();
for (User user : list) {
System.out.println(user);
}
tx.commit();
} catch (Exception e) {
tx.rollback();
} finally {
session.close();
sessionFactory.close();
}
}
1.使用这个对象查询操作,但是使用这个对象的时候,不需要写语句,直接调用方法实现
2.实现过程
(1)创建criteria对象
(2)调用对象里面的方法得到结果
@Test
public void testTx() {
SessionFactory sessionFactory = null;
Session session = null;
Transaction tx = null;
try {
sessionFactory = HibernateUtils.getSessionFactory();
session = sessionFactory.openSession();
tx = session.beginTransaction();
Criteria criteria = session.createCriteria(User.class);
List<User> list = criteria.list();
for (User user : list) {
System.out.println(user);
}
tx.commit();
} catch (Exception e) {
tx.rollback();
} finally {
session.close();
sessionFactory.close();
}
}
1、使用hibernate时候,调用底层sql实现
2、实现过程
(1)创建对象
(2)调用对象的方法得到结果
两种:
数组形式:
SQLQuery sql = session.createSQLQuery("select * from user");
List<Object[]> list = sql.list();
for (Object[] user : list) {
System.out.println(Arrays.toString(user));
}
对象形式:
SQLQuery sqlQuery = session.createSQLQuery("select * from user");
sqlQuery.addEntity(User.class);
List<User> list = sqlQuery.list();
for (User user : list) {
System.out.println(user);
}
具体代码
@Test
public void testTx() {
SessionFactory sessionFactory = null;
Session session = null;
Transaction tx = null;
try {
sessionFactory = HibernateUtils.getSessionFactory();
session = sessionFactory.openSession();
tx = session.beginTransaction();
SQLQuery sqlQuery = session.createSQLQuery("select * from user");
sqlQuery.addEntity(User.class);
List<User> list = sqlQuery.list();
for (User user : list) {
System.out.println(user);
}
tx.commit();
} catch (Exception e) {
tx.rollback();
} finally {
session.close();
sessionFactory.close();
}
}