1. 程式人生 > >(三)mybatis之對Hibernate初了解

(三)mybatis之對Hibernate初了解

直接 utf-8 多個 更改 fig cfg.xml myba jdb 相對

前言:為什麽會寫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初了解