一、Hibernate简介
1、什么是Hibernate?
Hibernate是数据持久层的一个轻量级框架。数据持久层的框架有很多比如:iBATIS,myBatis,Nhibernate,Siena等等。并且Hibernate是一个开源的orm(Object relations mapping)框架,提供了查询获取数据的方法,用面向对象的思想来操作数据库,节省了我们开发处理数据的时间。
2、Hibernate的优点
1)、使用简介的hql语句(Hibernate query language)。可以不使用传统的insert,update等sql语句。比如insert一个对象,原来的做法是:insert into 表名称 alue(值1,值2,值3,……),而现在的做法是:save(对象)。
2)、使用or映射。对象到关系数据库之间的映射。是从对象的角度操作数据库,再次体现了面向对象思想。原来的实体抽取方法:首先有了表,然后表映射实体对象。而现在Hibernate做法是:直接由对象映射到表。
3)、没有侵入性,移植性比较好。什么是没有侵入性?就是Hibernate采用了pojo对象。所谓的pojo对象就是没有继承Hibernate类或实现Hibernate接口。这样的话,此类就是一个普通的java类,所以移植性比较好。
4)、支持透明持久化。透明是针对上层而言的。三层架构的理念是上层对下层的依赖,只是依赖接口不依赖具体实现。而Hibernate中的透明是指对业务逻辑层提供了一个接口session,而其他的都封装隐藏。持久化是指把内存中的数据存放到磁盘上的文件中。
3、当然一个事物,不可能十全十美,即使如此优秀的Hibernate也有自己的弱点。比如:若是大量数据批量操作。则不适合使用Hibernate。并且一个持久化对象不能映射到多张表中。
4、Hibernate中5个核心接口
1)、Configuration接口:负责配置及启动Hibernate,用来创建sessionFactory
2)、SessionFactory接口:一个SessionFactory对应一个数据源存储,也就是一个数据库对应一个SessionFactory。SessionFactory用来创建Session对象。并且SessionFactory是线程安全的,可以由多个线程访问SessionFactory共享。
3)、Session接口:这个接口是Hibernate中常用的接口,主要用于对数据的操作(增删改查)。而这个Session对象不是线程安全的。不能共享。
4)、Query接口:用于数据库的查询对象。
5)、Transaction接口:Hibernate事务接口。它封装了底层的事务操作,比如JTA(;java transcation architecture)所有的数据操作,比如增删改查都写在事务中。
二、项目相关的jar包12个:
antlr-2.7.6.jar
commons-collections-3.1.jar
dom4j-1.6.1.jar
ejb3-persistence.jar(注解必须包)
hibernate3.jar
hibernate-annotations.jar(注解必须包)
hibernate-commons-annotations.jar(注解必须包)
javassist-3.9.0.GA.jar
jta-1.1.jar
log4j-1.2.15.jar
slf4j-api-1.5.8.jar
slf4j-log4j12-1.5.8.jar
还要加入数据库的相关的JDBC驱动的jar包:mysql-connector-java-5.1.25-bin.jar(MySQL),ojdbc14.jar(Oracle)。可以到http://www.docjar.com/网站下载。
三、配置核心文件hibernate .cfg.xml
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 7 <session-factory> 8 9 <!-- Database connection settings --> 10 <!--mysql settings 11 <property name="connection.driver_class">com.mysql.jdbc.Driver</property> 12 <property name="connection.url">jdbc:mysql://localhost/hibernate</property> 13 <property name="connection.username">root</property> 14 <property name="connection.password">196691</property> 15 --> 16 <property name="connection.driver_class">oracle.jdbc.driver.OracleDriver</property> 17 <property name="connection.url">jdbc:oracle:thin:@localhost:1521:orcl</property> 18 <property name="connection.username">CYRUS</property> 19 <property name="connection.password">12345678</property> 20 21 22 <!-- JDBC connection pool (use the built-in) --> 23 <!-- <property name="connection.pool_size">1</property> --> 24 25 <!-- SQL dialect mysql settings 26 <property name="dialect">org.hibernate.dialect.MySQLDialect</property>--> 27 <!-- SQL dialect --> 28 <property name="dialect">org.hibernate.dialect.Oracle9Dialect</property> 29 30 31 <!-- Enable Hibernate's automatic session context management --> 32 <!-- <property name="current_session_context_class">thread</property> --> 33 34 <!-- Disable the second-level cache --> 35 <property name="cache.provider_class">org.hibernate.cache.NoCacheProvider</property> 36 37 38 39 <!-- Echo all executed SQL to stdout --> 40 <property name="show_sql">true</property> 41 <property name="format_sql">true</property> 42 43 44 <!-- Drop and re-create the database schema on startup --> 45 <property name="hbm2ddl.auto">create</property> 46 47 <!-- 48 <mapping resource="com/qs/hibernate/model/Student.hbm.xml" /> --> 49 <mapping class="com.cyrus.hibernate.model.Teacher" /> 50 </session-factory> 51 52 </hibernate-configuration>
三、加入log4j配置文件log4j.properties,将该配置文件拷贝到src下,便于程序调试。
### direct log messages to stdout ### log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.Target=System.out log4j.appender.stdout.layout=org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n ### direct messages to file hibernate.log ### #log4j.appender.file=org.apache.log4j.FileAppender #log4j.appender.file.File=hibernate.log #log4j.appender.file.layout=org.apache.log4j.PatternLayout #log4j.appender.file.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n ### set log levels - for more verbose logging change 'info' to 'debug' ### log4j.rootLogger=warn, stdout #log4j.logger.org.hibernate=info #log4j.logger.org.hibernate=debug ### log HQL query parser activity #log4j.logger.org.hibernate.hql.ast.AST=debug ### log just the SQL #log4j.logger.org.hibernate.SQL=debug ### log JDBC bind parameters ### #log4j.logger.org.hibernate.type=info #log4j.logger.org.hibernate.type=debug ### log schema export/update ### log4j.logger.org.hibernate.tool.hbm2ddl=debug ### log HQL parse trees #log4j.logger.org.hibernate.hql=debug ### log cache activity ### #log4j.logger.org.hibernate.cache=debug ### log transaction activity #log4j.logger.org.hibernate.transaction=debug ### log JDBC resource acquisition #log4j.logger.org.hibernate.jdbc=debug ### enable the following line if you want to track down connection ### ### leakages when using DriverManagerConnectionProvider ### #log4j.logger.org.hibernate.connection.DriverManagerConnectionProvider=trace
四、创建实体类Teacher
1 package com.cyrus.hibernate.model; 2 3 4 import javax.persistence.Column; 5 import javax.persistence.Entity; 6 import javax.persistence.GeneratedValue; 7 import javax.persistence.GenerationType; 8 import javax.persistence.Id; 9 import javax.persistence.Table; 10 11 //Entity是javax.persistence.Entity包中的 12 @Entity 13 // 映射的表名 14 @Table(name = "T_CYRUS_TEACHER") 15 public class Teacher { 16 17 private int id; 18 private int age; 19 private String name; 20 private String title; 21 22 // 主键,一般写在get方法中,而不是在定义中 23 @Id 24 @Column(name="ID",nullable=false) 25 public int getId() { 26 return id; 27 } 28 29 public void setId(int id) { 30 this.id = id; 31 } 32 33 @Column(name="AGE") 34 public int getAge() { 35 return age; 36 } 37 38 public void setAge(int age) { 39 this.age = age; 40 } 41 42 @Column(name="NAME") 43 public String getName() { 44 return name; 45 } 46 47 public void setName(String name) { 48 this.name = name; 49 } 50 51 @Column(name="TITLE") 52 public String getTitle() { 53 return title; 54 } 55 56 public void setTitle(String title) { 57 this.title = title; 58 } 59 }
五、用JUnit编写测试类
1 package com.cyrus.hibernate.model; 2 3 import static org.junit.Assert.*; 4 5 import org.hibernate.Session; 6 import org.hibernate.SessionFactory; 7 import org.hibernate.cfg.AnnotationConfiguration; 8 import org.hibernate.cfg.Configuration; 9 import org.hibernate.tool.hbm2ddl.SchemaExport; 10 import org.junit.Test; 11 12 public class TeacherTest { 13 14 @Test 15 public void test() { 16 Teacher t = new Teacher(); 17 t.setAge(30); 18 t.setName("Cyrus Joyce"); 19 t.setTitle("一个灵魂自由的人"); 20 21 //注解读取hibernate.cfg.xml 22 AnnotationConfiguration cfg = new AnnotationConfiguration().configure(); 23 24 // Configuration cfg = new Configuration(); 25 // 读取hibernate.cfg.xml中的配置 26 cfg.configure(); 27 // 获取SessionFactory 28 SessionFactory sf = cfg.buildSessionFactory(); 29 // 获取Session 30 Session session = sf.openSession(); 31 // 开启事务 32 session.beginTransaction(); 33 // 保存 34 session.save(t); 35 // 提交事务 36 session.getTransaction().commit(); 37 // 关闭连接 38 session.close(); 39 sf.close(); 40 } 41 42 }
测试通过,数据库会插入一条测试信息。
浙公网安备 33010602011771号