分享web开发知识

注册/登录|最近发布|今日推荐

主页 IT知识网页技术软件开发前端开发代码编程运营维护技术分享教程案例
当前位置:首页 > 技术分享

Hibernate5配置与使用具体解释

发布时间:2023-09-06 01:41责任编辑:蔡小小关键词:配置Hibernate
???????????????????????????
???????????????????????

转载请注明出处:http://blog.csdn.net/tyhj_sf/article/details/51851163

引言

Hibernate是一个轻量级的持久层开源框架,它是连接java应用程序和关系数据库的中间件,负责java对象和关于Hibernate内部对JDBC API进行封装,负责java对象的持久化。由于他封装了所有的数据訪问细节,使的业务逻辑层开发专注于实现,它是一种优秀的ORM映射工具,提供了完好的对象–关系映射服务。开发过程不依赖容器。灵活性非常大,开源无缝集成到不论什么一个java系统中。

Hibernate5配置

版本号


这里是下载地址:http://hibernate.org/orm/
涉及到訪问数据库还须要数据库驱动器相关的jar包:

搭建使用hibernate的开发环境

你能够创建一个Java project或者一个web project。以上的方式创建的项目均可測试hibernate环境。
本次以创建一个web工程的方式演示搭建开发环境的具体步骤。


1)创建一个web项目。

2)将相关hibernate的包和数据库驱动器的包导入到例如以下图路径:

注意:hibernate的jar包,选择例如以下指定路径下的所有jar将其导入。

3)(在线安装eclipse的插件:hibernate tools。方便编辑”.cfg.xml”和“hbm.xml”格式的文件。安装方法若不熟可自行Google或百度,非本文重点。不再细说。


在src目录创建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> ???????<property name="hibernate.dialect">org.hibernate.dialect.MySQL5InnoDBDialect</property> ???????<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property> ???????<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/hb</property> ???????<property name="hibernate.connection.username">root</property> ???????<property name="hibernate.connection.password">root</property> ???????<property name="hibernate.hbm2ddl.auto">update</property> ???????<mapping resource="com/example/domain/User.hbm.xml"/> ???</session-factory></hibernate-configuration>

上面这个配置文件主要是数据库连接的相关配置,仅仅要配置成你自己的数据库设置就可以。


对于这个maping属性:

<mapping resource="com/example/domain/User.hbm.xml"/>

在你创建完以下的步骤 4和5后,就能够补上,假设有多个javabean类及相应的 **.hbm.xml文件。就须要加入多个这种maping属性。

4)创建你的项目中的javabean类,如User.java

public class User implements Serializable{ ???/** ????* ?????*/ ???private static final long serialVersionUID = 2015771159L;// ?@Id// ?@Basic(fetch=FetchType.EAGER)// ?@GeneratedValue(strategy=GenerationType.AUTO) ???private Long id;// ?@Basic(fetch=FetchType.LAZY)// ?@Column(length=50) ???private String emailName;// ?@Basic(fetch=FetchType.LAZY)// ?@Column(length=50) ???private String emailPassword; ???public User() { ???????// TODO Auto-generated constructor stub ???} ???public Long getId() { ???????return id; ???} ???public void setId(Long id) { ???????this.id = id; ???} ???public String getEmailName() { ???????return emailName; ???} ???public void setEmailName(String emailName) { ???????this.emailName = emailName; ???} ???public String getEmailPassword() { ???????return emailPassword; ???} ???public void setEmailPassword(String emailPassword) { ???????this.emailPassword = emailPassword; ???} ???@Override ???public int hashCode() { ???????return id != null ?

id.hashCode() : 0; ???} ???@Override ???public boolean equals(Object o) { ???????if ( this == o ) { ???????????return true; ???????} ???????if ( !( o instanceof User ) ) { ???????????return false; ???????} ???????if ( id == null ) { ???????????return false; ???????} ???????return id.equals( ((User) o).id ); ???} ???@Override ???public String toString() { ???????// TODO Auto-generated method stub ???????return super.toString()+"[id="+id+"EmailName="+emailName+"EmailPassword="+emailPassword+"]"; ???}

5)编写数据库表及字段到javabean类User的映射文件。

这个样例中必须创建为文件名称:User.hbm.xml,能够放User类所在包中。

<?xml version="1.0"?

><!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" ??????????????????????????????????"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"><!-- Generated 2016-7-8 1:31:59 by Hibernate Tools 3.4.0.CR1 --><hibernate-mapping> <class name="com.example.domain.User" table="USER"> ?<id name="id" type="java.lang.Long"> ??<column name="ID" not-null="true"/> ??<generator class="increment"/> ?</id> ?<property generated="never" lazy="false" name="emailName" type="java.lang.String"> ??<column length="50" name="EMAILNAME" not-null="false"/> ?</property> ?<property generated="never" lazy="false" name="emailPassword" type="java.lang.String"> ??<column name="EMAILPASSWORD"/> ?</property> </class></hibernate-mapping>

Hibernate5的使用

接着上述的几节内容。我来说说做关键部分,hibernate的使用。

这一部分我建议看看hibernate的官方文档。毕竟网上的样例各种hibernate版本号的样例都有。不同版本号提供的接口不同,用法也有非常多差别,并且最新的hibernate版本号的使用demo非常难找到。

基本使用思路

**在使用Hibernate运行持久化操作前。须要得到一个Session对象。有了Session对象,就能够以面向对象的方式保存、获取、更新和删除对象。
Session对象能够通过SessionFactory(会话工厂类)的openSession方法来获得。


因此还须要获取SessionFactory对象**,它通过例如以下方式获得:

final StandardServiceRegistry registry = new StandardServiceRegistryBuilder() ?????????????.configure() // 默认使用src目录下的hibernate.cfg.xml进行配置,若更改了路径,要附加上包路径如:"/com/example/hibernate.cfg.xml" ????????????.build(); ?????try { ?????????sessionFactory = new MetadataSources( registry ).buildMetadata().buildSessionFactory(); ?????} ?????catch (Exception e) { ?????????StandardServiceRegistryBuilder.destroy( registry ); ?????} 

或者通过例如以下方式获得:

Configuration configuration = new Configuration();// 默认使用src目录下的hibernate.cfg.xml进行配置,若更改了路径。要附加上包路径如:"/com/example/hibernate.cfg.xml" ????????SessionFactory sf = configuration.configure().buildSessionFactory(); ???????Session session = sf.openSession();

使用Junit測试搭建的hibernate开发环境

注意測试function中示范了hibernate的用法,这能够用在实际的开发项目中。
Userdao.java的完整源代码:

public class UserDao { ???public UserDao() { ???????// TODO Auto-generated constructor stub ???} ???public static SessionFactory getSessionFactoryInstance(){ ???????if (sessionFactory==null) { ???????????synchronized (SessionFactory.class) { ???????????????if (sessionFactory==null){ ???????????????????config=new Configuration().configure("me/seekout/wanlizhuizong/hibernate.cfg.xml");//若不指定。默认在目录src下 ???????????????????//使用默认配合文件。hibernate.cfg.xml ???????????????????return config.buildSessionFactory(); ???????????????????//另外一种写法。// ?????????????????StandardServiceRegistry standardServiceRegistry=new StandardServiceRegistryBuilder().configure("me/seekout/wanlizhuizong/hibernate.cfg.xml").build();// ?????????????????Metadata metadata = new MetadataSources( standardServiceRegistry ).getMetadataBuilder().applyImplicitNamingStrategy(ImplicitNamingStrategyJpaCompliantImpl.INSTANCE).build();// ?????????????????return metadata.getSessionFactoryBuilder().build(); ???????????????} ???????????} ???????} ???????return sessionFactory; ???} ???/** ????* @param id ????* @return ????* @throws Exception ????*/ ???public User queryById(long id) throws Exception { ???????SessionFactory sessionFactory = HibernateConfigContext ???????????????.getSessionFactoryInstance(); ???????Session session = sessionFactory.openSession(); ???????Transaction transaction = null; ???????User user = null; ???????try { ???????????transaction = session.beginTransaction(); ???????????user = (User) session.get(User.class, id); ???????????transaction.commit(); ???????} catch (Exception e) { ???????????// TODO: handle exception ???????????if (transaction != null) { ???????????????transaction.rollback(); ???????????} ???????????throw e; ???????} finally { ???????????session.close(); ???????????sessionFactory.close(); ???????} ???????return user; ???} ???/** ????* @param user ????* ???????????首次保存会生成id ????* @throws Exception ????*/ ???public void save(User user) throws Exception { ???????System.out.println("保存User数据"); ???????SessionFactory sessionFactory = HibernateConfigContext ???????????????.getSessionFactoryInstance(); ???????Session session = sessionFactory.openSession(); ???????Transaction transaction = null; ???????try { ???????????transaction = session.beginTransaction(); ???????????session.save(user); ???????????transaction.commit(); ???????} catch (Exception e) { ???????????// TODO: handle exception ???????????if (transaction != null) { ???????????????transaction.rollback(); ???????????} ???????????throw e; ???????} finally { ???????????session.close(); ???????????sessionFactory.close(); ???????} ???} ???/** ????* @param user ????* ???????????已知id的User实例。

????* @throws Exception ????*/ ???public void update(User user) throws Exception { ???????SessionFactory sessionFactory = HibernateConfigContext ???????????????.getSessionFactoryInstance(); ???????Session session = sessionFactory.openSession(); ???????Transaction transaction = null; ???????try { ???????????transaction = session.beginTransaction(); ???????????session.update(user); ???????????transaction.commit(); ???????} catch (Exception e) { ???????????// TODO: handle exception ???????????if (transaction != null) { ???????????????transaction.rollback(); ???????????} ???????????throw e; ???????} finally { ???????????session.close(); ???????????sessionFactory.close(); ???????} ???} ???/** ????* @param user ????* ???????????要删除的user,已经保存到数据库的,id分配 ????* @throws Exception ????*/ ???public void delete(User user) throws Exception { ???????SessionFactory sessionFactory = HibernateConfigContext ???????????????.getSessionFactoryInstance(); ???????Session session = sessionFactory.openSession(); ???????Transaction transaction = null; ???????try { ???????????transaction = session.beginTransaction(); ???????????session.delete("User", user); ???????????transaction.commit(); ???????} catch (Exception e) { ???????????// TODO: handle exception ???????????if (transaction != null) { ???????????????transaction.rollback(); ???????????} ???????????throw e; ???????} finally { ???????????session.close(); ???????????sessionFactory.close(); ???????} ???}}

Junit測试程序:

public class UserTest extends TestCase { ???public UserTest(String name) { ???????super(name); ???} ???protected void setUp() throws Exception { ???????super.setUp(); ???} ???protected void tearDown() throws Exception { ???????super.tearDown(); ???} ???public void testSave() { ???????UserDao userDao=new UserDao(); ???????User user=new User(); ???????user.setEmailName("tyhj_sf@163.com"); ???????user.setEmailPassword("ty123456789"); ???????try { ???????????userDao.save(user); ???????} catch (Exception e) { ???????????// TODO Auto-generated catch block ???????????e.printStackTrace(); ???????} ???} ???public void testQueryById() { ???????UserDao userDao=new UserDao(); ???????User user=new User(); ???????user.setId(1L); ???????user.setEmailName("tyhj_sf@163.com"); ???????user.setEmailPassword("ty123456789"); ???????try { ???????????assertEquals(user,userDao.queryById(1)); ???????} catch (Exception e) { ???????????// TODO Auto-generated catch block ???????????e.printStackTrace(); ???????} ???} ???public void testUpdate() { ???????UserDao userDao=new UserDao(); ???????User user=new User(); ???????user.setId(1L); ???????user.setEmailName("tyhj_sf@163.com"); ???????user.setEmailPassword("aaasss"); ???????try { ???????????userDao.update(user); ???????????assertEquals(user,userDao.queryById(1)); ???????} catch (Exception e) { ???????????// TODO Auto-generated catch block ???????????e.printStackTrace(); ???????} ???} ???public void testDelete() { ???????UserDao userDao=new UserDao(); ???????User user=new User(); ???????user.setId(1L); ???????user.setEmailName("tyhj_sf@163.com"); ???????user.setEmailPassword("aaasss"); ???????try { ???????????userDao.delete(user); ???????????assertNull(userDao.queryById(1)); ???????} catch (Exception e) { ???????????// TODO Auto-generated catch block ???????????e.printStackTrace(); ???????} ???}}

很多其它的数据库其它操作參照以上測试用例写就可以。Session类提供了大量方便的操作方法接口,能够參考javadoc文档使用。

???????????????????????????
??????????????????????????????????? ???????????????????????????????????
???

Hibernate5配置与使用具体解释

原文地址:https://www.cnblogs.com/zhchoutai/p/8413871.html

知识推荐

我的编程学习网——分享web前端后端开发技术知识。 垃圾信息处理邮箱 tousu563@163.com 网站地图
icp备案号 闽ICP备2023006418号-8 不良信息举报平台 互联网安全管理备案 Copyright 2023 www.wodecom.cn All Rights Reserved