Hibernate

Hibernate的概述

是一个标准ORM框架
操作对象就相当于操作表结构
通过映射文件吧对象与表关联到一起

对jdbc的一个封装

优点:简化了jdbc的繁琐代码
对面向对象特性的良好支持

缺点:不支持动态sql,灵活性较低
不适合大规模的数据处理

Hibernate 开发环境搭建

1.导入jar包 lib下required包下的所有jar包,还有log4j.jar及数据库连接

project-etc下找约束

配置映射文件User.hbm.xml
a.列名子标签形式存在
b.列名可以不写,默认和实体类名字段一样
c.type可以不写,默认和实体字段属性一致

主键生成策略:native(根据本地数据支持主键生成方式)
uuid(根据uuid算法生成一个32位16进制的字符串,推荐使用,使用此算法,主键必须为字符串)

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
    <hibernate-mapping>
    <class name="com.hemi.bean.User" table="tb_user">
    <id name="id" column="id">
    <generator class="native"></generator></id>
    <property name="name" column="name"></property>
    <property name="age" column="age"></property>
    </class>    
    </hibernate-mapping>

主配置文件hibernate.cfg.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
    "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
    <session-factory>

        <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
        <property name="hibernate.connection.url">jdbc:mysql:///bank</property>
        <property name="hibernate.connection.username">root</property>
        <property name="hibernate.connection.password"></property>

        <!-- 配置方言 -->
        <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
        
        
        <!-- 选配 -->
        <!-- 自动生成表 -->
        <property name="hbm2ddl.auto">update</property>
        <!--显示hibernate执行的sql语句  -->
        <property name="show_sql">true</property>
        <!-- 格式化sql输出 -->
        <property name="format_sql">true</property>
        
        <!-- 引入映射文件 -->
        <mapping resource="com/hemi/bean/User.hbm.xml" />
    
    </session-factory>


</hibernate-configuration>

测试类

Configuration con=new Configuration();
     con.configure();//加载配置文件
     SessionFactory factory = con.buildSessionFactory();//得到 SessionFactory对象
     System.out.println(factory);

crud操作

a.得到工厂对象
b.打开session
c.开启事物
d.crud操作
e.提交事务
f.关闭资源

2.png

快照机制
从数据库查询出的额数据会在缓存和快照区各一个 当调用flush或者close方法刷新缓存,来和快照区数据比对,有更新就推入数据库

对象的三种状态

a.瞬时态 (1)new出来的,不和 Session 实例关联(2) 在数据库中没有和瞬时对象关联的记录

b.持久态 瞬时对象转为持久对象:
(1) 通过 Session 的 save() 和 saveOrUpdate() 方法把一个瞬时对象与数据库相关联,这个瞬时对象就成为持久化对象。
(2) 使用get(),load() 待方法查询到的数据对象,将成为持久化对象。
持久化对象的特点:
(1) 和 Session 实例关联
(2) 在数据库中有和持久对象关联的记录

c.游离态:数据库有记录,但是脱离了session,缓存中没有

  1. 本质上和瞬时对象相同
    (2) 只是比瞬时对象多了一个数据库记录标识值 id.
    持久对象转为游离对象:
    当执行 close() 或 clear(),evict() 之后,持久对象会变为游离对象。
    瞬时对象转为持久对象:
    通过 Session 的 update(),saveOrUpdate() 和 lock() 等方法,把游离对象变为持久对象。

要先查后改

修改方法:

1.update
2.saveOrUpdate
当没设置存入数据的主键时执行save
设置了就执行update,主键在数据库找不到时,就会报状态异常
3.merge
当没有主键时,执行插入,当有主键时,先查询,判断是否存在,存在就修改,不存在就执行插入
瞬时态的数据被merge操作后变成游离态,返回的数据为持久态

查询方法

         Session session = HibernateUtil.getsession();
        Transaction transaction = session.beginTransaction();
        User user = new User();
        user.setAge(208);
        user.setName("ewjj");
    User user2 = session.get(User.class, 5);
    //一发送就执行sql语句
    User load = session.load(User.class, 1);
    //使用结果时,才执行sql语句,推荐
     session.saveOrUpdate(user);
        transaction.commit();
        session.close();
        Configuration con = new Configuration();
       con.configure();// 加载配置文件
       SessionFactory factory = con.buildSessionFactory();// 得到
                                                           // SessionFactory对象
       System.out.println(factory);
       Session session = factory.openSession();
       Transaction transaction = session.beginTransaction();
       User user = new User();
       try {
           user.setAge(20);
           user.setName("ew");
           session.save(user);
           transaction.commit();
       } catch (Exception e) {
           if (transaction != null) {
               transaction.rollback();
           }
       } finally {
           session.close();
       }


工具类

       private HibernateUtil() {
   }
   static SessionFactory factory;
   static {
       Configuration con = new Configuration();
       factory = con.configure().buildSessionFactory();
   }
   public static Session getsession(){
   return factory.openSession();
   }
   ```
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1.主键生成策略 1.1 主键的两种类型 自然主键:把数据表中的某一业务字段作为表的主键。如一张用户表中,把用户的...
    Wizey阅读 560评论 0 3
  • web service 相关 什么是Web Service? 答:从表面上看,Web Service就是一个应用程...
    niuben阅读 965评论 0 3
  • 本文包括:1、Hibernate的持久化类2、Hibernate 持久化对象的三个状态(难点)3、Hibernat...
    廖少少阅读 1,495评论 0 13
  • Hibernate: 一个持久化框架 一个ORM框架 加载:根据特定的OID,把一个对象从数据库加载到内存中OID...
    JHMichael阅读 2,000评论 0 27
  • 这篇文章送给差劲的你和我。 前些天,英语老师向全班问到“What's your dream”其实老师是想锻炼我们用...
    Zeson周彬昱阅读 267评论 1 4