Hibernate介紹java
Hibernate是一個開放源代碼的對象關係映射框架,它對JDBC進行了很是輕量級的對象封裝,使得Java程序員能夠爲所欲爲的使用對象編程思惟來操縱數據庫。 mysql
官網 http://hibernate.org/ ios
如下爲其原理和基本的結構示意圖程序員
一步一步簡單講述其基本應用sql
一、建立java項目,添加hibernate引用數據庫
下載地址:編程
https://sourceforge.net/projects/hibernate/files/hibernate-orm/session
下載的完整版本,直接在lib/required中的jar包導入架構
二、導入數據庫鏈接器併發
我使用的是Mysql數據庫,你們能夠在如下下載,而後導入鏈接器
http://dev.mysql.com/downloads/connector/j/
三、建立數據表
create table students( id int primary key not null, name nvarchar(50), age int )
四、建立實體類
建議實體類符合JavaBean標準,字段、get、set方法,還有默認構造函數。
package yank.hibernate.sample; /** * 學生信息 * @author yank * */ public class Student { private Integer id; private String name; private Integer age; /** * 無參構造函數 */ public Student(){ } public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } }
五、配置實體與表的映射關係
非持久化的屬性,不要在這裏聲明。這裏的type並不是java的類型或者sql的類型,而是hibernate定義的映射類型,若是未設置,hibernate會自動給一合適的類型。
最好安裝hibernate的eclipse插件,可能更方便點
http://marketplace.eclipse.org/content/hibernate-tools-helios
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <!-- 映射 --> <hibernate-mapping package="yank.hibernate.sample"> <class name="Student" table="students"> <id name="id" column="id"> <generator class="increment" /> <!-- 標識符生成策略 --> </id> <property name="name" type="string" column="name" /> <property name="age" type="int" column="age" /> </class> </hibernate-mapping>
這裏的類型,應該是Hibernate-Types,這樣能夠實現JAVA類型與數據庫類型的轉換。若是沒有找到匹配類型,Hibernate會自動斷定給一合適類型。
注意:使用最後一列(Registry Key)的值便可。
六、建立hibernate的配置文件
這裏就須要配置hibernate如何訪問數據庫,包括鏈接驅動,鏈接地址、用戶名、密碼,鏈接池大小等。而且在這裏將配置映射文件
文件建立在srv根目錄下。
<?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="myeclipse.connection.profile">mysql</property> <property name="connection.url"> jdbc:mysql://localhost:3306/test </property> <property name="connection.username">root</property> <property name="connection.password">admin</property> <property name="connection.driver_class"> com.mysql.jdbc.Driver </property> <property name="dialect"> org.hibernate.dialect.MySQLDialect </property> <property name="show_sql">true</property> <!-- 映射資源 --> <mapping resource="yank/hibernate/sample/student.hbm.xml" /> </session-factory> </hibernate-configuration>
SessionFactory- 一個關聯於特定數據庫全局性的工廠(factory)。若是你要使用多個數據庫,一般應該在多個配置文件中使用多個<session-factory>進行配置
七、從配置文件加載SessionFactory
package yank.hibernate.sample; import org.hibernate.SessionFactory; import org.hibernate.cfg.Configuration; /** * hibernate工具類 * @author yank * */ public class HibernateUtils { private static final SessionFactory sessionFactory = buildSessionFactory(); private static SessionFactory buildSessionFactory() { try { // Create the SessionFactory from hibernate.cfg.xml return new Configuration().configure().buildSessionFactory(); } catch (Throwable ex) { // Make sure you log the exception, as it might be swallowed System.err.println("Initial SessionFactory creation failed." + ex); throw new ExceptionInInitializerError(ex); } } public static SessionFactory getSessionFactory() { return sessionFactory; } }
八、基本功能測試,簡單的CRUD能夠實現了
package yank.hibernate.sample; import java.util.List; import org.hibernate.SQLQuery; import org.hibernate.Session; public class StudentManager { public static void main(String[] args){ //新增 StudentManager stuMgr = new StudentManager(); stuMgr.createStudent("LiLei", 20); //查詢 Student student = stuMgr.findById(1); //編輯,保存 student.setAge(21); stuMgr.update(student); //查詢全部 Student last = null; List stuList = stuMgr.findList(); for(Object item : stuList){ System.out.println(((Student)item).getName()); last = (Student)item; } //刪除 stuMgr.delete(last); } /** * 新增 * @param id * @param name * @param age */ public void createStudent(String name,Integer age){ Student student = new Student(); student.setName(name); student.setAge(age); this.save(student); } /** * 保存 * @param student */ public void save(Student student){ Session session = HibernateUtils.getSessionFactory().openSession(); session.beginTransaction(); session.save(student); session.getTransaction().commit(); session.close(); } /** * 更新 * @param student */ public void update(Student student){ Session session = HibernateUtils.getSessionFactory().openSession(); session.beginTransaction(); session.update(student); session.getTransaction().commit(); session.close(); } /** * 根據id查詢 * @param stuId * @return */ public Student findById(Integer stuId){ Session session = HibernateUtils.getSessionFactory().openSession(); Student student = session.get(Student.class, stuId); session.close(); return student; } /** * 查詢集合 */ public List findList(){ Session session = HibernateUtils.getSessionFactory().openSession(); SQLQuery qry = session.createSQLQuery(" select * from Students").addEntity(Student.class); List list = qry.list(); session.close(); return list; } /** * 刪除 * @param 學生對象 */ public void delete(Student student){ Session session = HibernateUtils.getSessionFactory().openSession(); session.beginTransaction(); session.delete(student); session.getTransaction().commit(); session.close(); } }
九、其餘:
查詢List時報異常
Exception in thread "main" java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to yank.hibernate.sample.Student
代碼以下:
/** * 查詢集合 */ public List findList(){ Session session = HibernateUtils.getSessionFactory().openSession(); SQLQuery qry = session.createSQLQuery(" select * from Students"); List list = qry.list(); session.close(); return list; }
緣由:
查詢出來的對象不能自動轉爲JavaBean對象
解決方案:
利用addEntity,增長類型映射。
/** * 查詢集合 */ public List findList(){ Session session = HibernateUtils.getSessionFactory().openSession(); SQLQuery qry = session.createSQLQuery(" select * from Students").addEntity(Student.class); List list = qry.list(); session.close(); return list; }
JPA:
JPA全稱Java Persistence API.JPA經過JDK 5.0註解或XML描述對象-關係表的映射關係,並將運行期的實體對象持久化到數據庫中。
Sun引入新的JPA ORM規範出於兩個緣由:其一,簡化現有Java EE和Java SE應用開發工做;其二,Sun但願整合ORM技術,實現天下歸一。
JPA 是 JCP 組織發佈的 Java EE 標準之一,所以任何聲稱符合 JPA 標準的框架都遵循一樣的架構,提供相同的訪問API,這保證了基於JPA開發的企業應用可以通過少許的修改就可以在不一樣的JPA框架下運行。
JPA框架中支持大數據集、事務、併發等容器級事務,這使得 JPA 超越了簡單持久化框架的侷限,在企業應用發揮更大的做用。
Hibernate是在版本3.2後遵循JPA標準的。