Hibernate01
从今天开始我们学习hibernate,hibernate是一个持久层的框架hibernate现在的使用其实也在逐渐的减弱,因为Hibernate比较难用,特别是新手使用hibernate,效率总是不太理想,当然不是说hibernate没有,其实它在Java Web开发中一直是很重要的组成部分,希望大家好好学习。
Jboss插件的安装
在学习hibernate之前,我们需要在我们的eclipse中安装Jboss插件,帮助我们学习hibernate,当然不安装也是可以的。
Eclipse的插件安装前面已经告诉大家了:
1、 使用在线安装方式:
在help中选择EclipseMarketplace选项,搜索Jboss
就是它,选择安装就行了。
2、 使用本地安装方式:
在help中选择InstallNew Software选项,然后选择Add按钮,之后选择Archive
弹出本地选择文件,选择你已经下载好的zip包:
之后就是下一步,下一步这样就行了。
创建第一个hibernate项目
我学习一个新技术的习惯就是:不管这个技术难不难,首先去搭建一个使用了该技术的基本项目,这样有助于我们学习它,那么下面我们先来搭建一个hibernate项目吧。
搭建hibernate项目有很多知识点,我们一步步来,首先创建一个项目(任意项目,Java 项目就行,因为hibernate接管的是持久层,与数据库打交道,与web无关)。
创建一个Java项目
导入hibernate所需的jar包
Hibernate支持包我们下载后发现很多的,我们在lib文件夹中选择required文件夹下的,这个文件夹下的jar是必须的jar包,其他的暂时不导入,等有需求的时候再说。
在这儿要注意一个问题,就是版本问题,在hibernate4之前,hibernate3它的jar包初了这个文件夹下的,还需要去主目录中将hibernate3.jar放入,在hibernate4之后,它将这些jar都放入了required文件夹下。
Hibernate3:
Lib文件夹下:
Hibernate4:
因为现在hibernate都已经更新到了5.0版本了,5.0比较新,所以3版本除了以前的项目使用,现在我们大多数情况下使用4,太新和太旧的我们一般都不使用,我们这次就以4的版本为例给大家学习hibernate。
jar包导入成功后,记得还要导入另外两个jar包哦:数据库的驱动包和log4j的jar包,因为hibernate使用的是log4j作为日志的。当然你使用了log4j作为日志,那么log4j的配置文件一定要在src目录下配置一份。
在src目录下创建hibernate的配置文件(hibernate.cfg.xml)
在src目录下创建hibernate.cfg.xml文件,注意:名称必须一致。
Hibernate.cfg.xml文件配置如下:
<!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> <!-- 我们使用了MySQL数据库,所以要使用MySQL方言,如果使用了其他数据库,则使用其他方言 --> <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property> <!-- 数据库驱动 --> <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property> <!-- 连接数据库的URL,username和password --> <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/db_hibernate</property> <property name="hibernate.connection.username">root</property> <property name="hibernate.connection.password">root</property>
<!-- 根据需要自动创建数据表 --> <property name="hibernate.hbm2ddl.auto">update</property> <!-- 显示Hibernate持久化操作所生成的SQL --> <property name="show_sql">true</property> <!-- 将SQL脚本进行格式化后再输出 --> <property name="hibernate.format_sql">true</property> </session-factory> </hibernate-configuration> |
创建实体类
我们这个项目就是用来测试hibernate的,所以我们创建一个用户的操作项目,User类。
User.java:
package com.lzcc.hibernate.entity; import java.util.Date; publicclass User { privateintid; private String username; private String password; private String nickname; private Date bornDate;
publicint getId() { returnid; }
publicvoid setId(int id) { this.id = id; }
public String getUsername() { returnusername; }
publicvoid setUsername(String username) { this.username = username; }
public String getPassword() { returnpassword; }
publicvoid setPassword(String password) { this.password = password; }
public String getNickname() { returnnickname; }
publicvoid setNickname(String nickname) { this.nickname = nickname; }
public Date getBornDate() { returnbornDate; }
publicvoid setBornDate(Date bornDate) { this.bornDate = bornDate; }
public User() { }
public User(int id, String username, String password, String nickname, Date bornDate) { super(); this.id = id; this.username = username; this.password = password; this.nickname = nickname; this.bornDate = bornDate; } } |
在实体类的包下创建与实体类对应的XXX.hbm.xml文件
在实体类的包下创建与实体类对应的xxx.hbm.xml文件,用来指定实体类和数据库表的对应关系。
User.hbm.xml:
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="com.lzcc.hibernate.entity"> <class name="User" table="t_user"> <id name="id" > <!-- 表的id的生产策略,可以根据不同的数据库选择不同自增,但是建议大家使用native,这样的话 hibernate会根据你选择的数据库自动的选择使用什么生产策略 --> <generator class="native" /> </id> <property name="username" /> <property name="password" /> <property name="nickname" /> <property name="bornDate" type="timestamp" column="born_date" /> </class> </hibernate-mapping> |
将实体类的配置文件加入到hibernate.cfg.xml文件中
<!-- 将实体类中的配置文件加入到hibernate的配置文件中 --> <mapping resource="com/lzcc/hibernate/entity/User.hbm.xml"/> |
至此我们就完成了hibernate的整个搭建过程,相对来说,hibernate的搭建相对复杂,所以建议大家多练习练习。
测试是否搭建成功
我们来创建一个JUnit,做一个单元测试:
TestHibernate.java:
package com.lzcc.hibernate.test;
import java.util.Date;
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; import org.hibernate.service.Service; import org.hibernate.service.ServiceRegistry; import org.hibernate.service. import org.junit.Test;
import com.lzcc.hibernate.entity.User;
publicclass TestHibernate {
@Test publicvoid test01() { // 想使用hibernate,必须首先获取hibernate的sessionfactory, // 到的sessionfactory后,通过它得到session,我们所有的操作都是 // 在session的基础上操作的 /** * 得到SessionFactory在hibernate3及其以前版本,很简单 Configuration cf = new * Configuration().configure(); SessionFactory sessionFactory = * cf.buildSessionFactory(); */ // 这样获取Sessionfactory已经过时了,如果你想使用也行,只是不建议大家使用 // Configuration cf = new Configuration().configure(); // SessionFactory sessionFactory = cf.buildSessionFactory();
// 在hibernate4.0-4.2之间,hibernate的Sessionfactory获取方式,如果你的版本是4.0-4.2之间,可以如此获取 //Configuration cfg = new Configuration().configure(); //ServiceRegistry serviceRegistry = new ServiceRegistryBuilder() // .applySettings(cfg.getProperties()).buildServiceRegistry(); //SessionFactory factory = cfg.buildSessionFactory(serviceRegistry);
//hibernate4.3及其以后,获取SessionFactory的方式,我们使用的是4.3.5,所以使用这样一种方式 Configuration cfg = new Configuration().configure(); StandardServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder().applySettings(cfg.getProperties()).build(); SessionFactory sessionFactory = cfg.buildSessionFactory(serviceRegistry);
Session session = null; try { session = sessionFactory.openSession(); /** * 因为增加、修改,删除是存在事务控制的,所以我们要开启事务 * 两只方式: * 1、session.beginTransaction(); * 2、session.getTransaction().begin(); */ session.beginTransaction(); //增加用户,判断我们的环境是否搭建成功 User u = new User("ljh", "123", "刘帅哥", new Date()); //session.save()方法表示保存对象到数据库 session.save(u); session.getTransaction().commit(); } catch (HibernateException e) { e.printStackTrace(); if (session != null) { session.getTransaction().rollback(); } } finally { if (session != null) { session.close(); } } } } |
测试通过,我们发现hibernate的版本在变化的同时,获取SessionFactory的方式也不同,希望大家注意下。其次注意写法,session打开后,一定要记得关闭掉。同时注意导包问题,我们要导入的包,都是hibernate下的包,防止导错。
使用hibernate完成一个CRUD
我们要经常使用Session,而且Session是属于线程安全的,所以我们可以使用单例模式来减少对资源的消耗(hibernate中能减少资源消耗就减少资源的消耗,hibernate是一个比较大的开源框架)。所以我们写一个回去获取Session的工具类吧:HibernateUtil.java
HibernateUtil.java:
package com.lzcc.hibernate.util; 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 final static SessionFactory SESSIONFACTORY = getSessionFactory(); /** * 获取SessionFactory对象 * @return SessionFactory */ private static SessionFactory getSessionFactory() { Configuration cfg = new Configuration().configure(); StandardServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder().applySettings(cfg.getProperties()).build(); SessionFactory sessionFactory = cfg.buildSessionFactory(serviceRegistry); return sessionFactory; }
/** * 得到hibernate中session * @return Session */ public static Session openSession() { return SESSIONFACTORY.openSession(); }
/** * 关闭session * @param session */ public static void closed(Session session) { if (session != null) { session.close(); } }
} |
创建一个单元测试类,来试试使用hibernate完成对一个对象的基本的增删改查吧:
TestCRUD.java:
package com.lzcc.hibernate.test;
import java.util.List;
import org.hibernate.Session; import org.junit.Test;
import com.lzcc.hibernate.entity.User; import com.lzcc.hibernate.util.DateUtil; import com.lzcc.hibernate.util.HibernateUtil;
publicclass TestCRUD {
@Test publicvoid testAdd() { Session session = null; try { session = HibernateUtil.openSession(); session.beginTransaction(); User u = new User("laomu", "123", "老牟", DateUtil.getDate("1986-12-23")); session.save(u); session.getTransaction().commit(); } catch (Exception e) { e.printStackTrace(); session.getTransaction().rollback(); } finally { HibernateUtil.closed(session); } }
@Test publicvoid testLoad() { Session session = null; try { /** * 注意:查询是没有事务控制的,不需要打开事务 */ session = HibernateUtil.openSession(); User u = (User) session.load(User.class,5); System.out.println(u); } catch (Exception e) { e.printStackTrace(); } finally { HibernateUtil.closed(session); } }
@Test publicvoid testUpdate() { Session session = null; try { session = HibernateUtil.openSession(); session.beginTransaction(); User u = new User(4,"liujianhong", "2222", "刘帅哥", DateUtil.getDate("1990-12-23")); session.update(u); session.getTransaction().commit(); } catch (Exception e) { e.printStackTrace(); session.getTransaction().rollback(); } finally { HibernateUtil.closed(session); } }
@Test publicvoid testDelete() { Session session = null; try { session = HibernateUtil.openSession(); session.beginTransaction(); User u = new User(); u.setId(5); session.delete(u); session.getTransaction().commit(); } catch (Exception e) { e.printStackTrace(); session.getTransaction().rollback(); } finally { HibernateUtil.closed(session); } }
@Test publicvoid testList() { Session session = null; try { /** * 注意:查询是没有事务控制的,不需要打开事务 */ session = HibernateUtil.openSession(); //注意,这里我们需要使用HQL语句来完成查询,什么是HQL语句,我们在后面回学习,现在知道就行了 //注意:这里使用了对象查询,不是表哦,认真看 List<User> users = session.createQuery("from User").list(); for (User u : users) { System.out.println(u); } } catch (Exception e) { e.printStackTrace(); } finally { HibernateUtil.closed(session); } }
@Test publicvoid testPageList() { Session session = null; try { /** * 注意:查询是没有事务控制的,不需要打开事务 */ session = HibernateUtil.openSession(); //注意,这里我们需要使用HQL语句来完成查询,什么是HQL语句,我们在后面回学习,现在知道就行了 //注意:这里使用了对象查询,不是表哦,认真看 List<User> users = session.createQuery("from User").setFirstResult(2).setMaxResults(2).list(); for (User u : users) { System.out.println(u); } } catch (Exception e) { e.printStackTrace(); } finally { HibernateUtil.closed(session); } } } |
通过对上面的学习,我们发现使用了hibernate以后,的确方便了很多,我们甚至都不需要些sql语句了,hibernate就是这么好用。
但是我们前面又说了,在SSH三个框架中,hibernate是最难掌握的,为什么这么说呢?因为hibernate的创始人在开发hibernate的时候,考虑到了大量的效率问题,所以使得hibernate就异常的复杂难用,如果你不考虑效率问题,hibernate是最好用的(当然,这个基本不可能,现在的项目都是相当庞大的,效率永远是第一位的)。