1. 程式人生 > >基於maven搭建hibernate運行環境

基於maven搭建hibernate運行環境

string 函數 manage 全局配置 img factory server2 gte ear

準備案例需要的數據庫表和測試數據

技術分享

建表語句:

create table DEPARTMENT (
   DEPT_ID integer not null,
   DEPT_NAME varchar(255) not null,
   DEPT_NO varchar(20) not null,
   LOCATION varchar(255),
   primary key (DEPT_ID),
   unique (DEPT_NO)
);

create table EMPLOYEE (
   EMP_ID bigint not null,
   EMP_NAME varchar(50) not
null, EMP_NO varchar(20) not null, HIRE_DATE date not null, IMAGE longblob, JOB varchar(30) not null, SALARY float not null, DEPT_ID integer not null, MNG_ID bigint, primary key (EMP_ID), unique (EMP_NO) ); create table SALARY_GRADE ( GRADE integer not null, HIGH_SALARY
float not null, LOW_SALARY float not null, primary key (GRADE) ); create table TIMEKEEPER ( Timekeeper_Id varchar(36) not null, Date_Time datetime not null, In_Out char(1) not null, EMP_ID bigint not null, primary key (Timekeeper_Id) ); alter table EMPLOYEE add index FK75C8D6AE269A3C9 (DEPT_ID),
add constraint FK75C8D6AE269A3C9 foreign key (DEPT_ID) references DEPARTMENT (DEPT_ID); alter table EMPLOYEE add index FK75C8D6AE6106A42 (EMP_ID), add constraint FK75C8D6AE6106A42 foreign key (EMP_ID) references EMPLOYEE (EMP_ID); alter table EMPLOYEE add index FK75C8D6AE13C12F64 (MNG_ID), add constraint FK75C8D6AE13C12F64 foreign key (MNG_ID) references EMPLOYEE (EMP_ID); alter table TIMEKEEPER add index FK744D9BFF6106A42 (EMP_ID), add constraint FK744D9BFF6106A42 foreign key (EMP_ID) references EMPLOYEE (EMP_ID);

初始化數據

insert into Department (DEPT_ID, DEPT_NAME, DEPT_NO, LOCATION)
values (10, ACCOUNTING, D10, NEW YORK);

insert into Department (DEPT_ID, DEPT_NAME, DEPT_NO, LOCATION)
values (20, RESEARCH, D20, DALLAS);

insert into Department (DEPT_ID, DEPT_NAME, DEPT_NO, LOCATION)
values (30, SALES, D30, CHICAGO);

insert into Department (DEPT_ID, DEPT_NAME, DEPT_NO, LOCATION)
values (40, OPERATIONS, D40, BOSTON);


insert into Employee (EMP_ID, EMP_NAME, EMP_NO, HIRE_DATE, JOB, SALARY, DEPT_ID, MNG_ID)
values (7839, KING, E7839, Str_To_Date(17-11-1981, %d-%m-%Y), PRESIDENT, 5000, 10, null);

insert into Employee (EMP_ID, EMP_NAME, EMP_NO, HIRE_DATE, JOB, SALARY, DEPT_ID, MNG_ID)
values (7566, JONES, E7566, Str_To_Date(02-04-1981, %d-%m-%Y), MANAGER, 2975, 20, 7839);

insert into Employee (EMP_ID, EMP_NAME, EMP_NO, HIRE_DATE, JOB, SALARY, DEPT_ID, MNG_ID)
values (7902, FORD, E7902, Str_To_Date(03-12-1981, %d-%m-%Y), ANALYST, 3000, 20, 7566);

insert into Employee (EMP_ID, EMP_NAME, EMP_NO, HIRE_DATE, JOB, SALARY, DEPT_ID, MNG_ID)
values (7369, SMITH, E7369, Str_To_Date(17-12-1980, %d-%m-%Y), CLERK, 800, 20, 7902);

insert into Employee (EMP_ID, EMP_NAME, EMP_NO, HIRE_DATE, JOB, SALARY, DEPT_ID, MNG_ID)
values (7698, BLAKE, E7698, Str_To_Date(01-05-1981, %d-%m-%Y), MANAGER, 2850, 30, 7839);

insert into Employee (EMP_ID, EMP_NAME, EMP_NO, HIRE_DATE, JOB, SALARY, DEPT_ID, MNG_ID)
values (7499, ALLEN, E7499, Str_To_Date(20-02-1981, %d-%m-%Y), SALESMAN, 1600, 30, 7698);

insert into Employee (EMP_ID, EMP_NAME, EMP_NO, HIRE_DATE, JOB, SALARY, DEPT_ID, MNG_ID)
values (7521, WARD, E7521, Str_To_Date(22-02-1981, %d-%m-%Y), SALESMAN, 1250, 30, 7698);

insert into Employee (EMP_ID, EMP_NAME, EMP_NO, HIRE_DATE, JOB, SALARY, DEPT_ID, MNG_ID)
values (7654, MARTIN, E7654, Str_To_Date(28-09-1981, %d-%m-%Y), SALESMAN, 1250, 30, 7698);

insert into Employee (EMP_ID, EMP_NAME, EMP_NO, HIRE_DATE, JOB, SALARY, DEPT_ID, MNG_ID)
values (7782, CLARK, E7782, Str_To_Date(09-06-1981, %d-%m-%Y), MANAGER, 2450, 30, 7839);

insert into Employee (EMP_ID, EMP_NAME, EMP_NO, HIRE_DATE, JOB, SALARY, DEPT_ID, MNG_ID)
values (7788, SCOTT, E7788, Str_To_Date(19-04-1987, %d-%m-%Y), ANALYST, 3000, 20, 7566);

insert into Employee (EMP_ID, EMP_NAME, EMP_NO, HIRE_DATE, JOB, SALARY, DEPT_ID, MNG_ID)
values (7844, TURNER, E7844, Str_To_Date(08-09-1981, %d-%m-%Y), SALESMAN, 1500, 30, 7698);

insert into Employee (EMP_ID, EMP_NAME, EMP_NO, HIRE_DATE, JOB, SALARY, DEPT_ID, MNG_ID)
values (7876, ADAMS, E7876, Str_To_Date(23-05-1987, %d-%m-%Y), CLERK, 1100, 20, 7698);

insert into Employee (EMP_ID, EMP_NAME, EMP_NO, HIRE_DATE, JOB, SALARY, DEPT_ID, MNG_ID)
values (7900, ADAMS, E7900, Str_To_Date(03-12-1981, %d-%m-%Y), CLERK, 950, 30, 7698);

insert into Employee (EMP_ID, EMP_NAME, EMP_NO, HIRE_DATE, JOB, SALARY, DEPT_ID, MNG_ID)
values (7934, MILLER, E7934, Str_To_Date(23-01-1982, %d-%m-%Y), CLERK, 1300, 10, 7698);


insert into Salary_Grade (GRADE, HIGH_SALARY, LOW_SALARY)
values (1, 9999, 3001);

使用idea新建一個空的maven工程,並在該項目中增加hibernate的依賴、jdbc驅動依賴、log4j日誌依賴、junit依賴。

該項目的pom.xml文件依賴內容如下:

 <dependencies>
    <!--junit依賴,用於單元測試-->
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.12</version>
      <scope>test</scope>
    </dependency>
    <!--添加hibernate的核心依賴-->
    <dependency>
      <groupId>org.hibernate</groupId>
      <artifactId>hibernate-core</artifactId>
      <version>5.0.12.Final</version>
    </dependency>
    <!--添加mysql的jdbc驅動-->
    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <version>5.1.41</version>
    </dependency>
    <!--添加log4j依賴-->
    <dependency>
      <groupId>log4j</groupId>
      <artifactId>log4j</artifactId>
      <version>1.2.17</version>
    </dependency>
  </dependencies>

在resource目錄下新建hibernate配置文件,hibernate.cfg.xml,該配置文件為hibernate的全局配置文件,用於定義hibernate的一些全局配置。目前僅配置數據庫連接的相關信息

<?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/dept?serverTimezone=UTC</property>
        <property name="connection.username">root</property>
        <property name="connection.password">12345678</property>

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

        <!-- SQL dialect ,定義數據庫方言-->
        <property name="dialect">org.hibernate.dialect.MySQLDialect</property>

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

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

</hibernate-configuration>

每種數據庫都有一個單獨的方言, 例如:

Oracle方言:

  • org.hibernate.dialect.Oracle10gDialect(Dùngcho 10g&11g)
  • org.hibernate.dialect.Oracle12cDialect

SQL Server方言:

  • org.hibernate.dialect.SQLServerDialect並
  • org.hibernate.dialect.SQLServer2012Dialect
  • org.hibernate.dialect.SQLServer2008Dialect

MySQL方言

  • org.hibernate.dialect.MySQLDialect
  • org.hibernate.dialect.MySQL5Dialect

什麽是方言?

Dialect是一個使用Hibernate的方式將數據庫的數據類型轉換為Java的數據類型,反之亦然。此外,它用於定義將HSQL(Hibernate SQL)的函數轉換為數據中的函數的方式,如下列出的一部分 -

Java SQL類型OracleMySQLSQL Server
Types.BIT number(1,0) bit bit
Types.BIGINT number(19,0) bigin bigint
Types.DATE date date date
…….
Types.CLOB clob longtext varchar(MAX)
Types.BLOB blob longblob varbinary(MAX)

創建HibernateUtils類,用於加載hibernate配置信息,以及提供獲取session的方法,代碼如下:

package com.deng.hibernate.util;

import org.hibernate.Session;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import org.hibernate.cfg.Configuration;
import org.hibernate.service.ServiceRegistry;

/**
 * hibernate工具類
 */
public class HibernateUtils {

    private static org.hibernate.SessionFactory sessionFactory;

    private static Configuration configuration = new Configuration();
    private static ServiceRegistry serviceRegistry;

    static {
        try {
            configuration.configure();
            serviceRegistry = new StandardServiceRegistryBuilder().applySettings(configuration.getProperties()).build();
            sessionFactory = configuration.buildSessionFactory(serviceRegistry);
        } catch (Exception e) {
            System.err.println("%%%% Error Creating SessionFactory %%%%");
            e.printStackTrace();
        }
    }

    /**
     * 獲取session,所有的hibernate操作均基於session進行
     * @return
     */
    public static Session getSession(){
        if(sessionFactory == null){
            return null;
        }
        if(sessionFactory.getCurrentSession() == null){
            return sessionFactory.getCurrentSession();
        }else{
            return sessionFactory.openSession();
        }
    }


    /**
     * 通過測試方法來測試是否正確加載hibernate,並獲取到session
     * @param args
     */
    public static void main(String[] args) {
        System.out.println(getSession());
    }

}

若運行main方法結果出現

技術分享

代表環境搭建成功。

基於maven搭建hibernate運行環境