SSH框架之旅-hibernate(1)

hibernate

1.什么是框架


什么是框架呢?个人觉得在软件设计中,框架可以看作是架构组件。如果把整个程序看作是一个人的话,那么框架可以看出是一个人的骨架,我们要做的的就是在这个框架的基础上进行开发,完成整个程序,让这个只有骨架的“人”活起来。而一些代码库可以看成是封装了某些功能的组件,而框架就是由很多库组成的。

2.SSH 框架介绍


SSH 是 spring struts hibernate 的缩写。从名字的缩写就可以看出,SSH 是一个集成框架,它是现在比较流行的 Web 应用程序的开源框架。个人的学习路线是 hibernate -> struts -> spring。hibernate 是操作数据库的框架,属于 Web 开发的 DAO 数据库操作层,底层是通过 jdbc 实现的,所以只要有jdbc基础的,都可以先从 hibernate 学起,hibernate也可以用在一般的 java项目的开发的。

3.认识 hibernate


hibernate 使用了 orm 的设计思想,orm 是 object relationship mapping,对象映射关系的缩写。即是实体类和数据库表是一一的映射(对应)关系。具体来说,实体类中的属性和数据表的字段是一一对应的。这样做有什么好处呢?这会大大简化我们对数据库的操作,我们操作数据库的方式,从原来的要写很多 sql 语句,改为通过数据库表对应的实体对象来操作数据库。


下面我们通过一个 java项目来学习 hibernate的基础使用。


项目的目录结构

4.搭建 hibernate框架环境


4.1 准备 hibernate包

heinate 框架是由一些 jar包组成的,我们首先要去官网下载 hibernate 的 zip压缩包。这里需要注意的是 hibernate 的版本,不同版本的 hibernate 所需的 jdk的版本也是不同的,2017年,hibernate 的版本是5.2。所需的 jdk 支持要是 jdk1.8。低于 jdk1.8的 jdk版本无法使用 hibernate 5.2。个人测试过 hibernate 5.0,需要 jdk1.7以上的支持。不知道为什么,Oracle 的官网,现在无法直接下载 jdk1.7的版本了,需要登陆,可能是 Oracle官网想提倡开发者使用最新的 jdk版本来开发吧,毕竟 jdk1.8,也就是 java8,里面还是提供了很多新功能的,也肯定在之前的版本上做了优化。个人看法是,当前的开发,肯定是使用最新的 jdk版本来开发,jdk的老版本是做测试用的。

4.2 导入 hibernate所需文件。

从 hibernate官网下载完压缩包后,找到目录下 lib文件夹下的 required文件夹,这里面的文件,就是 hibernate框架所需的所有文件啦,但由于 hibernate的底层还是 jdbc,所以我们还需要对应数据库的驱动文件。个人建议把这些 jar包单独存放在一个自定义的文件下,也便于使用。

4.3 配置路径

在 java项目下新建一个lib文件夹来存放我们的 hibernate 的 jar包和数据库连接的 jar包,并把这些包全部加到配置路径中。

hibernate 配置

5.使用 hibernate框架


5.1 创建实体类

用 private 访问限制词修饰,用 get,set 方法来设置属性的值,可以省略默认的构造方法。

package cc.wenshixin.entity;

public class Student {
    private int id;// 序号
    private String name;// 姓名
    private String sex;// 性别
    private String grade;// 班级
    
    public Student(String name, String sex, String grade) {
        this.name = name;
        this.sex = sex;
        this.grade = grade;
    }

    //这里省略了get和set方法
}

5.2 创建实体类映射文件

建议映射文件和实体类文件在同一个包下,映射文件命名为:实体类名称.hbm.xml。dtd 为 xml 的文件约束,下面的写法使需要在联网状态下才会有 xml 的代码提示的,关于离线dtd的配置,可自行上网搜索。所谓文件约束就是规定了文件内容的书写格式,具体就是标签的包裹,标签的属性等等。映射文件可以使用 jboss-tool插件生成,可自行根据自己使用的 IDE 工具使用。

下面说一下映射关系文件的配置,具体见下面代码所示。 1.首先是 hibernate-mapping 标签,包裹整个映射关系。 2.然后是 class 标签,里面 name 属性的值为实体类的全路径,table 为自动创建的数据表的名称。 3.id 标签配置数据表的主键,name 属性为实体类中作为唯一值的属性名称,column 属性作为生成的数据表的字段名称。id 标签里面的generator 是用来设置主键增长的策略,native 值为自动增长,assigned 为自定义增长。 4.property 标签设置一般的属性值,name 属性还是实体类的属性,column 是数据表的字段,这个和前面的id 标签是一样的。

<?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>
    <class name="cc.wenshixin.entity.Student" table="STUDENT">
        <id name="id" column="id">
            <generator class="native" />
        </id>
        <property name="name" column="name"></property>
        <property name="sex" column="sex"></property>
        <property name="grade" column="grade"></property>
    </class>
</hibernate-mapping>

5.3 创建 hibernate 核心配置文件

名称为 hibernate.cfg.xml,必须放在 src目录下面,和上面的实体类映射文件一样,核心配置文件也是有 dtd文件约束的。

下面说一下 hibernate 核心文件的配置,具体见下面代码所示。 1.首先是 hibernate-configuration 标签包裹整个配置信息。 2.接着是 session-factory 标签包裹整个配置内容。 3.配置的标签是 propertyname 为配置项的名字,标签里面是配置的内容。 4.配置的第一步是配置数据库相关的信息,数据库的驱动类,数据库连接的url参数,数据库的用户名,用户的密码。 5.hibernate 的功能选择,show_sql 是开启 hibernate中显示sql语句的功能,方便我们在开发中做调试;format_sql是对显示的sql语句进行格式话,方便我们阅读sql语句;hbm2ddl.auto 是关于表的更新操作,update 的意思是,如果表不存在就创建,如果表存在就更新表的内容。还有 create 的意思是,如果表不存在就创建,但如果表存在,就覆盖原来的表,创建新的表,那么原来表中的内容就没有了;dialect 是数据库方言的配置,在不同的类型的数据,一些 sql 语句的书写是不一样的,例如,分页操作要用的 sql语句,MySQL 数据库是用 limit 关键字来实现的,而Oracle 数据库是通过rownum 关键字来实现的,SQL server 数据库是通过 top 关键字来实现的,为了避免数据库的不同而对sql语句产生的差异,我们最好是加上方言的功能。 6.因为在 hibernate 的加载时,只会加载核心配置文件,所以要把实体类映射文件加入到 hibernate核心配置文件中,这样在加载核心配置文件的时候就会把映射文件也加载进去,注意映射文件的路径要写在 mapping 标签的resource 属性中。

<?xml version="1.0" encoding="UTF-8"?>
<!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>
      <!-- 配置数据库信息 -->
      <property name="connection.driver_class">com.mysql.jdbc.Driver</property>
      <property name="connection.url">jdbc:mysql://localhost:3306/study?useUnicode=true&characterEncoding=UTF-8</property>
      <property name="connection.username">root</property>
      <property name="connection.password">123456</property>

      <!-- hibernate功能选择 -->
      <property name="show_sql">true</property>
      <property name="format_sql">true</property>
      <property name="hbm2ddl.auto">update</property>
    <property name="dialect">org.hibernate.dialect.MySQL5InnoDBDialect</property>
      
      <!-- 加载映射文件 -->
      <mapping resource="cc/wenshixin/entity/Student.hbm.xml"/>
    </session-factory>
</hibernate-configuration>

5.4 创建 hibernate测试文件

经过前面的步骤,hibernate 的使用就已经完成了,下面是通过测试文件来测试,执行后到数据库中看是否有相应的数据表和记录。

package cc.wenshixin.hibernateTest;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;

import cc.wenshixin.entity.Student;

public class HibernateTest {
    
    public static void main(String[] args) {
        //1.加载hibernate核心配置文件
        Configuration cfg = new Configuration().configure();
        
        //2.创建一个SessionFactory工厂,在这个过程中读取 hibernate 的核心配置文件,根据映射关系把数据表创建起来
        SessionFactory sessionFactory = cfg.buildSessionFactory();
        
        //3.使用sessionFactory来生产session对象,这里的session类似于Connection的对象,连接到数据库
        Session session = sessionFactory.openSession();
        
        //4.开启事务
        Transaction transaction = session.beginTransaction();
        
        //5.执行具体的 curd 操作
        Student s = new Student("小明","男","计科2班");
        session.save(s);

        //6.提交事务
        transaction.commit();
        
        //7.关闭相关的资源
        session.close();
        sessionFactory.close();
    }
}

6.hibernate框架配置详解


6.1 hibernate映射配置文件

1.映射配置文件的位置和名称都是可以修改的,但我们习惯上,把映射配置文件的名称写成 类名称.hbm.xml,并且和实体类文件放在同一个包下

  1. 映射配置文件中,标签 name 属性的值是写实体类相关的内容,class 标签中的 name 属性值是实体类的全路径,id 标签和 property 标签的 name 属性值是实体类属性的名称。
  2. id 标签和 property 标签 column 属性是可以省略的,不写的话表的字段名称默认和 name 属性的值一样。
  3. property 标签中还有 type 属性,设置生成表的字的字段的类型,不写的话,hibernate自动设置对应的类型。还有 length 属性,设置字段类型的长度,在实际的开发中,这个属性是要写的,用来减少数据库的冗余,提高数据表的查询效率。

6.2 hibernate 核心配置文件

1.核心配置文件中三个部分的要求,数据库配置信息部分是必须的,接着是选择使用 hibernate 的那些功能部分,最后是加载映射文件,这个也是必须的。

2.核心配置文件的文件名称和文件的位置都是固定的,名称:hibernate.cfg.xml,位置是直接在src源文件目录下。

7.hibernate的核心API


7.1 Configuration

Configuration cfg = new Configuration().configure(); 在 src目录下找到 hibernate..cfg.xml 配置文件,把配置文件放到创建的配置对象中,简单的可以理解为加载核心配置文件项。

7.2 SessionFactory

SessionFactory sessionFactory = cfg.buildSessionFactory(); 使用 configuration 对象来创建 sessionFactory 的对象,在创建这个对象的过程中,要加载核心配置文件的映射文件,根据映射关系来把数据表创建起来,可能要有多个数据表的创建,所以创建一个 sessionFactory 的对象挺耗费资源的,一个项目建议只创建一个 sessionFactory 对象,一般我们是把这步代码写到静态代码块中,这样在类加载时就会执行静态代码块的代码,并且只执行一次。

7.3 Session

Session session = sessionFactory.openSession(); session 对象类似于我们在jdbc中的connection对象,session 里面有对数据表操作的各种方法,从而实现对数据表的 curd 操作。 - 1.save方法,插入一条记录 - 2.update方法,更新一条记录 - 3.delete方法,删除一条记录 - 4.根据id查询的get方法 需要说明的时,session 是线程不安全的,也即是 session 对象是不能被多个线程共用的,只能单一线程使用。

7.4 Transaction

Transaction transaction = session.beginTransaction(); 开启数据库的事务,session对象处理完数据库操作时,这里需要手动的提交事务,事务有提交操作 transaction.commit();,还有回滚操作 transaction.rollback();,关于事务的相关概念,事务的四个特性:原子性、一致性、隔离性、持久性。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏开源优测

性能测试必备监控技能jvm之jdk命令行工具篇16

前言 对于JVM的性能监控,主要注意以下关键参数,通过jdk自带的命令行工具,即可查看相关参数,从而分析系统或目标服务程序中存在的性能瓶颈 jps JVM Pr...

315120
来自专栏C/C++基础

Linux下使用gdb调试core文件

当程序运行过程中出现Segmentation fault (core dumped)错误时,程序停止运行,并产生core文件。core文件是程序运行状态的内存映...

25630
来自专栏技术博客

菜菜从零学习WCF二(设计和实现服务协定)

  服务是一个构造,它公开一个或多个终结点,其中每个终结点都公开一个或多个服务操作。

9720
来自专栏云计算与大数据

研发:Idea工具因为版本工具设置问题,导致全是红色

I have the current status of my files in the folders coloured red/brown. I tried...

14830
来自专栏Java架构沉思录

一文读懂分布式Session常见解决方案

前言 沉思君在之前的文章《谈谈HTTP状态保持》里介绍了有关HTTP状态保持的知识点,我们知道HTTP协议本身是无状态的,因此在使用HTTP协议进行通信的过程中...

28580
来自专栏Aloys的开发之路

屏幕输出VS文件输出

问题1:我们在编写程序时经常需要数一些数据到屏幕,来查看我们的结果是否正确,虽然直接输出到屏幕,查看起来呢很方便,但当数据量很大时,需要耗费大量的时间。于是我...

193100
来自专栏Laoqi's Linux运维专列

初识 MongoDB 服务

14430
来自专栏芋道源码1024

分布式事务 TCC-Transaction 源码解析 —— 调试环境搭建

本文主要基于 TCC-Transaction 1.2.3.3 正式版 1. 依赖工具 2. 源码拉取 3. 初始化数据库 4. 启动 capital 项目 5....

43670
来自专栏编程

每日一学之socket编程(二)

图片来自与百度图片 为什么要引入线程 在实际的开发中,一个ServerSocket服务端最小都有几十上百个客户端进行访问。当数据处理不及时,就会造成连接阻塞。 ...

18970
来自专栏Python

解决有关flask-socketio中服务端和客户端回调函数callback参数的问题(全网最全)

65540

扫码关注云+社区

领取腾讯云代金券