在基于MVC设计模式的JAVA WEB应用中 Hibernate可以作为模型层/数据访问层 它通过配置文件(hibernate properties或hibernate cfg xml)和映射文件(*** hbm xml)把JAVA对象或PO(Persistent Object 持久化对象)映射到数据库中的数据库 然后通过 *** 作PO 对数据表中的数据进行增 删 改 查等 *** 作
除配置文件 映射文件和持久化类外 Hibernate的核心组件包括以下几部分
a)Configuration类 用来读取Hibernate配置文件 并生成SessionFactory对象
b)SessionFactory接口 产生Session实例工厂
c)Session接口 用来 *** 作PO 它有get() load() save() update()和delete()等方法用来对PO进行加载 保存 更新及删除等 *** 作 它是Hibernate的核心接口
d)Query接口 用来对PO进行查询 *** 它可以从Session的createQuery()方法生成
e)Transaction接口 用来管理Hibernate事务 它主要方法有mit()和rollback() 可以从Session的beginTrancation()方法生成
Persistent Object
持久化对象可以是普通的Javabeans 惟一特殊的是它们与(仅一个)Session相关联 JavaBeans在Hibernate中存在三种状态
临时状态(transient):当一个JavaBean对象在内存中孤立存在 不与数据库中的数据有任何关联关系时 那么这个JavaBeans对象就称为临时对象(Transient Object)
持久化状态(persistent):当一个JavaBean对象与一个Session相关联时 就变成持久化对象(Persistent Object)
脱管状态(detached):在这个Session被关闭的同时 这个对象也会脱离持久化状态 就变成脱管状态(Detached Object) 可以被应用程序的任何层自由使用 例如可以做与表示层打交道的数据舆对象(Data Transfer Object)
Hibernate的运行过程
Hibernate的运行过程如下
A:应用程序先调用Configration类 该类读取Hibernate的配置文件及映射文件中的信息 并用这些信息生成一个SessionFactpry对象
B:然后从SessionFactory对象生成一个Session对象 并用Session对象生成Transaction对象可通过Session对象的get() load() save() update() delete()和saveOrUpdate()等方法对PO进行加载 保存 更新 删除等 *** 作在查询的情况下 可通过Session对象生成一个Query对象 然后利用Query对象执行查询 *** 作如果没有异常 Transaction对象将提交这些 *** 作结果到数据库中
Hibernate简单示例
数据
create table T_register
(
id int primary key
userName varchar( )
userPwd varchar( )
sex varchar( )
age int
)
视图层 注册页面register jsp
用户名
密 码
性 别
年 龄
设计持久化类TRegister java
package hibernate PO
/**
* 持久化类
*/
public class TRegister implements java io Serializable {
// Fields
private Integer id
private String userName
private String userPwd
private String sex
private Integer age
// Constructors
/** default constructor */
public TRegister() {
}
/** minimal constructor */
public TRegister(Integer id) {
this id = id
}
/** full constructor */
public TRegister(Integer id String userName String userPwd String sex Integer age) {
this id = id
this userName = userName
this userPwd = userPwd
this sex = sex
this age = age
}
// Property accessors
public Integer getId() {
return this id
}
public void setId(Integer id) {
this id = id
}
public String getUserName() {
return this userName
}
public void setUserName(String userName) {
this userName = userName
}
public String getUserPwd() {
return this userPwd
}
public void setUserPwd(String userPwd) {
this userPwd = userPwd
}
public String getSex() {
return this sex
}
public void setSex(String sex) {
this sex = sex
}
public Integer getAge() {
return this age
}
public void setAge(Integer age) {
this age = age
}
}
设计Hibernate配置文件hibernate cfg xml
//Hibernate/Hibernate Configuration DTD //EN
configuration dtd >
root
jdbc:mysql://localhost: /study
hibernate dialect MySQLDialect
MySQL
root
gjt mm mysql Driver
true
设计映射文件TRegister hbm xml
mapping dtd >
设计hibernate基础类HibernateUtil java
package hibernate
/**
* hibernate 基础类
* @author fengyan
* date :
*/
import hibernate HibernateException
import hibernate Session
import hibernate SessionFactory
import hibernate cfg Configuration
public class HibernateUtil {
private static final SessionFactory sessionFactory
static
{
try
{
Configuration config = new Configuration(nfigure( /hibernate/hibernate cfg xml )
sessionFactory = config buildSessionFactory()
}
catch(Throwable e)
{
throw new ExceptionInInitializerError(e)
}
}
public static final ThreadLocal session = new ThreadLocal()
public static Session currentSession() throws HibernateException
{
Session s = (Session)session get()
//Open a new Session if this Thread has none yet
if(s == null || !s isOpen())
{
s = sessionFactory openSession()
session set(s)
}
return s
}
public static void closeSession() throws HibernateException
{
Session s = (Session)session get()
session set(null)
if(s != null)
s close()
}
}
设计控制类
package hibernate servlet
/**
* @author fengyan
* date :
* 设计Hibernate控制类
*/
import hibernate HibernateUtil
import hibernate PO TRegister
import java io IOException
import java io PrintWriter
import javax servlet ServletException
import javax servlet HttpServlet
import javax servlet HttpServletRequest
import javax servlet HttpServletResponse
import hibernate HibernateException
import hibernate Session
import hibernate Transaction
public class RegisterServlet extends HttpServlet {
private static final String CONTENT_TYPE = text/charset=GBK
public void init() throws ServletException {
// Put your code here
}
public void destroy() {
super destroy()// Just puts destroy string in log
// Put your code here
}
public void doGet(HttpServletRequest request HttpServletResponse response)
throws ServletException IOException {
response setContentType(CONTENT_TYPE)
request setCharacterEncoding( GBK )
PrintWriter out = response getWriter()
String userName = request getParameter( userName )
String userPwd = request getParameter( userPwd )
String sex = request getParameter( sex )
int age = Integer parseInt(request getParameter( age ))
TRegister rg = new TRegister()
rg setAge(age)
rg setSex(sex)
rg setUserName(userName)
rg setUserPwd(userPwd)
Session session = HibernateUtil currentSession()//生成Session实例
Transaction tx = session beginTransaction()
try
{
session save(rg)//保存持久类对象
mit()//提交到数据库
session close()
response sendRedirect( registerOK jsp )
}
catch(HibernateException e)
{
e printStackTrace()
tx rollback()
}
}
public void doPost(HttpServletRequest request HttpServletResponse response)
throws ServletException IOException {
doGet(request response)
}
lishixinzhi/Article/program/Java/ky/201311/281441)一个总体用的hibernate.cfg.xml,比如设置数据库用户名、密码、常量、映射文件位置等等信息的地方,这个文件整个hibernate项目只用一个就可;
2)每个实体映射都有一个***.hbm.xml文件,即实体映射文件,里面写的是数据库和实体类的映射配置,包含关系映射或继承映射等等;比如Student.java实体类就用Student.hbm.xml这个映射文件;所以一个hibernate项目往往有多个配置文件。不过这些配置也可以以注解(Annotation)形式写在实体类里面。hibernate支持标准的JPA标准注解。
Hibernate加载配置文件的两种方法:(一):configuration.configure()(默认加载src下的hibernate.cfg.xml文件)
代码:
private static SessionFactory sf = null static{
Configuration configuration = new Configuration()
configuration.configure()
sf = configuration.buildSessionFactory()
}
如果使用了这种加载方法那么在hibernate.cfg.xml文件中就需要mapping XX.hbm.xml文件了
代码:
<session-factory>
<mapping resource="domain/Students.hbm.xml"/>
<mapping resource="domain/Techer.hbm.xml"/></session-factory>
第二种方法使用的是con.addClass(class)方法
在test类中代码:
private static SessionFactory sf = null static{
Configuration configuration = new Configuration()
configuration.configure()
configuration.addClass(Techer.class)
configuration.addClass(Students.class)
sf = configuration.buildSessionFactory()
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)