学习hibernate(一) -- hibernate环境搭建

1.下载hibernate

    需要到hibernate的官网下载一个hibernate。网址是:http://hibernate.org/orm/downloads/

2.解压hibernate

    下载后解压缩,得到一个hibernate-release-4.3.11.Final文件夹(我下载的hibernate版本是4.3.11),在hibernate-release-4.3.11.Final文件夹里有一个lib文件夹,里面放着hibernate的jar包。

    例子中使用了lib下的required文件夹中的所有jar包。如图:

学习hibernate(一) -- hibernate环境搭建_第1张图片

    这些包的作用如下(待验证):

包名
说明
antlr-2.7.7
可以接收词文法语言描述,并能产生识别这些语言的语句的程序,hibernate利用它实现hql到sql的转换。
dom4j-1.6.1
xml解析器,用来读写xml文件的。
hibernate-commons-annotations-4.0.5.Final
hibernate中支持注解开发的程序。
hibernate-core-4.3.11.Final
hibernate的核心程序。
hibernate-jpa-2.1-api-1.0.0.Final hibernate对jap(java persistence API)规范的支持,可以理解为JAP是标准接口,hibernate是实现。
jandex-1.1.0.Final 用来检索注解(annotation)索引的程序,识别该对象是注解对象(待验证)?
javassist-3.18.1-GA 用来操作字节码的程序,可直接编辑和生成java字节码,以达到对.class文件的动态修改。
jboss-logging-3.1.3.GA 提供hibernate日志功能的程序(待验证)?
jboss-logging-annotations-1.2.0.Beta1 解析logging的注解模式程序(待验证)?
jboss-transaction-api_1.2_spec-1.0.0.Final 事务控制程序(待验证)?

3.导入hibernate的jar包

    创建一个JavaProject,引用上面图片中的jar包,这里需要另外一个jar包,由于我连接的是mysql数据库,所以需要在导入一个mysql-connector-java-5.1.7-bin.jar

4.新建一个测试用的java对象

package cn.net.bysoft.lesson1;

import java.util.Date;

public class User {

    public User() {
    }

    public User(String name, Date birthday) {
        this.name = name;
        this.birthday = birthday;
    }

    @Override
    public String toString() {
        return "User [id=" + id + ", name=" + name + ", birthday=" + birthday
                + "]";
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Date getBirthday() {
        return birthday;
    }

    public void setBirthday(Date birthday) {
        this.birthday = birthday;
    }

    private int id;
    private String name;
    private Date birthday;
}

    编写的java对象需要满足如下要素:

  • 需要有一个无参的构造函数,因为在session.get时需要用到反射创建java对象;

  • 需要提供一个id属性,对应数据库的主键;

  • 需要为对象的其他属性提供get/set方法;

  • 需要定义成非final的类,以便在hibernate进行延迟加载时为类创建代理;

  • 如有必要保存到集合中,需要重equals方法和hashcode方法;

5.设置java对象与数据库的映射关系

    需要创建一个User.hbm.xml文件,编辑java对象与数据库的映射关系,格式如下:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
    <class name="cn.net.bysoft.lesson1.User" table="S_USER">
        <id name="id" type="integer" column="ID">
            <!-- 指定主键的生成方式,native是使用数据库本地的方式 -->
            <generator class="native"></generator>
        </id>
        <property name="name" type="string" column="NAME"></property>
        <property name="birthday" type="timestamp" column="BIRTHDAY"></property>
    </class>
</hibernate-mapping>

    该文件是用来配置java对象与数据表之间的映射关系的,其中需要留意的是id这个属性,generator来指定主键的生成方式,而native则代表是调用数据库本地的方式来生成主键,我使用的mysql数据库就会自动将id列设置成自增。

    主键具体有哪些生成方式,待接下来详细研究。

6.配置hibernate的配置信息

在src下创建一个hibernate.cfg.xml文件,格式如下:

<!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>
        <!-- 连接数据库的基本信息 -->
        <property name="hibernate.connection.username">root</property>
        <property name="hibernate.connection.password">root</property>
        <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
        <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/hibernate4</property>
        
        <!-- hibernate使用的数据库方言
             如果不知道可以去/hibernate-release-4.3.11.Final/project/etc/hibernate.properties
             中查找 -->
        <property name="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</property>
        <!-- 是否在控制台显示sql语句 -->
        <property name="hibernate.show_sql">true</property>
        <!-- 是否格式化显示的sql语句 -->
        <property name="hibernate.format_sql">true</property>
        <!-- 是否自动生成数据表的策略,create代表每次启动程序都重新创建数据表 -->
        <property name="hibernate.hbm2ddl.auto">create</property>
        
        <!-- 需要使用到的*.hbm.xml文件 -->
        <mapping resource="cn/net/bysoft/lesson1/User.hbm.xml"/>
    </session-factory>
</hibernate-configuration>

    该文件需要注意的有两个地方,第一个是mapping属性,第二个是hibernate.hbm2ddl.auto这个属性。

    mapping属性用来配置*.hbm.xml的资源文件地址,这里需要注意的是没有用cn.net.bysoft.lession的形式,而是使用的'/'来描述目录位置。

    接下来是自动执行ddl语句的设置(也就是hibernate.hbm2ddl.auto)参数有4个,分别是:

  • create

    create为每次创建sessionfactory时,会根据*.hbm.xml文件中所配置的信息来drop掉数据表,drop后重新create数据表;

  • create-drop

    create-drop为每次创建sessionfactory时,会根据*.hbm.xml文件中所配置的信息来create数据表。而每当sessionfactory被close时,会drop掉开始时create的数据表;

  • update

    update为每次创建sessionfactory时,如果数据库中没有对应的表,则新建。

    若已经新建过,则会判断*.hbm.xml文件的配置与建立好的数据表的结构是否相同。

    如果相同则不去进行ddl的操作。

    如果不同,则会根据*.hbm.xml文件中有变化的配置项去更新数据表,但不会删除数据表中已创建过的任何信息。

  • validate

    validate为每次创建sessionfactory时,将用*.hbm.xml文件中的配置信息与现有的对应的数据表结构进行比较,若发现不同则抛出异常。

7.编写代码测试

package cn.net.bysoft.lesson1;

import java.util.Date;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.boot.registry.StandardServiceRegistry;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import org.hibernate.cfg.Configuration;
import org.junit.Test;

public class UserTest {

    @Test
    public void test() {
        // 0.创建configuration对象,该对象保存着hibernate的配置信息和对象关系映射的信息。
        Configuration cfg = new Configuration().configure();
        // 1.创建sessionfactory对象
        StandardServiceRegistryBuilder builder = new StandardServiceRegistryBuilder().applySettings(cfg.getProperties());
        StandardServiceRegistry registry =  builder.build();
        SessionFactory sessionFactory = cfg.buildSessionFactory(registry); 
        // 2.创建session对象
        Session session = sessionFactory.openSession();
        // 3.开始事务
        Transaction transaction = session.beginTransaction();
        // 4.保存
        User user = new User("Jack", new Date());
        session.save(user);
        // 5.提交事务
        transaction.commit();
        // 6.关闭session对象
        session.close();
        // 7.关闭sessionfactory对象
        sessionFactory.close();
    }
}

    上面这段代码中configuration对象用来保存则hibernate的配置信息,如hibernate.cfg.xml中的配置信息,和*.hbm.xml的映射信息。

    sessionfactory为创建session的工厂,它是线程安全的。一般建议一个项目中只有一个sessionfactory,因为创建sessionfactory非常费资源。

    接下来是session对象,该对象是hibernate的核心,是一个单线程的对象,内部有session缓存。

    对需要持久化的java对象的所有操作都用到了session。

    常用的方法有get、load、save、update、saveorupdate、delete、begintransaction、isopen、flush、clear、evicto、close等等方法,接下来将会一个一个研究这些方法的使用。

    这是执行这段代码后,控制台输出的内容:

学习hibernate(一) -- hibernate环境搭建_第2张图片

    创建了一张名为S_USER的数据表,并insert了一条数据。

学习hibernate(一) -- hibernate环境搭建_第3张图片

    到此位置,一个简单的hibernate环境就搭建好了。工程的目录结构如下:

学习hibernate(一) -- hibernate环境搭建_第4张图片


你可能感兴趣的:(学习hibernate(一) -- hibernate环境搭建)