一  映射文件User.hbm.xml

定义了持久化类实例是如何存储和加载的,这个文件定义了持久化类和表的映射。

根据映射文件,Hibernate可以生成足够的信息以产生所有的SQL语句,也就是类的实例进行插入,更新,删除和查询所需要的SQL语句。

二  配置文件hibernate.cfg.xml(另外一种格式是hibernate.properities)

Hibernate配置文件:配置数据库连接以及Hibernate运行时所需要的各个属性的值。两种格式的文件是等价的,同时存在的的话xml的会覆盖properties的。

xml相比properties的优势:XML格式的文件更易于修改,配置能力更强;当改变底层应用配置时不需要改变和重新编译代码,由hibernate自动加载,而properties就没有这个优势。

常见配置属性:

   (1) Hibernate JDBC属性

        访问DB,要获得JDBC连接,所以需要有JDBC连接属性:    JDBC驱动, URL, 用户名, 密码, 连接池个数(pool_size)

(2) hibernate.dialect属性

         不同SQL数据库的SQL语言有一定的差异,为了让hibernate对不同的DB产生合适的SQL,需要指定方言。Hibernate会根据JDBC返回的metadata得到正确的方言。

    (3) hibernate.show_sql

         SQL语句输出到控制台,方便调试。

    (4) 映射文件列表

          包含xxx.hbm.xml文件

三: HibernateUtil.java

要启动hibernate需要创建一个SessionFactory对象。SessionFactory是一个线程安全的对象,只能被实例化一次,可以被多个线程共享。使用SessionFactory可以获得Session的一个或多个实例。package cn.jbit.auction.dao;import org.hibernate.Session;import org.hibernate.SessionFactory;

Session是持久化操作的基础,为持久化对象提供CURD操作。

Hibernate在处理session的时候使用延迟加载机制,在真正访问DB的时,才从连接池中获取数据库连接。

Session不是线程安全的,所以这里使用了Thread Local模式。

import org.hibernate.cfg.Configuration;

public class HibernateUtil {
// 初始化一个ThreadLocal对象
private static final ThreadLocal sessionTL = new ThreadLocal(); // Session每个线程有一个session的副本,线程之间不影响。 // configuration 和 SessionFactory都是静态的,只能实例化一次
private static Configuration configuration;
private final static SessionFactory sessionFactory;
static {
try {
configuration = new Configuration().configure();
sessionFactory = configuration.buildSessionFactory();
} catch (Throwable ex) {
throw new ExceptionInInitializerError(ex);
}
}
public static Session currentSession() {
//sessionTL的get()方法根据当前线程返回其对应的线程内部变量,
//也就是我们需要的Session,多线程情况下共享数据库连接是不安全的。
//ThreadLocal保证了每个线程都有自己的Session。
Session session = (Session) sessionTL.get();
// 如果session为null,则打开一个新的session
// 如下的标为红色的代码不需要加锁,不需要双重判断,因为session本身是线程局部变量了,不存在多线程的问题。
if (session == null) {
//创建一个数据库连接对象session。
session = sessionFactory.openSession();
// 保存该数据库连接session到ThreadLocal中。
sessionTL.set(session);
}
//如果当前线程已经访问过数据库了,
//则从sessionTL中get()就可以获取该线程上次获取过的数据库连接对象。
return session;
}
/**
* 关闭Session
*/
public static void closeSession(){
Session session = (Session) sessionTL.get();
sessionTL.set(null);
session.close();
}
}

四 编写Dao(Data Access Object)接口

Dao模式是标准的J2EE模式:

(1) 一个Dao接口

(2) 一个实现Dao接口的具体类

(3) 一个Dao工厂类

(4) 数据传递对象,主要是POJO

Dao接口定义了所有的CURD操作。Dao实现类实现了接口中定义的方法。

UserDAOImple.java的的一部分代码如下:

public void  save(User user)
{
Session session = HibernateUtil.getSession();
Transaction tx = session.beginTransaction();
try {
session.save(user);
tx.commit();
} catch(Exception e) {
tx.rollback;
}
finally {
HibernatenateUtil.closeSession();
}
}

最新文章

  1. ★Kali信息收集~ 5.The Harvester:邮箱挖掘器
  2. SharePoint中使用C#跳转页面的研究
  3. struts---JSP界面验证码生成与验证
  4. ubuntu14.04网络设置
  5. 【资料分享】 OpenCV精华收藏
  6. angular-ui-router state.go not passing data to $stateParams
  7. MFG 常用英文单字
  8. Shell printf 命令
  9. AngularJS and Asp.net MVC
  10. iOS tableView的系统分割线定格设置以及分割线自定制
  11. C的函数指针与指针函数
  12. JMeter常见错误解决方法
  13. WSGI及gunicorn指北(一)
  14. 关于android app签名文件获取sha1和MD值
  15. 解决Plugin is too old,please update to a more recent version,or set ANDROID_DAILY_OVERRIDE..
  16. IOS动画(Core Animation)总结 (参考多方文章)
  17. ruby簡單的代碼行統計工具
  18. MySQL 数据库最优化设计原则
  19. 【.NET Core项目实战-统一认证平台】第四章 网关篇-数据库存储配置(2)
  20. position absolute定位之所属的containing box

热门文章

  1. java性能监控工具jcmd-windows
  2. c# vitural
  3. python(20)- 列表生成式和生成器表达式练习Ⅱ
  4. Cocos2d-x 3.0final 终结者系列教程15-win7+vs2012+adt+ndk环境搭建(无Cygwin)
  5. hdu 5316 Magician 线段树
  6. Matlab princomp函数浅析
  7. 换站点Logo图片---轻开电子商务系统(企业入门级B2C站点)
  8. java_类型强转
  9. Erlang function guards NOTE
  10. RTSP/RTMP/HLS/HTTP流媒体播放器EasyPlayer