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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > windows >内容正文

windows

从零打造在线网盘系统之Hibernate查询与更新技术

發布時間:2024/4/15 windows 44 豆豆
生活随笔 收集整理的這篇文章主要介紹了 从零打造在线网盘系统之Hibernate查询与更新技术 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

歡迎瀏覽Java工程師SSH教程從零打造在線網盤系統系列教程,本系列教程將會使用SSH(Struts2+Spring+Hibernate)打造一個在線網盤系統,本系列教程是從零開始,所以會詳細以及著重地闡述SSH三個框架的基礎知識,第四部分將會進入項目實戰,如果您已經對SSH框架有所掌握,那么可以直接瀏覽第四章,源碼均提供在GitHub/ssh-network-hard-disk上供大家參閱

本章學習目標

  • 掌握標準查詢API的使用
  • 掌握QBE
  • 掌握HQL
  • 掌握SQL
  • 本篇前言

    在前面兩篇文章中我們基本會使用Hibernate操作數據庫,但是基本都是使用的是Session接口進行操作,像這種根據索引進行檢索數據庫局限性非常大.為此Hibernate提供了很強大的查詢技術,例如標準查詢API,QBE,HQL,SQL等

    標準查詢API

    要想使用標準查詢API就要用到Hibernate的org.hibernate.Criteria接口,通過Session.createCriteria既可以創建Criteria對象

    public static void main(String[] args) {Session session = HibernateSessionFactory.getSession();Criteria criteria = session.createCriteria(Product.class);criteria.setMaxResults(2);List list = criteria.list();for (Object var : list) {System.out.print(var.toString());}session.close();}

    在使用標準API進行查詢的時候增加約束條件是一個SimpleExpression對象,由org.hibernate.criterion.Restrictions類的靜態方法可以獲得相應的SimpleExpression對象.

    criteria.add(Restrictions.eq("name", "中藥"));

    我們同樣可以進行模糊匹配

    criteria.add(Restrictions.like("name", "%中%"));

    使用MatchMode類靜態常量,模糊匹配我們也可以這樣也是一樣的

    criteria.add(Restrictions.like("name", "中", MatchMode.ANYWHERE));

    在增加查詢的約束條件的時候我們會這樣使用,查詢成績大于90的學生并且是女生,或者怎么怎么樣....,我們可以使用LogicalExpression改變他們的邏輯

    public static void main(String[] args) {Session session = HibernateSessionFactory.getSession();Criteria criteria = session.createCriteria(Product.class);SimpleExpression id1 = Restrictions.eq("id", 1);SimpleExpression id11 = Restrictions.eq("id", 11);LogicalExpression logicalExpression = Restrictions.or(id1, id11);criteria.add(logicalExpression);List list = criteria.list();for (Object var : list) {System.out.print(var.toString());}session.close();}

    可以看到使用LogicalExpression邏輯變得非常臃腫,Hibernate提供了更便捷的解決方案,那就是使用Conjunction生成And關系,使用Disjunction生成or關系

    Disjunction disjunction = Restrictions.disjunction();disjunction.add(id1);disjunction.add(id11);criteria.add(disjunction); Conjunction conjunction = Restrictions.conjunction();conjunction.add(id1);conjunction.add(id11);criteria.add(conjunction);

    那么如何使用標準查詢API進行分頁查詢呢?得益于Hibernate對不同數據庫的封裝,我們可以很便捷地進行分頁,例如xxxxx limit0, 10這樣的SQL我們平時經常見到,我們可以使用Criteria接口兩條語句即可實現分頁功能

    criteria.setFirstResult(0);criteria.setMaxResults(10);

    您閱讀到這里的時候可以發現Criteria接口返回的都是List對象,如果我們知道一條索引id,我們根絕這個id去進行去進行查找,就沒必要返回給我一個List集合了吧? 同樣我們可以使用uniqueResult方法返回一個Object對象

    Session session = HibernateSessionFactory.getSession();Criteria criteria = session.createCriteria(Product.class);criteria.add(Restrictions.eq("id",1));Product product = (Product) criteria.uniqueResult();

    在處理多個實體Bean關聯的情況下我們需要處理多個Criteria之間的關聯,我們可以通過Criteria創建另一個Criteria對象,參數是一個屬性名

    Session session = HibernateSessionFactory.getSession();Criteria productCriteria = session.createCriteria(Product.class);Criteria productDetailCriteria = productCriteria.createCriteria("productDetail");productDetailCriteria.add(Restrictions.eq("detatil", "肯定匹配不到我"));List list = productCriteria.list();

    我們可以使用AggregateProjection類進行聚合操作查詢,例如查詢一個表中的記錄數

    public static void main(String[] args) {Session session = HibernateSessionFactory.getSession();Criteria criteria = session.createCriteria(Product.class);criteria.setProjection(Projections.rowCount());Long count = (Long) criteria.uniqueResult();}

    QBE(Query By Example)

    除了使用標準查詢API,我們還可以使用QBE進行查詢

    public static void main(String[] args) {Session session = HibernateSessionFactory.getSession();Criteria criteria = session.createCriteria(Product.class);Product product = new Product();product.setName("中藥");criteria.add(Example.create(product));List list = criteria.list();}

    HQL(Hibernate Query Language)

    HQL是Hibernate框架提供的另一種操作數據的方式,其語法非常接近SQL,但卻是面向對象的也就是說HQL所操作的都是持久化對象,而不是數據表

    public static void main(String[] args) {Session session = HibernateSessionFactory.getSession();Query from_product = session.createQuery("from Product");List list = from_product.list();}

    我們在進行復雜的查詢HQL都是游刃有余的

    public static void main(String[] args) {Session session = HibernateSessionFactory.getSession();Query from_product = session.createQuery("select name from Product where id >0 or id<10");List list = from_product.list();}

    HQL和JDBC一樣是支持占位符查詢的

    public static void main(String[] args) {Session session = HibernateSessionFactory.getSession();Query from_product = session.createQuery("select name from Product where id > :id");from_product.setInteger("id", 0);List list = from_product.list();}

    HQL進行分頁查詢跟標準查詢API很是相似

    public static void main(String[] args) {Session session = HibernateSessionFactory.getSession();Query from_product = session.createQuery("from Product");from_product.setFirstResult(0);from_product.setMaxResults(10);List list = from_product.list();}

    HQL同樣支持聚合查詢

    public static void main(String[] args) {Session session = HibernateSessionFactory.getSession();Query from_product = session.createQuery("select count(*) from Product");Long count = (Long) from_product.uniqueResult();}

    HQL作為一種查詢語言同樣支持Update/Delete/Insert

    Query from_product = session.createQuery("xxxxxxx");from_product.executeUpdate();

    SQL

    雖然HQL可以完成大多數的操作,但是HQL并不支持數據庫的所有特性,因此在需要的時候我們還是需要直接使用SQL操作數據庫

    public static void main(String[] args) {Session session = HibernateSessionFactory.getSession();NativeQuery sqlQuery = session.createSQLQuery("select * from products p");sqlQuery.addEntity("p", Product.class);List<Product> list = sqlQuery.list();}

    本篇總結

    掌握Hibernate的查詢與更新技術,能在Hibernate框架的任意場景中熟練運用各種查詢與更新技術

    轉載于:https://www.cnblogs.com/jimisun/p/9939831.html

    超強干貨來襲 云風專訪:近40年碼齡,通宵達旦的技術人生

    總結

    以上是生活随笔為你收集整理的从零打造在线网盘系统之Hibernate查询与更新技术的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。