hibernate框架
hibernate是數據化持久工具,也是一個開源代碼的ORM解決方案.hibernate內部封裝了通過jdbc訪問數據庫的操作,向商場應用提供面向對象的數據訪問api.
hibernate基於ORM在對象模型和關系型數據庫的表之間建立了一座橋梁,通過hibernate,程序員就不需要再使用SQL語句操作數據庫中的表,使用api直接操作
Javabean對象就可以實現數據的增,刪,改,查操作,顯著降低了由對象與關系型數據庫在數據表現方面的范例不匹配導致的開發成本.
hibernate框架的優點
- 提高了持久化代碼的開發速度,降低維護成本
- 支持許多面向對象的特性,如組合,繼承,多態等,使得開發人員不必再面向業務的對象模型和面向數據庫模型之間來回切換,方便開發人員進行領域驅動的面向對象的設計與開發
- 可移植性好.系統不會綁定在某個特定的關系型數據庫上對於系統更換數據庫,通常只需要修改hibernate配置文件即可正常運行
- hibernate框架開源免費,可以在需要時研究源代碼,改寫源代碼,進行功能的定制,具有可擴展性
hibernate框架的缺點
- 不適合以數據為中心,大量使用存儲過程的應用
- 大規模的批量插入,修改和刪除不適合用hibernate
hibernate的環境搭建
第一步創建項目並導入jar
鏈接:https://pan.baidu.com/s/1yLbnLaRRqI2paYGwlZiZQA
提取碼:fomx
創建web項目
進入之后選中web application
下一步之后 選好路徑命好名稱
最后finish即可
導入jar
在WEB-INF創建一個lib目錄
點擊第一選項后 找到lib 點擊ok即可
項目結構如下
最后ok 即可
第二步編寫hibernate配置文件
在resource下創建 hibernate.cfg.xml
進入此界面,選中項目點擊 +
點擊之后會出現一個框框選中hibernate,這個時候再點擊右邊的 + 添加
ok之后 resource下面就出現了我們所需的xml文件
之后再把這個框起來的路徑改成 不然可能會加載不到此配置文件
http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd
代碼如下
<?xml version='1.0' encoding='utf-8'?> <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"> <hibernate-configuration> <session-factory> <!-- 數據庫URL --> <property name="connection.url">jdbc:oracle:thin:@localhost:1521:orcl</property> <!-- 用戶--> <property name="connection.username">scott</property> <!-- 密碼 --> <property name="connection.password">orcl</property> <!-- jdbc驅動 --> <property name="connection.driver_class">oracle.jdbc.driver.OracleDriver</property> <!-- 每個數據庫都有其對應的方言(Dialect)以匹配其平台特效 --> <property name="hibernate.dialect">org.hibernate.dialect.Oracle10gDialect</property> <!-- 指定session范圍和上下文 --> <property name="current_session_context_class">thread</property> <!-- 是否將運行期間生成的SQL輸出到日志以共調試 --> <property name="show_sql">true</property> <!-- 是否格式化SQL --> <property name="format_sql">true</property> <!-- 映射文件配置位置 --> <mapping resource="entity/EmpDao.xml"/> </session-factory> </hibernate-configuration>
實體類:
package entity; import java.sql.Date; public class Emp { //編號 private Integer empno; //名稱 private String ename; //部門 private String job; //上級編號 private double MGR; //入職時間 private Date hiretDate; //工資 private double sal; //年終獎 private double comm; //崗位id private Integer deptNo; public void setEmpno(Integer empno) { this.empno = empno; } public void setEname(String ename) { this.ename = ename; } public void setJob(String job) { this.job = job; } public void setMGR(Object MGR) { if (MGR!=null) this.MGR = (double)MGR; } public void setHiretDate(Date hiretDate) { this.hiretDate = hiretDate; } public void setSal(double sal) { this.sal = sal; } public void setComm(Object comm) { if(comm!=null){ this.comm =(double)comm; } } public void setDeptNo(Integer deptNo) { this.deptNo = deptNo; } public Integer getEmpno() { return empno; } public String getEname() { return ename; } public String getJob() { return job; } public double getMGR() { return MGR; } public Date getHiretDate() { return hiretDate; } public double getSal() { return sal; } public double getComm() { return comm; } public Integer getDeptNo() { return deptNo; } }
接下來編寫實體類映射文件
右鍵 找到mapper 新建名為 Emp.hbm 的映射xml文件
會自動生成頭文件和一些屬性
自動生成參考這里: https://www.cnblogs.com/hfx123/p/9978289.html
如果不需要自動生要手打的則如下 新建名稱為 Emp.hbm
編寫好的映射文件如下
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <hibernate-mapping> <!-- name實體類路徑 table數據庫表名 schema表的擁有者--> <class name="entity.Emp" table="emp" schema="scott"> <!-- 此id屬性表示 持久化的OID和表的主鍵映射 name為實體類中的屬性名稱 type為數據類型 column為數據庫中的列名 --> <id name="empno" type="java.lang.Integer" column="empno"> <!-- 此屬性用於指定具體注解生成策略 assigned策略,就是不使用主鍵生成策略,由手工輸入ID. --> <generator class="assigned"/> </id> <!-- name為實體類中的屬性名稱 type為數據類型 column為數據庫中的列名 not-null表示不為空與數據庫列對應 --> <property name="ename" type="string" not-null="true" column="ename"/> <property name="deptNo" type="java.lang.Integer" column="deptNo"/> <property name="job" type="string"column="job"/> <property name="MGR" type="java.lang.Double" column="MGR"/> <property name="hiretDate" type="java.sql.Date" column="hireDate"/> <property name="sal" type="java.lang.Double" column="sal"/> <property name="comm" type="java.lang.Double" column="comm"/> </class> </hibernate-mapping>
主鍵策略
- increment
increment策略是指,不使用數據庫本地的自增長策略,而是由程序(Hibernate框架)產生一個自增長的ID值,賦予數據庫.每次插入前都會去查詢表中id最大的值,然后+1作為新主鍵
- hilo(了解)
高低位算法,主鍵自增,由hibernate來維護,開發時不使用.因為沒有數據庫同時不支持主鍵自增長或者則序列號
- idenitty
identity策略,指定使用數據庫里面的ID自增長策略. 只能用於支持ID自增長功能的數據庫,如:MySQL,SQLServer.. 不支持沒有ID自增長策略的數據庫,如Oracle,DB2..
- sequence
使用序列的實現ID生成策略,主要用於有序列的數據庫.如:Oracle,DB2,如果不支持序列的數據庫(如:MYSQL),該策略會使用一個表模擬序列。
- native
使用數據庫本地的策略,就是數據庫里面使用怎么樣的策略就用什么策略,HIbernate不做任何的判斷.如:MySQL數據庫使用了increment_auto,自增長策略.使用native.表示直接調用數據庫里面的increment_auto策略.
- uuid
就是數據庫的主鍵是使用一個唯一的==字符串==的來存儲.這個唯一的字符串就是UUID主鍵必須為String類型
- assigned
assigned策略,就是不使用主鍵生成策略,由手工輸入ID.
原文:https://blog.csdn.net/kato_op/article/details/80296619
第三步編寫dao及service層
dao層
package dao; import entity.Emp; import org.hibernate.SessionFactory; import org.hibernate.Transaction; import org.hibernate.cfg.Configuration; import java.io.Serializable; public class EmpDao { public Emp get(Serializable id){ //初始化配置和sessionFactory Configuration configuration = new Configuration().configure(); SessionFactory sessionFactory =configuration.buildSessionFactory(); //打開事務 sessionFactory.getCurrentSession().beginTransaction(); //通過session的get方法根據加載指定對象 return (Emp)sessionFactory.getCurrentSession().get(Emp.class,id); } }
service層
package service; import dao.EmpDao; import entity.Emp; import org.hibernate.SessionFactory; import org.hibernate.cfg.Configuration; import java.io.Serializable; public class EmpSerivce { EmpDao empDao =new EmpDao(); public Emp get(Integer id){ return empDao.get(id); } }
測試類
package test; import service.EmpSerivce; public class Test { public static void main(String[] args){ EmpSerivce empSerivce = new EmpSerivce(); System.out.println(empSerivce.get(7788).getEname()); } }
結果:
此項目的下載鏈接
鏈接:https://pan.baidu.com/s/1jJlXNbfvk79nzseNiiHQmg
提取碼:8sh3 lib目錄里沒有jar需要自己添加
如果有什么疑問可以在下面評論,看到了會第一時間回復.希望對大家有所幫助