您的位置:首页 > 运维架构 > 网站架构

javaEE之Hibernate架构之数据库连接工具模版制作

2017-08-14 13:50 513 查看
O/R Mapping

对象关系映射(ORM)技术,操纵数据库 通过使用描述对象和数据库之间映的射元数据将java程序中的对象自动持久化到数据库

在对数据库操纵时需要写mapping文件

如<class User>
<column >
</class>


然后通过session.save(user)就能不用写sql语句,自动把user存到数据库

类似工具还有mybatis(更灵活)

Hibernate是一个开放源码的、非常优秀、成熟的O/R Mapping框架。它提供了强大、高性能的Java对象和关系数据的持久化和查询功能。

Hibernate 只是一个将持久化类与数据库表相映射的工具,每个持久化类实例均对应于数据库表中的一条数据行。可以使用面向对象的方法操作此持久化类实例,完成对数据库表的插入、删除、修改等操作。

利用Hibernate操作数据库,我们通过应用程序经过Hibernate持久层来访问数据库,其实Hibernate完成了以前JDBC的功能,不过Hibernate使用面向对象的方法操作数据库。

Hibernate体系结构:



Hibernate入门示例。

第1步: 先建一个Java工程导入使用Hibernate最小必要包。可以到网站下载Hibernate最新的包,如果访问数据库,则需要导入数据库驱动包。最小必要包:



第2步:在src创建配置文件hibernate.cfg.xml,放置在src目录中。

第3步:编写一个会话工厂类。通过会话工厂类产生一个会话Session对象。Session对象是Hibernate的核心。任何对数据库操作都在会话中进行的。

第4步:编写POJO类以及映射文件。

第5步:编写测试文件

一个完整示例,显示了Hibernate编程基本思路。

我们需要建立值对象和它的配置文件:

package cn.hncu.demo.domain;

public class Student {
private String studId;
private String studName;
private Integer age;
private String deptId;

public String getstudId() {
return studId;
}

public void setstudId(String studId) {
this.studId = studId;
}

public String getstudName() {
return studName;
}

public void setstudName(String studName) {
this.studName = studName;
}

public Integer getAge() {
return age;
}

public void setAge(Integer age) {
this.age = age;
}

public String getDeptId() {
return deptId;
}

public void setDeptId(String deptId) {
this.deptId = deptId;
}

}


<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="cn.hncu.demo.domain">
<class name="Student" table="students" catalog="hib">
<!-- id标记是指Student类中的属性变量,该属性是对应表主键字段的 -->
<id name="studId" type="java.lang.String">
<!-- column标记是指数据库表中的哪一列(字段) -->
<column name="id" length="8"></column>
</id>
<!-- 其他字段都用property 只有主键用id -->
<property name="studName" type="java.lang.String">
<column name="name" length="40"></column>
</property>
<property name="age" type="java.lang.Integer">
<column name="age"></column>
</property>
<property name="deptId" type="java.lang.String">
<column name="deptId" length="8"></column>
</property>
</class>
</hibernate-mapping>


hibernate.cfg.xml

<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://www.hibernate.org/dtd/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://127.0.0.1:3306/hib</property>
<property name="connection.username">root</property>
<property name="connection.password">1234</property>
<!-- SQL dialect方言 -->
<property name="dialect">org.hibernate.dialect.MySQLDialect</property>

<!-- 一定要把我们写的对象映射文件配置进来,否则没法使用hibernate的ORM功能 -->
<mapping resource="cn/hncu/demo/domain/Student.hbm.xml" />
</session-factory>
</hibernate-configuration>


我们采用线程池获取方式包装hibernate获取服务器连接操作的sesssion对象

也就是我们以后可以直接拿来用的工具模版

package cn.hncu.demo.util;

import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.boot.registry.StandardServiceRegistry;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import org.hibernate.cfg.Configuration;

public class HibernateUtil {
private static SessionFactory sessionFactory = null;
private static ThreadLocal<Session> t = new ThreadLocal<Session>();

static {
try {
Configuration config = new Configuration().configure();
StandardServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder()
.applySettings(config.getProperties()).build();
sessionFactory = config.buildSessionFactory(serviceRegistry);
} catch (Throwable e) {
throw new ExceptionInInitializerError(e);
}
}

public static Session getSession() throws HibernateException {
Session session = t.get();
// 如果连session都拿不到,则session为null,则返回null
// 如果拿到session没有开启,则将session开启
if (null == session || !session.isOpen()) {
session = (sessionFactory != null) ? sessionFactory.openSession()
: null;
t.set(session);
}
return session;
}

public static SessionFactory getSessionFactory() {
return sessionFactory;
}

// 关闭与数据库的会话
public static void closeSession() throws HibernateException {
t.set(null);
}
}


然后就能进行操作了:

package cn.hncu.demo;

import org.hibernate.Session;

import cn.hncu.demo.domain.Student;
import cn.hncu.demo.util.HibernateUtil;

//Hibernate中session是不能关也关不了的
public class StudentManager {

public static void main(String[] args) {
Session session = HibernateUtil.getSession();
// 开启事务
session.beginTransaction();

Student stu = new Student();
stu.setstudId("S006");
stu.setstudName("jack");
stu.setAge(22);
stu.setDeptId("p002");
session.save(stu);
session.getTransaction().commit();// 事务提交(如果出异常,hibernate会帮我们回滚的)

}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: