初试Hibernate
最近在学Hibernate,感觉到非常神奇,一般我们操作数据库是通过jdbc,和sql语句。但是Hibernate却通过对象来操作。
重所周知,Hibernate属于一个持久化ORM(Object/Relation Mapping)框架,他将数据库和对象做了一个映射。下面我们通过一个实例来了解 如下图
1 导入相关的Hibernate jar包 (我用的是HIbernate4.2.21),只需导入required文件下的所有
jar包,另外还要导入mysql-connector-java-5.0.8-bin.jar(用来连接数据库)。Hibernate实质封装了jdbc的一系列方法。
2 创建web project
3 创建com.bean包,并写一个Student类实现其中的get,set方法和构造方法
4
5 Student.java的代码
public class Student {
private int id;
private String name;
private String grade;
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 getGrade() {
return grade;
}
public void setGrade(String grade) {
this.grade = grade;
}
public Student() {
super();
// TODO Auto-generated constructor stub
}
@Override
public String toString() {
return "Student [id=" + id + ", name=" + name + ", grade=" + grade
+ "]";
}
}
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 name="foo">
<!-- 数据库连接 用的是MySQL-->
<property name="connection.driver_class">
com.mysql.jdbc.Driver
</property>
<!-- 数据库连接类型方式url -->
<property name="connection.url">
jdbc:mysql://localhost:3306/wang
</property>
<!--数据库连接名字,密码 -->
<property name="connection.username">root</property>
<property name="connection.password">123456</property>
<!--数据库方言(必须的) -->
<property name="dialect">org.hibernate.dialect.MySQLDialect</property>
<!-- 是否打印数据库语句在控制台 true or false -->
<property name="show_sql">true</property>
<!-- 映射文件路径 通过此配置找到对应的xml-->
<mapping resource="com/bean/student.hdm.xml" />
</session-factory>
</hibernate-configuration>
student.hdm.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<!-- Class name代表加载的类的bean,table代表数据库中的表 -->
<class name="com.bean.Student" table="student">
<!--id name="id" 这个id必须与javabean中的对应的实体类名字要一至-->
<id name="id" column="id" type="int"> <!-- 持久化类的唯一标识 generator class="native" native:主键生成方式会根据不同的底层数据库自动选择Identity、Sequence、Hilo主键生成方式 -->
<generator class="native"></generator>
</id>
<property name="name" type="string" not-null="true" length="50"
lazy="true">
<column name="name"></column><!-- 数据库中的列名字 -->
</property>
<property name="grade" type="string">
<column name="grade"></column>
</property>
</class>
</hibernate-mapping>
HibernateUtil.java 这个类是用来初始化SessionFactory和生成Session的
package com.bean;
import org.hibernate.*;
import org.hibernate.cfg.*;
public class HibernateUtil {
private static final ThreadLocal<Session> THREAD_LOCAL = new ThreadLocal<Session>();
private static SessionFactory sessionFactory = null;//创建一个会话工厂
static {
try {
Configuration cfg = new Configuration().configure();//加载Hibernate配置文件
//在4.0以上应该加载一个ServiceRegistry 接口
ServiceRegistry sregistry = new ServiceRegistryBuilder().applySettings(cfg.getProperties()).builderServiceRegister();
sessionFactory = cfg.buildSessionFactory(sregistry);//初始化静态工厂
} catch (Exception e) {
System.out.println("创建会话工厂失败");
e.printStackTrace();
}
}
public static Session getSession() throws HibernateException {
Session session = (Session) THREAD_LOCAL.get();//创建session
if (session == null || !session.isOpen()) {//判断是否为空或者session是否开启
if (sessionFactory == null) {
rebuildSessionFactory();//session为空,重建会话工厂
}
session = (sessionFactory != null) ? sessionFactory.openSession()
: null;
//将session保存到THREAL_LOCAL中
THREAD_LOCAL.set(session);
}
return session;
}
/*
* 重建会话工厂
*/
public static void rebuildSessionFactory() {
try {
Configuration cfg = new Configuration().configure();
ServiceRegistry sregistry = new ServiceRegistryBuilder().applySettings(cfg.getProperties()).builderServiceRegister();
sessionFactory=cfg.buildSessionFactory(sregistry);
} catch (Exception e) {
System.out.println("创建会话工厂失败");
e.printStackTrace();
}
}
public static void closeSession() throws HibernateException{
Session session=(Session)THREAD_LOCAL.get();
THREAD_LOCAL.set(null);
if(session!=null){
session.close(); //关闭session
}
}
}
StudentTest.java 该类用来测试
public class StudentTest {
public void create(){
//代码生成表
Configuration cfg = new Configuration().configure();
SchemaExport se = new SchemaExport(cfg);
se.create(true, true);
}
public static void main(String[] args){
Student st=new Student();
st.setName("小明");
st.setGrade("80");
Session session=HibernateUtil.getSession();
Transaction t = session.beginTransaction();
session.save(st);
t.commit();
}
}
接下来是测试
以上就是一个完整的简单的Hibernate 程序。