Hibernate的四種查詢方式(主鍵查詢,HQL查詢,Criteria查詢,本地sql查詢)和修改和添加

Hibernate的添加,修改,查詢(三種查詢方式)的方法:java

案例演示:mysql

1:第一步,導包,老生常談了都是,省略;
sql

2:第二步,建立數據庫和數據表,表結構以下所示:數據庫

3:第三步建立實體類User.java數組

 1 package com.bie.po;
 2 /** 
 3 * @author BieHongLi 
 4 * @version 建立時間:2017年3月8日 下午5:17:23 
 5 * 
 6 */
 7 public class User {
 8 
 9     private int id;
10     private String name;
11     private String password;
12     private String email;
13     private String phone;
14     public int getId() {
15         return id;
16     }
17     public void setId(int id) {
18         this.id = id;
19     }
20     public String getName() {
21         return name;
22     }
23     public void setName(String name) {
24         this.name = name;
25     }
26     public String getEmail() {
27         return email;
28     }
29     public void setEmail(String email) {
30         this.email = email;
31     }
32     public String getPhone() {
33         return phone;
34     }
35     public void setPhone(String phone) {
36         this.phone = phone;
37     }
38     public String getPassword() {
39         return password;
40     }
41     public void setPassword(String password) {
42         this.password = password;
43     }
44     @Override
45     public String toString() {
46         return "User [id=" + id + ", name=" + name + ", password=" + password + ", email=" + email + ", phone=" + phone
47                 + "]";
48     }
49     
50     
51 }

4:第四步,完成實體類的屬性和數據表字段的映射,映射的.xml以下所示,前面的博客已經介紹如何寫這個映射,這裏略過;session

 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     
 6 <hibernate-mapping package="com.bie.po"> 
 7     <!-- 操做條件:
 8         1:對象與表
 9         2:屬性與字段的對應
10         3:類型的對應,類型默認採用屬性的類型,type不寫的話
11      -->
12     <class name="User" table="user">
13         <!-- 主鍵,映射 -->
14         <id name="id" column="id">
15             <generator class="native"></generator>
16         </id>
17         
18         <!-- 非主鍵,映射 -->
19         <property name="name" column="name"></property>
20         <property name="password" column="password"></property>
21         <property name="email" column="email"></property>
22         <property name="phone" column="phone"></property>
23         
24         
25     </class>
26 
27 </hibernate-mapping>

5:映射以後寫Hibernate的配置文件,配置文件以下所示:app

 1 <!DOCTYPE hibernate-configuration PUBLIC
 2     "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
 3     "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
 4 
 5 <hibernate-configuration>
 6     <session-factory>
 7         <!-- 
 8             1:數據鏈接配置
 9             2:加載全部的映射(*.hbm.xml)
10          -->
11          
12          <!-- 1:數據鏈接配置 -->
13          <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
14          <property name="hibernate.connection.url">jdbc:mysql:///test</property>
15          <property name="hibernate.connection.username">root</property>
16          <property name="hibernate.connection.password">123456</property>
17          <!-- mysql數據庫的方言 -->
18          <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
19          
20          <property name="hibernate.show_sql">true</property>
21          
22          <!-- 2:加載全部的映射(*.hbm.xml) -->
23          <mapping resource="com/bie/po/User.hbm.xml"/>
24          
25     </session-factory>
26 </hibernate-configuration>

6:完成上面的以後寫測試的類便可;框架

  6.1:首先實現Hibernate的插入操做《session.save(user)》:ide

      核心代碼:測試

           //獲取加載配置文件的管理類對象
                  Configuration config=new Configuration();
                  //默認加載src/hibernate.cfg.xml文件
                  config.configure();
                 //建立session的工廠文件
                 SessionFactory sf=config.buildSessionFactory();
                //建立session(表明一個會話,與數據庫鏈接的會話)
                Session session=sf.openSession();
                //開啓事務
                Transaction tx=session.beginTransaction();
                //保存到數據庫
                session.save(user);
                //提交事務
                tx.commit();
                //關閉
                session.close();
                //sessionFactory關閉
               sf.close();


 源碼以下所示:

 1 package com.bie.test;
 2 
 3 import org.hibernate.Session;
 4 import org.hibernate.SessionFactory;
 5 import org.hibernate.Transaction;
 6 import org.hibernate.cfg.Configuration;
 7 import org.junit.Test;
 8 
 9 import com.bie.po.User;
10 
11 /** 
12 * @author BieHongLi 
13 * @version 建立時間:2017年3月8日 下午5:28:35 
14 * 
15 */
16 public class HelloTest {
17 
18     @Test
19     public void testHello(){
20         //對象
21         User user=new User();
22         user.setName("張三");
23         user.setPassword("123456");
24         user.setEmail("1748741329@qq.com");
25         user.setPhone("15236083005");
26         
27         //獲取加載配置文件的管理類對象
28         Configuration config=new Configuration();
29         //默認加載src/hibernate.cfg.xml文件
30         config.configure();
31         //建立session的工廠文件
32         SessionFactory sf=config.buildSessionFactory();
33         //建立session(表明一個會話,與數據庫鏈接的會話)
34         Session session=sf.openSession();
35         //開啓事務
36         Transaction tx=session.beginTransaction();
37         //保存到數據庫
38         session.save(user);
39         //提交事務
40         tx.commit();
41         //關閉
42         session.close();
43         //sessionFactory關閉
44         sf.close();
45     
46         
47     }
48 }

演示效果以下所示:


   6.2:實現Hibernate的修改操做,核心代碼《session.saveOrUpdate(user);   session.update(user);這個就不演示了,用法同樣,將他們替換一下便可,只是saveOrUpdate更增強大的說》:

       session.saveOrUpdate(user);

      這個實現的是若是沒有實體類的編號就執行保存操做,若是有實體類的編號就執行修改操做;

        設計Hibernate框架的人太TMD有才了,固然這是誇讚,大大簡化了咱們對數據庫的操做,必須贊一個;

源碼以下所示:

 1 package com.bie.test;
 2 
 3 import org.hibernate.Session;
 4 import org.hibernate.SessionFactory;
 5 import org.hibernate.Transaction;
 6 import org.hibernate.cfg.Configuration;
 7 import org.junit.Test;
 8 
 9 import com.bie.po.User;
10 
11 /** 
12 * @author BieHongLi 
13 * @version 建立時間:2017年3月8日 下午5:28:35 
14 * 
15 */
16 public class HelloTest2 {
17 
18     //SessionFactory表明整個配置文件,因此不必加載屢次,放到全局便可
19     private static SessionFactory sf;
20     static{
21         //1:建立配置管理類對象
22         Configuration config=new Configuration();
23         //加載配置文件,(默認加載/src/hibernate.cfg.xml)
24         config.configure();
25         
26         //2:根據加載的配置管理類對象,建立SessionFactory對象
27         sf=config.buildSessionFactory();
28         
29         //簡介寫法,寫到一行裏面
30         //sf=new Configuration().configure().buildSessionFactory();
31     }
32     @Test
33     public void testHello(){
34         //對象
35         User user=new User();
36         user.setId(1);
37         user.setName("李四22222");
38         user.setPassword("222222");
39         user.setEmail("22222222@qq.com");
40         user.setPhone("15236083005");
41         
42         //3:根據sesson的工廠建立session對象
43         Session session = sf.openSession();
44         
45         //開啓事務
46         Transaction tx = session.beginTransaction();
47         //執行操做
48         //session.save(user);
49         session.saveOrUpdate(user);
50         
51         //提交事務
52         tx.commit();
53         //關閉事務
54         session.close();
55         sf.close();
56     }
57     
58 }

演示結果以下所示:


   6.3:實現Hibernate的查詢操做:

    6.3.1:主鍵查詢的方法

      兩種方法:

       User u=(User)session.get(User.class, 1);
               User u=(User)session.load(User.class, 1);支持懶加載

源碼以下所示:

 1 package com.bie.test;
 2 
 3 import org.hibernate.Session;
 4 import org.hibernate.SessionFactory;
 5 import org.hibernate.Transaction;
 6 import org.hibernate.cfg.Configuration;
 7 import org.junit.Test;
 8 
 9 import com.bie.po.User;
10 
11 /** 
12 * @author BieHongLi 
13 * @version 建立時間:2017年3月9日 下午8:47:46 
14 * Hibernate查詢的幾種方式:
15 *     
16 */
17 public class SelectTest {
18 
19     //全局靜態session工廠
20     private static SessionFactory sf;
21     static{
22         //1:建立sesson工廠
23         sf=new Configuration().configure().buildSessionFactory();
24     }
25     
26     @Test
27     public void select(){
28         User user=new User();
29         
30         //2:根據session工廠建立session
31         Session session=sf.openSession();
32         //3:開啓事務
33         Transaction tx=session.beginTransaction();
34         //4:主鍵查詢,執行查詢操做,方法一:get方法,方法2:load方法
35         //User u=(User)session.get(User.class, 1);
36         User u=(User)session.load(User.class, 1);
37         
38         //主鍵查詢測試結果
39         System.out.println(u);
40         //5:提交事務
41         tx.commit();
42         //6:關閉事務和session
43         session.close();
44         sf.close();
45         
46     }
47     
48 }

演示效果以下所示:


   6.3.2:HQL查詢,特別注意的是查詢語句必須是實體類的方法名,不能是表名稱,必須和sql語句查詢區別:

    HQL查詢和sql查詢的區別:

      (1):sql查詢是表以及字段,不區分大小寫,也叫作結構化的查詢語句;

      (2):HQL查詢是Hibernate提供的面向對象的查詢語句,查詢的是對象以及對象的屬性,區分大小寫的。

源碼以下所示:

 1 package com.bie.test;
 2 
 3 
 4 
 5 import java.util.List;
 6 
 7 import org.hibernate.Query;
 8 import org.hibernate.Session;
 9 import org.hibernate.SessionFactory;
10 import org.hibernate.Transaction;
11 import org.hibernate.cfg.Configuration;
12 import org.junit.Test;
13 
14 import com.bie.po.User;
15 
16 /** 
17 * @author BieHongLi 
18 * @version 建立時間:2017年3月9日 下午8:47:46 
19 * Hibernate查詢的幾種方式:
20 *     
21 */
22 public class SelectTest2 {
23 
24     //全局靜態session工廠
25     private static SessionFactory sf;
26     static{
27         //1:建立sesson工廠
28         sf=new Configuration().configure().buildSessionFactory();
29     }
30     
31     @Test
32     public void select(){
33         User user=new User();
34         
35         //2:根據session工廠建立session
36         Session session=sf.openSession();
37         //3:開啓事務
38         Transaction tx=session.beginTransaction();
39         
40         //HRL查詢,查詢所有信息,注意HRL查詢的是實體類的名稱,不是數據表的名稱,特別注意這一點
41         //Query q=session.createQuery("from User");
42         Query q=session.createQuery("from User user where user.id=1 or user.id=2 ");
43         
44         List<User> list=q.list();
45         System.out.println(list);
46         
47         //5:提交事務
48         tx.commit();
49         //6:關閉事務和session
50         session.close();
51         sf.close();
52         
53     }
54     
55 }

 效果以下所示:


 6.3.3:徹底面向對象的查詢,Criteria查詢也叫作 QBC查詢   query by criteria

       核心代碼:   

      //Criteria查詢也叫作 QBC查詢   query by criteria
           //徹底的面向對象的查詢
             Criteria criteria = session.createCriteria(User.class);    
             //添加條件
             criteria.add(Restrictions.eq("id", 1));
             //查詢所有,沒有sql語句
             List<User> list = criteria.list();
             System.out.println(list);

源碼以下所示:

 1 package com.bie.test;
 2 
 3 
 4 
 5 import java.util.List;
 6 
 7 import org.hibernate.Criteria;
 8 import org.hibernate.Session;
 9 import org.hibernate.SessionFactory;
10 import org.hibernate.Transaction;
11 import org.hibernate.cfg.Configuration;
12 import org.hibernate.criterion.Restrictions;
13 import org.junit.Test;
14 
15 import com.bie.po.User;
16 
17 /** 
18 * @author BieHongLi 
19 * @version 建立時間:2017年3月9日 下午8:47:46 
20 * Hibernate查詢的幾種方式:
21 *     
22 */
23 public class SelectTest3 {
24 
25     //全局靜態session工廠
26     private static SessionFactory sf;
27     static{
28         //1:建立sesson工廠
29         sf=new Configuration().configure().buildSessionFactory();
30     }
31     
32     @Test
33     public void select(){
34         User user=new User();
35         
36         //2:根據session工廠建立session
37         Session session=sf.openSession();
38         //3:開啓事務
39         Transaction tx=session.beginTransaction();
40         
41         //Criteria查詢也叫作 QBC查詢   query by criteria 
42         //徹底的面向對象的查詢
43         Criteria criteria = session.createCriteria(User.class);    
44         //添加條件
45         criteria.add(Restrictions.eq("id", 1));
46         
47         //查詢所有,沒有sql語句
48         List<User> list = criteria.list();
49     
50         
51         System.out.println(list);
52         
53         //5:提交事務
54         tx.commit();
55         //6:關閉事務和session
56         session.close();
57         sf.close();
58         
59     }
60     
61 }

演示效果以下所示:

  6.3.4:本地查詢sql語句,適合使用複雜的查詢,或者不想使用HQL或者criteria查詢,可使用本地sql查詢,缺點,不能跨越數據庫,通常不適用,除非遇到複雜的sql語句才使用:

    核心代碼:

      //sql語句
             //SQLQuery sql= session.createSQLQuery("select * from user ");
            SQLQuery sql=session.createSQLQuery("select * from user where id=1 ");
            sql.addEntity(User.class);
            List<User> list=sql.list();
            System.out.println(list);源碼以下所示:

 1 package com.bie.test;
 2 
 3 
 4 
 5 import java.util.List;
 6 
 7 import org.hibernate.SQLQuery;
 8 import org.hibernate.Session;
 9 import org.hibernate.SessionFactory;
10 import org.hibernate.Transaction;
11 import org.hibernate.cfg.Configuration;
12 import org.junit.Test;
13 
14 import com.bie.po.User;
15 
16 /** 
17 * @author BieHongLi 
18 * @version 建立時間:2017年3月9日 下午8:47:46 
19 * Hibernate查詢的幾種方式:
20 *     
21 */
22 public class SelectTest4 {
23 
24     //全局靜態session工廠
25     private static SessionFactory sf;
26     static{
27         //1:建立sesson工廠
28         sf=new Configuration().configure().buildSessionFactory();
29     }
30     
31     @Test
32     public void select(){
33         User user=new User();
34         
35         //2:根據session工廠建立session
36         Session session=sf.openSession();
37         //3:開啓事務
38         Transaction tx=session.beginTransaction();
39         
40         //sql語句
41         //把每一行記錄封裝爲對象數組,再添加到list集合中
42         //SQLQuery sql= session.createSQLQuery("select * from user ");
43         //把每一行記錄封裝爲指定的對象類型
44         SQLQuery sql=session.createSQLQuery("select * from user where id=1 ").addEntity(User.class);
45         List<User> list=sql.list();
46         System.out.println(list);
47         
48         //5:提交事務
49         tx.commit();
50         //6:關閉事務和session
51         session.close();
52         sf.close();
53         
54     }
55     
56 }

演示以下所示:


爲了美好明天,加油!!!

相關文章
相關標籤/搜索