好记性不如烂笔头!虽然小弟身为菜鸟,但是学起hibernate毫不逊色!
这里记录一些本人学习hibernate的笔记以及学习当中自己对一些概念的理解
废话不多说了!开始吧。
首先先说说hibernate的搭建吧!至于其定义直接google得了
先看看使用hibernate的基本流程!下面是简单的流程图
第一步:创建项目
这里就不多说了!用myeclipse创建一个java project
第二部:导入hibernate到项目
myeclipse导入就不多说了!如果不是用IDE进行开发则在classpath目录
下新建一个名在lib的目录!下面列出hibernate最小的包集合
antlr.jar
cglib.jar
asm.jar
asm-attrs.jars
commons-collections.jar
commons-logging.jar
ehcache.jar
hibernate3.jar
jta.jar
dom4j.jar
log4j.jar
这些jar文件是保存在hibernate文件夹的lib目录下,把他拷到项目中就可以了
第三步: 配置hibernate
hibernate的配置有两种形式!一种是使用hibernate.properties文件!另一种
是使用hibernate.cfg.xml文件!这里我们使用hibernate.cfg.xml进行配置
下面给出hibernate.cfg.xml文件的基本配置信息
<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<!-- 数据库连接信息 -->
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="connection.url">jdbc:mysql://localhost:3306/test</property>
<property name="connection.username">root</property>
<property name="connection.password">6813229</property>
<property name="connection.pool_size">1</property>
<!-- 数据库方言 -->
<property name="dialect">org.hibernate.dialect.MySQLDialect</property>
<property name="current_session_context_class">thread</property>
<property name="cache.provider_class">org.hibernate.cache.NoCacheProvider</property>
<!-- 打印SQL语句 -->
<property name="show_sql">true</property>
<!-- 打开hbm2ddl.auto选项将自动生成数据库模式 -->
<!-- <property name="hbm2ddl.auto">create</property> -->
<!-- 所有映射到hibernate的实体类配置 -->
<mapping resource="entity/entity1.hbm.xml"/>
<mapping resource="entity/entity2.hbm.xml"/>
</session-factory>
</hibernate-configuration>
最开始的4个property元素包含必要的JDBC连接信息!JDBC驱动和URL如果不清楚
可以参照hibernate发行文件etc目录下的hibernate.properties文件。里面列举了
各个数据库的配置信息
<property name="dialect">org.hibernate.dialect.MySQLDialect</property>
这里配置了hibernate所使用的方言!
<property name="show_sql">true</property>
这里指定hibernate打印相关操作的sql语句!这个很有用,方便我们查错
<property name="hbm2ddl.auto">create</property>
打开hbm2ddl.auto选项将自动生成数据库模型!就是由hibernate帮我们建表
和建字段的操作
<mapping resource="entity/entity1.hbm.xml"/>
<mapping resource="entity/entity2.hbm.xml"/>
这里配置所有实体类的映射文件!关于映射文件后面在具体说明
第四步: 创建实体类和映射文件
package events;
import java.util.Date;
public class Event {
private Long id;
private String title;
private Date date;
public Event() {}
public Long getId() {
return id;
}
private void setId(Long id) {
this.id = id;
}
public Date getDate() {
return date;
}
public void setDate(Date date) {
this.date = date;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
}
上面是官方文档给出的一个简单的实体类!实体类最好写成JavaBean的命名约定!即
各个属性设置其存取方法(getter and setter method)!属性设置成private的访问
权限!hibernate是通过反射机制(Reflection)来实例化实体类对象的!所以我们需要
为实体类提供一个无参的构造方法。至此实体类写完了,我们来看看实体类映射文件的配置
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
[...]
</hibernate-mapping>
这是实体类文件的基本结构
我们来为上面的实体类创建一个映射文件
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="events.Event" table="EVENTS">
<id name="id" column="EVENT_ID">
<generator class="native"/>
</id>
<property name="date" type="timestamp" column="EVENT_DATE"/>
<property name="title"/>
</class>
</hibernate-mapping>
这里列出的是简单也是最基本的配置
<class name="events.Event" table="EVENTS">
该标签配置实体类与数据库表的映射关系
name:指定实体类的类名, 包括完整的包名
table:实体类映射到数据库表的表名
<id name="id" column="EVENT_ID">
<generator class="native"/>
</id>
ID标签设置实体类的唯一标识符(主键)
name:指定使用实体类的哪个属性作为唯一标识符
column:与之对应的数据库字段
嵌套的generator标签指定了标识符生成策略,在这里我们指定native
它根据已配置的数据库(方言)自动选择最佳的标识符生成策略
<property name="date" type="timestamp" column="EVENT_DATE"/>
<property name="title"/>
默认情况下,类里面的属性都被视为非持久化的
如果要持久化某个字段则必须配置用property标签进行配置
name:指定需要持久化实体类的属性名
column:与之对应的数据库字段
type:与之对应的SQL字段类型
这里title属性没有配type和column属性。如果没有配置column属性,hibernate会
自动以该属性名作为字段名在数据库中进行创建和查找。如果没有配置type属性!
hibernate会自动将该字段的Java数据类型转换到SQL数据类型,反之亦然。在某些情况
下这个自动检测机制(在Java 类上使用反射机制)不会产生你所期待或需要的缺省值。
date属性就是个很好的例子,Hibernate无法知道这个属性(java.util.Date类型的)
应该被映射成:SQL date,或timestamp,还是time 字段。在此例中,把这个属性
映射成timestamp 转换器
最后把该文件命名为 "实体类名.hbm.xml"放到与实体类同一目录下!该文件的实体类名可以
随意命名,但是"hbm.xml"的后缀是必须的。但是这样的命名约定是大家约定俗成的
第五步:创建SessionFactory对象
public class HibernateUtil {
private static final SessionFactory sessionFactory;
static {
try {
// 从 hibernate.cfg.xml读取先关信息来创建 SessionFactory
sessionFactory = new Configuration().configure().buildSessionFactory();
} catch (Throwable ex) {
System.err.println("Initial SessionFactory creation failed." + ex);
throw new ExceptionInInitializerError(ex);
}
}
public static SessionFactory getSessionFactory() {
return sessionFactory;
}
}
上面代码略去导入包名
第六步:获取Session对象进行相关操作
public class EventManager {
public static void main(String[] args) {
EventManager mgr = new EventManager();
if (args[0]!=null && !args[0].equals("list")) {
mgr.createAndStoreEvent(args[0], new Date());
}
else if (args[0].equals("list")) {
List events = mgr.listEvents();
for (int i = 0; i < events.size(); i++) {
Event theEvent = (Event) events.get(i);
System.out.println("Event: " + theEvent.getTitle() +
" Time: " + theEvent.getDate());
}
}
HibernateUtil.getSessionFactory().close();
}
private void createAndStoreEvent(String title, Date theDate) {
//获得当前Session
Session session = HibernateUtil.getSessionFactory().getCurrentSession();
//开启事务
session.beginTransaction();
//创建一个Event对象
Event theEvent = new Event();
theEvent.setTitle(title);
theEvent.setDate(theDate);
//保存Event对象实体
session.save(theEvent);
//提交事务
session.getTransaction().commit();
}
}
上面代码略去导入包名
至此一个最基本的hibernate的配置和操作就完成了。这是我在看官方文档之后做的笔记
一些概念的理解可能有错误。如果哪位朋友不幸看到此文并发现其中的错误请给我留个言!
大家互相学习互相进步!