Hibernate使用快速入门介绍(2)

本文详细介绍了Hibernate框架的使用方法,包括实体类编写规则、主键生成策略、实体类操作(如CRUD)、对象状态管理、一级缓存机制及事务操作等内容。
  1. 实体类编写规则
  2. hibernate主键生成策略
  3. 实体类操作
    (1)crud操作
    (2)实体类对象状态
  4. hibernate的一级缓存
  5. hibernate的事务操作
    (1)事务代码规则写法
  6. hibernate其他api(查询)

###1.实体类编写规则

  1. 实体类里面的属性都是私有的
  2. 私有属性使用公开的get/set方法
  3. 要求实体类有属性作为唯一值(一般使用id值)
  4. 实体属性建议不使用基本数据类型,使用基本数据类型对应的包装类
    (1)8个基本数据类型对应的包装类
    int–Integer
    char–Character
    其他的都是首字母大写 比如 double-Double
    (2)比如 表示学生的分数,假如 int scroe;
    学生考了0分1 int score=0;
    学生没有参加参加考试,int score=0,不能准确表示学生是否参加考试
    解决:使用包装类就可以了,Integer score=0 表示学生得了0分
    表示学生未参加考试,Integer score=null;

###hibernate中主键的生成策略
####1.hibernate中要求实体类里面有一个属性作为唯一的值,对应表主键,主键可以不同的生成策略.

####2.hibernate主键生成策略有很多值

           <!-- 设置数据库id增长策略
 				   native:生成id值就是主键自动增长	   -->
 			    <generator class="native"></generator>

主要记两个
native:底层数据库对自动生成符的能力来选择 identity,sequence,hilo三种生成器中的一种
uuid:之前web阶段生成id值,hibernate帮我们生成uuid值

3.使用uuid

(1)将uid的类型改为String类型
private String uid;

###实体类操作
####1.实体类的crud操作
添加操作
调用session里面的user方法实现

                   //添加功能
                   User user= new User();
                   user.setUsername("小马");
                   user.setPassword("123");
                   user.setAddress("美国");
                   //调用session的方法实现添加
                   session.save(user);

根据id查询
调用session里面的get方法实现

                   	// 4.根据id查询
                	// 调用session里面的get方法
                	// 第一个参数:实体类的class 第二个参数:id值
                	User user = session.get(User.class, 1);
                	System.out.println(user);                                     

修改操作
首先查询,再修改

                    // 4.修改操作
                	// 修改uid=2的username
                	// 4.1根据id查
                	User user = session.get(User.class, 2);
                	// 4.2向返回的user对象里面设置修改之后的值
                	user.setUsername("小红");
                	// 4.3调用session的update方法修改
                	// 执行过程:到session对象里面找到uid的值,根据uid进行修改
                	session.update(user); 

删除操作

                    调用session里面的delete方法实现
                    // 4.删除操作
                		// 第一种:根据id查询对象
                		User user = session.get(User.class, 2);
                		session.delete(user); 
                    //第二种
                		User user3=new User();
                		user3.setUid(3);
                		session.delete(user3);   

注意:在进行修改操作时:
若使用save操作已存在id的记录,则会在后面添加

####2.实体类对象状态(概念)
实体类状态有三种
(1)瞬时态:对象里面没有id值,对象与session没有关联

                         User u=new User();
                         u.setUsername("jack");
                         u.setPassword("124");
                         u.setAddress("china");

(2)持久态:对象里面有id值,对象与session关联

                         User user=session.get(User.class,1); 

(3)托管态:对象里面有id值,对象与session没有关联

                         User user=new User();
                         user.setUid(3);         

演示操作实体类对象的方法
(1)saveOrUpture方法:实现添加,实现修改

                        //1.添加操作
                    		User user=new User();
                    		user.setUsername("jack");
                    		user.setPassword("520");
                    		user.setAddress("朝鲜");
                    		//实体类对象状态是瞬时态,做添加
                    		session.saveOrUpdate(user);
                    //2.修改操作
                    User user=new User();
                    user.setUid(6); //托管态
                		user.setUsername("jack");
                		user.setPassword("520");
                		user.setAddress("朝鲜");
	                    //实体类对象状态是瞬时态,做修改
                		session.saveOrUpdate(user);
                    
                    User user=session.get(User.class,7);
                    user.setUsername("lilei");
                    //实现类对象状态是持久态,做修改
                    session.saveOrUpdate(user);

###Hibernate的一级缓存
####什么是缓存

  1. 数据存到数据里面,数据库本身是文件系统,使用流方式操作文件并不是很高.
    (1) 把数据存到系统内存里面,不需要使用流方式,可以直接读取内存中数据
    (2)把数据放到内存中,提供读取效率
    ####Hibernate缓存
  2. hibernate框架中提供很多优化,hibernate的缓存就是一个优化方式
  3. hibernate缓存特点.
    第一类 hibernate 的一级缓存
    (1)hibernate的一级缓存默认打开的
    (2)hibernate的一级缓存使用范围.
    其范围是session范围,从session创建到session关闭范围
    (3)hibernate的一级缓存中,存储数据必须是持久态数据

第二类 hibernate 的二级缓存
(1)目前已经不是用了,代替技术redis
(2)二级缓存默认不是打开的,需要配置
(3)二级缓存使用范围,是sessionFactory范围
####验证一级缓存存在
#####1.验证方式

                    (1)首先根据uid=1 查询,返回对象
                    (2)其次再根据uid=1 查询,返回对象           
                     //1.根据uid=1查询,返回对象
                     //执行第一个get方法是否查询数据库,是否发送sql语句
                     User user1=session.get(User.class,6);
                     //2.在uid=1查询
                     //执行第二个get方法是否查询数据库,是否发送sql语句
                     User user2=session.get(User.class,6);
Hibernate缓存的一般特性
          1.持久态自动更新数据库
                    //1.根据id查询
                    User user=session.get(User.class,7);
                    //2.设置返回对象的值
                    user.setUsername("hanmeimei");                   
                    //3.调用方法实现          
                    //session.update(user);这一句其实不用写也可

2.执行过程(了解)

###5.Hibernate事务操作
####事务相关概念

  1. 什么是事务

  2. 事务特性

  3. 不考虑隔离性产生问题
    (1)脏读
    (2)不可重复读
    (3)虚读

  4. 设置事务的隔离级别
    (1)mysql默认隔离级别repeatable read
    Hibernate事务代码规范写法

               try{
                   开启事务
                   提交事务
               }catch{
                   回滚事务
               }finally{
                   关闭  
               }                                            
    

#####Hibernate 绑定session
session类似于jdbc的connection,之前web阶段学过threadLocal

       帮实现与本地线程绑定session
       
       获取与本地线程session
           (1)在hibernate核心配置文件中配置
                  <property name="hibernate.current_session_context_class">thread</property>
           (2)调用sessionFactory里面的方法得到 
                  // 在util中提供返回与本地线程的session的方法
                	public static Session getSessionobject() {
                		return sessionFactory.getCurrentSession();
                	}
       获取与本地线程绑定session时候,关闭session报错
              org.hibernate.SessionException: Session was already closed //不需要手动关闭

###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对象里面的方法得到结果

                  SessionFactory sessionFactory = null;
              		Session session = null;
              		Transaction tx = null;
              		try {
              			sessionFactory = HibernateUtils.getSessionFactory();
              			session = HibernateUtils.getSessionobject();
              			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对象里面的方法得到结果

		                // 1.创建criteria对象
            			// 方法里面的参数是实体类class
            			Criteria criteria = session.createCriteria(User.class);
            			// 2.调用方法得到结果
            			List<User> list = criteria.list();
            
            			for (User user : list) {
            				System.out.println(user);
            			}

####SQLQuery对象
#####1.使用hibernate时候,调用底层sql实现
#####2.实现过程
(1)创建对象
(2)调用对象的方法得到结果

                  //返回list中的部分是数组
                  // 1.创建对象
            			SQLQuery sqlQuery = session.createSQLQuery("select*from t_user");
            			// 调用sqlQuery里面的方法
            			// 返回list集合,默认里面每部分是数组结构
            			List<Object[]> list = sqlQuery.list();
            			for (Object[] objects : list) {
            				for (int i = 0; i < objects.length; i++) {
            					System.out.print(objects[i] + " ");
            				}
            				System.out.println();
            			}
                 返回list中的部分是对象
                     SQLQuery sqlQuery = session.createSQLQuery("select*from t_user");
                     sqlQuery.addEntity(User.class);
              			 List<User> user = sqlQuery.list();
              			 for (User user2 : user) {
              				 System.out.println(user2);
              		  	}
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值