• hiberate架构介绍及环境搭建(非常详细)


    目录

    1 三层架构

    2 hiberate概述

    3 ORM思想

    4 Hiberate环境搭建与各种准备(非常详细)

    基础准备

    配置一对应关系

    hibernate.cfg.xml模板

    实现添加操作步骤

    测试全代码

    效果验证

    5 实体类的编写规则

    6 主键增长策略


    1 三层架构

    1、web层:struts2框架

    2、service层:spring框架

    3、dao层:hiberate框架 (对数据库进行crud操作)

    MVC思想:model-view-controller

    2 hiberate概述

    在javaEE三层架构中的dao层。

    Hibernate底层就是JDBC,对JDBC进行了封装,好处就是不需要写复杂的JDBC代码和SQL语句实现了。

    Hibernate是一个开源的、轻量级(可以直接用不需要依赖其他的东西、导入很少的jar包)的框架

    Hibernate版本:Hibernate3.x、4.x、5.x;4.x是过度版本

    3 ORM思想

    Hibernate是一个开放源代码的对象关系映射(orm-Object Relational Mapping)框架。

    Hibernate使用该思想对数据库进行crud操作。

    Web阶段javaBean类,在框架阶段叫实体类

    让实体类和数据库表进行一对一对应关系。

    类的属性--表中的字段对应

    不需要直接操作数据库表,直接操作表对应实体类对象。

    Jdbc代码:

    1. Class.forName(“com.oracle.jdbc.driver”);
    2. Connection = DriverManager.getConnection();
    3. (url,username,password)
    4. String sql=””;
    5. ps = conn.prepareStatement(sql);
    6. rs = ps.excuteQuery();
    7. //遍历结果集
    8. //释放资源

    实体类

    1. Public class User{
    2. Private int userid;
    3. Private String username;
    4. Private String password;
    5. //set、get
    6. }

    数据库表:

    1. Create table t_user(
    2. Userid number not NULL AUTO_INCREATEMENT,
    3. username varchar2(100),
    4. password varchar2(100)
    5. );

    使用配置文件的方式完成一一对应

    Hibernate封装的对象Session:

    1. User user = new User();
    2. User.setUserName(“”);
    3. Session.save(user); //session中的方法

    4 Hiberate环境搭建与各种准备(非常详细)

    基础准备

    第一步:导入Hibernate的jar包

    require文件夹与JPA文件夹中的jar必须导入。

    因为使用Hibernate时有日志信息输出,Hibernate本身没有日志输出的jar包,需要导入其他的日志jar包支持这些输出。

    2、创建实体类

    Hibernate要求实体类中有一个属性(如id)是唯一的。(如表中的主键)

    private int userid;

    3、创建表(hibernate可自动创建)

    4、配置实体类和数据库表的映射关系--配置文件实现

    创建xml配置文件:配置文件名称和位置没有要求,但一般命名为:hbm.xml;位置创建在所在实体类所在包下。

    先引入xml约束,目前在hibernate中大多数是dtd约束;在hibernate的约束文件(hibernate-mapping-3.0.dtd)中复制过来拷入创建的xml。

    1. <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    2.  "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >

    配置一对应关系

    创建核心配置文件

    位置和名称固定。位置--src下;名称--hibernate.cfg.xml

    hibernate.cfg.xml模板

    1. <?xml version="1.0" encoding="UTF-8"?>
    2. <!DOCTYPE hibernate-configuration PUBLIC
    3. "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
    4. "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
    5. <hibernate-configuration>
    6. <session-factory>
    7. <!--1.配置数据库信息 ,必须要有 -->
    8. <!-- 配置数据库的方言,如:MySQL中分页为limit,oracle中是rownum;让hibernate识别不同数据库中的语句或关键字 -->
    9. <property name="dialect">org.hibernate.dialect.OracleDialect</property>
    10. <property name="hibernate.connection.driver_class">oracle.jdbc.driver.OracleDriver</property>
    11. <property name="hibernate.connection.url">jdbc:oracle:thin:@127.0.0.1:1521:XE</property>
    12. <property name="hibernate.connection.username">abc</property>
    13. <property name="hibernate.connection.password">abc</property>
    14. <!--2.配置hibernate信息,可有可无的 -->
    15. <!-- 输出底层SQL -->
    16. <property name="hibernate.show_sql">true </property>
    17. <!-- 对底层SQL进行格式化,格式化即不在一行显示 -->
    18. <property name="hibernate.format_sql">true</property>
    19. <!-- 自动生成或更新数据库表,写了的话,就会自动创建表 -->
    20. <property name="hibernate.hbm2ddl.auto">update</property>
    21. <!-- 3.注册映射文件 -->
    22. <mapping resource="com/wl/entity/User.hbm.xml" /> <!-- 以src为相对路径,如果在src下,直接就是User.hbm.xml -->
    23. <!-- 注:hibernate.hbm2ddl.auto的值为create表示每次运行都会新建表;
    24. 值为create-drop是在关闭SessionFactory时删除仙剑表;
    25. 值为update(常用值)时表示如果第一运行时数据库没有对应表,那么会新建表,但是如果存在对应数据表,就不再创建对应的数据表 -->
    26. </session-factory>
    27. </hibernate-configuration>

    复制进去dtd约束:

    1. <?xml version='1.0' encoding='UTF-8'?>
    2. <!DOCTYPE hibernate-configuration PUBLIC
    3.           "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
    4.           "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"

    hibernate操作过程中,只会加载核心配置文件,其他配置文件不会加载。

    以下三部基本只配置一次,之后很少修改。

    第一部分:配置数据库信息

    第二部分:配置hibernate信息

    第三部分:把配置文件放到核心配置文件中

    1. <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
    2. <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
    3. <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/hibernate</property>

    实现添加操作步骤

    第一步:加载hibernate核心配置文件

    第二步:创建Sessionfactory工厂对象

    第三步:使用Sessionfactory创建session对象

    第四步:开启事务,建议手动创建

    第五步:curd操作

    第六步:提交事务

    第七步:关闭资源

    变化的只是第五步,其他通用固定。

    测试全代码

    1. package com.wl.test;
    2. import org.hibernate.Session;
    3. import org.hibernate.SessionFactory;
    4. import org.hibernate.Transaction;
    5. import org.hibernate.cfg.Configuration;
    6. import org.junit.Test;
    7. import com.wl.entity.User;
    8. import com.wl.utils.HibernateUtils;
    9. /*
    10. * 添加:save()
    11. * 修改:update()
    12. * 删除:delete()
    13. * 根据id查询:get()
    14. */
    15. public class InsertDemo {
    16. /*
    17. * 修改
    18. */
    19. @Test
    20. public void updateDemo(){
    21. // Configuration cfg = new Configuration();
    22. // cfg.configure();
    23. SessionFactory sessionFactory = HibernateUtils.getSessionFactory();
    24. Session session = sessionFactory.openSession();
    25. Transaction transaction = session.beginTransaction();
    26. User user = new User();
    27. user.setUserid(4);
    28. user.setUsername("rrr");
    29. user.setPassword("rrr");
    30. user.setAddress("AAAAA");
    31. session.update(user);
    32. transaction.commit();
    33. session.close();
    34. sessionFactory.close();
    35. }
    36. /*
    37. * 插入
    38. */
    39. @Test
    40. public void insertDemo1(){
    41. SessionFactory sessionFactory = HibernateUtils.getSessionFactory();
    42. Session session = sessionFactory.openSession();
    43. Transaction transaction = session.beginTransaction();
    44. User user = new User();
    45. user.setUsername("wl9");
    46. user.setPassword("000002");
    47. user.setAddress("XXXXX");
    48. session.save(user);
    49. transaction.commit();
    50. session.close();
    51. sessionFactory.close();
    52. }
    53. /*
    54. * 插入
    55. */
    56. @Test
    57. public void insertDemo(){
    58. // 第一步:加载hibernate核心配置文件,会在src下找hibernate.cfg.xml
    59. Configuration cfg = new Configuration();
    60. cfg.configure();
    61. // 第二步:读取核心配置文件的内容,来创建Sessionfactory工厂对象;在该过程中,会根据映射关系,在配置数据库中创建表。
    62. SessionFactory sessionFactory = cfg.buildSessionFactory();
    63. // 第三步:使用Sessionfactory创建session对象,类似于连接connection
    64. Session session = sessionFactory.openSession();
    65. // 第四步:开启事务,建议手动创建
    66. Transaction transaction = session.beginTransaction();
    67. // 第五步:curd操作,如添加操作
    68. User user = new User();
    69. user.setUsername("123");
    70. user.setPassword("000002");
    71. user.setAddress("XX");
    72. //调用session里面的方法实现添加
    73. session.save(user);
    74. // 第六步:提交事务
    75. transaction.commit();
    76. // 第七步:关闭资源
    77. session.close();
    78. sessionFactory.close();
    79. }
    80. }

    效果验证

    1是否创建了表;

    2是否增加了记录。

    控制台:

    共五条语句:

    1. Hibernate:
    2.     update
    3.         t_user
    4.     set
    5.         username=?,
    6.         password=?,
    7.         address=?
    8.     where
    9.         userid=?
    10. Hibernate:
    11.     select
    12.         hibernate_sequence.nextval
    13.     from
    14.         dual
    15. Hibernate:
    16.     insert
    17.     into
    18.         t_user
    19.         (username, password, address, userid)
    20.     values
    21.         (?, ?, ?, ?)
    22. Hibernate:
    23.     select
    24.         hibernate_sequence.nextval
    25.     from
    26.         dual
    27. Hibernate:
    28.     insert
    29.     into
    30.         t_user
    31.         (username, password, address, userid)
    32.     values
    33.         (?, ?, ?, ?)

    数据库中:

    select dbms_metadata.get_ddl('TABLE', ‘T_USER’) from dual;

     或desc查看:

    5 实体类的编写规则

    1. 属性私有,提供get/set方法。
    2. 要有一个属性作为唯一值,如使用id区分唯一值。
    3. 实体类的数据类型建议使用基本数据类型的包装类型,如Integer,Character,其他都是首字母大写

    如果使用int表示score,int score=0;分数为0时,此时若要表示学生没有参加考试就无法实现,因为int score=null;是错误的。这时就要用Integer score = null;

    6 主键增长策略

    主键:在Hibernate中持久化类都会有一个标识属性,用于标识实例的唯一,该属性映射到数据库表的主键。

       主键生成器:<generator class="生成方式"/>

       生成方式的值有:

            increment:表示获取数据库中表最大主键值,并+1后作为新的主键。

            identity:自动增长,主要使用在mysql,db2。

            Sequence:Hibernate根据底层数据库序列生成标识符,条件是数据库要支持序列。适用于代理主键。

            native:(开发中一般选择此方式)自动增长,Hibernate会根据数据库从identity,sequence(序列),hilo(高低算法)中选择一种合适的方式生成主键,在mysql中时使用identity,在Oracle中时选择sequence(序列)。

            uuid:使用UUID算法生成字符串类型主键(主要用于分布式部署)。

    使用uuid时,将实体类的主键修改为String类型,将配置文件中修改为uuid。

    运行封装好的工具类,查看效果:

    运行测试数据:

    也就是说,当使用uuid策略作为主键生成策略时,需要把主键设为String类型。

  • 相关阅读:
    在 centos7 上安装Docker
    【python】云打印实现
    MLC--机器学习编译的课程笔记
    迁移 MySQL 数据到 OceanBase 集群(mysqldump+datax)
    【云原生】docker+k8微服务容器化实战(下篇)
    从零开始Blazor Server(6)--基于策略的权限验证
    错题集(c语言)
    Visual Leak Detector 2.5.1 (VLD)下载、安装与使用
    python与xml数据的交互
    Antd中Table列表行默认包含修改及删除功能的封装
  • 原文地址:https://blog.csdn.net/HYZX_9987/article/details/125435393