咱們都知道SQL是很是強大的,爲何這麼說呢?相信學過數據庫原理的同窗們都深有體會,SQL語句變化多端,好絕不誇張的說能夠實現任意符合咱們須要的數據庫操做,既然前面講到Hibernate很是強大,因此Hibernate也是可以實現SQL的一切數據庫操做。sql
在SQL中,單表查詢是最經常使用的語句,同理Hibernate最經常使用到的也是查詢語句,因此今天就來說講Hibernate的單表查詢:數據庫
今天要將的內容分如下幾點:緩存
Hibernate不只爲咱們提供了它自己的查詢語句HQL,同時也還提供了SQL和criteria標準查詢,接下來咱們都會來一一實驗。服務器
廢話很少說,直接上代碼:session
SQL:app
String sql = "select * from t_student"; List<Student> list =session.createSQLQuery(sql).addEntity(Student.class).list(); for(Student student:list) { System.out.println(student); } //sql語句和咱們原生的sql語句同樣,查詢後的 //createSQLQuery(sql)這個返回的是一個sql語句,經過查詢得到的是一個結果集(Set),而後Hibernate經過addEntity進行封裝,返回一個list集合,裏面裝着封裝好的Student對象。
HQL:函數
String hql = "from Student";//這裏放的是Student類,由於HQL查詢時面向對象的。 List <Student>list = session.createQuery(hql).list();//正由於查詢是面向對象的,因此不須要封裝。 for(Student student:list) { System.out.println(student); }
QBC(Query By Criteria):spa
List <Student>list = session.createCriteria(Student.class).list(); for(Student student:list) { System.out.println(student); } //它也是面向對象查詢,只須要將Student Class對象最爲參數就行,連語句都不須要0.0
SQL:.net
String sql = "select * from t_student order by t_age desc"; //降序,升序爲asc List<Student> list =session.createSQLQuery(sql).addEntity(Student.class).list();
HQL:hibernate
String hql = "from Student order by age desc";
List <Student>list = session.createQuery(hql).list();
QBC:
List <Student>list = session.createCriteria(Student.class).addOrder(Order.desc("age")).list(); //session.createCriteria(Student.class).addOrder(Order.asc("age")).list(); //QBC的特殊查詢,每一個查詢都會對應方法
接下來咱們只驗證HQL語句,由於SQL語句和咱們學過的都同樣,以前只是演示了它在Hibernate中的用法。
在JDBC中咱們可使用預處理語句來提升效率,而且能夠用來防止SQL注入攻擊,Hibernate一樣能夠完成相似的操做:
//方法一: String hql = "from Student where age>?"; List <Student>list = session.createQuery(hql).setInteger(0, 25).list(); //setInteger(0, 25)位置從0開始,JDBC是從1開始
//方法二: String hql = "from Student where age>:age";//以冒號開頭起別名 List <Student>list = session.createQuery(hql).setInteger("age", 25).list();
//方法三: String hql = "from Student where age>?"; List <Student>list = session.createQuery(hql).setParameter(0, 25).list(); //這裏設置參數要注意數據類型,若是類中字段定義的是Double類型,那麼setParameter(0, 25)參數25應該爲寫爲25.0
在SQL中分頁查詢時很是重要的了,在Hibernate中也一樣是。
在傳統的SQL語句中分頁查詢的語句爲:
select*from table limit startIndex,pageSize;
HIbernate裏面的分頁不是經過語句來實現的,而是經過方法對session操做來實現的:
int page = 2;//前臺須要分頁的時候通常會向後臺提交頁數 int pageSize = 3;//由前臺傳回須要每頁幾條數據 int firstResult = (page-1)*pageSize;//結果集是從零開始 List <Student>list = session.createQuery(hql).setFirstResult(firstResult).setMaxResults(pageSize).list(); //這樣就完成了咱們的分頁
一樣Hibernate也提供了模糊查詢:
//方法一: String hql = "from Student where name like '%張%'"; List <Student>list = session.createQuery(hql).list();
//方法二: String hql = "from Student where name like ?"; List <Student>list = session.createQuery(hql).setString(0, "%張%").list();
//方法三: String hql = "from Student where name like:name"; List <Student>list = session.createQuery(hql).setString("name", "%張%").list();
String hql = "from Student where id=:id"; Student student = (Student)session.createQuery(hql) .setInteger("id", 1) .uniqueResult(); //以前咱們獲得的都是list集合,經過.uniqueResult();能夠獲得單個結果集,也就是封裝好的單個對象。
String hql = "select count(*) from Student "; Long count = (Long)session.createQuery(hql) .uniqueResult(); //聚合函數count查詢出來的數是long數據類型,也是uniqueResult
投影查詢也就是查詢部分字段。如:id,name,age,score
咱們只須要查詢name,age,就叫作投影查詢。
String hql = "select new Student(name,age) from Student "; List<Student> list = session.createQuery(hql) .list(); //由於hql語句是面向對象的查詢,因此投影查詢須要new一個含有所投影字段的對象(同時要在實體類中添加對應是構造函數)
String hql = "select age from Student group by age having count(age)>4 "; List<Integer> list = session.createQuery(hql) .list(); //對於查詢單個的字段,由於有數據類型與它對應,因此不須要新建對象,能夠直接查詢。 HQL分組查詢和SQl查詢方法基本一致
iterator(迭代器)首先會從session緩存中查詢咱們須要的內容,若是沒有咱們須要的內容,而後去數據庫用sql語句查詢。
屢次查詢相同的內容咱們能夠用到Hibernate的緩存特性(session),能夠加快查詢的效率。
傳統的咱們用HQL查詢的時候,每次都須要去數據庫中查詢,這樣若是查詢一樣的內容就會形成數據庫服務器負載太重(例如新聞主頁,就會屢次查詢相同內容),當第一次查詢事後session沒有clear或者close以前咱們已經查詢過的內容都會在session中緩存,因此當第二次查詢的時候咱們就可使用迭代器了。
咱們知道從session中讀取數據遠遠比從數據庫中讀取數據要快。
可是,迭代器對於沒有查詢過的內容(也就是session緩存中沒有要查詢的數據的時候),效率會特別低,因此咱們建議對於一樣查詢,第一次使用list查詢,第二次及之後使用iterator迭代。
咱們也能夠將常常用到的查詢語句在咱們Hibernate主配置文件中配置好。
<!--注意,query標籤是<hibernate-mapping>的子標籤--> <query name="queryById">from Student where id=:id</query>
//使用getNamedQuery方法來得到配置文件中的查詢語句。 Student student = (Student)session.getNamedQuery("queryById").setInteger("id", 1).uniqueResult();
到這裏咱們就將Hibernate的基本單表查詢學的差很少了(我這裏只列舉了咱們常用到的一些操做)。