hibernate框架的基本原理及实例

Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,它将POJO与数据库表建立映射关系,是一个全自动的orm框架,hibernate可以自动生成SQL语句,自动执行,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。Hibernate可以应用在任何使用JDBC的场合,既可以在Java的客户端程序使用,也可以在Servlet/JSP的Web应用中使用。

从中,我们可以得出这样的结论:Hibernate是一个轻量级的JDBC封装,也就是说,我们可以使用Hibernate来完成原来我们使用JDBC完成的操作,也就是与数据库的交互操作。它是在dao层去使用的。

什么是ORM

对象关系映射(英语:Object Relation Mapping,简称ORM,或O/RM,或O/R mapping),是一种程序技术,用于实现面向对象编程语言里不同类型系统的数据之间的转换。

对象-关系映射,是随着面向对象的软件开发方法发展而产生的。面向对象的开发方法是当今企业级应用开发环境中的主流开发方法,关系数据库是企业级应用环境中永久存放数据的主流数据存储系统。对象和关系数据是业务实体的两种表现形式,业务实体在内存中表现为对象,在数据库中表现为关系数据。内存中的对象之间存在关联和继承关系,而在数据库中,关系数据无法直接表达多对多关联和继承关系。因此,对象-关系映射(ORM)系统一般以中间件的形式存在,主要实现程序对象到关系数据库数据的映射。

ORM模型的简单性简化了数据库查询过程。使用ORM查询工具,用户可以访问期望数据,而不必理解数据库的底层结构。

简单来说,我们使用ORM可以将我们的对象(或类)去进行映射,使得我们可以去操作对象就能完成对表的操作。
原文链接:https://blog.csdn.net/qq_38977097/java/article/details/81326503

下面是以显示数据库表中的信息为例,描述hibernate的原理:

环境:myeclipse2013+tomcat7+jdk1.8。

(1)新建项目,并新建两个包,一个包用来放hibernate的session工厂类文件,另一个放置orm类文件,并配置好相关的jdbc驱动包并导入(千万不要忘记导入);

(2)新建一个数据库连接;

首先打开数据库浏览视图DB browse,右击新建,然后填写好相关内容,如下所示:

再点击finish就完成了数据库连接的创建:

 (3)为项目安装hibernate;

右击项目后如图:

 

 这里我选择了3.3的版本,点击next:

选择放置配置文件的包,这里选择的是hibernate这个包,点击next:

然后选择我们创建的数据库连接mysql,点击next:

 这里默认,点击finish:

 这里就创建好了我们的hibernate的环境,这里我是遇到了一个错误,因为连接数据库的url是从之前的项目复制过来,没有做任何的更改,当配置到xml文件中时,如果url中含有“&”字符,xml文件是无法识别的,需要将其更换为“&”:

 (4)为数据库表创建映射类文件;

右击需要创建映射的表,选择hibernate reverse engineering,这里需要注意,所映射的数据库表一定一定要有主键,否则生成的orm类文件有两个,除了一般的类文件,它会自动生成一个***id的类文件,就像自动生成了一个id主键用来区分不同的对象,操作十分不方便:

 选择src文件以及放置orm的包,并配置好映射方案,点击next:

 接下来这里默认,一般不做选择,尤其是这里的主键生成策略id generator,主键生成策略我只是查了一下资料,试了其中的两个策略,理解的不是很好:

 接下来选择我们需要做映射的表,点击finish,就完成了orm映射的创建(这里如果项目没有导入jdbc的jar包的话点击finish会报错):

(5)看一下生成的orm;

这里生成了两个文件,Drug.java文件和Drug.hbm.xml文件:

Drug.java里映射了数据库表中的内容:

/**
 * Drug entity. @author MyEclipse Persistence Tools
 */

public class Drug implements java.io.Serializable {

    // Fields

    private String namee;
    private String numm;

    // Constructors

    /** default constructor */
    public Drug() {
    }

    /** minimal constructor */
    public Drug(String namee) {
        this.namee = namee;
    }

    /** full constructor */
    public Drug(String namee, String numm) {
        this.namee = namee;
        this.numm = numm;
    }

    // Property accessors

    public String getNamee() {
        return this.namee;
    }

    public void setNamee(String namee) {
        this.namee = namee;
    }

    public String getNumm() {
        return this.numm;
    }

    public void setNumm(String numm) {
        this.numm = numm;
    }

}

Drug.hbm.xml文件配置了表名(drug),数据库名(stu),对应的映射类文件的名称(orm.Drug),属性类型,名称,长度等信息,这里需要注意的是,属性的类型需要与数据库中相对应,比如当数据库中的字段的类型为varchar时,对应的这里就需要设置为java.lang.String:

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<!-- 
    Mapping file autogenerated by MyEclipse Persistence Tools
-->
<hibernate-mapping>
    <class name="orm.Drug" table="drug" catalog="stu">
        <id name="namee" type="java.lang.String">
            <column name="namee" length="25" />
            <generator class="assigned" />
        </id>
        <property name="numm" type="java.lang.String">
            <column name="numm" />
        </property>
    </class>
</hibernate-mapping>

(6)接下来新建一个jsp文件,编写我们的程序:

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@page import="org.hibernate.Query"%>
<%@page import="org.hibernate.Session"%>
<%@page import="orm.*"%>
<%@page import="hibernate.*"%>


<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">
    
    <title>My JSP 'DrugList.jsp' starting page</title>
    
    <meta http-equiv="pragma" content="no-cache">
    <meta http-equiv="cache-control" content="no-cache">
    <meta http-equiv="expires" content="0">    
    <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
    <meta http-equiv="description" content="This is my page">
    <!--
    <link rel="stylesheet" type="text/css" href="styles.css">
    -->

  </head>
  
  <body>
    <%
    Session ss = HibernateSessionFactory.getSession();
    ss.beginTransaction();
    Query query = ss.createQuery("from Drug");
    List<Drug> drugs = query.list();
    ss.getTransaction().commit();
    ss.close();
     %>
    <center>
       药品列表
    <br>
    <br>
    <a href="Drugadd.html">添加</a>
    <br>
    <br>
    <table border="1" cellspacing="0" cellpadding="4">
    <tr>
    <th>药名</th><th>库存</th><th>操作</th>
    </tr>
    <%for(int i=0;i<drugs.size();i++) { %>
    <tr>
    <td><%=drugs.get(i).getNamee() %></td>
    <td><%=drugs.get(i).getNumm() %></td>
    <td>
        <a href="Drugedit.jsp?name=<%=drugs.get(i).getNamee() %>" >编辑</a> 
        <a href="servlet/Drugdel?name=<%=drugs.get(i).getNamee() %>"  >删除</a> </td>
    </tr>
    <% } %>
    </table>
    <br>
    <br>
    <a href="index.jsp">返回</a>
    </center>
  </body>
</html>

运行结果:

 整个实例(包括增删改查)的下载地址:

https://github.com/wjn123/Hibernate-framework-instance

posted on 2020-04-18 17:22  宥宁  阅读(768)  评论(0编辑  收藏  举报

导航