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