Hibernate学习笔记01

来源:互联网 发布:免费开源java即时通讯 编辑:程序博客网 时间:2024/05/29 14:31

建立 Hibernate 工程步骤

首先得导入 Hibernate 相关 jar 包,也可以使用 Maven 创建工程,再配置 POM.xml

1. 创建 Hibernate 配置文档 hibernate.cfg.xml

<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE hibernate-configuration PUBLIC        "-//Hibernate/Hibernate Configuration DTD 3.0//EN"        "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"><hibernate-configuration>    <session-factory>        <!--数据库用户名 -->        <property name="connection.username">root</property>        <!--对应的用户密码 -->        <property name="connection.password">root</property>        <!--数据库驱动  -->        <property name="connection.driver_class">com.mysql.jdbc.Driver</property>        <!--数据库连接字段 -->        <property name="connection.url">jdbc:mysql:///hibernate?useUnicode=true&amp;characterEncoding=UTF-8</property>        <!--数据库方言-->        <property name="dialect">org.hibernate.dialect.MySQLDialect</property>        <!--设置对数据库的操作模式-->        <!--update只更新相应数据 -->        <!--create无论表是否存在执行操作都要删除原表创建新表 -->        <property name="hbm2ddl.auto">update</property>        <!--在控制台显示sql语句  -->        <property name="show_sql">true</property>        <!--设置格式输出sql语句  -->        <property name="format_sql">true</property>        <!--设置映射的文件-->        <mapping resource="Students.hbm.xml"/>    </session-factory></hibernate-configuration>

2. 创建持久化类

规范:遵循JavaBeans规范,必须满足
1. 公有类
2. 有无参构造方法
3. 私有的属性变量
4. 每个属性对应的getter/setter方法

一个持久化类对应数据库中的一张表,一个属性对应表中的一个字段,一个该类的实例对应表中的一条记录

3. 创建对象关系映射文件

Students类对应的文件:Students.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"><!-- Generated 2017-6-27 19:21:06 by Hibernate Tools 3.4.0.CR1 --><hibernate-mapping package="com.lyon.Hibernate_003">    <class name="Students" table="STUDENTS">        <id name="sid" type="int">            <column name="SID" />            <generator class="native" />        </id>        <property name="sname" type="java.lang.String">            <column name="SNAME" />        </property>        <property name="gender" type="java.lang.String">            <column name="GENDER" />        </property>        <property name="birthday" type="java.util.Date">            <column name="BIRTHDAY" />        </property>        <!--        <property name="address" type="java.lang.String">            <column name="ADDRESS" />        </property>        -->        <property name="picture" type="java.sql.Blob">            <column name="PICTURE" />        </property>        <!-- 组件属性 -->        <component name="address" class="Address">            <property name="postcode" column="POSTCODE"></property>            <property name="phone" column="PHONE"></property>            <property name="address" column="ADDRESS"></property>        </component>    </class></hibernate-mapping>

知识点:

  1. 根标签<hibernate-mapping> 中的package属性设置对应的持久化类所在的包

    <id></id> 标签指定该表对应的主键, 其中 <generator/>子标签class指定主键的方式:如 assigned为Java代码指定主键值;native指定主键值自增

  2. 如果持久化类中某一属性的类型为 自定义类的引用类型(如上述代码中的 address 属性 ,它包含自身的属性信息,这样的属性在Hibernate中称为组件属性),它的内部属性在数据库中为多个不同的字段

    注意点:需将该属性信息用<component></component>标签包围,name属性为持久化类中的属性名,class属性指定该引用类型的类名(由于在根标签属性中指定了包名,所以这里只需要给出类名)

  3. <property></property 标签中type属性的设置(即数据库对应字段的类型)

    有三种设置 分别为:Hibernate自带的类型,Java自带的类型,SQL语言自带类型(一般用前两种)
    以下为属性对照表

4. 通过 Hibernate API 编写访问数据库的的代码

步骤:

  1. 创建Configuration(配置)对象
  2. 创建ServiceRegistry(服务注册)对象
  3. 创建SessionFactory(会话工厂)对象
  4. 创建Session(会话)对象
  5. 开启Transaction(事务)对象

代码示例:

//1Configuration config = new Configuration().configure();//2ServiceRegistry serviceRegistry = new ServiceRegistryBuilder().applySettings(config.getProperties()).builderServiceRegistry();//3SessionFactory sessionFactory = config.buildSessionFactory();//4Session session= sessionFactory.openSession();//5Transaction transaction = session.beginTransaction();

对应访问完成后需要的操作:

//提交事务transaction.commit();//关闭会话session.close();//关闭会话工厂sessionFactory.close()

知识点:

  1. Session 相当于 JDBC 中的 Connection 对象,一个 Session 对象在访问数据库时对应一个 Connection 对象。一个 Connection 对象可以被多个 Session 对象复用。

  2. 创建 Session 对象有两种方法:

    • openSession(); 开启一个新的会话,对应 Connection 连接池中一个新的连接对象,必须手动关闭,若过多使用而未关闭会导致连接池溢出

    • getCurrentSession(); 使用当前会话,在事务提交或回滚时会自动释放连接,达到多个Session复用连接的目的。使用该该方法需在hibernate.cfg.xml中进行配置

      • 使用本地事务(JDBC事务):
        <property name="hibernate.current_session_context_class">thread</property>

      • 使用全局事务(JTA事务):
        <property name="hibernate.current_session_context_class">jta</property>

    • 调用 Session 对象的 doWork()方法 可以对其对应的 Connection对象 进行相应的设置,如自动提交,获取 Connection 的信息等。

    • Transaction对象:hibernate对数据的操作都是封装在事务里的,并且默认是非自动提交,在使用session对象保存对象时,如果不开启事务并提交事务,对象不会真正保存在数据库中

Hibernate单表操作

代码示例:

package com.lyon.Hibernate_004;import java.util.Date;import org.hibernate.Session;import org.hibernate.SessionFactory;import org.hibernate.Transaction;import org.hibernate.cfg.Configuration;import org.hibernate.service.ServiceRegistry;import org.hibernate.service.ServiceRegistryBuilder;import org.junit.After;import org.junit.Before;import org.junit.Test;//测试类public class StudentsTest {    private SessionFactory sessionFactory;    private Session session;    private Transaction transaction;    @Before    public void init(){        //创建配置对象        Configuration config = new Configuration().configure();        //创建服务注册对象        ServiceRegistry serviceRegistry = new ServiceRegistryBuilder().applySettings(config.getProperties()).buildServiceRegistry();        //创建会话工厂对象        sessionFactory = config.buildSessionFactory(serviceRegistry);        //会话对象        session = sessionFactory.openSession();        //开启事务        transaction = session.beginTransaction();    }    @After    public void destory(){        transaction.commit();//提交事务        session.close();//关闭会话        sessionFactory.close();//关闭会话工厂    }    @Test    public void testSaveStudents(){        //由于配置文档中设置为主键自增,无需设置sid属性        Students stu = new Students();        stu.setSname("张三");        stu.setGender("男");        stu.setBirthday(new Date());        Address ad = new Address("324378","123466551","杭州市");        stu.setAddress(ad);        //session的save方法保存数据        session.save(stu);    }    @Test    public void testGetStudents(){        //session的get方法查询数据        Students s = (Students) session.get(Students.class, 1);        System.out.println(s);    }    @Test    public void testLoadStudents(){        //session 的 load 方法查询数据        Students s = (Students) session.load(Students.class, 1);        System.out.println(s);    }    @Test    public void testUpdateStudents(){        //先获取到需要修改的数据        Students s = (Students) session.get(Students.class, 1);        //修改相应字段        s.setGender("女");        //session的update方法修改数据        session.update(s);    }    @Test    public void testDeleteStudents(){        Students s = (Students) session.get(Students.class, 1);        //session的delete方法删除数据        session.delete(s);    }}

上述代码使用Junit单元测试工具测试代码,其中:
- @ Before 注解下的方法为执行测试方法之前执行的方法(这里使用 Hibernate API 进行访问前的初始化工作)
- @ After 注解下的方法为执行测试方法之后执行的方法 (这里对事务提交及关闭相应的连接)
- @ Test 注解下的方法为测试方法(这里测试了使用session进行简单的增删改查)

知识点:
load 方法 和 get 方法的区别:load 方法在需要用到查询数据时才开始建立连接并查询,而 get 方法则在方法执行时就建立连接并查询。

原创粉丝点击