日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Hibernate_1_配置文件详解_基础案例_Hibernate工具类_API详解_持久化类编写规则

發(fā)布時(shí)間:2024/7/5 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Hibernate_1_配置文件详解_基础案例_Hibernate工具类_API详解_持久化类编写规则 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

Hibernate( ORM框架 )

Hibernate是一個(gè)數(shù)據(jù)持久化層的ORM框架. 它通過JavaBean, 數(shù)據(jù)庫中的表與自身的映射關(guān)系達(dá)到表中數(shù)據(jù)的增刪改查

特性

1.對(duì)JDBC訪問數(shù)據(jù)庫的代碼進(jìn)行封裝, 簡(jiǎn)化數(shù)據(jù)訪問的重復(fù)性代碼
2.使用反射機(jī)制完成對(duì)Bean的封裝
3.輕量級(jí)框架,支持關(guān)系型數(shù)據(jù)庫

核心配置文件的編寫

Hibernate的核心配置文件用于連接數(shù)據(jù)庫, 以及添加映射文件(映射文件就是JavaBean屬性與數(shù)據(jù)表之間的對(duì)應(yīng)關(guān)系)
核心配置文件文件名必須是: hibernate.cfg.xml //此處的cfg不是文件后綴類型
文件的地址位于src目錄下

下面通過例子說明:

<?xml version="1.0" encoding="UTF-8"?> <!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就是對(duì)數(shù)據(jù)庫連接的配置--><session-factory><!--以下都是固定寫法--><property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property> <!--配置數(shù)據(jù)庫驅(qū)動(dòng)類--><property name="hibernate.connection.url">jdbc:mysql:///test</property> <!--配置數(shù)據(jù)庫服務(wù)地址--><property name="hibernate.connection.username">root</property> <!--配置數(shù)據(jù)庫用戶名--><property name="hibernate.connection.password">1234</property> <!--配置數(shù)據(jù)庫登錄密碼--><!--向控制臺(tái)打印Hibernate執(zhí)行的sql語句--><property name="show_sql">true</property><!--優(yōu)化控制臺(tái)輸出的sql語句格式--><property name="format_sql">true</property><!--表結(jié)構(gòu)生成策略--><property name="hbm2ddl.auto">update</property><!--配置數(shù)據(jù)庫使用的sql, 固定寫法--><property name="hibernate.dialect">org.hibernate.dialect.MYSQLDialect</property><!--事務(wù)自動(dòng)提交--><property name="hibernate.connection.autocommit">true</property><!--將hibernate核心Session與線程綁定, 使得線程安全--><property name="hibernate.current_session_context_class">thread</property><mapping resource="com/hibernatetest/User.hbm.xml"> <!--配置映射文件, resource對(duì)應(yīng)映射文件的相對(duì)路徑--></session-factory> </hibernate-configuration>

表結(jié)構(gòu)生成策略
在hibernate中, 如果數(shù)據(jù)庫中沒有對(duì)應(yīng)的table, 在配置了hbm2ddl.auto屬性, hibernate將為你自動(dòng)生成表結(jié)構(gòu), 下面將詳細(xì)介紹該屬性的取值

  • update: 當(dāng)數(shù)據(jù)庫中不存在表結(jié)構(gòu), hibernate將會(huì)自動(dòng)創(chuàng)建表結(jié)構(gòu), 如果存在表結(jié)構(gòu), hibernate會(huì)檢查數(shù)據(jù)庫中的表結(jié)構(gòu)與映射文件配置的結(jié)構(gòu)是否對(duì)應(yīng), 如果不對(duì)應(yīng), 那么hibernate將會(huì)在原有的結(jié)構(gòu)上添加不存在的列, 不存在的數(shù)據(jù)使用null填充
  • create: 無論數(shù)據(jù)庫中是否存在表結(jié)構(gòu), 每次啟動(dòng)hibernate, hibernate都會(huì)新建一個(gè)表結(jié)構(gòu), 表中原有的數(shù)據(jù)會(huì)丟失
  • create-drop: 無論數(shù)據(jù)庫中是否存在表結(jié)構(gòu), 每次啟動(dòng)hibernate, hibernate都會(huì)新建一個(gè)表結(jié)構(gòu), 在hibernate運(yùn)行結(jié)束后, 刪除表結(jié)構(gòu)
  • validate: 啟動(dòng)hibernate, 會(huì)自動(dòng)檢查表結(jié)構(gòu)是否與映射文件結(jié)構(gòu)對(duì)應(yīng), 不對(duì)應(yīng)就拋異常, 它不會(huì)自動(dòng)創(chuàng)建/刪除/維護(hù)表結(jié)構(gòu)

JavaBean與映射文件

  • 數(shù)據(jù)庫中表結(jié)構(gòu):
create table t_user(id int auto_increment primary key,username varchar(50),password varchar(50) );
  • JavaBean就通過User表示
public class User{private int id;private String username;private String password;//下面一堆get/set操作,就不寫了 }
  • 映射文件:
    就是建立JavaBean中屬性與表結(jié)構(gòu)相對(duì)應(yīng)
    文件名: 遵守規(guī)范, 與JavaBean同名, 例如: User.hbm.xml
    文件位置: 放在JavaBean同一目錄下
    下面舉例說明:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN""http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <!--當(dāng)設(shè)置了package的時(shí)候,在后面的class中就不用寫完整的類名結(jié)構(gòu)--> <hibernate-mapping package="com.hibernatetest"><class name="User" table="t_user"><id name="id"><generator class="native"></generator> </id><property name="username" column="username" length="50" type="string"></property><property name="password" column="password"></property></class> </hibernate-mapping>

id標(biāo)簽中的generator屬性:配置主鍵生成策略
配置generator, 使得表中數(shù)據(jù)的主鍵可以由數(shù)據(jù)庫自增, 我們自己指定, 或者由Hibernate自動(dòng)生成(表必須有主鍵).

1.increment: 數(shù)據(jù)庫auto_increment方式, Hibernate會(huì)從數(shù)據(jù)庫中查找最大的主鍵值, 然后在該主鍵的基礎(chǔ)上加一為Bean對(duì)象的id賦值 2.identity: 直接依賴于數(shù)據(jù)庫的auto_increment 3.sequence: 序列,依賴于數(shù)據(jù)庫的序列功能(Oracle專屬) 4.hilo: 使用Hibernate自己實(shí)現(xiàn)的序列算法,自己生成主鍵為Bean對(duì)象id賦值 5.native: 自動(dòng)根據(jù)數(shù)據(jù)庫類型判斷, 自動(dòng)從identity, sequence, hilo中選擇 6.uuid 使用生成的32為不重復(fù)隨機(jī)字符串作為主鍵 7.assigned 使用自己指定的主鍵值

property標(biāo)簽常用屬性:
property主要用于配置數(shù)據(jù)庫中column與Bean的對(duì)應(yīng)關(guān)系, 以及column的屬性(數(shù)據(jù)類型, 長(zhǎng)度, 有效位, 是否為空, 是否唯一)

1.name: Bean中屬性名稱 2.column: 表中列名稱 3.type: 配置數(shù)據(jù)類型, 使用java的數(shù)據(jù)類型 或 數(shù)據(jù)庫數(shù)據(jù)類型 或 Hibernate數(shù)據(jù)類型中任意一個(gè) 4.length: 數(shù)據(jù)長(zhǎng)度范圍 5.scale: 數(shù)字的有效位 6.precision: 小數(shù)點(diǎn)后精度 7.not-null: 指定屬性的約束是否為空 8.unique: 指定屬性約束是否使用唯一

使用Hibernate進(jìn)行數(shù)據(jù)庫操作

下面使用一個(gè)簡(jiǎn)單的例子說明:

@Test public void demo(){//1. 加載核心配置文件和映射文件//由于核心配置文件文件名符合規(guī)則, 使用默認(rèn)的configure方法來加載Configuration c = new Configuration().configure();//2.獲得SessionFactory, 相當(dāng)于獲得數(shù)據(jù)庫連接池SessionFactory factory = c.buildSessionFactory();//3.獲得Session對(duì)象, 相當(dāng)于獲得connectionSession session = factory.openSession();//4.開啟事務(wù)Transaction transaction = session.beginTransaction();//5.執(zhí)行數(shù)據(jù)庫增刪改查操作................//6.提交事務(wù)transaction.commit();//7.釋放資源session.close();factory.close(); }

上面的7個(gè)步驟就可以完成數(shù)據(jù)庫的操作, 操作過程與JDBC差不多

封裝Hibernate工具類

由于加載配置文件, 獲得session對(duì)象, 關(guān)閉資源都是相同的代碼, 所以將相同的代碼封裝為工具類

package com.utils;import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.cfg.Configuration;public class HibernateUtils {private static SessionFactory sf;static {Configuration cf = new Configuration().configure();sf = cf.buildSessionFactory();Runtime.getRuntime().addShutdownHook(new Thread(new Runnable(){//當(dāng)虛擬機(jī)關(guān)閉的時(shí)候關(guān)閉資源@Overridepublic void run() {System.out.println("虛擬機(jī)關(guān)閉, 釋放資源");sf.close();}}));}public static Session openSession(){return sf.openSession();}//用于獲得ThreadLocal中的Sessionpublic static Session getCurrentSession(){return sf.getCurrentSession();} }

HibernateAPI解析:

  • Configuration配置核心文件
    1.new Configuration().configure(): Hibernate能做到自動(dòng)加載src下的Hibernate核心配置文件和Bean同目錄下的User.hbm.xml, 前提必須是文件放置的位置符合規(guī)范.
    2.當(dāng)放置的文件不符合規(guī)則的時(shí)候使用new Configuration().configure(file/path); 通過file/path進(jìn)行加載
    3.手動(dòng)加載映射文件:
configure.addResource("com/hibernatetest/User.hbm.xml"); configure.addClass(User.class);
  • SessionFactory
    SessionFactory用于管理所有的Session,線程安全, 使用configure.buildSessionFactory()獲得
    factory.openSession()與factory.getCurrentSession的區(qū)別:
openSession: 是直接就打開一個(gè)session, 不去看ThreadLocal是否存有Session getCurrentSession: 先去ThreadLocal中檢查是否存有, 若存在就使用ThreadLocal中的Session, 不存在再new

注: 使用getCurrentSession, 必須在核心配置文件中配置

<property name="hibernate.current_session_context_class">thread</property>
  • Session對(duì)象
    Session對(duì)象就相當(dāng)于JDBC中的Connection操作,單線程, session可以用來對(duì)數(shù)據(jù)庫中數(shù)據(jù)進(jìn)行增刪改查操作(都是建立在有主鍵的情況下).

  • Transaction事務(wù)
    開啟事務(wù): session.beginTransaction();
    獲得事務(wù): session.getTransaction();
    提交事務(wù): transaction.commit();
    回滾事務(wù): transaction.rollback();
    事務(wù)處理結(jié)構(gòu):

try{//開啟事務(wù)//session操作 } catch(e){//事務(wù)回滾 }

Session對(duì)象基本操作:

準(zhǔn)備操作:

Configuration c = new Configuration().configure(); SessionFactory factory = c.buildSessionFactory(); Session session = factory.openSession();
  • get查找數(shù)據(jù)庫中對(duì)象
獲得數(shù)據(jù)庫中對(duì)應(yīng)id為1的User對(duì)象 User u = session.get(User.class, 1);
  • load查找數(shù)據(jù)庫中對(duì)象
User u = (User)session.load(User.class, 3);
  • createQuery批量查詢
Query q = session.createQuery("from com.hibernate.User");//內(nèi)部的字符串是HQL語言(Hibernate自制的SQL) List<User> list = q.list(); User u = (User) q.uniqueResult(); //只返回一條記錄, 就是list.get(0); 使用Query可以進(jìn)行分頁操作, 數(shù)據(jù)庫的limit: q.setFirstResult(int i); //開始索引 q.setMaxResult(int i); //每頁顯示個(gè)數(shù)
  • createCriteria批量查詢
Criteria criteria = session.createCriteria(User.class); List<User> list = criteria.list(); // 查找id小于3的用戶 criteria.add(Restrictions.le("id", "3")); //使用add方法添加查詢的過濾條件 List<User> list = criteria.list();

注: Criteria做到面向?qū)ο蟛樵? 完全不需要使用SQL語句, 但是在一定程度上缺少靈活性

  • createSQLQuery執(zhí)行原生SQL實(shí)現(xiàn)批量查詢
SQLQuery query = session.createSQLQuery("select * from t_user"); query.addEntity(User.class);//將查詢結(jié)果封裝到指定的對(duì)象中 List<User> list = query.list();
  • save將Bean對(duì)象保存到數(shù)據(jù)庫中
//由于前面指定主鍵生成策略是native, 所以這里就不指定主鍵 //使用數(shù)據(jù)庫的auto_increment User u = new User(); u.setUsername("AAA"); u.setPassword("123"); session.save(u);
  • update對(duì)數(shù)據(jù)庫中數(shù)據(jù)進(jìn)行修改
首先查詢數(shù)據(jù)庫中是否存在對(duì)應(yīng)的User User u = (User) session.get(User.class,1); if (!u){u.setUsername("BBB"); //當(dāng)User存在的時(shí)候進(jìn)行修改session.update(u); }
  • delete刪除數(shù)據(jù)庫中對(duì)應(yīng)的對(duì)象
User u = (User) session.get(User.class, 2); session.delete(u);

load與get的區(qū)別
get: 一旦調(diào)用get操作,Hibernate就會(huì)使用SQL去數(shù)據(jù)庫中查找指定對(duì)象, 然后將這個(gè)對(duì)象封裝到User中
load: 調(diào)用load操作的時(shí)候, Hibernate先在內(nèi)部使用動(dòng)態(tài)代理, 生成只具有id屬性的代理對(duì)象, 只有當(dāng)使用該代理對(duì)象的屬性的時(shí)候, 才會(huì)去數(shù)據(jù)庫中查詢指定對(duì)象, 然后初始化該動(dòng)態(tài)代理對(duì)象
總結(jié): get操作立馬就SQL查詢, load操作只有在使用該對(duì)象屬性才會(huì)去查詢(延遲操作,一定程度上節(jié)約資源)

Hibernate持久化類

  • 持久化類編寫規(guī)則:
    1.提供無參public修飾的構(gòu)造方法
    2.提供一個(gè)"主鍵"屬性, 映射表中的主鍵
    3.所有屬性提供public修飾的get, set方法
    4.屬性盡量使用包裝類 (防止基本數(shù)據(jù)類型自動(dòng)初始化為0/""/false/0.0…, 使用包裝類就直接初始化為null, 便于數(shù)據(jù)庫操作)
    5.不要使用final修飾實(shí)例 (無法生存代理對(duì)象)
  • 持久化對(duì)象的唯一標(biāo)識(shí)OID
    對(duì)象的id要與表中的主鍵對(duì)應(yīng), 為了保證OID的唯一性, 應(yīng)該使用OID賦值
  • 類型對(duì)應(yīng)

上面有錯(cuò), 還請(qǐng)指出, 如果認(rèn)為我寫的還不錯(cuò), 還請(qǐng)點(diǎn)個(gè)贊, 多多支持一下, O(∩_∩)O~~

總結(jié)

以上是生活随笔為你收集整理的Hibernate_1_配置文件详解_基础案例_Hibernate工具类_API详解_持久化类编写规则的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。