运行环境: MySQL5.6 Hibernate 4.3.7 发布版
IDE: MyEclipse for Spring
序言:
小编之前比较仓促的学习了SSH 框架并开始开发了一些小项目,因为那时候时候是看着马士兵比较旧的视频学习的,但是自己使用的4.3.7发行版。新版跟视频中的旧版配置或多或少有点出入。现在有时间重温一下Hibernate 的技术,重新加强一下自己的基础,故开始编写Hibernate 学习经验之谈一系列的文章。如果文章中有什么不妥之处,望各路大神斧正。
学习一个技术,往往最权威的教课书就是官方文档了,接下来的这一系列的博客,都会依据官方文档来进行一个学习。虽然重温,对于初学者可以尝试阅读本系列博客,希望能够给大家一些帮助。
在项目中我主要使用的配置方式是:注解配置,弱xml配置,所以对注解不太了解的博友,要靠自己补一下了,不对注解进行太多说明,毕竟这是针对个人学习过程笔记类博客。
干货;
一.配置hibernate 环境
官方文档的配置方式是采用maven 来进行搭建hibernate 环境的,但是如果现在夹杂太多hibernate 之外的知识恐怕对于不了解maven 的博友会多一点障碍,所以采用原始的手动加包的方式:
1.到官网下载开发包:
http://hibernate.org/orm/documentation/
;
2.加入lib 目录下required 文件夹下的所有包;
3.当然也不能缺少jdbc 驱动的包了;
通过以上步骤就能搭建起初步我们需要使用的Hibernate 使用环境了。
二.开始一个简单的hello world 程序
1.查看官方文档中关于配置Hibernate 的描述,并且开始配置hibernate.cfg.xml
http://docs.jboss.org/hibernate/orm/4.3/manual/en-US/html/ch01.html#tutorial-firstapp-configuration
在里面你可以得到一个怎样写一个hibernate.cfg.xml 的文档应该怎样写,copy it!新建一个hibernate.cfg.xml 放到你的项目src 目录下面中去,然后进行修改,以满足自己的需求。
我的项目结构
(1)修改我们的jdbc 链接信息
这里的话我们使用jdbc 来做链接,所以按 jdbc 的写法填写内容就行了。
里面有关于数据库访问设置的内容:
(2)修改我们的本地数据库的方言
方言是指,当你使用HQL(hibernate的官方查询语言)进行查询的时候,hibernate 会帮你自动转换成你所用的数据库的语言。其中使用的值的话可以参考官方文档
http://docs.jboss.org/hibernate/orm/4.3/manual/en-US/html/ch03.html#configuration-optional-dialects
其中可以看到MySQL 就有很多种,在官方文档中似乎没有对其中的信息进行说明,我们可以通过网上一篇博客了解一下其中的区别
(3)方便调试的属性配置 show_sql 和format_sql
show_sql是当执行sql语句的时候,展示出来,fomat_sql 是把输出的语句进行格式化一下。
(4)hibernate 的hbm2ddl 配置
这个配置是有create,update,create-drop ;
http://docs.jboss.org/hibernate/orm/4.3/manual/en-US/html/ch03.html#configuration-optional
这里面有官方的简单解释,但是其中的区别是什么最好动手验证看看。
官网解析:Automatically validates or exports schema DDL to the database when the
is created. |
create —每次sessionFactory 建立好的时候,会进行自动先移除原有实体表,重新建立新的表。
update —每次建立成功sessionFactory 的时候,对原有的的表不移除,对没有的表进行新建。
常用的就是以上的内容;
(5)注解方式添加实体配置
在第一步配置环境的时候可以看到,hibernate4已经在必须的包含了注解包,我们可以直接使用这种方式开始进行实体映射。
完整的配置文件
com.mysql.jdbc.Driver
jdbc:mysql://localhost/hibernatetest
root
123456
1
org.hibernate.dialect.MySQL5Dialect
thread
org.hibernate.cache.internal.NoCacheProvider
true
true
create
2.实体映射
package com.hwj.model;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;
import sun.launcher.resources.launcher;
@Table(name="t_teacher")
@Entity
public class Teacher {
private int id;
private String name;
private String title;
@Id
@GeneratedValue
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
}
3.获取sessionFactory 的工具类
package com.hwj.utils;
import org.hibernate.SessionFactory;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import org.hibernate.cfg.Configuration;
public class HibernateUtil {
private static final SessionFactory sessionFactory = buildSessionFactory();
private static SessionFactory buildSessionFactory() {
try {
Configuration configuration=new Configuration().configure();
return configuration.buildSessionFactory(
new StandardServiceRegistryBuilder()
.applySettings(configuration.getProperties())
.build() );
}
catch (Throwable ex) {
// Make sure you log the exception, as it might be swallowed
System.err.println("Initial SessionFactory creation failed." + ex);
throw new ExceptionInInitializerError(ex);
}
}
public static SessionFactory getSessionFactory() {
return sessionFactory;
}
}
4..测试代码
import org.hibernate.Hibernate;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import org.hibernate.cfg.Configuration;
import org.hibernate.service.ServiceRegistry;
import org.hibernate.service.ServiceRegistryBuilder;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import com.hwj.model.Teacher;
import com.hwj.utils.HibernateUtil;
public class MainTest {
private Session session;
private SessionFactory sessionFactory;
//当调用Test注解的方法前调用
@Before
public void init(){
this.sessionFactory=HibernateUtil.getSessionFactory();
this.session=this.sessionFactory.getCurrentSession();
this.session.beginTransaction();
}
@Test
/** 向数据库中插入一个实体对象*/
public void add(){
Teacher teacher =new Teacher();
teacher.setName("李四");
teacher.setTitle("经理");
this.session.save(teacher);}
//当结束对Test方法后的时候调用
@After
public void destory(){
session.getTransaction().commit();
sessionFactory.close();
}
}