作為一個ORM框架,hibernate對JDBC進行了輕量級的封裝,使得我們在開發時能夠把更多的精力放在業務實現上,不過這畢竟是一把雙刃劍,在提供了方便的同時,也降低了程序員理解數據庫、SQL語句的門檻,所以在平時,還是需要花一些時間在數據庫上,至少是SQL上。下面記錄的是平時學習,工作中可能用到的一些技術點,或者心得,記錄下來,以備查看。
先交代一下和使用環境相關的信息
IDE:Eclipse Kepler Service Release 2
Mysql:5.0.96
使用Maven構建測試項目,所需依賴如下(在實際的使用中,可能涉及更多的依賴,尤其在框架間整合時)
1 <!-- 方便書寫測試案例 -->
2 <dependency>
3 <groupId>junit</groupId>
4 <artifactId>junit</artifactId>
5 <version>3.8.1</version>
6 <scope>test</scope>
7 </dependency>
8
9 <!-- hibernate相關依賴 -->
10 <dependency>
11 <groupId>org.hibernate</groupId>
12 <artifactId>hibernate-entitymanager</artifactId>
13 <version>4.3.5.Final</version>
14 </dependency>
15
16 <!-- log4j相關依賴 -->
17 <dependency>
18 <groupId>log4j</groupId>
19 <artifactId>log4j</artifactId>
20 <version>1.2.16</version>
21 </dependency>
22
23 <!-- Mysql驅動依賴 -->
24 <dependency>
25 <groupId>mysql</groupId>
26 <artifactId>mysql-connector-java</artifactId>
27 <version>5.1.6</version>
28 </dependency>
單獨使用hibernate時,需要為其指定一個創建sessionFactory的配置文件hibernate.cfg.xml,常規內容如下,放置于項目classpath下
1 <?xml version="1.0" encoding="UTF-8"?>
2 <!DOCTYPE hibernate-configuration PUBLIC
3 "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
4 "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
5 <hibernate-configuration>
6 <session-factory name="sessionFactory">
7 <!-- 驅動類 -->
8 <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
9 <!-- 連接字符串 -->
10 <property name="hibernate.connection.url">jdbc:mysql://localhost/hibernate_begin</property>
11 <property name="hibernate.connection.username">root</property>
12 <property name="hibernate.connection.password">root</property>
13 <!-- 數據庫對應方言 -->
14 <property name="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</property>
15 <!-- 實體類自動生成數據表 -->
16 <property name="hibernate.hbm2ddl.auto">update</property>
17 <!-- 控制臺顯示SQL語句 -->
18 <property name="show_sql">true</property>
19 <!-- 實體類相關XML文件 -->
20 <mapping resource="domain/Student.hbm.xml"/>
21 </session-factory>
22 </hibernate-configuration>
23
配置完畢之后,我們只需通過sessionFactory來獲取session,之后通過session對數據庫進行操作即可,通常來說,項目中會把sessionFactory的獲取寫進一個工具類中,通過工具類獲取session,如下
1 package util;
2
3 import org.hibernate.Session;
4 import org.hibernate.SessionFactory;
5 import org.hibernate.boot.registry.StandardServiceRegistry;
6 import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
7 import org.hibernate.cfg.Configuration;
8
9 /**
10 * Hibernate工具類,用于通過配置文件構建session工廠,通過工廠返回session
11 * @author Alvin Du
12 *
13 */
14 public class HibernateUtil {
15 //SessionFactory是線程安全的,對資源占用較高,一般需要定義為單例的
16 private static final SessionFactory FACTORY = buildSessionFactory();
17
18 private static SessionFactory buildSessionFactory() {
19
20 Configuration configuration = new Configuration().configure();
21 //hibernate 4中使用standardServiceRegistryBuilder創建standardServiceRegistry
22 StandardServiceRegistryBuilder standardServiceRegistryBuilder =
23 new StandardServiceRegistryBuilder().applySettings(configuration.getProperties());
24 StandardServiceRegistry standardServiceRegistry = standardServiceRegistryBuilder.build();
25 SessionFactory sessionFactory = configuration.buildSessionFactory(standardServiceRegistry);
26
27 return sessionFactory;
28 }
29
30 /**
31 * 獲取工廠
32 * @return the factory
33 */
34 public static SessionFactory getFactory() {
35 return FACTORY;
36 }
37
38 /**
39 * 獲取hibernate session
40 * @return
41 */
42 public static Session openSession(){
43 return FACTORY.openSession();
44 }
45
46 /**
47 * 關閉hibernate session
48 * @param session
49 */
50 public static void closeSession(Session session){
51 if(session !=null){
52 session.close();
53 }
54 }
55
56 }
57
之后,我們需要為hibernate配置實體類和表的映射,此處為演示,一切從簡,定義Student實體類和對應的hbm配置文件,類和hbm一般習慣放置于同一個包下
(表和實體類之間的映射還可以使用注解的方式進行配置,后續會再記錄)
Student.java
1 package domain;
2
3 public class Student {
4
5 private int id;
6 private String name;
7 private String grade;
8 //get/set方法和構造器省略,但是實際不可不寫
9
10 }
11
Student.hbm.xml
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 <hibernate-mapping>
5 <!-- 配置類名和表的對應 -->
6 <class name="domain.Student" table="STUDENT">
7 <!-- 字段和屬性之間的對應 -->
8 <id name="id" type="int">
9 <column name="ID" />
10 <generator class="native" />
11 </id>
12 <property name="name" type="java.lang.String">
13 <column name="NAME" />
14 </property>
15 <property name="grade" type="java.lang.String">
16 <column name="GRADE" />
17 </property>
18 </class>
19 </hibernate-mapping>
20
至此,環境的搭建就告一段落,書寫測試類進行測試
1 package demo;
2
3 import java.util.List;
4
5 import org.hibernate.Session;
6 import org.junit.Test;
7
8 import domain.Student;
9 import util.HibernateUtil;
10
11 public class App
12 {
13 @Test
14 public void addTest() {
15 //session使用結束之后注意記得釋放資源
16 Session session = null;
17 try {
18 //一般使用,考慮采用如下寫法
19 session = HibernateUtil.openSession();
20 //開啟事物
21 session.beginTransaction();
22
23 Student stu1 = new Student();
24 stu1.setName("小明");
25 stu1.setGrade("一");
26 session.save(stu1);
27
28 Student stu2 = new Student();
29 stu2.setName("小紅");
30 stu2.setGrade("二");
31 session.save(stu2);
32
33 session.getTransaction().commit();
34
35 } catch (Exception e) {
36 //異常時回滾事物
37 if (session != null) {
38 session.getTransaction().rollback();
39 }
40 } finally{
41 if (session != null) {
42 session.close();
43 }
44 }
45 }
46
47 }
48
49
以上就是hibernate最簡單的使用