• 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

  • 相关阅读:
    ASP.NET 分页数据源:: PagedDataSource //可分页数据源
    strtok
    FloydWarshall算法详解(转)
    Tom Clancy's Splinter Cell: Double Agent
    暴雪COO确认:星际争霸2.0要来了
    wxWidgets 2.8.0 released
    如饥似渴
    大乘法器遇见小乘法器
    GLEW 1.3.5 adds OpenGL 2.1 and NVIDIA G80 extensions
    DevIL真是好用得想哭
  • 原文地址:https://www.cnblogs.com/123456www/p/12726932.html
Copyright © 2020-2023  润新知