三大框架之hibernate入門,三大hibernate入門
hibernate入門
1、orm
hibernate是一個經典的開源的orm[數據訪問中間件]框架
ORM( Object Relation Mapping)對象關系映射
通過 對象模型 操作 數據庫關系模型
hibernate處於項目的持久層位置,因此又稱為持久層框架
2、hibernate核心組件
SessionFactory [整個數據庫的操作] 重量級組件
Session[對數據庫的一次業務操作] -- 輕量級組件
3、hibernate配置
配置SessionFactory
4、使用hibernate開發一個APP
在導好jar包後:
a.配置hibernate.cfg.xml:
1 <?xml version="1.0" encoding="UTF-8"?>
2 <!DOCTYPE hibernate-configuration PUBLIC
3 "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
4 "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
5 <hibernate-configuration>
6 <session-factory>
7 <!--Database connection settings -->
8 <property name="connection.driver_class">oracle.jdbc.driver.OracleDriver</property>
9 <property name="connection.url">jdbc:oracle:thin:@localhost:1521:orcl</property>
10 <property name="connection.username">scott</property>
11 <property name="connection.password">tiger</property>
12 <!--SQL dialect 方言-->
13 <property name="dialect">org.hibernate.dialect.Oracle10gDialect</property>
14 <!--Enable Hibernate's automatic session context management -->
15 <property name="current_session_context_class">thread</property>
16 <!--Echo all executed SQL to stdout -->
17 <property name="show_sql">true</property>
18 <mapping resource="com/it/bean/UserInfo.hbm.xml"/>
19 </session-factory>
20 </hibernate-configuration>
SessionFactory --- 關聯 xxx.hbm.xml
UserInfo.hbm.xml的配置:
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 <hibernate-mapping package="com.it.bean">
6 <class name="UserInfo" table="userinfo">
7 <id name="user_id" column="user_id">
8 <!-- 主鍵生成策略 -->
9 <generator class="assigned"></generator>
10 </id>
11 <property name="user_name" column="user_name"></property>
12 <property name="user_sex" column="user_sex"></property>
13 <property name="user_birth" column="user_birth"></property>
14 <property name="user_addr" column="user_addr"></property>
15 <property name="user_pwd" column="user_pwd"></property>
16 </class>
17 </hibernate-mapping>
View Code
補充:
主鍵生成策略:
-
Assigned:主鍵由外部程序生成,無需Hibernate干預。
-
identity:采用數據庫提供的主鍵生成機制,如MySql、DB2、SqlServer的自增主鍵。
-
sequence:使用數據庫的sequence機制。
-
hilo:通過hi/lo 算法實現的主鍵生成機制,需要額外的數據庫表保存主鍵生成歷史狀態。
-
seqhilo:與hilo 類似,通過hi/lo 算法實現的主鍵生成機制,只是主鍵歷史狀態保存在Sequence中,適用於支持Sequence的數據庫,如Oracle。
-
increment:主鍵按數值順序遞增。此方式的實現機制為在當前應用實例中維持一個變量,以保存著當前的最大值,之後每次需要生成主鍵的時候將此值加1作為主鍵。這種方式可能產生的問題是:如果當前有多個實例訪問同一個數據庫,那麼由於各個實例各自維護主鍵狀態,不同實例可能生成同樣的主鍵,從而造成主鍵重復異常。因此,如果同一數據庫有多個實例訪問,此方式必須避免使用。
-
native:由Hibernate根據底層數據庫定義自行判斷采用identity、hilo、sequence其中一種作為主鍵生成方式。
-
foreign:使用外部表的字段作為主鍵。
-
uuid.hex:由Hibernate基於128 位唯一值產生算法,根據IP、當前時間、JVM啟動時間、內部自增量生成16 進制數值(編碼後以長度32 的字符串表示)作為主鍵,該方法提供了最好的數據庫插入性能和數據庫平台適應性。
-
uuid.string:與uuid.hex 類似,只是生成的主鍵未進行編碼(長度16),在某些數據庫中可能出現問題(如PostgreSQL)。
b、創建sessionFactory
SessionFactory
sessionFactory=(SessionFactory)
new Configuration().configure().buildSessionFactory();
c.創建Session
Session session=sessionFactory .getCurrentSession();
d.創建Transaction
//創建事務並開啟事務
Transaction tx = session.beginTransaction();
e.開啟事務
f.執行操作--業務操作
g.提交事務
tx.commit();
h.異常處理塊,事務回滾
在try catch異常處理後,tx.rollback;
完整代碼(basedao):
1 package com.it.dao;
2 import java.util.List;
3 import org.hibernate.Query;
4 import org.hibernate.SessionFactory;
5 import org.hibernate.Transaction;
6 import org.hibernate.cfg.Configuration;
7 import org.hibernate.classic.Session;
8 import com.it.dao.util.SessionFactoryUtils;
9 /**
10 * 基礎DAO
11 * @author xj
12 *
13 */
14 public class BaseDAO <T>{
15 /**
16 * 查詢集合--全部
17 */
18 public List<T> find(String hql){
19 Session session =null;
20 //事務
21 Transaction tx = null;
22 List<T> list =null;
23 try {
24 //這裡將創建SessionFactory寫成了方法(工具類)--創建SessionFactory並得到Session
25 session=SessionFactoryUtils.getSessionFactory().getCurrentSession();
26 //開啟事務
27 tx=session.beginTransaction();
28 //查詢Java bean UserInfo--對象這裡hql是查詢語句:eg:from UserInfo(UserInfo-->是java bean裡的對象)
29 Query query = session.createQuery(hql);
30 list = query.list();
31 //提交
32 tx.commit();
33 } catch (Exception e) {
34 e.printStackTrace();
35 //事務回滾
36 tx.rollback();
37 }
38 return list;
39 }
40
41 /**
42 * 查詢帶參數
43 */
44 public List<T> find(String hql,String ...params){
45 Session session =null;
46 //事務
47 Transaction tx = null;
48 List<T> list =null;
49 try {
50 session=SessionFactoryUtils.getSessionFactory().getCurrentSession();
51 //開啟事務
52 tx=session.beginTransaction();
53 //查詢Java bean UserInfo--對象
54 Query query = session.createQuery(hql);
55 //給參數賦值
56 for (int i = 0; i < params.length; i++) {
57 query.setString(i, params[i]);
58 }
59 list = query.list();
60 //提交
61 tx.commit();
62 } catch (Exception e) {
63 e.printStackTrace();
64 //事務回滾
65 tx.rollback();
66 }
67 return list;
68 }
69
70 }
71 /**
72 * 添加
73 * @param obj
74 */
75 public void add(Object obj){
76 Session session =null;
77 Transaction tx = null;
78 try {
79 //
80 session=SessionFactoryUtils.getSessionFactory().getCurrentSession();
81 tx=session.beginTransaction();
82 //操作
83 session.save(obj);
84 //提交
85 tx.commit();
86 } catch (Exception e) {
87 // TODO: handle exception
88 e.printStackTrace();
89 //事務回滾
90 tx.rollback();
91 System.out.println("--我回滾啦---");
92 }
93 }
94
95 /**
96 * 按對象刪除
97 */
98 public void del(Object obj){
99 Session session =null;
100 Transaction tx = null;
101 try {
102 //
103 session=SessionFactoryUtils.getSessionFactory().getCurrentSession();
104 tx=session.beginTransaction();
105 //操作
106 session.delete(obj);
107 //提交
108 tx.commit();
109 } catch (Exception e) {
110 // TODO: handle exception
111 e.printStackTrace();
112 //事務回滾
113 tx.rollback();
114 System.out.println("--我回滾啦---");
115 }
116 }
117 /**
118 * 按編號刪除
119 */
120 public void delete(Class<T> clz, String OID){
121 Session session =null;
122 Transaction tx = null;
123 //通過給的id來查詢該id的對象
124 Object o=get(clz,OID);
125 try {
126 //
127 session=SessionFactoryUtils.getSessionFactory().getCurrentSession();
128 tx=session.beginTransaction();
129 //操作
130 session.delete(o);
131 //提交
132 tx.commit();
133 } catch (Exception e) {
134 // TODO: handle exception
135 e.printStackTrace();
136 //事務回滾
137 tx.rollback();
138 System.out.println("--我回滾啦---");
139 }
140 }
141
142 /**
143 * 修改
144 * @param obj
145 */
146 public void upd(Object obj){
147 Session session =null;
148 Transaction tx = null;
149 try {
150 //得到SessionFactory
151 session=SessionFactoryUtils.getSessionFactory().getCurrentSession();
152 //開啟事務
153 tx=session.beginTransaction();
154 //操作
155 session.update(obj);
156 //提交
157 tx.commit();
158 } catch (Exception e) {
159 // TODO: handle exception
160 e.printStackTrace();
161 //事務回滾
162 tx.rollback();
163 System.out.println("--我回滾啦---");
164 }
165 }
166
167 /**
168 * 查詢
169 */
170 public T get(Class<T> clz, String OID){
171 Session session =null;
172 Transaction tx = null;
173 T t=null;
174 try {
175 //
176 session=SessionFactoryUtils.getSessionFactory().getCurrentSession();
177 tx=session.beginTransaction();
178 //操作
179 t = (T) session.get(getClass(), OID);
180 //提交
181 tx.commit();
182 } catch (Exception e) {
183 // TODO: handle exception
184 e.printStackTrace();
185 //事務回滾
186 tx.rollback();
187 System.out.println("--我回滾啦---");
188 }
189 return t;
190 }
191
View Code
hibernate導的包: