前言
ORM框架不是一個新話題,它已經伴隨我們很多年了。它提供了概念性的、易于理解的數據模型,將數據庫中的表和內存中的對象建立了很好的映射關系。在Java中常用的ORM框架主要有兩個:Hibernate和iBatis。本篇文章主要介紹Hibernate的使用方法,后續會出介紹iBatis的文章。
傳統的MVC開發模式
- ?M:Model包括pojo、service、dao。
- V:View 包括jsp、html、模塊引擎。
- C:Controll 包括我們動態網絡資源的技術:Servlet。?
SSH框架在開發中的作用
- ?S:Struts/SpringMVC: 實際上解決的是我們的控制器的問題(簡單的可以認為是Servlet的封裝)。
- Spring: 整合其余的第三方框架,就是為 Srvice 層提供事務。
- Hibernate:其實就是DAO層的解決方案。?
同時可以看下其余框架(SSM、SSS)的含義:
Hibernate是什么
1.Hibernate是一個非侵入式ORMapping框架
- 非侵入式框架:我們在使用這個框架的時候,不需要繼承或者實現這個框架中的類或者接口,這種類型的框架就叫做非侵入式的框架,非侵入式的框架在使用的時候更好的和原有的框架實現了解耦
- 侵入式框架:我們在使用這個框架的時候,需要繼承或者實現這個框架中的某些類或者接口,這種框架叫做侵入式框架
2.ORMapping解析
- O:Object
- R:Relation
- M:Mapping 映射
- a.Hibernate能夠將Java對象通過映射的關系映射到數據庫
- b.Hibernate能夠將數據庫的數據通過映射關系映射到Java對象
Hibernate就是能夠通過操作Java對象來達到操作數據庫的一門技術。
Hibernate能干什么
簡單的說:實現數據庫的所有操作(CRUD),是原有DAO層的一個解決方案,也是一個替代品。
Hibernate的簡單使用
「簡單使用:」
導包,將下載下來的required+jpa相關的包放到一個文件里面
在src下面創建hibernate.cfg.xml配置文件
<?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>
<!--驅動程序-->
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<!--訪問的URL-->
<property name="hibernate.connection.url">jdbc:mysql:///qianyu</property>
<!--用戶名-->
<property name="hibernate.connection.username">root</property>
<!--密碼-->
<property name="hibernate.connection.password">root</property>
<!--方言 表示的是告訴Hibernate框架當前 你要生成那個數據庫下的SQL語句-->
<property name="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</property>
<!--是否自動創建表 create:表示的是每一次 都從新創建 update:表示的是 如果有就不創建 沒有就創建-->
<property name="hibernate.hbm2ddl.auto">update</property>
<!--配置映射文件-->
<mapping resource="com/qy/helloworld/User.hbm.xml"/>
</session-factory>
</hibernate-configuration>
創建Java的類的對象
public class User implements Serializable{
private static final long serialVersionUID = -6949433888868762441L;
private int uId;
private String userName;
private String userPwd;
public User(int uId, String userName, String userPwd) {
super();
this.uId = uId;
this.userName = userName;
this.userPwd = userPwd;
}
public User() {
super();
}
public int getuId() {
return uId;
}
public void setuId(int uId) {
this.uId = uId;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getUserPwd() {
return userPwd;
}
public void setUserPwd(String userPwd) {
this.userPwd = userPwd;
}
@Override
public String toString() {
return "User [uId=" + uId + ", userName=" + userName + ", userPwd=" + userPwd + "]";
}
}
編寫測試類
@Test
public void testHelloWord() throws Exception {
//引入配置文件
Configuration cfg=new Configuration().configure("hibernate.cfg.xml");
//創建SessionFactory對象
SessionFactory sf=cfg.buildSessionFactory();
//創建會話
Session session=sf.openSession();
//開啟事務
session.beginTransaction();
//操作對象
User user=new User(1,"小羽","110");
//開始操作
session.save(user);
//進行事務的提交
session.getTransaction().commit();
session.close();
}
Hibernate中的hibernate.cfg.xml配置文件的詳解
<?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>
<!--驅動程序-->
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<!--訪問的URL-->
<property name="connection.url">jdbc:mysql:///qianyu</property>
<!--用戶名-->
<property name="connection.username">root</property>
<!--密碼-->
<property name="connection.password">root</property>
<!--方言 表示的是告訴Hibernate框架當前 你要生成那個數據庫下的SQL語句-->
<property name="dialect">org.hibernate.dialect.MySQL5Dialect</property>
<!--是否自動創建表 create:表示的是每一次 都從新創建 update:表示的是 如果有就不創建 沒有就創建-->
<!--create經常用在測試的環境中-->
<property name="hbm2ddl.auto">update</property>
<!--執行的時候將SQL語句展示出來-->
<property name="show_sql">true</property>
<!--格式化這個SQL語句-->
<property name="format_sql">true</property>
<!--配置映射文件 配置的是映射文件的-->
<mapping resource="com/qy/helloworld/User.hbm.xml"/>
<!--使用注解的時候使用的是這一個-->
<!-- <mapping package="com.qy.helloworld"/> -->
</session-factory>
</hibernate-configuration>
Hibernate的xxx.hbm.xml配置文件的詳解
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<!--package:一般情況下要進行配置 可以不配置 但是 下面你就要寫全路徑 auto-import="true":如果不配置的話那么在進行查詢的時候必須寫類的全路徑-->
<!--default-lazy:配置整個實體是否支持懶加載 默認就支持懶加載-->
<hibernate-mapping package="com.qy.helloworld" default-lazy="true" auto-import="true">
<!--下面配置的是映射關系 將JAVA對象 直接映射到數據庫的表里面去
name:表示的是類的名字
table:表示的是當前的這個JAVA類 對應的數據庫中的表的名字做是什么 這個名字是可以隨便寫的 但是一般要見名之意
lazy:當前這個類在進行查詢操作的時候 要進行懶加載
-->
<class name="User" table="t_user" lazy="true">
<!--
id:表示的是主鍵的映射
name:類中主鍵的名字
column:主鍵對應的表的字段
length:確定當前字段的最大長度
type:類型(寫的是JAVA中數據類型的全路徑)
注意:類型可以省略:省略之后的類型就和實體中的類型保持一致
length:可以省略 默認就是int的最大范圍
column:這個也可以省略省略之后 默認和類中保持一致
-->
<id name="uId">
<!--主鍵自增長
上面的重點記住
identity:自增長這個表示的意思是:會根據底層的數據庫選擇自增長的策略
assigned:自己設置這個id的值
foreign:這個表示的是要將別人的主鍵來作為自己的主鍵
uuid:通過uuid來生成id主鍵
下面的了解
increment:遞增(這個跟數據庫是有關系的)
native:是遞增(跟底層的數據庫的方言有關)
sequence:這個表示的是通過表的序列來完成下一個id的生成(Oracle數據庫)
-->
<generator class="identity"/>
</id>
<!--下面映射的是普通的屬性
length:字符串的長度
not-null:當前字段不能為空
type:類型
-->
<property name="userName" column="userName" length="20" not-null="true"/>
<property name="userPwd" length="20" not-null="true" type="java.lang.String"/>
</class>
</hibernate-mapping>
Hibernate中的CRUD的實現
添加數據
session.save(user);
session.persist(user);
修改數據
session.beginTransaction();
//查詢數據(積極的加載)
User user=session.get(User.class,1);
//下面支持的是懶加載
user.setUserName("xxxxx");
user.setUserPwd("yyyyy");
session.getTransaction().commit();
數據查詢
//查詢數據(積極的加載)
User user=session.get(User.class,1);
//下面支持的是懶加載
User user2=session.load(User.class,1);
刪除數據
//查詢數據(積極的加載)
User user=session.get(User.class,1);
session.delete(user);
Hibernate中的幫助類的編寫
public class HibernateUtils {
private static Configuration cfg=null;
private static SessionFactory sf=null;
private static ThreadLocal<Session> threadLocal=null;
static{
//初始化線程的局部變量
threadLocal=new ThreadLocal<Session>();
//加載配置文件
cfg=new Configuration().configure("config/hibernate.cfg.xml");
//生成我們的工廠
sf=cfg.buildSessionFactory();
}
/**
* 獲取session的玩法
* @Title: getSession
* @Description: TODO
* @param: @return
* @return: Session
* @throws
*/
public static Session getSession(){
Session session=threadLocal.get();
if(null==session){
session=sf.openSession();
session.beginTransaction();
threadLocal.set(session);
}
return session;
}
/**
* 關閉Session
* @Title: close
* @Description: TODO
* @param:
* @return: void
* @throws
*/
public static void close(){
Session session=threadLocal.get();
if(null!=session){
session.getTransaction().commit();
session.close();
threadLocal.remove();
}
}
}
注意事項
- 我們hibernate.cfg.xml配置文件中這個括hibernate.是可以省略
- 為什么不開啟事務也能查詢到數據?是因為默認Hibernate存在只讀事務,只讀事務是可以完成數據的讀的操作的,如果是要完成增刪改的話那么就需要讀寫事務,這個時候就需要開啟事務
Save和Persist的區別
- Save在保存數據的時候,如果id是自增長,你給定id和不給定id都是對的。
- Persist在保存數據的時候,如果id是自增長的,你給定id是會報錯的。
結語
本篇關于Hibernate的介紹就先到這里結束了,后續會出更多關于Hibernate系列更多文章,謝謝大家支持!
原文地址:https://mp.weixin.qq.com/s/25xY2fl4rv89alvmaUrxOw