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关闭情况下进行历史查询

    导入第三方包

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

   

时间: 2024-10-12 17:23:05

Hibernate怎么用的相关文章

Hibernate - HHH000352: Unable to release batch statement

这是hibernate的一个bug,具体看https://hibernate.atlassian.net/browse/HHH-11732?attachmentViewMode=list When using stateless session with jdbc batch size we get an HHH000352: Unable to release batch statement.. error in session.close() after rollback: Code:Con

Hibernate简述及入门实例

一.Hibernate简述 总的概括,Hibernate是一个ORM的轻量级持久层框架,解决了对象和关系数据库中表的不匹配问题(阻抗不匹配)以及拥有开发代码不用去继承hibernate类或接口的优势(无侵入性).hibernate框架实现使得开发人员可以避免反复地编写javajdbc部分代码,应用面向对象的思维操作关系型数据库. 二.使用myeclipse创建hibernate实例两种方法(以hibernate3.5.2及mysql为例) a)手动编写hibernate.cfg.xml及*.hb

对象序列化和反序列--Hibernate的查询和新增极其相似

Hibernate几个关键字持久化,ORM(关系对象映射)(数据库中关系称作是一张表) 应用在项目中,刘一从写的查询代码,每次都挂掉,想要弄出测试数据,自己想着把查询出来的复杂数据弄到文件里自己要是去造那些复杂数据很麻烦public class Object1 { public static void main(String args[]){ HashMap<String, Object> obj=new HashMap<String,Object>(); obj.put(&quo

Hibernate的七种映射关系之七种关联映射(二)

继续上篇博客 七.Hibernate双向一对多关联映射:让多的一端来维护关系. 主要是解决一对多单向关联的缺陷,而不是需求驱动的. 1.在Student.java实体类里添加Classes引用.private Classes classes; 2.Student.hbm.xml里添加many-to-one标签:<many-to-one name="classes" column="classesid"/>.Classes.hbm.xml在例子(六)里的那

Hibernate的七种映射关系之七种关联映射(一)

关联映射就是将关联关系映射到数据库里,在对象模型中就是一个或多个引用. 一.Hibernate多对一关联映射:就是在"多"的一端加外键,指向"一"的一端. 比如多个学生对应一个班级,多个用户对应一个级别等等,都是多对一关系. 1."多"端实体加入引用"一"端实体的变量及getter,setter方法. 比如说多个学生对应一个班级,在学生实体类加入:private Grade grade; 2."多"端配置文

mybatis与hibernate的区别

本文转载自:http://blog.csdn.net/wangpeng047/article/details/17038659 以前没怎么用过mybatis,只知道与hibernate一样是个orm数据库框架.随着使用熟练度的增加,发现它与hibernate区别是非常大的,结合至今为止的经验,总结出以下几点: 1. hibernate是全自动,而mybatis是半自动. hibernate完全可以通过对象关系模型实现对数据库的操作,拥有完整的JavaBean对象与数据库的映射结构来自动生成sql

hibernate载入持久化对象的两种方式——get、load

一.get与load对照 在hibernate中get和load方法是依据id取得持久化对象的两种方法.但在实际使用的过程中总会把两者混淆,不知道什么情况下使用get好,什么时候使用load方法效率更高.下边具体说一下get和load的不同,有些时候为了对照也会把find加进来. 1.从返回结果上对照: load方式检索不到的话会抛出org.hibernate.ObjectNotFoundException异常 get方法检索不到的话会返回null 2.从检索运行机制上对照: get方法和fin

org.hibernate.NonUniqueObjectException:a different object with the same identifier value was alread

转自: http://blog.csdn.net/zzzz3621/article/details/9776539 看异常提示意思已经很明显了,是说主键不唯一,在事务的最后执行SQL时,session缓存里面有多个(>1)主键一样的对象. 了解过hibernate的都知道它有一个一级缓存,即session级别的缓存,在一个事务的执行过程中可以管理持久化对象,在事务最后执行SQL,可以减少数据库的操作. 报这个异常就得仔细看看你的代码,一定有地方引用的对象已经不同了. 下面就是一个典型的例子: [

谈谈你对Hibernate的理解

答: 1. 面向对象设计的软件内部运行过程可以理解成就是在不断创建各种新对象.建立对象之间的关系,调用对象的方法来改变各个对象的状态和对象消亡的过程,不管程序运行的过程和操作怎么样,本质上都是要得到一个结果,程序上一个时刻和下一个时刻的运行结果的差异就表现在内存中的对象状态发生了变化. 2.为了在关机和内存空间不够的状况下,保持程序的运行状态,需要将内存中的对象状态保存到持久化设备和从持久化设备中恢复出对象的状态,通常都是保存到关系数据库来保存大量对象信息.从Java程序的运行功能上来讲,保存对

Hibernate session缓存

一级缓存(执行代码时查看console台上的sql语句)  清空缓存 @Test public void demo03(){ //清空缓存 Session session=factory.openSession(); session.beginTransaction(); //1.查询 User user = (User)session.get(User.class, 1); System.out.println(user); //session.evitc(user) //将执行对象从一级缓存