zoukankan      html  css  js  c++  java
  • Hibernate怎么用

    一.为什么用Hibernate?  【核心:对象关系映射】

      Hibernate是对jdbc的轻量级封装,可以简化数据库连接操作,

      在该框架之前,数据库的操作步骤是:

    1.根据连接字串获取连接
    2.执行sql语句
    3.获取结果集
    4.从结果集提取数据

    二.Hibernate怎么用?

      1.引入框架所需要的包

      2.配置 src/hibernate.cfg.xml,常用配置如下:  【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">
    <!-- Generated by MyEclipse Hibernate Tools.                   -->
    <hibernate-configuration>
    
        <session-factory>
            <property name="hbm2ddl.auto">update</property>  //根据类自动建表
            <property name="dialect">org.hibernate.dialect.MySQLDialect</property>
            <property name="connection.url">jdbc:mysql://localhost:3306/test</property>
            <property name="connection.username">root</property>
            <property name="connection.password">java</property>
            <property name="connection.driver_class">com.mysql.jdbc.Driver</property>
    
            <!-- 自定义配置 -->
            <property name="show_sql">true</property>  //显示sql语句
            <property name="format_sql">true</property>  //格式化显示sql语句
            
            <!-- 映射文件 -->  
            <mapping resource="com/bean/User.hbm.xml"/>  
        </session-factory>
    
    </hibernate-configuration>

      3.编写实体类映射文件  User.hbm.xml  【文件名和实体类名字相同】

    <?xml version="1.0"?>
    <!DOCTYPE hibernate-mapping PUBLIC
            "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
            "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
            
    <hibernate-mapping>
        <class name="com.bean.User" table="TEST_USER" >
            <id name="id">
                <generator class="native"/>
            </id>
            <property name="uname"/>
            <property name="photo"/>
        </class>
    </hibernate-mapping> 

      4.进行具体查询的业务逻辑【软件导入框架时会默认添加一个获取session的类】

    package com.dao.impl;
    
    import org.hibernate.Session;
    import org.hibernate.Transaction;
    
    import com.bean.User;
    import com.dao.IUserDao;
    import com.util.HibernateSessionFactory;
    
    public class UserDaoImpl implements IUserDao{
    
        @Override
        public Integer addUser(User u) {
            
            int result = -1;
            //获取会话
            Session session = HibernateSessionFactory.getSession();
            Transaction tx = session.beginTransaction();
            
            try {
                //保存数据
                session.save(u);
                tx.commit();
                result=1;
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            
            //关闭
            session.close();
            return result;
        }
    
    }

    三,Hibernate高级知识:

      1.对象关系映射

        当一个类里,把另一个类作为属性使用时,怎么用映射文件来反映这种关系?

        这就是对象关系映射,参考上一篇对象关系映射文章

      2.Hibernate查询:Query查询,Criteria查询  [不常用的本地查询,native查询]

        Query查询:

      //获取会话 
      Session session = HibernateSessionFactory.getSession();
      Transaction tx = session.beginTransaction();
    String hql="from Admin as admin where admin.aname=:name";//使用命名参数,推荐使用,易读。 Query query=session.createQuery(hql); query.setString("name", name);
    List
    <Admin> list=query.list(); for(Admin admin:list){   System.out.println(admin.getAname()); }

       Criteria查询:

        Restrictions-条件查询,默认获取全部

        Projections-聚合查询,如求和,平均值

      //获取会话 
      Session session = HibernateSessionFactory.getSession();
      Transaction tx = session.beginTransaction();


      Criteria c=session.createCriteria(Admin.class); c.add(Restrictions.eq("aname",name));//eq是等于,gt是大于,lt是小于,or是或 c.add(Restrictions.eq("apassword", password)); List<Admin> list=c.list(); for(Admin admin:list){ System.out.println(admin.getAname()); }

    四,Hibernate查询优化 

      1.延时加载:当一个类的属性是另一个类的时候,只显示本类属性,

        用法:配置set-lazy属性即可,默认开启

    <?xml version="1.0" encoding="GBK"?> 
     <!DOCTYPE hibernate-mapping PUBLIC 
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> 
    <hibernate-mapping package="org.crazyit.app.domain">    <!-- 映射 Person 持久化类 -->    <class name="Person" table="person_inf">     <!-- 映射标识属性 id -->     <id name="id" column="person_id">       <!-- 定义主键生成器策略 -->       <generator class="identity"/>     </id>     
         <!-- 用于映射普通属性 -->     <property name="name" type="string"/>      <property name="age" type="int"/>   
        <!-- 映射集合属性 -->     <set name="addresses" table="person_address" lazy="true">       。。。    </set>   </class> </hibernate-mapping>

       2.抓取策略:和延时差不多,

        用法:配置set-fetch属性即可,默认开启

    五,Hibernate缓存

      1.一级缓存默认开启,session不关闭同一查询,语句只执行一次

        2.二级缓存,由第三方提供,可以于session关闭情况下进行历史查询

        导入第三方包

        在配置文件里添加开启配置

       

  • 相关阅读:
    Markdown学习
    二叉树的最近公共祖先
    javaCompiler简析
    自定义类加载器
    聚合和组合的区别
    拓扑排序
    C++ map和unordered_map
    静态文件加载路径
    文件上传
    jackson
  • 原文地址:https://www.cnblogs.com/hackxiyu/p/6946363.html
Copyright © 2011-2022 走看看