码迷,mamicode.com
首页 > 数据库 > 详细

Hibernate ORM(1):创建一个Maven & Hibernate & MySQL应用

时间:2015-08-03 20:40:49      阅读:166      评论:0      收藏:0      [点我收藏+]

标签:

一个Hibernate应用最基本的文件结构如下:

技术分享

 

#1准备maven文件

pom.xml里面定义了项目的依赖jar以及项目的编译打包选项;依赖jar至少需要包含Hibernate的核心库(hibernate-core),第三方数据库连接池管理库(c3p0)和mysql的连接驱动(mysql-connector-java)

文件内容如下:

技术分享
 1 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 2     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
 3 
 4     <modelVersion>4.0.0</modelVersion>
 5 
 6     <groupId>org.hibernate.tutorial.test</groupId>
 7     <artifactId>HibernateProject</artifactId>
 8     <version>1.0.0-SNAPSHOT</version>
 9     <name>First Hibernate Tutorial</name>
10 
11     <build>
12         <!-- we dont want the version to be part of the generated war file name -->
13         <finalName>${artifactId}</finalName>
14     </build>
15 
16     <dependencies>
17         <dependency>
18             <groupId>org.hibernate</groupId>
19             <artifactId>hibernate-core</artifactId>
20             <version>4.3.10.Final</version>
21         </dependency>
22         
23         <dependency>
24             <groupId>c3p0</groupId>
25             <artifactId>c3p0</artifactId>
26             <version>0.9.1.2</version>
27         </dependency>
28         
29         <dependency>
30             <groupId>mysql</groupId>
31             <artifactId>mysql-connector-java</artifactId>
32             <version>5.0.8</version>
33         </dependency>
34 
35         <!-- Because this is a web app, we also have a dependency on the servlet 
36             api. -->
37         <dependency>
38             <groupId>javax.servlet</groupId>
39             <artifactId>servlet-api</artifactId>
40             <version>2.5</version>
41         </dependency>
42 
43         <!-- Hibernate uses slf4j for logging, for our purposes here use the simple 
44             backend -->
45         <dependency>
46             <groupId>org.slf4j</groupId>
47             <artifactId>slf4j-simple</artifactId>
48             <version>1.5.2</version>
49         </dependency>
50 
51         <dependency>
52             <groupId>javassist</groupId>
53             <artifactId>javassist</artifactId>
54             <version>3.12.0.GA</version>
55         </dependency>
56 
57         <dependency>
58             <groupId>commons-collections</groupId>
59             <artifactId>commons-collections</artifactId>
60             <version>3.1</version>
61         </dependency>
62     </dependencies>
63 
64 </project>
View Code

 

#2准备数据库

安装mysql数据库,并创建数据库表User。

创建指令如下:

技术分享
 1 drop database if exists SAMPLEDB;
 2 create database SAMPLEDB;
 3 use SAMPLEDB;
 4 
 5 create table USER (
 6     ID bigint not null,
 7     USER_NAME varchar(20),
 8     CREATED_BY varchar(20),
 9     CREATED_DATE date,
10     primary key (ID)
11 );
View Code

 

#3准备POJO文件

POJO对应需要进行持久化的对象, Hibernate要求POJO的类定义中必须有一个no-argument的构造方法便于Reflection机制(java.lang.reflect.Constructor.newInstance())。

Hibernate不强制要求每一个属性都有setter和getter,但一旦有则要保证其方法名满足命名规范,否则抛出异常;如果没有则Hibernate也可访问POJO的所有属性,不管是否有getter也不管属性的访问限制符是否为private,访问限制符仅仅是提供给程序其他模块的访问接口;

Hibernate也不要求每一个POJO必须实现Serializable接口,但如果对采用RMI和J2EE分布式结构的应用,POJO在不同进程节点之间传输时,或者在HttpSession内,则一定需要实现此接口;

文件内容如下:

技术分享
 1 package org.hibernate.tutorial.domain;
 2 
 3 import java.util.Date;
 4 
 5 public class User implements java.io.Serializable {
 6 
 7     private int ID;
 8     private String userName;
 9     private String createdBy;
10     private Date createdDate;
11 
12     public User() {
13     }
14 
15     public User(int userId) {
16         this.ID = userId;
17     }
18 
19     public User(int userId, String userName, String createdBy,
20             Date createdDate) {
21         this.ID = userId;
22         this.userName = userName;
23         this.createdBy = createdBy;
24         this.createdDate = createdDate;
25     }
26 
27     public int getUserId() {
28         return this.ID;
29     }
30 
31     /**
32      * User ID has no business meaning, so there is no way you should rewrite it. 
33      * */
34     private void setUserId(int userId) {
35         this.ID = userId;
36     }
37 
38     public String getUserName() {
39         return this.userName;
40     }
41 
42     public void setUserName(String userName) {
43         this.userName = userName;
44     }
45 
46     public String getCreatedBy() {
47         return this.createdBy;
48     }
49 
50     public void setCreatedBy(String createdBy) {
51         this.createdBy = createdBy;
52     }
53 
54     public Date getCreatedDate() {
55         return this.createdDate;
56     }
57 
58     public void setCreatedDate(Date createdDate) {
59         this.createdDate = createdDate;
60     }
61 
62 }
View Code

 

同时还需要准备Hibernate核心接口SessionFactory和Session;一旦SessionFactory创建之后,则任何Configuration之后的任何配置变化都不再会关联到SessionFactory上。

文件内容如下:

技术分享
 1 package org.hibernate.tutorial.util;
 2 
 3 import org.hibernate.SessionFactory;
 4 import org.hibernate.cfg.Configuration;
 5 
 6 public class DBUtils {
 7     
 8     private static final SessionFactory sessionFactory = buildSessionFactory();
 9      
10     @SuppressWarnings("deprecation")
11     private static SessionFactory buildSessionFactory() {
12         try {
13             // Create the SessionFactory from hibernate.cfg.xml
14             return new Configuration().configure().buildSessionFactory();
15         } catch (Throwable ex) {
16             // Make sure you log the exception, as it might be swallowed
17             System.err.println("Initial SessionFactory creation failed." + ex);
18             throw new ExceptionInInitializerError(ex);
19         }
20     }
21  
22     public static SessionFactory getSessionFactory() {
23         return sessionFactory;
24     }
25  
26     public static void shutdown() {
27         // Close caches and connection pools
28         sessionFactory.close();
29     }
30 
31 }
View Code

 

#4准备hbm.xml文件

*.hbm.xml文件是POJO文件和数据库表之间建立关联的中间文件;通过Hibernate的中间类型,自动映射Java类型和SQL类型。常见的类型映射如下:

Java类型

Hibernate映射类型

SQL类型

String(0-255)

String

VARCHAR

Int

Int

INT

Char

Character

CHAR

Boolean

Boolean

BIT

String(>255)

Text

TEXT

Byte[]

Binary

BLOB

Java.sql.Date

Date

DATE

 

如果*.hbm.xml中某个属性没有指定type,则Hibernate使用Java反射机制识别属性的类型,并为其自动配置一个Hibernate映射类型。

文件内容如下:

技术分享
 1 <?xml version="1.0"?>
 2 <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
 3 "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
 4 <!-- Generated 2013-10-22 15:28:34 by Hibernate Tools 3.4.0.CR1 -->
 5 <hibernate-mapping>
 6     <class name="org.hibernate.tutorial.domain.User" table="USER">
 7         <id name="userId" type="int">
 8             <column name="ID" />
 9             <generator class="increment" />
10         </id>
11         <property name="userName" type="string">
12             <column name="USER_NAME" length="20" not-null="true" />
13         </property>
14         <property name="createdBy" type="string">
15             <column name="CREATED_BY" length="20" not-null="true" />
16         </property>
17         <property name="createdDate" type="date">
18             <column name="CREATED_DATE" length="7" not-null="true" />
19         </property>
20     </class>
21 </hibernate-mapping>
View Code

 

#5准备hibernate.cfg.xml文件

在Configuration.configure()的时候加载并解析hibernate.cfg.xml文件,需要指定Hibernate的启动参数,如驱动、用户名/密码、数据库连接池配置、数据库方言等等。

文件内容如下:

技术分享
 1 <?xml version=‘1.0‘ encoding=‘utf-8‘?>
 2 <!DOCTYPE hibernate-configuration PUBLIC
 3         "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
 4         "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
 5 
 6 <hibernate-configuration>
 7     <session-factory>
 8         <!-- 指定连接数据库所用的驱动 -->
 9         <property name="connection.driver_class">com.mysql.jdbc.Driver</property>
10         <!-- 指定连接数据库的url,hibernate连接的数据库名 -->
11         <property name="connection.url">jdbc:mysql://localhost/sampledb</property>
12         <!-- 指定连接数据库的用户名 -->
13         <property name="connection.username">root</property>
14         <!-- 指定连接数据库的密码 -->
15         <property name="connection.password"></property>
16         
17         <!-- 指定连接池里最大连接数 -->
18         <property name="hibernate.c3p0.max_size">20</property>
19         <!-- 指定连接池里最小连接数 -->
20         <property name="hibernate.c3p0.min_size">1</property>
21         <!-- 指定连接池里连接的超时时长 -->
22         <property name="hibernate.c3p0.timeout">5000</property>
23         <!-- 指定连接池里最大缓存多少个Statement对象 -->
24         <property name="hibernate.c3p0.max_statements">100</property>
25         <property name="hibernate.c3p0.idle_test_period">3000</property>
26         <property name="hibernate.c3p0.acquire_increment">2</property>
27         <property name="hibernate.c3p0.validate">true</property>
28         
29         <!-- 指定数据库方言 -->
30         <property name="dialect">org.hibernate.dialect.MySQLInnoDBDialect</property>
31         <!-- 根据需要自动创建数据库 -->
32         <property name="hbm2ddl.auto">update</property>
33         <!-- 显示Hibernate持久化操作所生成的SQL -->
34         <property name="show_sql">true</property>
35         <!-- 将SQL脚本进行格式化后再输出 -->
36         <property name="hibernate.format_sql">false</property>
37         
38         <!-- 指定ORM文件 -->
39         <mapping resource="domain/user.hbm.xml"/>
40     </session-factory>
41 </hibernate-configuration>
View Code

 

#6 编译项目文件

进入到pom.xml文件所在的目录,并执行$mvn compile命令,maven会自动下载所需的jar包并编译所有java文件;

 

#7 Hibernate核心接口

Configuration:

获取ORM的元数据,根据hibernate.cfg.xml启动Hibernate,并返回SessionFactory实例;

 

SessionFactory:

一个SessionFactory对应一个数据源,因此如果有多个数据源则需要准备多个hibernate.cfg.xml文件;hibernate.cfg.xml引入*.hbm.xml映射文件。

org.hibernate.SessionFactory和org.hibernate.Session,前者是线程安全的全局变量,后者是由前者创建的只能在单线程环境下工作的局部变量;

SessionFactory是一个重量级的变量,其本身维护一个cache用于缓存预编译的SQL以及ORM元数据;同时还可以为其配置一个二级cache用于在事务之间共享读取过的数据。

 

Session:

非线程安全,因此避免在多个线程之间共享实例;Session本身缺省有一个一级cache,用于在同一个事务内部共享读取过的数据;

提供了所有与持久化相关的操作,保存、更新、删除、加载和查找;一个Session实例通常和一个数据库事务绑定,所有该事务内的操作都可以回滚;

 

Transaction:

对底层事务接口(JDBC、JTA、CORBA)做了统一封装,便于移植。

 

Query & Criteria:

此接口提供直接访问和操作DB的功能,Query使用HQL进行DB操作,Criteria适于动态查询。Query由session.createQuery(“[HQL]”)创建

 

Hibernate ORM(1):创建一个Maven & Hibernate & MySQL应用

标签:

原文地址:http://www.cnblogs.com/leo-chen-2014/p/4700180.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!