Hibernate框架入门

来源:互联网 发布:乐乎亚洲雄风的喜欢 编辑:程序博客网 时间:2024/04/28 02:31

Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,它可以自动生成SQL语句,自动执行,更好的使用面向对象的思路操作数据库。


ORM


(Object Relational Mapping)对象关系映射,在关系型数据库和对象之间做一个映射。其实Hibernate文件就是将我们之前使用的JDBC+SQL进行封装,通过配置文件来操作。  

  


映射类:.Java :描述数据库表结构,数据库表对应类,数据库表中字段对应类中属性。


映射文件:.hbm.xml:指定数据库表和映射类的对应关系,包括:类与表的对应关系、表字段与类属性对应关系。


核心配置文件:.cfg.xml:指定核心配置,包括:数据库连接信息、映射文件地址等。


Hibernate流程


Configuration:用于加载主配置文件,只能加载hibernate.properties的配置文件。

               如果想加载hibernate.cfg.xml需要使用.configure()方法。


SessionFactory:创建Session对象,openSession()方法创建对象。

                因为它维护的信息较多,创建和销毁会消耗资源,所以一个应用最好一个SessionFactory,可以提取到工具类中。


Session:与数据库进行交互,包括增删改查操作以及获取事务对象。


Transaction:用于控制事务的,commit()提交事务,rollback()回滚事务。


对象状态


对象标识符OID区分两个事物是否为同一对象的标识。

Hibernate中的一级缓存:Session的对象缓存,查询时如果缓存中有就在缓存中查,没有就再去数据库中查,从而提高效率。Session对象close一级缓存就消失。




快照机制:在产生一级缓存的时候同时生成一个一样的快照,目的是保持和数据库中数据一致。


查询


createQuery:HQL把表的名称换成实体类,表的字段换成实体属性


Query query = s.createQuery("from Customer where custName like :custName and custLevel = :custLevel");query.setString("custLevel", "普通客户");query.setString("custName", "%集%");


createCriteria:查询实体类字节码对象


Criteria c = s.createCriteria(Customer.class);//它就相当于HQL的from Customerc.add(Restrictions.like("custName", "%集%"));c.add(Restrictions.eq("custLevel", "普通客户"));


createSQLQuery:使用SQL语句查询


SQLQuery sqlquery = s.createSQLQuery("select * from cst_customer");sqlquery.addEntity(Customer.class);

OID查询:get立即加载;load延迟加载。lazy为true则为延迟加载。


@Testpublic void test(){ Session s=HibernateUtils.getCurrentSession(); Transaction tt = s.beginTransaction(); Customer c = s.get(Customer.class, 1L); System.out.println(c); tt.commit();}

对象导航查询:有关联关系的实体间


@Testpublic void test2(){Customer c=findCustomer();//对象导航查询Set<Linkman> linkmans = c.getLinkmans();for (Linkman linkman : linkmans) {System.out.println(linkman);}}

表间关系


多对一:name:一的属性名   class:一的类名  column:多的外键名称


<many-to-one name="customer" class="Customer" column="lkm_cust_id" cascade="save-update"></many-to-one>

一对多:set集合:name:多的属性名  table:多的表名

        key:column:多的外键名

        name:class:一的类名


<set name="linkmans" table="cst_linkman" cascade="save-update"><key column="lkm_cust_id"></key><one-to-many class="Linkman"/></set>


多对多:


<set name="users" table="user_role_rel"><key column="role_id"></key><many-to-many class="SysUser" column="user_id"></many-to-many></set>

单向和双向的表间关系是指:在原有的类中加入另一方的属性,如果在Customer和Linkman是一对多的关系,此时我在Linkman类中加入Customer属性,则为单向的多对一关系。


关于Hibernate的知识推荐博客《Hibernate系列博客》


入门案例


映射类:Customer.java


public class Customer implements Serializable {private Long custId;private String custName;private String custSource;private String custIndustry;private String custLevel;private String custAddress;private String custPhone;public Long getCustId() {return custId;}public void setCustId(Long custId) {this.custId = custId;}        ......}

映射文件:


<?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 package="com.itheima.domain"><class name="Customer" table="cst_customer"><id name="custId" column="cust_id"><generator class="native"></generator></id><property name="custName" column="cust_name"></property><property name="custSource" column="cust_source"></property><property name="custIndustry" column="cust_industry"></property><property name="custLevel" column="cust_level"></property><property name="custAddress" column="cust_address"></property><property name="custPhone" column="cust_phone"></property></class></hibernate-mapping>

核心配置文件:


<?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://localhost:3306/day36_ee48_hibernate</property><property name="hibernate.connection.username">root</property><property name="hibernate.connection.password">123456</property><property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property><property name="hibernate.show_sql">true</property><!-- 使映射文件中的配置进行更新 --><property name="hibernate.format_sql">true</property><property name="hibernate.hbm2ddl.auto">update</property><!-- 配置数据源提供商 --><property name="connection.provid">org.hibernate.connection.C3P0ConnectionProvider</property><!-- 把Session绑定到当前线程上 --><property name="hibernate.current_session_context_class">thread</property><!-- 映射文件位置 --><mapping resource="com/itheima/domain/Customer.hbm.xml"/><mapping resource="com/itheima/domain/Linkman.hbm.xml"/></session-factory></hibernate-configuration>

Demo:


public class HibernateDemo1 {@Testpublic void test1(){Customer customer = new Customer();//1.加载主配置文件Configuration cfg = new Configuration();//执行很重要cfg.configure();//2.构建SessionFactorySessionFactory factory = cfg.buildSessionFactory();//3.生产一个sessionSession session = factory.openSession();//4.开启事务Transaction tt = session.beginTransaction();//5.保存客户session.save(customer);//6.提交事务tt.commit();//7.释放资源session.close();session.close();}}

小结:感觉知识隔的时间越长总结起来越是费时,还是趁热打铁的好,很多东西当下理解了,但是如果不记录下来,几天之后就忘记了,然后还得重新翻,所以今后一定要及时总结。

1 0