Hibernate (開放源代碼的對象關係映射框架): Hibernate是一個開放源代碼的 對象關係映射框架,它對JDBC進行了很是輕量級的對象封裝,它將POJO與數據庫表創建映射關係,是一個 全自動的ORM框架,hibernate能夠 自動生成SQL語句,自動執行,使得Java程序員能夠爲所欲爲的使用對象編程思惟來操縱數據庫。
<!-- more -->java
緩存方面node
相同點:mysql
Hibernate和Mybatis的二級緩存除了採用系統默認的緩存機制外,均可以經過實現你本身的緩存或爲其餘第三方緩 存方案,建立適配器來徹底覆蓋緩存行爲。程序員
不一樣點:sql
Hibernate的二級緩存配置在SessionFactory生成的配置文件中進行詳細配置,而後再在具體的表-對象映射中配置是那種緩存。數據庫
MyBatis的二級緩存配置都是在每一個具體的表-對象映射中進行詳細配置,這樣針對不一樣的表能夠自定義不一樣的緩存機制。而且Mybatis能夠在命名空間中共享相同的緩存配置和實例,經過Cache-ref來實現。編程
準備好User實體類和數據庫記錄緩存
User.java
session
public class User { private Integer id; private String userName; private String passWord; //Get、Set方法,此處省略。 }
mysql數據庫:架構
Hibernate基礎Maven依賴:
<dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <scope>test</scope> </dependency> <!-- 添加hibernate的依賴 開始--> <dependency> <groupId>dom4j</groupId> <artifactId>dom4j</artifactId> <version>1.6.1</version> </dependency> <dependency> <groupId>commons-logging</groupId> <artifactId>commons-logging</artifactId> <version>1.1.1</version> </dependency> <!-- http://mvnrepository.com/artifact/org.hibernate/hibernate --> <!-- https://mvnrepository.com/artifact/org.hibernate/hibernate-core --> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-core</artifactId> <version>4.3.2.Final</version> </dependency> <dependency> <groupId>commons-collections</groupId> <artifactId>commons-collections</artifactId> <version>3.2.1</version> </dependency> <!-- <dependency> <groupId>cglib</groupId> <artifactId>cglib-nodep</artifactId> <version>3.1</version> </dependency> <!– Hibernate library dependecy end –> <dependency> <groupId>javax.transaction</groupId> <artifactId>jta</artifactId> <version>1.1</version> </dependency>--> <!-- 添加hibernate的依賴 結束--> <!-- mysql數據庫的驅動包 --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.6</version> </dependency> </dependencies>
<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"> <hibernate-configuration> <session-factory> <!--<property name="hibernate.bytecode.use_reflection_optimizer">false</property>--> <!--指定數據庫的驅動程序--> <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property> <!--指定鏈接數據庫的口令--> <property name="hibernate.connection.password">admin</property> <!--指定鏈接數據庫的URL--> <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/Hibernatetraning</property> <!--指定鏈接數據庫的用戶名--> <property name="hibernate.connection.username">root</property> <!--數據庫方言,用於指定使用的sql從屬於哪一個數據庫--> <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property> <!--若是爲true,表示在程序運行時會在控制檯輸出SQL語句,有利於跟蹤Hibernate的運行狀態,默認爲false。應用開發階段設置爲true,發佈階段應設置爲false提升運行性能--> <property name="show_sql">true</property> <!-- <property name="hibernate.hbm2ddl.auto">update</property>--> <mapping resource="mapper/User.hbm.xml"></mapping> </session-factory> </hibernate-configuration>
<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 4.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping> <class name="com.entity.User" table="tbl_user"> <!-- 在User裏面 id 的set 和 get 方法裏 也要設置爲Integer類型的,否則會報錯 --> <id name="id" column="id" type="java.lang.Integer"> <generator class="assigned"/> </id> <property name="userName" column="username" type="java.lang.String" length="20" /> <property name="passWord" column="password" type="java.lang.String" length="20"/> </class> </hibernate-mapping>
Configuration config = new Configuration().configure(); SessionFactory sessionFactory = config.buildSessionFactory(); //測試session是否建立,以及是否能夠從user映射的表裏獲取記錄 Session session = sessionFactory.openSession(); //System.out.println("session=="+session); User user = (User)session.get(User.class,1); System.out.println(user); //關閉會話工廠,項目自動中止。生產環境中千萬不要寫這句。 //sessionFactory.close();
控制檯輸出:User{id=1, userName='Jack', passWord='123'}
Hibernate是自動化程度更高ORM(Object-Relational Mapping)框架,不是面向SQL的持久層框架,以更加OO方式來編寫數據讀寫代碼。
注意:必定要清楚當前操做的東西,是屬於對象層面的仍是關係型數據庫層面的,解決異常也是如此。
Hibernate中的對象有3中狀態,瞬時對象(Transient Objects)、持久化對象(Persistent Objects)和離線對象(Detached Objects也叫作脫管對象)。
HibernateUtils.java
工具類public class HibernateUtils { private static SessionFactory sessionFactory = null; static { try { Configuration configuration = new Configuration().configure(); ServiceRegistry serviceRegistry = new ServiceRegistryBuilder() .applySettings(configuration.getProperties()) .build(); sessionFactory = configuration.buildSessionFactory(serviceRegistry); }catch (HibernateException e){ System.out.println("SessionFactory初始化失敗"); e.printStackTrace(); } } public static SessionFactory getSessionFactory() throws Exception{ if (sessionFactory != null){ return sessionFactory; }else { throw new Exception("sessionFactory爲空,請檢查配置文件"); } } public static Session getSession(){ Session session = null; try { if (sessionFactory != null){ session = sessionFactory.openSession(); } }catch (HibernateException e){ e.printStackTrace(); } return session; } public static void closeSession(Session session){ try { if (session != null && session.isOpen()){ session.close(); } }catch (HibernateException e){ e.printStackTrace(); } } }
測試代碼:
Session session = HibernateUtils.getSession(); Transaction tx = session.beginTransaction(); User user1 = new User(); user1.setId(2); user1.setUserName("Frank"); user1.setPassWord("111"); // 當前user1在數據庫中沒有記錄進行關聯,因此此時user1是瞬時對象。 // 將user1持久化 session.save(user1); tx.commit(); User user2 = (User)session.get(User.class, 2); System.out.println(user2); // 當前user2在數據庫有惟一一條記錄對應,因此此時user2是持久化對象。
hibernate.cfg.xml配置文件中hibernate.hbm2ddl.auto屬性值(從類自動生成數據庫DDL操做)
<property name="hibernate.hbm2ddl.auto">update</property>
設置爲update能夠不用手動建表了。