今天想回顧一下一個月前學的hibernate框架,也讓我瞭解了持久層的概念(訪問數據庫).java
首先提的是ORM概念,O表示Object,mysql
R表示Relation(關係),關係型數據庫,如mysql,oracle等,M表示mapping,ORM連起來對象關係映射.sql
Hibernate 實現了ORM,解決了兩個問題:一是存儲:把對象的數據直接保存到數據庫中,二是獲取,直接從數據庫中拿到一個對象,中間必須經過映射這個概念數據庫
搭建一個Hibernate環境,開發步驟:session
1. 下載源碼oracle
版本:hibernate-distribution-3.6.0.Finalapp
2. 引入jar文件框架
hibernate3.jar核心 + required 必須引入的(6個) + jpa 目錄 + 數據庫驅動包ide
以下圖:sqlserver
3. 寫對象以及對象的映射
Employee.java 對象
Employee.hbm.xml 對象的映射 (映射文件)
4. src/hibernate.cfg.xml 主配置文件
-à 數據庫鏈接配置
-à 加載所用的映射(*.hbm.xml)
5. App.java 測試
Employee.java對象
package cn.itcast.a_hello; import java.util.Date; public class Employee { private int empId; private String empName; public int getEmpId() { return empId; } public void setEmpId(int empId) { this.empId = empId; } public String getEmpName() { return empName; } public void setEmpName(String empName) { this.empName = empName; } public Date getEmpDate() { return empDate; } public void setEmpDate(Date empDate) { this.empDate = empDate; } private Date empDate; public Employee() { // TODO Auto-generated constructor stub } @Override public String toString() { return "Employee [empId=" + empId + ", empName=" + empName + ", empDate=" + empDate + "]"; } }
Employee.hbm.xml配置文件
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping SYSTEM "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="cn.itcast.a_hello"> <class name="Employee" table="employee"> <!-- 主鍵映射值 --> <id name="empId" column="id"> <generator class="native"> </generator> </id> <!-- 非主鍵映射 --> <property name="empName" column="empName"></property> <property name="empDate" column="empDate"></property> </class> </hibernate-mapping>
hibernate.cfg.xml主配置文件
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd"> <hibernate-configuration> <session-factory name="foo"> <!-- 數據庫鏈接配置 --> <property name="hibernate.connection.driver_class">com.microsoft.sqlserver.jdbc.SQLServerDriver</property> <property name="hibernate.connection.url">jdbc:sqlserver://localhost:1433;DatabaseName=Employee</property> <property name="hibernate.connection.username">sa</property> <property name="hibernate.connection.password">XXXXXX</property> <property name="hibernate.dialect">org.hibernate.dialect.SQLServer2008Dialect</property> <!-- 2.其它配置設置 --> <!-- 2.1設置運行時是否顯示執行的sql語句 --> <property name="show_sql">true</property> <!-- 2.2設置運行的sql語句格式化 --> <property name="hibernate.format_sql">true</property> <!-- 2.3設置是否建立表 1.create不存在表直接建立,存在則先刪除表再建立表 2.update若是存在就不會建立表,若是不存在則建立 3.create-drop createSessionFactory()時建立表 sf.close()刪除表 --> <property name="hibernate.hbm2ddl.auto">create</property> <!-- 加載全部映射 <mapping resource="cn/itcast/a_hello/Employee.hbm.xml"/>--> </session-factory> </hibernate-configuration>
最後的效果:
最後看到數據庫多了一條記錄
|-- Configuration 配置管理類對象
config.configure(); 加載主配置文件的方法(hibernate.cfg.xml)
默認加載src/hibernate.cfg.xml
config.configure(「cn/config/hibernate.cfg.xml」); 加載指定路徑下指定名稱的主配置文件
config.buildSessionFactory(); 建立session的工廠對象
|-- SessionFactory session的工廠(或者說表明了這個hibernate.cfg.xml配置文件)
sf.openSession(); 建立一個sesison對象
sf.getCurrentSession(); 建立session或取出session對象
|--Session session對象維護了一個鏈接(Connection), 表明了與數據庫鏈接的會話。
Hibernate最重要的對象: 只用使用hibernate與數據庫操做,都用到這個對象
session.beginTransaction(); 開啓一個事務; hibernate要求全部的與數據庫的操做必須有事務的環境,不然報錯!
更新:
session.save(obj); 保存一個對象
session.update(emp); 更新一個對象
session.saveOrUpdate(emp); 保存或者更新的方法:
à沒有設置主鍵,執行保存;
à有設置主鍵,執行更新操做;
à若是設置主鍵不存在報錯!
配置SessfionFactory
private static SessionFactory sf; //加載配置文件,只執行一次 static{ /** * 建立SessionFactory對象,指定了class對象後就 * 能夠不用在主配置文件中指定<mapping resource=""/> */ sf = new Configuration() .configure() .addClass(Employee.class)//(測試)會自動加載Employee.hbm.xml文件,必須和該類在同一包下 .buildSessionFactory(); }
測試保存:
@Test public void testSave() throws Exception{ // TODO Auto-generated method stub //對象 Employee emp = new Employee(); emp.setEmpName("張三"); emp.setEmpDate(new Date()); Session session = sf.openSession(); //開啓事務alt+shift+l快速生成左邊的變量,但鼠標要放在放在方法後面 Transaction tx = session.beginTransaction(); //保存到數據庫 session.save(emp); // session.createQuery("from cn.itcast.c_hbm_config.Employee").list(); //提交事務 tx.commit(); session.close(); }
測試更新
@Test public void testUpdate() { //對象 Employee emp = new Employee(); emp.setEmpName("李四2"); emp.setEmpId(4); //1.建立session Session session = sf.openSession(); //2.開啓事務 Transaction tx = session.beginTransaction(); //3.執行更新操做,必須設置主鍵 //session.update(emp); //根據主鍵獲得對應的對象 Employee employee = (Employee) session.get(Employee.class, 5); System.out.println(employee); //save或者update,當設置主鍵時,執行更新操做,當沒有設置主鍵時執行插入操做 session.saveOrUpdate(emp); tx.commit(); session.close(); }
1、主鍵查詢:
session.get(Employee.class, 1); 主鍵查詢
session.load(Employee.class, 1); 主鍵查詢 (支持懶加載)
例如:
@Test public void testGet() { Session session = sf.openSession(); //2.開啓事務 Transaction tx = session.beginTransaction(); Employee emp = (Employee) session.get(Employee.class,5); System.out.println(emp); tx.commit(); session.close(); }
2、HQL查詢:
HQL查詢與SQL查詢區別:
SQL: (結構化查詢語句)查詢的是表以及字段; 不區分大小寫。
HQL: hibernate query language 即hibernate提供的面向對象的查詢語言
查詢的是對象以及對象的屬性。
區分大小寫。優勢跨平臺
//HQL查詢 @Test public void testSQL() { //1.建立session Session session = sf.openSession(); //2.開啓事務 Transaction tx = session.beginTransaction(); Query q = session.createQuery("from Employee where id= 2 or id=5"); List<Employee> list = q.list(); System.out.println(list); tx.commit(); session.close(); }
3、Criteria查詢:
徹底面向對象的查詢。
@Test public void testCRQ() { //1.建立session Session session = sf.openSession(); //2.開啓事務 Transaction tx = session.beginTransaction(); Criteria crita = session.createCriteria(Employee.class); //查詢條件 crita.add(Restrictions.eq("id", 8)); List<Employee> list = crita.list(); System.out.println(list); tx.commit(); session.close(); }
4、本地SQL查詢:
複雜的查詢,就要使用原生態的sql查詢,也能夠,就是本地sql查詢的支持!
(缺點: 不能跨數據庫平臺!)
//本地SQL查詢 @Test public void testSQL() { //1.建立session Session session = sf.openSession(); //2.開啓事務 Transaction tx = session.beginTransaction(); SQLQuery se = session.createSQLQuery("select * from employee"); //查詢條件 List<Employee> list = se.list(); System.out.println(list); tx.commit(); session.close(); }
Hibernate 實現分頁查詢
//HQL實現分頁查詢 @Test public void testFenYe() { //1.建立session Session session = sf.openSession(); //2.開啓事務 Transaction tx = session.beginTransaction(); Query query = session.createQuery("from Employee"); //設置分頁參數.起始從零開始 query.setFirstResult(0);//查詢的起始記錄 query.setMaxResults(4);//查詢的記錄數 List<Employee> list = query.list(); System.out.println(list); tx.commit(); session.close(); }
值得注意的問題:
共性問題1:
ClassNotFoundException…., 缺乏jar文件!
問題2:
若是程序執行程序,hibernate也有生成sql語句,但數據沒有結果影響。
問題通常是事務忘記提交…….
遇到問題,必定看錯誤提示!