作为一个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最简单的使用