Hibernate(1)-使用Hibernate完成数据持久化

使用Hibernate完成数据持久化

-了解Hibernate的基本原理
-学会编写实体配置文件
-熟练掌握使用Hibernate进行增删改查操作
-掌握在项目中使用Hibernate


为什么使用Hibernate?
    代码精简易读
    封装了JDBC操作,以面向对象的方式操作数据
    开发工作量小,可以将精力集中在业务逻辑处理上

什么是Hibernate?
    Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,对数据持久化的工具。

HIbernate之父--------Gaving    King

ORM:完成对象数据到关系型数据的映射的机制成为对象-关系映射


什么是数据持久化?
    持久化过程中有三个状态:瞬时状态、持久状态、游离状态
持久化:将程序数据在瞬时状态与持久状态之间转换的机制。
瞬时状态:保存在内存中的程序数据,程序退出后,数据就消失了,称为瞬时状态。
持久状态:保存在磁盘上的程序数据,程序退出后依然存在,称为程序数据的持久状态。

使用Hibernate的3个准备:


(1)导入Hibernate    jar包
(2)添加配置文件hibernate.cfg.xml
   
   
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd" >
  3. <hibernate-configuration>
  4. <!-- 配置数据源 -->
  5. <session-factory>
  6. <!-- 使用C3P0替换数据源 -->
  7. <property name="hibernate.connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</property>
  8. <!-- 最大连接数 -->
  9. <property name="hibernate.c3p0.max_size">50</property>
  10. <!-- 最小连接数 -->
  11. <property name="hibernate.c3p0.min_size">10</property>
  12. <!-- 获得连接的超时时间,如果超过这个时间,会抛出异常,单位毫秒 -->
  13. <property name="hibernate.c3p0.timeout">2000</property>
  14. <!-- 最大的PreparedStatement的数量 -->
  15. <property name="hibernate.c3p0.max_statements">100</property>
  16. <!-- 每隔120秒检查连接池里的空闲连接 ,单位是秒-->
  17. <property name="hibernate.c3p0.idle_test_period">60</property>
  18. <!-- 当连接池里面的连接用完的时候,C3P0一下获取的新的连接数 -->
  19. <property name="hibernate.connection.driver_class">oracle.jdbc.driver.OracleDriver</property>
  20. <property name="hibernate.connection.url">jdbc:oracle:thin:@localhost:1521:niit</property>
  21. <property name="hibernate.connection.username">system</property>
  22. <property name="hibernate.connection.password">niit</property>
  23. <!-- 配置数据库方言 -->
  24. <property name="dialect">org.hibernate.dialect.Oracle10gDialect</property>
  25. <property name="show_sql">true</property>
  26. <!-- 添加映射文件 -->
  27. <mapping resource="com/niit/mapper/userMapper.xml"/>
  28. <mapping resource="com/niit/mapper/empMapper.xml"/>
  29. <mapping resource="com/niit/mapper/depMapper.xml"/>
  30. <mapping resource="com/niit/mapper/customerMapper.xml"/>
  31. <mapping resource="com/niit/mapper/orderMapper.xml"/>
  32. </session-factory>
  33. </hibernate-configuration>
(3)添加实体类和映射文件
   
   
  1. public class User implements Serializable {
  2. private int userId;
  3. private String userName;
  4. private String password;
  5. private Date regTime;
  6. private int sex;
  7. public User(){}
  8. public User(int userId, String userName, String password, Date regTime,
  9. int sex) {
  10. super();
  11. this.userId = userId;
  12. this.userName = userName;
  13. this.password = password;
  14. this.regTime = regTime;
  15. this.sex = sex;
  16. }
  17. public User(String userName, String password){
  18. this.userName = userName;
  19. this.password = password;
  20. }
  21. public int getUserId() {
  22. return userId;
  23. }
  24. public void setUserId(int userId) {
  25. this.userId = userId;
  26. }
  27. public String getUserName() {
  28. return userName;
  29. }
  30. public void setUserName(String userName) {
  31. this.userName = userName;
  32. }
  33. public String getPassword() {
  34. return password;
  35. }
  36. public void setPassword(String password) {
  37. this.password = password;
  38. }
  39. public Date getRegTime() {
  40. return regTime;
  41. }
  42. public void setRegTime(Date regTime) {
  43. this.regTime = regTime;
  44. }
  45. public int getSex() {
  46. return sex;
  47. }
  48. public void setSex(int sex) {
  49. this.sex = sex;
  50. }
  51. }
   
   
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >
  3. <hibernate-mapping package="com.niit.pojo">
  4. <!-- 配置实体类与数据表的映射关系 -->
  5. <class name="User" table="users">
  6. <!-- 映射主键 -->
  7. <id name="userId" column="userid"></id>
  8. <!-- 映射其他字段 -->
  9. <property name="userName" column="username"></property>
  10. <property name="password" column="userpwd"></property>
  11. <property name="regTime" column="regtime"></property>
  12. <property name="sex" column="sex"></property>
  13. </class>
  14. </hibernate-mapping>

使用Hibernate的7个步骤:
   
   
  1. public static void main(String[] args) {
  2. // TODO Auto-generated method stub
  3. //(1)启动Hibernate框架,加载配置文件
  4. Configuration config = new Configuration().configure();
  5. //(2)创建SessionFactory
  6. SessionFactory factory = config.buildSessionFactory();
  7. //(3)打开Session,获得数据库连接
  8. Session session = factory.openSession();
  9. //(4)开启事务,数据持久化必须开启事务
  10. Transaction transaction = session.beginTransaction();
  11. //(5)持久化操作
  12. //创建User对象
  13. //此时对象状态为瞬时状态,和数据表没有关联
  14. User user = new User(1, "jack", "jack123", new Date(), 1);
  15. //保存对象至数据库
  16. //session.save(user);
  17. //此时对象状态为持久化状态,在事务未提交之前,对象的任意改变都将关联影响到数据库
  18. //user.setPassword("admin_123");
  19. //(6)提交事务
  20. transaction.commit();
  21. //事务提交后,对象状态未游离状态
  22. //user.setUserName("jack");
  23. //(7)关闭Session
  24. session.close();
  25. }

根据主键进行查询
    查询不需要开始事务
   
   
  1. public static void main(String[] args) {
  2. Configuration config = new Configuration().configure();
  3. SessionFactory factory = config.buildSessionFactory();
  4. Session session = factory.openSession();
  5. //进行查询不需要开启事务
  6. //根据主键查询
  7. //load查询
  8. User user = (User) session.load(User.class, 1);
  9. session = factory.openSession();
  10. //get查询
  11. User user1 = (User) session.get(User.class, 1);
  12. //关闭
  13. session.close();
  14. System.out.println(user1.getClass());
  15. System.out.println(user.getUserName());
  16. }
get与load方法查询后的结果都将写入缓存
 * get与load的差异:
 * 1.get如果查找不到数据返回null,load查找不到数据则抛出异常
 * 2.load首先至缓存中加载查找的数据,如果缓存中不存在,则到数据库中查询对应的数据,并返回数据映射对象的代理类;get也先至缓存中查询数据
 * 如果数据不存在,则至数据库中查询数据并返回对象本身


Hibernate的缓存
    缓存是位于应用程序与物理数据源之间,用于临时存放复制数据的内存区域,目的是为了减少应用程序对物理数据源访问的次数,从而提高应用程序的运行性能。
基本上我们开发项目只会用到一级缓存,如果是大项目可能会用到二级缓存
HIbernate一级缓存
    session是Hibernate的一次缓存区域,存储根据ID查询获取的对象包,可以通过get和load方法从缓存中获取数据。
Hibernate二次缓存
    sessionFactory缓存分为内置缓存和外置缓存,其中sessionFactory的外置缓存称为二级缓存,需要通过插件的方式来开启。
    sessionFactory内置缓存存储了映射的元数据和预定义SQL语句,外置缓存是进程级缓存,被全局共享,用以存储需要频繁读取且具有稳定性的数据。

二级缓存的使用原则:
    (1) 更新频率低的数据
    (2)不会被第三方改变的数据
    (3)非关键数据(如财务数据)
    (4)数据大小在内存可接受范围内的数据

二级缓存的使用步骤:
    (1)把ehcache-1.2.3.jar加入到当前应用的classpath中
    (2)在hibernate.cfg.xml文件中加入EhCache缓存插件的提供类
   
   
  1. <property name="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</property>
    (3)配置持久化类的对象关系映射文件
   
   
  1. <hibernate-mapping>
  2. <class name="pojo.Student" table="student" catalog="system">
  3. <!-- 配置启用Student对象的缓存 -->
  4. <cache usage="read-only"/>
  5. <id name="stuId">
  6. <column name="stuId"></column>
  7. </id>
  8. <property name="stuName">
  9. <column name="stuName"></column>
  10. </property>
  11. </class>
  12. </hibernate-mapping>


Hibernate本身数据池的性能不是很好,因此可以通过配置文件替换数据池。
配置JNDI数据源
   
   
  1. <property name="connection.datasource">java:comp/env/jndi/mysource</property>

配置C3P0数据池
    
    
  1. <!-- 配置数据源 -->
  2. <session-factory>
  3. <!-- 使用C3P0替换数据源 -->
  4. <property name="hibernate.connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</property>
  5. <!-- 最大连接数 -->
  6. <property name="hibernate.c3p0.max_size">50</property>
  7. <!-- 最小连接数 -->
  8. <property name="hibernate.c3p0.min_size">10</property>
  9. <!-- 获得连接的超时时间,如果超过这个时间,会抛出异常,单位毫秒 -->
  10. <property name="hibernate.c3p0.timeout">2000</property>
  11. <!-- 最大的PreparedStatement的数量 -->
  12. <property name="hibernate.c3p0.max_statements">100</property>
  13. <!-- 每隔120秒检查连接池里的空闲连接 ,单位是秒-->
  14. <property name="hibernate.c3p0.idle_test_period">60</property>
  15. <!-- 当连接池里面的连接用完的时候,C3P0一下获取的新的连接数 -->
  16. <property name="hibernate.connection.driver_class">oracle.jdbc.driver.OracleDriver</property>
  17. <property name="hibernate.connection.url">jdbc:oracle:thin:@localhost:1521:niit</property>
  18. <property name="hibernate.connection.username">system</property>
  19. <property name="hibernate.connection.password">niit</property>
  20. <!-- 配置数据库方言 -->
  21. <property name="dialect">org.hibernate.dialect.Oracle10gDialect</property>
  22. <property name="show_sql">true</property>
  23. <!-- 添加映射文件 -->
  24. <mapping resource="com/niit/mapper/userMapper.xml"/>
  25. <mapping resource="com/niit/mapper/empMapper.xml"/>
  26. <mapping resource="com/niit/mapper/depMapper.xml"/>
  27. <mapping resource="com/niit/mapper/customerMapper.xml"/>
  28. <mapping resource="com/niit/mapper/orderMapper.xml"/>
  29. </session-factory>







  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值