Hibernate使用之快速开始

在gradle中引入hibernate

相关gradle内容如下:

apply plugin: "java"

repositories {
    jcenter()
}

dependencies {
    compile "org.hibernate:hibernate-core:5.0.0.Final"
}

截止到本文时最新的hibernate是5.0.0版。

创建并编写配置文件”hibernate.cfg.xml”

hibernate的主配置文件有两种方式:”hibernate.properties”和”hibernate.cfg.xml”, 本文中我们采用第二种方式。如果对第一种方式感兴趣,可以自行搜索。

这里我们按照gradle java插件的默认源码结构规则,将”hibernate.cfg.xml”文件放到”src/main/resources”目录下。

配置文件的内容如下:

<?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>
      <property name="hibernate.dialect">
         org.hibernate.dialect.PostgreSQLDialect
      </property>

      <property name="hibernate.connection.driver_class">
         org.postgresql.Driver
      </property>

      <property name="hibernate.hbm2ddl.auto">update</property>

      <property name="hibernate.connection.url">
         jdbc:postgresql://localhost:5432/zhanglong_test
      </property>

      <property name="hibernate.connection.username">
         postgres
      </property>

      <property name="hibernate.connection.password">
         123456
      </property>

      <!-- List of XML mapping files -->
      <mapping resource="UserAccount.hbm.xml"/>

   </session-factory>
</hibernate-configuration>

“”标签前面的部分基本上是固定的,不用更改,直接拷贝即可。

“hibernate.dialect”属性代表具体的数据库偏好,因为不同的数据库在具体的实现上,sql语句上会有一些差别,通过这个属性来制定具体的数据库”方言”可以让hibernate产生效率更高的SQL语句。

常用的一些支持的数据库”方言”如下:

DatabaseDialect Property
DB2org.hibernate.dialect.DB2Dialect
HSQLDBorg.hibernate.dialect.HSQLDialect
HypersonicSQLorg.hibernate.dialect.HSQLDialect
Informixorg.hibernate.dialect.InformixDialect
Ingresorg.hibernate.dialect.IngresDialect
Interbaseorg.hibernate.dialect.InterbaseDialect
Microsoft SQL Server 2000org.hibernate.dialect.SQLServerDialect
Microsoft SQL Server 2005org.hibernate.dialect.SQLServer2005Dialect
Microsoft SQL Server 2008org.hibernate.dialect.SQLServer2008Dialect
MySQLorg.hibernate.dialect.MySQLDialect
Oracle (any version)org.hibernate.dialect.OracleDialect
Oracle 11gorg.hibernate.dialect.Oracle10gDialect
Oracle 10gorg.hibernate.dialect.Oracle10gDialect
Oracle 9iorg.hibernate.dialect.Oracle9iDialect
PostgreSQLorg.hibernate.dialect.PostgreSQLDialect
Progressorg.hibernate.dialect.ProgressDialect
SAP DBorg.hibernate.dialect.SAPDBDialect
Sybaseorg.hibernate.dialect.SybaseDialect
Sybase Anywhereorg.hibernate.dialect.SybaseAnywhereDialect

“hibernate.connection.driver_class”属性指定数据库驱动类名,hibernate可以通过配置的驱动类型用java的反射机制加载驱动类。

本人只使用过mysql和postgresql,所以只列出这两个数据库的驱动,启动可自行搜索,网上资料很多:

Databasedriver class name
MySQLcom.mysql.jdbc.Driver
PostgresSQLorg.postgresql.Driver

“hibernate.hbm2ddl.auto”属性是告诉hibernate操作数据表的模式,可用的模式有:”validate”, “update”, “create”, “create-drop” 和”none”。

create:
每次加载hibernate时都会删除上一次的生成的表,然后根据你的model类再重新来生成新表,哪怕两次没有任何改变也要这样执行,这就是导致数据库表数据丢失的一个重要原因。
create-drop :
每次加载hibernate时根据model类生成表,但是sessionFactory一关闭,表就自动删除。
update:
最常用的属性,第一次加载hibernate时根据model类会自动建立起表的结构(前提是先建立好数据库),以后加载hibernate时根据 model类自动更新表结构,即使表结构改变了但表中的行仍然存在不会删除以前的行。要注意的是当部署到服务器后,表结构是不会被马上建立起来的,是要等 应用第一次运行起来后才会。
validate :
每次加载hibernate时,验证创建数据库表结构,只会和数据库中的表进行比较,不会创建新表,但是会插入新值。

none:自己来维护表的创建,更改与销毁。

“hibernate.connection.url”属性指定数据库的连接字符串,这里列出MySql和PostgresSQL的, 注意连接字符串中的域名,端口和数据库名要替换成实际的:

DataBaseconnection url
MySQLjdbc:mysql://localhost:3600/zhanglong_test
PostgreSQLjdbc:postgresql://localhost:5432/zhanglong_test

“hibernate.connection.username”属性指定数据库的用户名,用于连接数据库时的认证。
“hibernate.connection.password”属性指定数据库的用户密码,用于连接数据库时的认证。
“mapping”标签指定所有映射文件(定义domain类到关系数据库的映射方式)的位置,每个domain类对应一个。

编写domain类与映射文件

本文的代码按照gradle java插件的默认目录结构将java文件放到”src/main/java”目录下。

在”src/main/java”目录下创建”com.zhanglong.test.domains”包,并在新创建的包下创建”UserAccount.java”文件。文件的内容如下:

package com.zhanglong.test.domains;

public class UserAccount {
    private Long id;
    private String name;
    private Integer age;

    public UserAccount() {

    }

    public UserAccount(String name, int age) {
        this.name = name;
        this.age = age;
    }

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

    public Long getId() {
        return this.id;
    }

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

    public String getName() {
        return this.name;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public Integer getAge() {
        return this.age;
    }
}

然后在”src/main/resources”目录下为该类创建hibernate映射文件”UserAccount.hbm.xml”,内容如下:

<!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.zhanglong.test.domains">

    <class name="UserAccount" table="user_account">
        <id name="id" column="id">
            <generator class="increment"/>
        </id>
        <property name="name" type="string" column="name"/>
        <property name="age" type="int" column="int"/>
    </class>

</hibernate-mapping>

编写业务代码并操作数据库

为了保证能顺利操作数据,我们还需要引入驱动包,在build.gradle文件中的”dependencies”模块中添加如下一行:

compile "org.postgresql:postgresql:9.4-1201-jdbc41"

此时整个build.gradle内容如下:

apply plugin: "java"

repositories {
    jcenter()
}

dependencies {
    compile "org.hibernate:hibernate-core:5.0.0.Final"
    compile "org.postgresql:postgresql:9.4-1201-jdbc41"
}

在”com.zhanglong.test”包下创建”TestNativeApiHbmMapping.java”文件,文件内容如下:

package com.zhanglong.test;

import com.zhanglong.test.domains.UserAccount;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;

public class TestNativeApiHbmMapping {
    private static SessionFactory factory;

    public static void main(String[] args) {
        try{
           factory = new Configuration().configure().buildSessionFactory();
        } catch (Throwable ex) {
           System.err.println("Failed to create sessionFactory object." + ex);
           throw new ExceptionInInitializerError(ex); 
        }
        System.out.println("factory: " + factory);
        Session session = factory.openSession();
        session.beginTransaction();
        UserAccount me = new UserAccount("zhanglong", 26);
        long meId = (Long) session.save(me); 
        System.out.println("meId: " + meId);
        session.getTransaction().commit();
        session.close();
    }
}

build和运行

为了更方便的管理运行的包得依赖,我们使用gradle的fatJar插件将所有被依赖的包大包到一块。“build.gradle”问价中添加如下几行:

buildscript {
    repositories {
        jcenter()
    }

    dependencies {
        classpath 'eu.appsatori:gradle-fatjar-plugin:0.3'
    }
}

apply plugin: 'eu.appsatori.fatjar'

此时完整的build.gradle文件内容如下:

buildscript {
    repositories {
        jcenter()
    }

    dependencies {
        classpath 'eu.appsatori:gradle-fatjar-plugin:0.3'
    }
}

apply plugin: 'eu.appsatori.fatjar'

apply plugin: "java"

repositories {
    jcenter()
}

dependencies {
    compile "org.hibernate:hibernate-core:5.0.0.Final"
    compile "org.postgresql:postgresql:9.4-1201-jdbc41"
}

在终端执行如下命令进行打包:

~$ gradle fatJar

命令执行成功后,将会生成一个build目录,最终的jar包就在“build/libs”目录下。

在终端执行如下命令运行jar包:

~$ java -cp build/libs/TestNativeApiHbmMapping.jar com.zhanglong.test.TestNativeApiHbmMapping

输出的结果如下:

九月 09, 2015 9:50:56 上午 org.hibernate.Version logVersion
INFO: HHH000412: Hibernate Core {5.0.0.Final}
九月 09, 2015 9:50:56 上午 org.hibernate.cfg.Environment <clinit>
INFO: HHH000206: hibernate.properties not found
九月 09, 2015 9:50:56 上午 org.hibernate.cfg.Environment buildBytecodeProvider
INFO: HHH000021: Bytecode provider name : javassist
九月 09, 2015 9:50:56 上午 org.hibernate.annotations.common.reflection.java.JavaReflectionManager <clinit>
INFO: HCANN000001: Hibernate Commons Annotations {5.0.0.Final}
九月 09, 2015 9:50:57 上午 org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl configure
WARN: HHH000402: Using Hibernate built-in connection pool (not for production use!)
九月 09, 2015 9:50:57 上午 org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator
INFO: HHH000401: using driver [org.postgresql.Driver] at URL [jdbc:postgresql://localhost:5432/zhanglong_test]
九月 09, 2015 9:50:57 上午 org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator
INFO: HHH000046: Connection properties: {user=postgres, password=****}
九月 09, 2015 9:50:57 上午 org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator
INFO: HHH000006: Autocommit mode: false
九月 09, 2015 9:50:57 上午 org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl configure
INFO: HHH000115: Hibernate connection pool size: 20 (min=1)
九月 09, 2015 9:50:57 上午 org.hibernate.dialect.Dialect <init>
INFO: HHH000400: Using dialect: org.hibernate.dialect.PostgreSQLDialect
九月 09, 2015 9:50:57 上午 org.hibernate.engine.jdbc.env.internal.LobCreatorBuilderImpl useContextualLobCreation
INFO: HHH000424: Disabling contextual LOB creation as createClob() method threw error : java.lang.reflect.InvocationTargetException
九月 09, 2015 9:50:57 上午 org.hibernate.type.BasicTypeRegistry register
INFO: HHH000270: Type registration [java.util.UUID] overrides previous : org.hibernate.type.UUIDBinaryType@55cf0d14
九月 09, 2015 9:50:57 上午 org.hibernate.tool.hbm2ddl.SchemaUpdate execute
INFO: HHH000228: Running hbm2ddl schema update
九月 09, 2015 9:50:57 上午 org.hibernate.tool.schema.extract.internal.InformationExtractorJdbcDatabaseMetaDataImpl processGetTableResults
INFO: HHH000262: Table not found: user_account
九月 09, 2015 9:50:57 上午 org.hibernate.tool.schema.extract.internal.InformationExtractorJdbcDatabaseMetaDataImpl processGetTableResults
INFO: HHH000262: Table not found: user_account
factory: org.hibernate.internal.SessionFactoryImpl@5b58ed3c
meId: 3

结果中最后两行是我们打印的运行成功的结果,前面是hibernate的log。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值