首页 > 代码库 > hibernate框架总结

hibernate框架总结

 

hibernate的pom.xml专门用于存放各种jar包下面是简单的几种

          <dependencies>
 
               <dependency>
                    <groupId>org.hibernate</groupId>
                    <artifactId>hibernate-core</artifactId>
                    <version>4.2.21.Final</version>
                    </dependency>
                  <dependency>
                    <groupId>mysql</groupId>
                    <artifactId>mysql-connector-java</artifactId>
                    <version>5.1.14</version>
                  </dependency>
 
 
            </dependencies>

1.2 接下来创建hibernate.cfg.xml文件,其中书写各种关于数据库的对象

  <hibernate-configuration>

  <session-factory>
    <property name="hibernate.connection.username">root</property>
    <property name="hibernate.connection.password">123456</property>
    <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/xiangmuku</property>
    <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
    </session-factory>
</hibernate-configuration>

1.3  接下来就是利用eclips插件自动生成代码

  技术分享

  技术分享技术分享技术分享技术分享

技术分享

按照图解就可以创建啦,但是如果要正常使用还需要导包,如tomcat,web,maven,这些都是需要导包的,之后才可以不报错

之后的hibernate.cfg.xml中要添加 <mapping resource="com/qianfeng/User.hbm.xml" />

而且还需要添加事务级别:

  hibernate中有4个事务级别数字划分为1,2,4,8

      其实就是  

                    脏读 不可重复读 幻读
          read uncommited   y   y     y
          read commited     x   y     y
          repeadabel read     x   x         y
          serializable      x    x     x
  
脏读 servlet1修改数据 然后休眠一段时间 这时 servlet2开始读取数据,这是可以读取的修改的数据
休眠时间过去,开始回滚,回到修改前的数据,读取到的数据是无效的没有用
不可重复读:
1 servlet1 修改值session servlet 2 开始读取数据 接下来 servlet再次修改值
如果servlet2在读取 值就会发生改变 与原先的值不一样,就是不可重复读
幻读:servlet1 update user set age(80)
servlet2 insert into user (age) value(70)
servlet1 select * from user
就是首先修改在查询之前另外一个插入一条数据库,你查到的值 与你之前插入的不一样
隔离级别目的:
一个事务与其他事务隔离成都为隔离级别
隔离是为了隔离事务与实务之间操作的影响
其中一般默认的是第三种
配置事务隔离级别:
<property name="hibernate.connection.isolation">2</property>
hibernate的另外一个重点就是4中状态
1 临时状态
new一个对象没有任何操作就是临时状态
[1]OID:没有OID
[2]是否在Session缓存中:不在
[3]是否在数据库中有对应的记录:没有
2 持久化状态
User user = (User) s.get(User.class, 1);
[1]OID:有OID
[2]是否在Session缓存中:在
[3]是否在数据库中有对应的记录:有
3 游离状态
在s.clear()清理缓存之后
[1]OID:有OID;
[2]是否在Session缓存中:不在
[3]是否在数据库中有对应的记录:有
4 删除状态
[1]OID:有OID
[2]是否在Session缓存中:不在
[3]是否在数据库中有对应的记录:没有
session的主要方法
1 Session核心方法
1.1 save()
①将一个临时对象转换为持久化对象
②对于OID:忽略临时对象中的“OID”值,save()方法会将数据库产生的新的OID的值赋值给持久化对象
③持久化状态的对象的OID的值是不允许修改的
1.2 persist()
①作用和save()相同
②不允许保存带有OID的对象,会抛异常:org.hibernate.PersistentObjectException
1.3 get()
①根据OID的值,从数据库中立即加载一个对象到内存中。
②如果调用get()方法时,Session缓存中已经有了一个OID相同的对象,则get()方法会将缓存中的对象返回,不发送SQL语句。
1.4 load()
①采用延迟检索策略,在调用load()方法时仅返回一个代理对象,不发送SQL语句。在真正用到非OID属性值时,才发送SQL语句进行查询。
②懒加载初始化异常
[1]全类名:org.hibernate.LazyInitializationException
[2]产生原因:对一个延迟加载的代理对象进行初始化时,Session缓存中没有对应OID的对象,无法完成初始化。
1.5 update()
①根据游离对象或持久化对象对数据库表进行更新
update()方法更新一个游离对象时,默认情况下无法获知当前游离对象中的数据和数据库表中的数据是否有差异。所以,无论是否有差异都会发送SQL语句。为了避免盲目的发updat语句,可以在hbm配置文件的class元素中设置select-before-update属性的值为true。通常不设置这个属性。
③使用update()方法更新一个OID不存在的对象会抛出异常:org.hibernate.StaleObjectStateException
④使用update()方法更新一个游离对象,但此时Session缓存中已经存在了OID相同的持久化对象,会抛出异常:org.hibernate.NonUniqueObjectException
1.6 saveOrUpdate()
①兼具保存和更新两种功能。传入临时对象执行保存,传入游离对象执行更新。
②判断执行INSERT语句还是UPDATE语句的依据
[1]根据OID的值,如果为null则执行保存,否则执行更新
[2]如果OID的值等于hbm文件中,id元素设置的unsaved-value属性则执行保存操作。
1.7 delete()
①执行删除操作
②删除对象后将OID的值置空:在Hibernate配置文件中加入如下配置
<property name="hibernate.use_identifier_rollback" >true </property>
 
1.8 doWork()
①用于在Hibernate环境下执行原生的JDBC代码
②示例代码
@Test
public void testWork() {
session.doWork(new Work() {

@Override
public void execute(Connection connection) throws SQLException {

//使用传入的Connection对象实现原生的JDBC操作...

}
});
}
 3 其中另外一个重点就是hibernate的hql语句,其实就是和sql语句差别不太大,如果你对sql语句有过了解的话
这个就比较好理解啦  
    下面是我写的一个hql语句关于调用数据库的类
private void manytomany(){
        //hql语句
        Session s = SessionY.getSession();
        String hq101 = "from user";
        //根据hql语句创建query对象
        Query q = s.createQuery(hq101);
        
        //查询返回的是一个集合
        List<User> user = q.list();
        System.out.println("01"+user.toString());
        //where语句
        String hq102 = "from User u where u.age > 15";
        Query q02 = s.createQuery(hq102);
        List<User> user02 = q02.list();
        System.out.println("02"+user02.toString());
        //占位符,如果变量是从前端页面传递过来的,都需要使用占位符
        
        
        int age = 18;
        String hq103 = "from User u where u.age > ?";
        Query q03 = s.createQuery(hq103);
        q03.setInteger(0, age);
        List<User> user03 = q03.list();
        System.out.println("03"+user03.toString());
        //占位符2,使用具名参数,
        int age2 = 18;
        String address = "bj";
        String hq104 = "from User u where u.age > :age and address > :add";
        Query q04 = s.createQuery(hq103);
        q04.setString("add", address);
        q04.setInteger("age", age2);
        
        List<User> user04 = q03.list();
        System.out.println("04"+user04.toString());
        //占位符3  
        //两张表  一张所有员工,一张所有部门
        //多对一关联  员工是many,
        
        
        //分页
        //sql  第一页  select * from limit 10
        //  select 8 * from new limit 10 0fset 10
        //select * from new limit offset 100
        //hql中
        
        Query q05 = s.createQuery("from User");
        q05.setFirstResult(5);//第三页
        //q05.setFirstResult(5).q05.setMaxResults(5).list();
        q05.setMaxResults(5);
        List<User> user05 = q05.list();
        System.out.println("05"+user.toString());
        //投影查询  ,查询部分字段
        //查询年龄所有年龄大于20的认得名字
        Query q06 = s.createQuery("select u.name,max(age)  from User u where u.age > 20");
        List<Object[]> user06 = q05.list();
        System.out.println("06"+user06.get(0)[0]);
        
        
        
        
    }
    写的不太好,这就是我对hibernate框架的理解,不够全面,有遗漏的大家可以和我说,大家共同学习进步
 

 

hibernate框架总结