01. Hibernate程序的开发流程

本文详细介绍Hibernate的开发流程,包括数据库表的创建、定义持久化类、配置核心文件hibernate.cfg.xml、创建映射文件及如何通过Configuration对象读取配置文件等内容。

Hibernate程序的开发流程

数据库中创建表
定义持久化类/实体类(POJO)

实际上也是JSP中的JavaBean

创建hibernate.cfg.xml或hibernate.properties

核心的Hibernate配置文件,主要用来配置任意关系型数据库进行连接用到的参数(Driver、URL、User和Password)以及其他杂项的配置。hibernate.cfg.xml是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>

        <!-- Database connection settings -->
        <property name="connection.driver_class">org.hsqldb.jdbcDriver</property>
        <property name="connection.url">jdbc:hsqldb:hsql://localhost</property>
        <property name="connection.username">sa</property>
        <property name="connection.password"></property>

        <!-- JDBC connection pool (use the built-in) -->
        <property name="connection.pool_size">1</property>

        <!-- SQL dialect -->
        <property name="dialect">org.hibernate.dialect.HSQLDialect</property>

        <!-- Enable Hibernate's automatic session context management -->
        <property name="current_session_context_class">thread</property>

        <!-- Disable the second-level cache  -->
        <property name="cache.provider_class">org.hibernate.cache.internal.NoCacheProvider</property>

        <!-- Echo all executed SQL to stdout -->
        <property name="show_sql">true</property>

        <!-- Drop and re-create the database schema on startup -->
        <property name="hbm2ddl.auto">update</property>

        <mapping resource="org/hibernate/tutorial/domain/Event.hbm.xml"/>

    </session-factory>

</hibernate-configuration>
  • 前四项配置数据库连接的基本信息

  • connection.pool_size:配置连接池最大的连接数量。Hibernate内置了连接池,我们可以配置连接池的相关参数,或可以使用第三方的数据库连接处(如:C3P0),也可以配置使用Tomcat的数据源。

  • dialect:我们称之为方言类,帮助将Hibernate数据类型和特定的数据库数据类型进行转换,因为不同的数据库的数据类型有可能会不一样。

  • current_session_context_class:设置session对象和当前线程的绑定

  • cache.provider_class:开放二级缓存

  • show_sql:是否在控制台显示SQL语句,调试阶段最好开启,容易找出bug

  • hbm2ddl.auto:通过映射文件创建表

  • mapping:配置后面的映射文件,标示出其路径

创建POJO对应的映射文件*.hbm.xml
  • 映射文件,主要用来配置持久化类(POJO)和表、字段(列)、关联关系等之间的映射关系。

  • Hibernate程序可以根据此文件和数据库进行CRUD的操作

  • 一个POJO对应一个文件

映射文件我们通常创建在和POJO同一个包下,并和POJO类同名(大小写一致),当然这也不是必须的要求。文件的格式我们可以参考Hibernate官网的Documentation中的The Mapping File。

<hibernate-mapping package="com.li.pojo">
    <class name="Student" table="STU_INFO">
        <id name="id" type="string" column="STU_NO">
            <generator class="assigned"></generator>
        </id>
        <property name="name" type="string" column="STU_NAME"></property>
        <property name="gender" type="string" column="STU_GENDER"></property>
        <property name="age" type="int" column="STU_AGE"></property>
    </class>
</hibernate-mapping>
  • The class mapping element:class标签配置类,name表示POJO类,table表示对应表(大小写没关系,我们建议大写,因为到数据库层都得转大写)。如果前面没有设置package属性,则此处的name需使用全类名。

  • The id mapping element:id标签配置UID(主键),name对应POJO类里面的属性,column对应数据表里面的列(这里是主键),type是name的数据类型,可以是Hibernate内置的数据类型(注意string要小写),也可以是Java数据类型,如果使用Java数据类型需以全称,如:java.lang.String。

    其中generator配置主键生成策略。如果我们自己插入主键,则可以不配置。我们还可以使用sequence为表生成主键(Oracle数据库),配置如下:

    <generator class="sequence">
        <param name="sequence">student_sequence</param>
    </generator>

    param标签内部指定sequence序列的名称

  • The property mapping element:property标签配置非UID属性,还有数据类型和表中的列

创建Configuration对象并读取hibernate.cfg.xml

org.hibernate.cfg.Configuration

Configuration config = new Configuration()
config.configure("hibernate.cfg.xml")

hibernate.cfg.xml默认的路径是src目录下,如果不在该目录下,则指定其路径。

通过Configuration创建SessionFactory对象

org.hibernate.SessionFactory

SessionFactory factory=config.buildSessionFactory();

buildSessionFactory()该方法在4.x版本中已经不推荐使用,有其他的方法,但是还是可以使用

通过SessionFactory创建Session对象

org.hibernate.Session

Session session=factory.openSession();

此处自动根据配置文件获取数据库的连接,如果我们需要使用自己获取到的数据库连接,则可以使用如下方法:

Session session=factory.openStateless();

开启一个无状态的会话,方法里可以选择传入一个Connection形参。

通过Session对象和数据库进行CRUD操作
  • session.save(…)、delete(…)、update(…)等。

  • load(…)、get(…)等

Example

核心配置文件

<?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>

        <!-- Database connection settings -->
        <property name="connection.driver_class">com.mysql.jdbc.Driver</property>
        <property name="connection.url">jdbc:mysql://localhost:3306/learning?useSSL=true</property>
        <property name="connection.username">root</property>
        <property name="connection.password">123456</property>

        <!-- SQL dialect:方言类,将操作转为对应的SQL语句 -->
        <property name="dialect">org.hibernate.dialect.MySQLDialect</property>

        <!-- 输出操作的SQL语句 -->
        <!-- Echo all executed SQL to stdout -->
        <property name="show_sql">true</property>

        <!-- 配置映射文件 -->
        <mapping resource="com/li/pojo/Student.hbm.xml"/>

    </session-factory>

</hibernate-configuration>

映射文件

<?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.li.pojo">
    <class name="Student" table="STU_INFO">
        <id name="id" type="string" column="STU_NO"></id>       
        <property name="name" type="string" column="STU_NAME"></property>
        <property name="gender" type="string" column="STU_GENDER"></property>
        <property name="age" type="int" column="STU_AGE"></property>
    </class>
</hibernate-mapping>

测试

package com.li.test;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;

import com.li.pojo.Student;

public class StudentTest {

    public static void main(String[] args) {

        Student stud=new Student();
        stud.setId("4561654");
        stud.setName("wwww");
        stud.setAge(20);
        stud.setGender("male");

        /*创建Configuration对象,并读取指定的Hibernate核心配置文件*/
        Configuration config=new Configuration();
        config.configure("hibernate.cfg.xml");

        /*创建SessionFactory对象*/
        SessionFactory factory=config.buildSessionFactory();

        /*创建Session对象,也是在此处获得数据库的连接*/
        Session session=factory.openSession();

        /*通过session完成和数据库的CRUD操作*/
        Transaction trans=null;

        try {
            /*启动事务*/
            trans=session.beginTransaction();
            /*保存,面向对象型,底层的方言类做SQL语句的翻译工作*/
            session.save(stud);
            /*提交事务*/
            trans.commit();
        } catch (Exception e) {
            e.printStackTrace();
            /*回滚事务*/
            trans.rollback();
        }finally {
            /*关闭session(关闭一个Connection)*/
            session.close();
        }

    }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值