前言:为什么会写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初了解
原文地址:https://www.cnblogs.com/NYfor2018/p/9092810.html