SSH框架: Struts框架, 基於mvc模式的應用層框架技術! Hibernate,基於持久層的框架(數據訪問層使用)! Spring,創建對象處理對象的依賴關係以及框架整合! Dao代碼,如何編寫? 1.操作XML數據 2.使用Jdbc技術 3.原始的jdbc操作, Connection/St ...
SSH框架:
Struts框架, 基於mvc模式的應用層框架技術!
Hibernate,基於持久層的框架(數據訪問層使用)!
Spring,創建對象處理對象的依賴關係以及框架整合!
Dao代碼,如何編寫?
1.操作XML數據
2.使用Jdbc技術
3.原始的jdbc操作, Connection/Statement/ResultSet
a.自定義一個持久層框架, 封裝了dao的通用方法
b.DbUtils組件, 輕量級的dao的組件;
c.Hibernate技術 【hibernate最終執行的也是jdbc代碼!】
Hibernate是ORM的實現!
ORM 對象關係映射。 把對象的數據直接保存到資料庫;直接從資料庫中拿到一個對象。必須得有映射
1.引jar包
同struts。大家自己網上百度。
2.寫對象及對象的映射
Dept.java
1 package dao; 2 //對象 3 public class Dept { 4 private int deptId; 5 private String deptName; 6 public int getDeptId() { 7 return deptId; 8 } 9 public void setDeptId(int deptId) { 10 this.deptId = deptId; 11 } 12 public String getDeptName() { 13 return deptName; 14 } 15 public void setDeptName(String deptName) { 16 this.deptName = deptName; 17 } 18 19 20 }
Dept.hbm.xml 對象的映射// 映射文件: 映射一個實體類對象; 描述一個對象最終實現可以直接保存對象數據到資料庫中。
package: 要映射的對象所在的包(可選,如果不指定,此文件所有的類都要指定全路徑)
class 映射某一個對象的(一般情況,一個對象寫一個映射文件,即一個class節點)
name 指定要映射的對象的類型
table 指定對象對應的表;
如果沒有指定表名,預設與對象名稱一樣
主鍵的生成策略
identity 自增長(mysql,db2)
sequence 自增長(序列), oracle中自增長是以序列方法實現
native 自增長【會根據底層資料庫自增長的方式選擇identity或sequence】
如果是mysql資料庫, 採用的自增長方式是identity
如果是oracle資料庫, 使用sequence序列的方式實現自增長
increment 自增長(會有併發訪問的問題,一般在伺服器集群環境使用會存在問題。)
assigned 指定主鍵生成策略為手動指定主鍵的值
uuid 指定uuid隨機生成的唯一的值
foreign (外鍵的方式, one-to-one講)
普通欄位映射
property
name 指定對象的屬性名稱
column 指定對象屬性對應的表的欄位名稱,如果不寫預設與對象屬性一致。
length 指定字元的長度, 預設為255
type 指定映射表的欄位的類型,如果不指定會匹配屬性的類型
java類型: 必須寫全名
hibernate類型: 直接寫類型,都是小寫
1 <?xml version="1.0"?> 2 <!DOCTYPE hibernate-mapping PUBLIC 3 "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 4 "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> 5 6 <hibernate-mapping package="dao"> 7 <class name="Dept" table="t_dept"> //上邊寫的javabean 對應 一個 資料庫中的表 8 <id name="deptId" column="deptId">//主鍵映射 9 <generator class="native"/> 10 </id>
11 <property name="deptName" column="deptName"> //其他鍵 映射 12 </property> 13 </class> 14 </hibernate-mapping>
3.src/hibernate.cfg.xml 主配置文件
資料庫連接配置
載入所用的映射(*.hbm.xml)
1 <!DOCTYPE hibernate-configuration PUBLIC 2 "-//Hibernate/Hibernate Configuration DTD 3.0//EN" 3 "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd"> 4 5 <hibernate-configuration> 6 <session-factory name="foo"> 7 <!-- 資料庫連接配置 --> 8 <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property> 9 <property name="hibernate.connection.url">jdbc:mysql:///test1</property> 10 <property name="hibernate.connection.username">mxning</property> 11 <property name="hibernate.connection.password">mxning</property> 12 <property name="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</property> 13 14 <property name="hibernate.show_sql">true</property> 15 <!-- 載入所有映射 --> 16 <mapping resource="dao/Dept.hbm.xml"/> 17 </session-factory> 18 </hibernate-configuration>
4.測試
1 package dao; 2 3 import javax.transaction.HeuristicMixedException; 4 import javax.transaction.HeuristicRollbackException; 5 import javax.transaction.RollbackException; 6 import javax.transaction.SystemException; 7 import javax.transaction.Transaction; 8 9 import org.hibernate.Session; 10 import org.hibernate.SessionFactory; 11 import org.hibernate.cfg.Configuration; 12 import org.junit.Test; 13 14 15 public class app{ 16 @Test 17 public void testdept() throws Exception{ 18 Dept d = new Dept(); 19 d.setDeptName("xcxcxcx"); 20 21 // 獲取載入配置文件的管理類對象 22 Configuration config = new Configuration(); 23 config.configure(); // 預設載入src/hibenrate.cfg.xml文件 24 // 創建session的工廠對象 25 SessionFactory sf = config.buildSessionFactory(); 26 // 創建session (代表一個會話,與資料庫連接的會話) 27 Session session = sf.openSession(); 28 // 開啟事務 29 Transaction tx = session.beginTransaction(); 30 //保存-資料庫 31 session.save(d); 32 // 提交事務 33 tx.commit(); 34 // 關閉 35 session.close(); 36 sf.close(); 37 } 38 39 }
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); 保存或者更新的方法:
根據對象的狀態決定是save 還是 update
a.沒有設置主鍵,執行保存;
b.有設置主鍵,執行更新操作;
c.如果設置主鍵不存在報錯!
主鍵查詢:
session.get(Employee.class, 1); 主鍵查詢
session.load(Employee.class, 1); 主鍵查詢 (支持懶載入)返回的是代理,不會立即訪問資料庫。
HQL查詢:
HQL查詢與SQL查詢區別:
SQL: (結構化查詢語句)查詢的是表以及欄位; 不區分大小寫。
HQL: hibernate query language 即hibernate提供的面向對象的查詢語言
查詢的是對象以及對象的屬性。
區分大小寫。
hibernate的 CRUD
1 public class EmployeeDaoImpl implements IEmployeeDao{ 2 3 @Override 4 public Employee findById(Serializable id) { 5 Session session = null; 6 Transaction tx = null; 7 try { 8 // 獲取Session 9 session = HibernateUtils.getSession(); 10 // 開啟事務 11 tx = session.beginTransaction(); 12 // 主鍵查詢 ,會立刻訪問資料庫 13 return (Employee)session.get(Employee.class, id);
當我們需要使用這個類的時候可以用class的函數通過類名.class來載入這個類或者直接通過使用這個類來讓虛擬機載入你的類. 14 類名.class是一個關聯於類的對象。對於每一個類型都對應一個Class對象(基本類型除外)。
Class對象描述的是類的信息,包括靜態屬性、方法等,它是在類載入的時候生成的。
當要生成一個類型的對象是會先去檢查是否已經存在該類的Class對象,否則視為該類為被載入! 15 } catch (Exception e) { 16 throw new RuntimeException(e); 17 } finally { 18 tx.commit(); 19 session.close(); 20 } 21 }
1 public List<Employee> getAll() { 2 Session session = null; 3 Transaction tx = null; 4 try { 5 session = HibernateUtils.getSession(); 6 tx = session.beginTransaction(); 7 // HQL查詢 8 Query q = session.createQuery("from Employee"); 9 return q.list(); 10 } catch (Exception e) { 11 throw new RuntimeException(e); 12 } finally { 13 tx.commit(); 14 session.close(); 15 } 16 }
1 public List<Employee> getAll(String employeeName) { 2 Session session = null; 3 Transaction tx = null; 4 try { 5 session = HibernateUtils.getSession(); 6 tx = session.beginTransaction(); 7 Query q =session.createQuery("from Employee where empName=?"); 8 // 註意:參數索引從0開始 9 q.setParameter(0, employeeName); 10 // 執行查詢 11 return q.list(); 12 } catch (Exception e) { 13 throw new RuntimeException(e); 14 } finally { 15 tx.commit(); 16 session.close(); 17 } 18 }
1 public void save(Employee emp) { 2 Session session = null; 3 Transaction tx = null; 4 try { 5 session = HibernateUtils.getSession(); 6 tx = session.beginTransaction(); 7 // 執行保存操作,沒有主鍵添加,有主鍵更新 8 session.save(emp); 9 } catch (Exception e) { 10 throw new RuntimeException(e); 11 } finally { 12 tx.commit(); 13 session.close(); 14 } 15 16 }
1 public List<Employee> getAll(int index, int count) { 2 Session session = null; 3 Transaction tx = null; 4 try { 5 session = HibernateUtils.getSession(); 6 tx = session.beginTransaction(); 7 Query q = session.createQuery("from Employee"); 8 // 設置分頁參數 9 q.setFirstResult(index); // 查詢的其實行 10 q.setMaxResults(count); // 查詢返回的行數 11 12 List<Employee> list = q.list(); 13 return list; 14 } catch (Exception e) { 15 throw new RuntimeException(e); 16 } finally { 17 tx.commit(); 18 session.close(); 19 } 20 }