Hibernate 查詢進(jìn)階

本文包括:

1匠抗、Hibernate 的查詢方式

2嵌言、HQL (Hibernate Query Language) 查詢

3蝠检、HQL 的投影查詢

4怖亭、HQL 的聚合函數(shù)查詢

5涎显、QBC (Query By Criteria ) 條件查詢

6、QBC 離線條件查詢

7兴猩、SQL查詢方式(了解)

8期吓、HQL 多表查詢

9、延遲加載

10倾芝、Hibernate 的查詢策略

1讨勤、Hibernate 的查詢方式

  1. 根據(jù)唯一標(biāo)識 OID 的檢索方式

    • session.get(XXX.class,OID)

    可利用斷點(diǎn)調(diào)試觀察,執(zhí)行該行代碼時的控制臺輸出為:

    select * from xx where id = ?

  2. 對象的導(dǎo)航的方式

    • Customer.getLinkmans()

    執(zhí)行該行代碼時晨另,控制臺輸出:

    select * from cst_linkmans where cust_id = ?

  3. HQL 的檢索方式

    • Hibernate Query Language -- Hibernate 的查詢語言
  4. QBC 的檢索方式

    • Query By Criteria -- 條件查詢
  5. SQL 檢索方式(了解)

    • 本地的 SQL 檢索 -- 較麻煩潭千,在 Hibernate 中不推薦使用

2、HQL (Hibernate Query Language) 查詢

  1. HQL 的介紹:

    • HQL(Hibernate Query Language) 是面向?qū)ο蟮牟樵冋Z言, 它和 SQL 查詢語言有些相似

    • 在 Hibernate 提供的各種檢索方式中, HQL 是使用最廣的一種檢索方式

  2. HQL 與 SQL 的關(guān)系:

    • HQL 查詢語句是面向?qū)ο蟮慕枘颍琀ibernate 負(fù)責(zé)解析 HQL 查詢語句, 然后根據(jù)對象-關(guān)系映射文件中的映射信息, 把 HQL 查詢語句翻譯成相應(yīng)的 SQL 語句.

    • HQL 查詢語句中的主體是域模型中的類及類的屬性

    • SQL 查詢語句是與關(guān)系數(shù)據(jù)庫綁定在一起的刨晴。SQL查詢語句中的主體是數(shù)據(jù)庫表及表的字段

  3. HQL基本的查詢格式:

    • 支持方法鏈的編程,即直接調(diào)用 list() 方法

    • 簡單的代碼如下

        session.createQuery("from Customer").list();
      
  4. 使用別名的方式:

    • 可以使用別名的方式

        session.createQuery("from Customer c").list();
        session.createQuery("select c from Customer c").list();
      
  5. 排序查詢:

    • 排序查詢和SQL語句中的排序的語法是一樣的

      • 升序

          session.createQuery("from Customer order by cust_id").list();
        
      • 降序

          session.createQuery("from Customer order by cust_id desc").list();
        
  6. 分頁查詢(不用管 DBMS 是 Oracle 還是 MySQL,Hibernate 自動幫我們完成分頁):

    • Hibernate 框架提供了分頁的方法割捅,咱們可以調(diào)用方法來完成分頁

    • 兩個方法如下

      • setFirstResult(a) -- 從哪條記錄開始奶躯,如果查詢是從第一條開啟,值是0

      • setMaxResults(b) -- 每頁查詢的記錄條數(shù)

    • 演示代碼如下

        List<LinkMan> list = session.createQuery("from LinkMan").setFirstResult(0).setMaxResults().list();
      

    MySQL 對于分頁的實(shí)現(xiàn):

    limit ?,? (注意:參數(shù)的值 從 0 開始)

    第一個參數(shù):該頁從第幾個記錄開始亿驾,有公式:(currentPage - 1) * pageSize

    第二個參數(shù):每頁顯示多少個記錄嘹黔,一般取個固定值,如 10

  7. 帶條件的查詢:

    • Query.setString(0,"男");

    • Query.setLong(0,2L);

    • Query.setParameter("?號的位置莫瞬,默認(rèn)從0開始","參數(shù)的值"); -- 這個方法不用像上面兩個方法一樣考慮參數(shù)的具體類型

    • 按名稱綁定參數(shù)的條件查詢(HQL語句中的 ? 號換成 :名稱 的方式)

        Query query = session.createQuery("from Customer where name = :aaa and age = :bbb");
        query.setString("aaa", "李健");
        query.setInteger("bbb", 38);
        List<Customer> list = query.list();
      

    對應(yīng) JDBC 的代碼:

    PreparedStatement.setString(1,"男");

    注意:JDBC 的查詢從1開始儡蔓!

3、HQL 的投影查詢

  1. 投影查詢就是想查詢某一字段的值或者某幾個字段的值

  2. 投影查詢的案例

    • 如果查詢多個字段疼邀,返回的 list 中每個元素是對象數(shù)組(object[])

        List<Object[]> list = session.createQuery("select c.cust_name,c.cust_level from Customer c").list();
        for (Object[] objects : list) {
            System.out.println(Arrays.toString(objects));
        }
      
    • 如果查詢兩個字段喂江,也可以把這兩個字段封裝到對象中

      • 先在持久化類中提供對應(yīng)字段的構(gòu)造方法

          public class Customer {
              private Long cust_id;
              private String cust_name;
              private Long cust_user_id;
              private Long cust_create_id;
              private String cust_source;
              private String cust_industry;
              private String cust_level;
              private String cust_linkman;
              private String cust_phone;
              private String cust_mobile;     
        
              // 持久化類中一定要有無參的構(gòu)造方法,所以需要手動重載
              public Customer(){};
        
              public Customer(cust_name,cust_level){};
        
          }
        
      • 然后使用下面這種 HQL 語句的方式: select new Customer(c.cust_name,c.cust_level) from Customer c

          List<Customer> list = session.createQuery("select new Customer(c.cust_name,c.cust_level) from Customer c").list();
          for (Customer customer : list) {
              System.out.println(customer);
          }
        

4旁振、HQL 的聚合函數(shù)查詢

  1. 聚合函數(shù):count(),avg(),max(),min(),sum()获询,返回的是一個數(shù)值

  2. 獲取總的記錄數(shù)

     Session session = HibernateUtils.getCurrentSession();
     Transaction tr = session.beginTransaction();
     List<Number> list = session.createQuery("select count(c) from Customer c").list();
     Long count = list.get(0).longValue();
     System.out.println(count);
     tr.commit();
    

    Number 類是 Integer、Float拐袜、Double吉嚣、Long 等等的父類,所以泛型寫 Number 最省事蹬铺,得到后可以轉(zhuǎn)化為具體的子類尝哆,在上面的代碼中,調(diào)用了 Number.longValue()甜攀,于是轉(zhuǎn)為了 Long 類型秋泄。

  3. 獲取某一列數(shù)據(jù)的和

     Session session = HibernateUtils.getCurrentSession();
     Transaction tr = session.beginTransaction();
     List<Number> list = session.createQuery("select sum(c.cust_id) from Customer c").list();
     Long count = list.get(0).longValue();
     System.out.println(count);
     tr.commit();
    

5、QBC (Query By Criteria ) 條件查詢

  1. 簡單查詢规阀,使用的是 Criteria 接口

     List<Customer> list = session.createCriteria(Customer.class).list();
     for (Customer customer : list) {
         System.out.println(customer);
     }
    
  2. 排序查詢

    • 需要使用 addOrder() 的方法來設(shè)置參數(shù)恒序,參數(shù)使用

        org.hibernate.criterion.Order 對象的 asc() or desc() 方法
      

      如:

        criteria.addOrder(Order.desc("lkm_id"));
      
    • 具體代碼如下:

        Session session = HibernateUtils.getCurrentSession();
        Transaction tr = session.beginTransaction();
        Criteria criteria = session.createCriteria(Linkman.class);
        // 設(shè)置排序
        criteria.addOrder(Order.desc("lkm_id"));
        List<Linkman> list = criteria.list();
        for (Linkman linkman : list) {
            System.out.println(linkman);
        }
        tr.commit();
      
  3. 分頁查詢

    • QBC 的分頁查詢也是使用兩個方法,與 HQL 一樣

      • setFirstResult();

      • setMaxResults();

    • 代碼如下;

        Session session = HibernateUtils.getCurrentSession();
        Transaction tr = session.beginTransaction();
        Criteria criteria = session.createCriteria(Linkman.class);
        // 設(shè)置排序
        criteria.addOrder(Order.desc("lkm_id"));
        criteria.setFirstResult(0);
        criteria.setMaxResults(3);
        List<Linkman> list = criteria.list();
        for (Linkman linkman : list) {
            System.out.println(linkman);
        }
        tr.commit();
      
  4. 條件查詢(Criterion 是查詢條件的接口姥敛,Restrictions 類是 Hibernate 框架提供的工具類奸焙,使用該工具類來設(shè)置查詢條件)

    • 條件查詢使用 Criteria 接口的 add 方法,用來傳入條件彤敛。

    • 使用 Restrictions 的添加條件的方法,來添加條件了赌,例如:

      • Restrictions.eq -- 相等

      • Restrictions.gt -- 大于號

      • Restrictions.ge -- 大于等于

      • Restrictions.lt -- 小于

      • Restrictions.le -- 小于等于

      • Restrictions.between -- 在之間墨榄,閉區(qū)間

      • Restrictions.like -- 模糊查詢

      • Restrictions.in -- 范圍

      • Restrictions.and -- 并且

      • Restrictions.or -- 或者

      • Restrictions.isNull -- 判斷某個字段是否為空
    • Restrictions.in 示例:

      首先看參數(shù)類型:

        Restrictions.in(String propertyName, Collection values)
      

      發(fā)現(xiàn),應(yīng)該在第二個參數(shù)傳入 Collection 勿她,于是可以這樣演示:

        Criteria criteria = session.createCriteria(Linkman.class);
        
        List<Long> params = new ArrayList<Long>();
        params.add(1L);
        params.add(2L);
        params.add(7L);
        
        // 使用in 方法查詢
        criteria.add(Restrictions.in("lkm_id", params));
      

      SQL:

        select * from cst_linkman 
        where lkm_id in (1,2,7);
      
    • Restrictions.or 示例:

      首先看參數(shù)類型袄秩,發(fā)現(xiàn)有兩種重載方法:

        Restrictions.or(Criterion lhs, Criterion rhs)
        Restrictions.or(Criterion... predicates)
      

      很明顯,第一個是兩個條件,第二個是可變參數(shù)之剧,所以條件數(shù)量不定郭卫,但是可以發(fā)現(xiàn),參數(shù)類型都是 Criterion 背稼,故都應(yīng)該傳入 Restrictions.XX()贰军。

        Session session = HibernateUtils.getCurrentSession();
        Transaction tr = session.beginTransaction();
        Criteria criteria = session.createCriteria(Linkman.class);
        // 設(shè)置排序
        criteria.addOrder(Order.desc("lkm_id"));
        // 設(shè)置查詢條件
        criteria.add(Restrictions.or(Restrictions.eq("lkm_gender", "男"), Restrictions.gt("lkm_id", 3L)));
        List<Linkman> list = criteria.list();
        for (Linkman linkman : list) {
            System.out.println(linkman);
        }
        tr.commit();
      

      SQL:

        select * from Linkman 
        where lkm_gender='男' or lkm_id=3 
        order by lkm_id desc;
      
  5. 聚合函數(shù)查詢(Projection 的聚合函數(shù)的接口,而 Projections 是 Hibernate 提供的工具類蟹肘,使用該工具類設(shè)置聚合函數(shù)查詢)

    • 使用 QBC 的聚合函數(shù)查詢词疼,需要使用 criteria.setProjection() 方法

      如:

        criteria.setProjection(Projections.rowCount());
      

      又如:

        criteria.setProjection(Projections.count("lkm_id"));
      
    • 具體的代碼如下:

        Session session = HibernateUtils.getCurrentSession();
        Transaction tr = session.beginTransaction();
        Criteria criteria = session.createCriteria(Linkman.class);
        criteria.setProjection(Projections.rowCount());
        List<Number> list = criteria.list();
        Long count = list.get(0).longValue();
        System.out.println(count);
        tr.commit();
      
    • 注意,如果想先執(zhí)行 select count(*) from xxx 帘腹,再執(zhí)行 select * from xxx贰盗,不能直接在后面執(zhí)行編寫 QBC 語句,應(yīng)該先“恢復(fù)” Projection

        // 創(chuàng)建QBC查詢接口
        Criteria criteria = session.createCriteria(Linkman.class);
        // 設(shè)置聚合函數(shù)的方式  select count(lkm_id) from 表;  5
        criteria.setProjection(Projections.count("lkm_id"));
        List<Number> list = criteria.list();
        Long count = list.get(0).longValue();
        System.out.println(count);
        
        criteria.setProjection(null);
        
        // 繼續(xù)查詢所有的聯(lián)系人  select * from 表
        List<Linkman> mans = criteria.list();
      

6阳欲、QBC 離線條件查詢

  1. 離線條件查詢使用的是 DetachedCriteria 接口進(jìn)行查詢舵盈,離線條件查詢對象在創(chuàng)建的時候不需要使用 Session 對象,在添加條件 時也不需要 Session 對象球化,只有在查詢的時候使用 Session 對象即可书释,所以叫做離線條件查詢。

    為什么要有離線條件查詢赊窥?

    一般情況下爆惧,在業(yè)務(wù)層開啟 Session 后,在持久層對數(shù)據(jù)進(jìn)行操作锨能,而在 web 層需要接收條件查詢的若干條件扯再,所以在 web 層就設(shè)置條件會很方便,又因?yàn)?Criteria 需要由 Session 創(chuàng)建址遇,所以無法在 web 層設(shè)置條件熄阻,于是離線條件查詢出現(xiàn)了。

  2. 創(chuàng)建離線條件查詢對象

     DetachedCriteria criteria = DetachedCriteria.forClass(Linkman.class);
    
  3. 具體的代碼如下倔约,注意順序秃殉,這樣是可行的

     DetachedCriteria criteria = DetachedCriteria.forClass(Linkman.class);
     // 設(shè)置查詢條件
     criteria.add(Restrictions.eq("lkm_gender", "男"));
     
     Session session = HibernateUtils.getCurrentSession();
     Transaction tr = session.beginTransaction();
    
     // 查詢數(shù)據(jù)
     List<Linkman> list = criteria.getExecutableCriteria(session).list();
     for (Linkman linkman : list) {
         System.out.println(linkman);
     }
     tr.commit();
    

7、SQL查詢方式(了解)

  1. 基本語法

     Session session = HibernateUtils.getCurrentSession();
     Transaction tr = session.beginTransaction();
     
     SQLQuery sqlQuery = session.createSQLQuery("select * from cst_linkman where lkm_gender = ?");
     sqlQuery.setParameter(0,"男");
     sqlQuery.addEntity(Linkman.class);
     List<Linkman> list = sqlQuery.list();
     System.out.println(list);
     tr.commit();
    

8浸剩、HQL 多表查詢

  1. 多表查詢使用 HQL 語句進(jìn)行查詢钾军,HQL 語句和 SQL 語句的查詢語法比較類似

    • 內(nèi)連接查詢

      • 顯示內(nèi)連接

          select * from customers c inner join orders o on c.cid = o.cno;
        
      • 隱式內(nèi)連接

          select * from customers c,orders o where c.cid = o.cno;
        
    • 外連接查詢

      • 左外連接

          select * from customers c left join orders o on c.cid = o.cno;
        
      • 右外連接

          select * from customers c right join orders o on c.cid = o.cno;
        
  2. HQL 多表查詢時的兩種方式

    • 迫切和非迫切:

      • 非迫切返回結(jié)果是 Object[]

      • 迫切連接返回的結(jié)果是對象,把客戶的信息封裝到客戶的對象中绢要,把訂單的信息封裝到客戶的 Set 集合中

    • 非迫切內(nèi)連接使用 inner join 吏恭,默認(rèn)返回的是 Object 數(shù)組

        Session session = HibernateUtils.getCurrentSession();
        Transaction tr = session.beginTransaction();
        List<Object[]> list = session.createQuery("from Customer c inner join c.linkmans").list();
        for (Object[] objects : list) {
            System.out.println(Arrays.toString(objects));
        }
        tr.commit();
      
    • 迫切內(nèi)連接使用 inner join fetch ,返回的是實(shí)體對象

        Session session = HibernateUtils.getCurrentSession();
        Transaction tr = session.beginTransaction();
        List<Customer> list = session.createQuery("from Customer c inner join fetch c.linkmans").list();
        Set<Customer> set = new HashSet<Customer>(list);
        for (Customer customer : set) {
            System.out.println(customer);
        }
        tr.commit();
      

      把 List 轉(zhuǎn)為 Set 集合重罪,可以消除重復(fù)的數(shù)據(jù)

  3. 左外連接查詢

    • 非迫切左外連接:封裝成List<Object[]>

    • 迫切左外連接:

        Session session = HibernateUtils.getCurrentSession();
        Transaction tr = session.beginTransaction();
        List<Customer> list = session.createQuery("from Customer c left join fetch c.linkmans").list();
        Set<Customer> set = new HashSet<Customer>(list);
        for (Customer customer : set) {
            System.out.println(customer);
        }
        tr.commit();
      

9樱哼、延遲加載

  1. 原理:先獲取到代理對象哀九,當(dāng)真正使用到該對象中的屬性的時候,才會發(fā)送 SQL 語句搅幅,是 Hibernate 框架提升性能的方式

  2. 類級別的延遲加載

    • Session 對象的 load 方法默認(rèn)就是延遲加載阅束,例如:

        Customer c = session.load(Customer.class, 1L);
      

      斷點(diǎn)調(diào)試,發(fā)現(xiàn)茄唐,執(zhí)行該行代碼時息裸,控制臺輸出為空,即沒有發(fā)送 SQL 語句琢融,再執(zhí)行下面這行代碼:

        System.out.println(c.getCust_name);
      

      此時發(fā)現(xiàn)界牡,控制臺輸出對應(yīng)的 SQL 語句。

      Session.get(Class,id) 沒有延遲加載

    • 使類級別的延遲加載失效(一般情況下使用默認(rèn)的延遲加載)

      • 在映射配置文件的 <class> 標(biāo)簽上配置 lazy="false"

          <?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">
          <hibernate-mapping>
              
              <class name="com.itheima.domain.Customer" table="cst_customer" lazy="false">
                  <id name="cust_id" column="cust_id">
                      <generator class="native"/>
                  </id>
                  
                  <property name="cust_name" column="cust_name"/>
                  <property name="cust_user_id" column="cust_user_id"/>
                  <property name="cust_create_id" column="cust_create_id"/>
                  <property name="cust_source" column="cust_source"/>
                  <property name="cust_industry" column="cust_industry"/>
                  <property name="cust_level" column="cust_level"/>
                  <property name="cust_linkman" column="cust_linkman"/>
                  <property name="cust_phone" column="cust_phone"/>
                  <property name="cust_mobile" column="cust_mobile"/>
                  
                  <!-- 配置一方 -->
                  <!--
                      set標(biāo)簽name屬性:表示集合的名稱
                  -->
                  <set name="linkmans" inverse="true">
                      <!-- 需要出現(xiàn)子標(biāo)簽 -->
                      <!-- 外鍵的字段 -->
                      <key column="lkm_cust_id"/>
                      <one-to-many class="com.itheima.domain.Linkman"/>
                  </set>
                  
              </class>
              
          </hibernate-mapping>    
        
      • Hibernate.initialize(Object proxy);

  3. 關(guān)聯(lián)級別的延遲加載(查詢某個客戶漾抬,當(dāng)查看該客戶下的所有聯(lián)系人是是否是延遲加載)

    • 代碼:

        Session session = HibernateUtils.getCurrentSession();
        Transaction tr = session.beginTransaction();
        Customer c = session.get(Customer.class, 1L);
        System.out.println("=============");
        System.out.println(c.getLinkmans().size());
        tr.commit();
      

      最后在控制臺上發(fā)現(xiàn)宿亡,在執(zhí)行第二個輸出語句時,控制臺才會輸出如下類似語句纳令,所以關(guān)聯(lián)級別的延遲加載也是默認(rèn)的

         select * from Linkmans where cust_id = ?
      

10挽荠、Hibernate 的查詢策略

  1. 查詢策略:使用 Hibernate 查詢一個對象的關(guān)聯(lián)對象時,應(yīng)該如何查詢平绩,這是 Hibernate 的一種優(yōu)化手段!!!

  2. Hibernate 查詢策略要解決的問題:

    • 查詢的時機(jī)

        Customer c1 = (Customer) session.get(Customer.class, 1);
        System.out.println(c1.getLinkmans().size());
      

      lazy 屬性解決查詢的時機(jī)的問題圈匆,配置是否該持久化類是否采用延遲加載

    • 查詢的語句形式

        List<Customer> list = session.createQuery("from Customer").list();
        for(Customer c : list){
            System.out.println(c.getLinkmans());
        }
      

      fetch 屬性就可以解決查詢語句的形式的問題,具體見下文

<set> 標(biāo)簽上配置策略

  1. <set> 標(biāo)簽上使用 fetch 和 lazy 屬性

    • fetch 的取值 -- 控制 SQL 語句生成的格式

      • select -- 默認(rèn)值捏雌,發(fā)送普通的查詢語句

      • join -- 連接查詢跃赚,發(fā)送的是一條迫切左外連接,配置了join性湿,lazy 無論取哪種值都是同一個效果

      • subselect -- 子查詢纬傲,發(fā)送一條子查詢查詢其關(guān)聯(lián)對象(需要使用 list() 方法進(jìn)行測試)

    • lazy 的取值 -- 查找關(guān)聯(lián)對象的時候是否采用延遲

      • true -- 默認(rèn)值,延遲加載

      • false -- 不延遲

      • extra -- 極其懶惰

  2. <set> 標(biāo)簽上的默認(rèn)值是 fetch="select"lazy="true"

<many-to-one> 標(biāo)簽上配置策略

  1. 在<many-to-one>標(biāo)簽上使用fetch和lazy屬性

    • fetch 的取值 -- 控制SQL的格式

      • select -- 默認(rèn)值肤频,發(fā)送基本的查詢查詢

      • join -- 發(fā)送迫切左外連接查詢

    • lazy 的取值 -- 控制加載關(guān)聯(lián)對象是否采用延遲

      • false -- 不采用延遲加載.

      • proxy -- 默認(rèn)值叹括,代理,現(xiàn)在是否采用延遲加載宵荒,由另一端(即一對多的一方)的 <class> 上的 lazy 確定

        • 如果一方的 <class> 上的lazy="true"汁雷,proxy 的值就是 true (延遲加載)
        • 如果一方的 <class> 上的 lazy="false",proxy的值就是 false (不采用延遲.)
  2. <many-to-one> 標(biāo)簽上的默認(rèn)值是 fetch="select"lazy="proxy"

總結(jié):Hibernate 框架都采用了默認(rèn)值报咳,開發(fā)中基本上使用的都是默認(rèn)值侠讯。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市少孝,隨后出現(xiàn)的幾起案子继低,更是在濱河造成了極大的恐慌,老刑警劉巖稍走,帶你破解...
    沈念sama閱讀 206,214評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件袁翁,死亡現(xiàn)場離奇詭異,居然都是意外死亡婿脸,警方通過查閱死者的電腦和手機(jī)粱胜,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來狐树,“玉大人焙压,你說我怎么就攤上這事∫种樱” “怎么了涯曲?”我有些...
    開封第一講書人閱讀 152,543評論 0 341
  • 文/不壞的土叔 我叫張陵,是天一觀的道長在塔。 經(jīng)常有香客問我幻件,道長,這世上最難降的妖魔是什么蛔溃? 我笑而不...
    開封第一講書人閱讀 55,221評論 1 279
  • 正文 為了忘掉前任绰沥,我火速辦了婚禮,結(jié)果婚禮上贺待,老公的妹妹穿的比我還像新娘徽曲。我一直安慰自己,他們只是感情好麸塞,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,224評論 5 371
  • 文/花漫 我一把揭開白布秃臣。 她就那樣靜靜地躺著,像睡著了一般哪工。 火紅的嫁衣襯著肌膚如雪奥此。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,007評論 1 284
  • 那天正勒,我揣著相機(jī)與錄音得院,去河邊找鬼。 笑死章贞,一個胖子當(dāng)著我的面吹牛祥绞,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播鸭限,決...
    沈念sama閱讀 38,313評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼蜕径,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了败京?” 一聲冷哼從身側(cè)響起兜喻,我...
    開封第一講書人閱讀 36,956評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎赡麦,沒想到半個月后朴皆,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體帕识,經(jīng)...
    沈念sama閱讀 43,441評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,925評論 2 323
  • 正文 我和宋清朗相戀三年遂铡,在試婚紗的時候發(fā)現(xiàn)自己被綠了肮疗。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,018評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡扒接,死狀恐怖伪货,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情钾怔,我是刑警寧澤碱呼,帶...
    沈念sama閱讀 33,685評論 4 322
  • 正文 年R本政府宣布,位于F島的核電站宗侦,受9級特大地震影響愚臀,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜凝垛,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,234評論 3 307
  • 文/蒙蒙 一懊悯、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧梦皮,春花似錦炭分、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至让网,卻和暖如春呀忧,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背溃睹。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評論 1 261
  • 我被黑心中介騙來泰國打工而账, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人因篇。 一個月前我還...
    沈念sama閱讀 45,467評論 2 352
  • 正文 我出身青樓泞辐,卻偏偏與公主長得像,于是被迫代替她去往敵國和親竞滓。 傳聞我的和親對象是個殘疾皇子咐吼,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,762評論 2 345

推薦閱讀更多精彩內(nèi)容