(三)mybatis之对Hibernate初了解
前言:为什么会写Hibernate呢?因为HIbernate跟Mybatis一样,是以ORM模型为核心思想的,但是这两者有相似的地方也有差异的地方。通过这两种框架的比对,可以对mybatis有着更深的了解。
Hibernate
在Hibernate之前是EJB(JavaEE服务器端组件模型),但是由于EJB配置复杂,且适用范围比较小,所以很快就被淘汰了。于是Hibernate一问世就成了Java世界首选的ORM模型,它是建立在POJO和数据库表模型的直接映射关系上的。
Hibernate是建立在若干POJO通过xml映射文件(或注解)提供的规则映射到数据库表上的。而且Hibernate对JDBC的封装程度还是比较高的,我们已经不需要编写SQL语言,只要使用HQL(Hibernate Query Language)语言就可以了。
① 首先我们要先提供hbm.xml文件,制定从POJO到数据库表的映射规则。
<?xml version="1.0?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="com.entity.User" table="user_info">
<!-- class标签中,name是POJO的所在坐标位置,table是POJO在数据库中对应的表的表明 -->
<id name="id" type="int">
<column name="id"/>
<generator class="assigned"/>
<!-- generator这里的class的值为assigned,表示主键由外部程序负责生成,在save()之前指定一个 -->
</id>
<property name="userName" type="string">
<column name="userName" length="60"/>
</property>
</class>
</hibernate-mapping>
这是一个简单的XML文件,它描述的是POJO和数据库表的映射关系。Hibernate通过配置文件(或注解)就可以把数据库的数据直接映射到POJO上,我们可以通过操作POJO去操作数据库记录。
② 再编写Hibernate连接数据库的配置文件cfg.xml。
<?xml version="1.0 encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/mybatis</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password"></property>
<mapping resource="com/entity/User.hbm.xml"/>
</session-factory>
</hibernate-configuration>
这个xml文件描述了数据库连接信息,在配置信息的时候也相对于JDBC要方便。
③ 然后建立Hibernate的工厂对象(SessionFactory),用它来做全局对象,产生Session接口,就可以操作数据库了。
public class HibernateUtil{
private static final SessionFactory sessionFactory;
static{
try{
Configuration cfg = new Configuration().configure("hibernate.cfg.xml");
//引入数据库配置文件
sessionFactory = cfg.buildSessionFactory();
//将数据库的配置信息应用到sessionFactory,sessionFactory用于生成session
}catch(Throwable ex){
System.err.println("Initial SessionFactory creation failed."+ex);
throw new ExceptionInInitializerError(ex);
}
}
public static SessionFactory getSessionFactory(){
return sessionFactory;
}
}
上面的操作就是为了产生Hibernate的SessionFactory。它作为全局,可以到处引用。
④ 最后就是引用上面的操作来进行session的应用。
public class HibernateExample{
public static void main(String[] args){
Session session = null;
try{
session = HibernateUtil.getSessionFactory().openSession();
User user = (User)session.get(User.class,1);
System.err.println("userName =>"+user.getUserName());
}finally{
if(session!=null){
session.close();
}
}
}
}
这里的代码的效果跟JDBC篇(https://www.cnblogs.com/NYfor2018/p/9088254.html )的代码效果是一样的。
而Hibernate的实现比用JDBC的方法实现的好处在于:
1、 消除了代码的映射规则,它全部被分离到了XML文件或者注解里面去配置。(Hibernate的注解方式的应用可以参考这篇文章:http://www.cnblogs.com/NYfor2018/p/9029933.html ).
2、 无需再管理数据库连接,它也配分离到XML文件配置里面了。
3、 一个会话中,不要操作多个对象,只要操作Session对象即可。
4、 关闭资源只用关闭一个Session即可。
5、 Hibernate还提供级联、缓存、映射、一对多等功能。
6、 Hibernate是全表映射,可以通过HQL去操作POJO进而操作数据库的数据。
但是,如果表名进行了更改,要动态加载映射关系,Hibernate需要破坏底层封装才能做到。而且我们是没有办法通过xml文件去完成映射规则的。再者,Hibernate屏蔽了SQL,那就意味着只能全表映射,很不便于在较多数据的数据库表中对数据进行操作。
稍微总结一下HIbernate的缺点:
1、 全表映射带来的不便,像是更新时需要发送所有的字段。
2、 无法根据不同的条件组装不同的SQL。
3、 对多表关联和复杂SQL查询支持较差,需要自己写SQL,返回后,需要自己将数据组装为POJO。
4、 不能有效支持存储过程。
5、 虽然有HQL,但是性能较差。大型互联网系统往往需要优化SQL,而Hibernate做不到。
(三)mybatis之对Hibernate初了解的更多相关文章
- Hibernate初认识以及HelloWorld
一.Hibernate初认识 1. Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库. 2.对 ...
- hibernate初体验
简介: Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库. Hibernate可以应用在任何使 ...
- hibernate初使用
准备工作,安装及配置Hibernate http://zhoualine.iteye.com/blog/1190141 在产生数据库表映射 Java 对象时,我增加了数据库中的两张表分别为Chatlo ...
- 一 Mybatis概述&与Hibernate的区别&CRUD
Mybatis是类似Hibernate的ORM持久层框架 为什么学习Mybatis? 是目前国内主流的持久层框架,面向sql(相较于Hibernate,Mybatis一定要用sql) Hibernat ...
- 【SSH三个框架】Hibernate第七基金会:不少下属业务
相对于上述一关系,在这里,下一个一对多关系说明. 另外,在上述.我们描述了许多人描述的一一对应关系.在关系数据库是多对一的关系,但也有许多关系.但,只知道它是不够的,Hibernate它是一种面向对象 ...
- 【SSH三个框架】Hibernate第十篇基础:inverse属性具体解释
inverse后经常用于双向1-N在相关性.它也可以在使用N-N该协会,这里,例如用双1-N联想 或两个与各部门及工作人员,两javabean没有写. 首先,我们的员工看映射文件: <?xml ...
- 【SSH三个框架】Hibernate第八部分基础:经营-many关系
在Hibernate在-many关系.它通常不使用.由于当数据库查询复杂度太高时. 我们在这里做的是学生和教师,学生可以有多个老师,教师可以有多个学生. watermark/2/text/aHR0cD ...
- 20155315庄艺霖第三次作业之Linux初体验
Linux初体验 安装Linux三两事 老师的作业要求基于VirtualBox安装Linux系统,我一开始下载了VB但是电脑运行不了,后来看网上的教程下载了VMware,才算开始了我的Linux之旅. ...
- mybatis入门(三):mybatis的基础特性
mybatis的知识点: 1.mybatis和hibernate本质区别和应用场景 hibernate:是一个标准的ORM框架(Ojbect relation mapper对象关系映射).入门门槛较高 ...
随机推荐
- 查看电脑MAC地址
MAC地址也叫物理地址 1.运行 cmd 输入ipconfig或ipconfig/all
- 关于chrome被篡改主页修复方法
打开chrome的属性. 在目标框中追加以下内容 "PATH\chrome.exe" --flag-switches-begin --flag-switches-end about ...
- linux中的条件变量
1 大家可能知道互斥量是线程程序中必须的工具了,但是也不能是万能的,就比如某个线程正在等待共享数据某个条件的发生,这个时候会发生什么呢.它就可能重复的尝试对互斥对象锁定和解锁来检查共享数据结构. 2 ...
- 20个Flutter实例视频教程-第10节: 一个不简单的搜索条-1
20个Flutter实例视频教程-第10节: 一个不简单的搜索条-1 视频地址: https://www.bilibili.com/video/av39709290/?p=10 博客地址: https ...
- Flutter实战视频-移动电商-48.详细页_详情和评论的切换
48.详细页_详情和评论的切换 增加切换的效果,我们主要是修改这个地方 这样我们的评论的内容就显示出来了 最终代码 details_web.dart import 'package:flutter/m ...
- UVa 1641 ASCII Area (计算几何,水题)
题意:给定一个矩阵,里面有一个多边形,求多边形的面积. 析:因为是在格子里,并且这个多边形是很规则的,所以所有格子不是全属于多边形就是全不属于,或者一半,并且我们可以根据"/"和“ ...
- HDU - 1098 - Ignatius's puzzle - ax+by=c
http://acm.hdu.edu.cn/showproblem.php?pid=1098 其实一开始猜测只要验证x=1的时候就行了,但是不知道怎么证明. 题解表示用数学归纳法,假设f(x)成立,证 ...
- 第五章 “我要点爆”微信小程序云开发实例之从云端获取数据制作首页
下面我们来实现从云端获取数据,完成首页世界页面index的制作,首页分为4个数据列表导航页面,页面具体内容如下: 推荐:为用户推荐最新的点爆信息,它包含文本点爆内容和语音点爆内容. 文爆:筛选出文字点 ...
- centos 7.3 安装vmtools,解决无法编译共享文件夹模块
环境说明: vmware 12.5.0 build-4352439 centos 7.3.1611 64位,内核版本:Linux version 3.10.0-514.16.1.el7.x86_6 ...
- ios 微信登录相关
引入项目的文件 info.plist 添加内容 WXApi.registerApp(Config.wx.APP_ID,enableMTA: true)//注册微信api(在AppDelegate里面注 ...