(三)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初了解