Hibernate框架第二天

hibernate中的实体规则

实体类创建的注意事项

  • 持久化类提供无参数构造
  • 成员变量私有,提供共有get/set方法访问.需提供属性
  • 持久化类中的属性,应尽量使用包装类型
  • 持久化类需要提供oid.与数据库中的主键列对应
  • 不要用final修饰class

主键类型

  • 自然主键(少见):表的业务列中,有某业务列符合,必须有,并且不重复的特征时,该列可以作为主键使用.

  • 代理主键(常见):表的业务列中,没有某业务列符合,必须有,并且不重复的特征时,创建一个没有业务意义的列作为主键

主键生成策略

  • 代理主键:identity : 主键自增.由数据库来维护主键值.录入时不需要指定主键.
  • 自然主键:assigned:自然主键生成策略. hibernate不会管理主键值.由开发人员自己录入.

hibernate中的对象状态

对象的三种状态

  • 瞬时状态:没有id,没有在session缓存中
  • 持久化状态:有id,在session缓存中
  • 游离|托管状态:有id,没有在session缓存中

hibernate进阶之一级缓存

  1. 缓存的作用:提高效率.hibernate中的一级缓存也是为了提高操作数据库的效率.
  2. 提高效率手段
    1、提高查询效率
    2、减少不必要的修改语句发送

hibernate中的事务

在hibernate中指定数据库的隔离级别

hibernate.cfg.xml 主配置文件中配置

 <!-- 指定hibernate操作数据库时的隔离级别 #hibernate.connection.isolation 1|2|4|8 
 0001 1 读未提交
 0010 2 读已提交 
 0100 4 可重复读
 1000 8 串行化
 -->
  <property name="hibernate.connection.isolation">4</property>

在项目中如何管理事务

  1. 业务开始之前打开事务,业务执行之后提交事务. 执行过程中出现异常.回滚事务.
  2. 在dao层操作数据库需要用到session对象.在service控制事务也是使用session对象完成. 我们要确保dao层和service层使用的使用同一个session对象
  3. 在hibernate中,确保使用同一个session的问题,hibernate已经帮我们解决了. 我们开发人员只需要调用sf.getCurrentSession()方法即可获得与当前线程绑定的session对象
    注意:
    注意1: 调用getCurrentSession方法必须配合主配置中的一段配置
    注意2:通过getCurrentSession方法获得的session对象.当事务提交时,session会自动关闭.不要手动调用close关闭.
<!-- 指定session与当前线程绑定 -->
<property name="hibernate.current_session_context_class">thread</property>
//service层
public void save(Customer customer) {
	Session session =  HibernateUtils.getCurrentSession();
  	//打开事务
 	 Transaction tx = session.beginTransaction();
  	//调用Dao保存客户
  	try {
		customerDao .save(customer);
 	 } catch (Exception e) {
  	 	e.printStackTrace();
   		tx.rollback();
 	 }
 	//提交事务
  	tx.commit();
 }
//Dao层
public void save(Customer customer) {
  	// 1 获得session
 	 Session session = HibernateUtils.getCurrentSession();
 	 session.save(customer);
 }

hibernate中的批量查询(概述)

HQL查询-hibernate Query Language(多表查询,但不复杂时使用)

//基本查询
public static void fun1() {
 	 // 获得session
  	Session session = HibernateUtils.openSession();
 	 // 执行事务
  	Transaction transaction = session.beginTransaction();
 	 // 3执行操作
 	 // -------------------------------------------
 	 // 1> 书写HQL语句
 	 // String hql = "from com.geek.domain.User";
 	 String hql = "from User";
 	 // 2> 根据HQL语句创建查询对象
 	 Query query = session.createQuery(hql);
 	 // 3> 根据查询对象获得查询结果
 	 List<User> list = query.list();
 	 // query.uniqueResult();//接收唯一的查询结果
 	 System.out.println(list);
 	 // -------------------------------------------
  	// 4提交事务.关闭资源
  	transaction.commit();
  	session.close();// 游离|托管 状态, 有id , 没有关联
 }
//条件查询
public static void fun1() {
   	// 获得session
  	 Session session = HibernateUtils.openSession();
  	 // 执行事务
  	 Transaction transaction = session.beginTransaction();
   	// 3执行操作
  	// -------------------------------------------
  	// 1> 书写HQL语句
  	// String hql = "from com.geek.domain.User";
  	//基本条件查询
 	String hql = "from User where uid=1";
 	//占位符条件查询
 	//String hql = "from User where uid=?";
 	// 设置参数,参数索引从0开始
  	//query.setParameter(0, 3);
  	// 命名占位符条件查询
  	//String hql = "from User where uid=:uid";
  	// 设置参数,通过任意命名进行设置参数
  	//query.setParameter("uid", 2);
 	// 2> 根据HQL语句创建查询对象
  	Query query = session.createQuery(hql);
  	// 3> 根据查询对象获得查询结果
  	// 接收唯一的查询结果
  	User user = (User) query.uniqueResult();
  	System.out.println(user);
  	// -------------------------------------------
  	// 4提交事务.关闭资源
 	transaction.commit();
 	session.close();// 游离|托管 状态, 有id , 没有关联
 }
//分页查询
public static void fun1() {
    // 获得session
    Session session = HibernateUtils.openSession();
    // 执行事务
    Transaction transaction = session.beginTransaction();
    // 3执行操作	
    // -------------------------------------------
    // 1> 书写HQL语句
    // String hql = "from com.geek.domain.User";
    String hql = "from User";
    // 2> 根据HQL语句创建查询对象
    Query query = session.createQuery(hql);
    // 设置参数,通过任意命名进行设置参数
    // 设置分页信息 limit ?,?
    query.setFirstResult(1);
    uery.setMaxResults(3);
    // 3> 根据查询对象获得查询结果
    List<User> list = query.list();
    System.out.println(list);
    // -------------------------------------------
    // 4提交事务.关闭资源
    ransaction.commit();
    session.close();// 游离|托管 状态, 有id , 没有关联
 }  

Criteria查询(单表条件查询)

//基本查询
public static void fun1() {
	  //获得session
	  Session session = HibernateUtils.openSession();
	  //控制事务
	  Transaction transaction = session.beginTransaction();
	  //执行操作
	  Criteria criteria = session.createCriteria(User.class); 
	  List<User> list = criteria.list();
	  //User user = (User) criteria.uniqueResult();
	  System.out.println(list);
	  //提交事务
	  transaction.commit();
	  //关闭资源
	  session.close();
 }
//条件查询
 public static void fun2() {
	  //获得session
	  Session session = HibernateUtils.openSession();
	  //控制事务
	  Transaction transaction = session.beginTransaction();
	  //执行操作
	  Criteria criteria = session.createCriteria(User.class);
	  //设置条件
	  criteria.add(Restrictions.eq("id", 1));
	  User user = (User) criteria.uniqueResult();
	  System.out.println(user);
	  //提交事务
	  transaction.commit();
	  //关闭资源
	  session.close();
 }
//分页查询
public static void fun3() {
	  // 获得session
	  Session session = HibernateUtils.openSession();
	  // 控制事务
	  Transaction transaction = session.beginTransaction();
	  // 执行操作
	  Criteria criteria = session.createCriteria(User.class);
	  //设置分页信息
	  criteria.setFirstResult(1);
	  criteria.setMaxResults(3);
	  //执行查询
	  List list = criteria.list();
	  System.out.println(list);
	  // 提交事务
	  transaction.commit();
	  // 关闭资源
	  session.close();
 }
// 分页最多行数查询
 public static void fun4() {
	  // 获得session
	  Session session = HibernateUtils.openSession();
	  // 控制事务
	  Transaction transaction = session.beginTransaction();
	  // 执行操作
	  Criteria criteria = session.createCriteria(User.class);
	  //使用聚合函数,查询最多行数
	  criteria.setProjection(Projections.rowCount());
	  Long uniqueResult = (Long) criteria.uniqueResult();
	  System.out.println(uniqueResult);
	  // 提交事务
	  transaction.commit();
	  // 关闭资源
	  session.close();
 }

原生SQL查询(复杂的业务查询)

//基本查询,返回数组list
 public static void fun1() {
	  // 获得session
	  Session session = HibernateUtils.openSession();
	  // 控制事务
	  Transaction transaction = session.beginTransaction();
	  // 执行操作
	  //1、sql语句
	  String sql = "select * from user";
	  //2、创建sql查询对象
	  SQLQuery query = session.createSQLQuery(sql);
	  //调用方法查询结果
	  List<Object []> list = query.list();
	  for (Object[] objects : list) {
	   System.out.println(Arrays.toString(objects));
     	 }
 }
//基本查询,返回对象集合
public static void fun2() {
	  // 获得session
	  Session session = HibernateUtils.openSession();
	  // 控制事务
	  Transaction transaction = session.beginTransaction();
	  // 执行操作
	  // 1、sql语句
	  String sql = "select * from user";
	  // 2、创建sql查询对象
	  SQLQuery query = session.createSQLQuery(sql);
	  //将结果封装到对象中去
	  query.addEntity(User.class);
	  // 调用方法查询结果
	  List<User> list = query.list();
	  System.out.println(list);
 }
//分页查询
public static void fun3() {
	  // 获得session
	  Session session = HibernateUtils.openSession();
	  // 控制事务
	  Transaction transaction = session.beginTransaction();
	  // 执行操作
	  // 1、sql语句
	  String sql = "select * from user limit ?,?";
	  // 2、创建sql查询对象
	  SQLQuery query = session.createSQLQuery(sql);
	  //3、 设置分页信息
	  query.setParameter(0,1);
	  query.setParameter(1,2);
	  // 将结果封装到对象中去
	  query.addEntity(User.class);
	  // 调用方法查询结果
	  List<User> list = query.list();
	  System.out.println(list);
 }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值