首页 > 代码库 > Hibernate学习随笔

Hibernate学习随笔

一、Hibernate的基本使用

    首先需要配置相应的配置文件
    Hibernate基本使用步骤
        1.创建org.hibernate.cfg.Configuration对象
         2.调用configure方法将配置文件放入其中
         3.调用buildSessionFactory()方法创建SessionFactory对象(该方法需要加载配置文件、创建表等等,及其耗费资源,所以一般一个项目只需要一个就足够,可以利用工具类和静态代码块使该项目中共用一个SessionFactory对象)
        4.利用SessionFactory创建session对象,creatSession()创建一个Session对象 getCurrentSession()从当前线程中获得Session对象
        5.开启事物, Session.beginTransaction()
        6.业务处理
        7.提交处理
   Hibernate几个数据库操作对象操作对象
        1.利用Session直接操作对象
        save();
        get();直接获得对应的数据
        load();延迟获得对应的数据
        update();
        delete();等等
            关于Hibernate的延迟机制,可以在对应的class中配置lazy属性
 
技术分享
二、Hibernate的检索
        1.对象导航检索
技术分享
     2.OID检索
                技术分享

 

                 默认情况下load方式会延迟加载,可也在配置文件中修改延迟方式
3.HQL检索
    技术分享

 

 
        通过session.creatQuery(String sql)来创建Query对象进行检索
                普通查询,条件查询,投影查询,分组查询,排序等与普通SQL语句类似,select * 时 要省略 ,否则会报错
                分页查询使用Query.setFirstResult(int startIndex);Query.setMaxResults(int pageSize);
         参数设置:
                技术分享

 


4.QBC检索
       特点:没有SQL语句,全都是方法进行检索
        技术分享

 

            利用criteria.add(Restructions)来添加条件
                        例如:
                         Criteria criteria = currentSession.createCriteria(Customer.class);
            criteria.add(Restrictions.or(Restrictions.eq("address", "深圳"), Restrictions.eq("telephone", "120")));
            条件语句:
            技术分享

 

            分页查询与Query语句类似;
            排序查询:
                    技术分享
    查询count(*) criteria.setProjection(Projections.rowCount());
      技术分享

 

5.本地SQL检索
        Session.creatSQLQuery(String sql)来创建一个本地SQL对象
        然后设置实际参数进行相应的方法进行查询或者更新等语句
 
6.Query多表查询
        技术分享

 

             迫切内连接:select distinct c from Customer c inner join fetch c.linkmanSet      
             迫切左外连接:select distinct c from Customer c left outer join fetch c.linkmanSet
技术分享
 技术分享

 

ssh中hibernate模板的普通sql使用
SessionFactory sessionFactory = this.getSessionFactory();
        Session session = sessionFactory.getCurrentSession();
        String sql = "select l.l_name,count(*) as count from tb_customer as c ,tb_level as l where c.l_id = l.l_id group by l.l_id";
        SQLQuery query = session.createSQLQuery(sql);
        query.setResultTransformer(Transformers.aliasToBean(HashMap.class));
        List<Map<Object,Object>> list = query.list();

 

 

Hibernate配置文件配置

核心配置文件(默认设置文件名为hibernate.cfg.xml,放置在src目录下,如果不是需要加载配置时候设置)
<?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>
        <!-- 基本四大参数
            #hibernate.connection.driver_class com.mysql.jdbc.Driver
            #hibernate.connection.url jdbc:mysql:///test
            #hibernate.connection.username gavin
            #hibernate.connection.password
         -->
        <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
        <property name="hibernate.connection.url">jdbc:mysql:///test_frame</property>
        <property name="hibernate.connection.username">root</property>
        <property name="hibernate.connection.password">root</property>
        <!-- 数据库方言 
            #hibernate.dialect org.hibernate.dialect.MySQLDialect
        -->
        <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
        <!-- 其他辅助配置  -->
        <!-- 自动创建表设置 
            #hibernate.hbm2ddl.auto create-drop
        -->
        <property name="hibernate.hbm2ddl.auto">update</property>
        <!-- SQL语句显示设置
            #hibernate.show_sql true
            #hibernate.format_sql true
         -->
        <property name="hibernate.show_sql">true</property>
        <property name="hibernate.format_sql">true</property>
        <!-- 配置数据库的事物隔离级别
            1-Read uncommitted isolation  读未提交,所有隔离问题窦唯解决
            2-Read cimmitted isolation           读已提交,解决了脏读
            4-Repeatable read isolation   可重复读,解决了脏读、不可重复读,未解决幻读/MySQL的默认事物隔离级别
            8-Serializable isolation          序列化/串行化,解决了所有问题,但效率极低
            #hibernate.connection.isolation 4
         -->
         <property name="hibernate.connection.isolation">4</property>
         <!-- 将Session与本地线程ThreadLocal绑定 -->
        <property name="hibernate.current_session_context_class">thread</property>
        <mapping resource="cn/zz/hibernate/domain/Customer.hbm.xml"/>
        <mapping resource="cn/zz/hibernate/domain/Linkman.hbm.xml"/>
    </session-factory>

</hibernate-configuration>


映射配置文件(建议放置在对应实体类包下,名字为实体类名.hbm.xml)
<?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="cn.zz.hibernate.domain.Customer" table="customer">
        <!-- 基础单表配置 -->
        <id name="cid" column="cid">
            <generator class="uuid"></generator>
        </id>
        <property name="cname"></property>
        <property name="address"></property>
        <property name="level"></property>
        <property name="source"></property>
        <property name="telephone"></property>
        <!-- 多对一表配置,多的一方 name:一的一方对应的Set集合来表示多的一方的属性名 cascade:级联操作,save-update开始级联存储,delete开启级联删除 
            inverse:倒转(如果为true,则不维护当前外键,反之维护) -->
        <set name="linkmanSet" cascade="save-update,delete" inverse="true">
            <!-- 对应的外键的字段名 -->
            <key column="cid"></key>
            <one-to-many class="cn.zz.hibernate.domain.Linkman" />
        </set>
<!-- 多对一表配置,一的一方
            name:表示多的一方对象的属性名
            column:外键字段名称
            cascade:联及操作,save-update开始联及存储,delete开启联及删除
            inverse:倒转(如果为true,则不维护当前外键,反之维护)
    -->
    <many-to-one name="customer" class="cn.zz.hibernate.domain.Customer" column="cid" >
<!-- 多对多表配置
            name:表示另一方对象Set集合的属性名
            key:column表示第三张表中指向本类的外键名,foreign-key外建名
            cascade:联及操作,save-update开始联及存储,delete开启联及删除
            inverse:倒转(如果为true,则不维护当前外键,反之维护)
            many-to-many:class表示对应另一方的实体类全路径,column表示第三张表中指向该类的外键名
    -->
 
<set name="roleSet" table="user_role" cascade="save-update" inverse="false">
            <key column="uid" foreign-key="uid_fk"></key>
            <many-to-many class="cn.zz.hibernate.domain.Role" column="rid"></many-to-many>
        </set>
    </class>
</hibernate-mapping>
 
hibernat配置联合主键
  <composite-id>
                <key-many-to-one name="customer" class="cn.zz.crm.domain.Customer" column="c_id"></key-many-to-one>
                <key-many-to-one name="user" class="cn.zz.crm.domain.User" column="u_id"></key-many-to-one>
   </composite-id>
 
技术分享

技术分享

技术分享

 

 

Hibernate学习随笔