Hibernate 入門

本文包括:

1、CRM 項目的整體介紹

2、Hibernate 框架概述

3、Hibernate 快速入門

4、Hibernate 常用的配置文件

5、Hibernate 常用的接口和類

1、CRM 項目的整體介紹

  1. 什么是 CRM

    • CRM(Customer Relationship Management)客戶關系管理,是利用相應的信息技術以及互聯網技術來協調企業與顧客間在銷售、營銷和服務上的交互,向客戶提供創新式的個性化的客戶交互和服務的過程

    • 其最終目標是將面向客戶的各項信息和活動集成起來,組建一個以客戶為中心的企業,實現對面向客戶的活動的全面管理

  2. CRM 的模塊

    • CRM 系統實現了對企業銷售、營銷、服務等各階段的客戶信息、客戶活動進行統一管理。

    • CRM 系統功能涵蓋企業銷售、營銷、用戶服務等各各業務流程,業務流程中與客戶相關活動都會在 CRM 系統統一管理。

    • 下邊列出一些基本的功能模塊,包括:

      • 客戶信息管理

      • 聯系人管理

      • 商機管理

      • 統計分析等

  3. 模塊的具體功能

    • 客戶信息管理

      • 對客戶信息統一維護,客戶是指存量客戶或擬營銷的客戶,通過員工錄入形成公司的“客戶庫”是公司最重要的數據資源。
    • 聯系人管理

      • 對客戶的聯系人信息統一管理,聯系人是指客戶企業的聯系人,即企業的業務人員和客戶的哪些人在打交道。
    • 客戶拜訪管理

      • 業務員要開發客戶需要去拜訪客戶,客戶拜訪信息記錄了業務員與客戶溝通交流方面的不足、采取的策略不當、有待改進的地方或值得分享的溝通技巧等方面的信息。
    • 綜合查詢

      • 客戶相關信息查詢,包括:客戶信息查詢、聯系人信息查詢、商機信息查詢等
    • 統計分析

      • 按分類統計客戶信息,包括:客戶信息來源統計、按行業統計客戶、客戶發展數量統計等
    • 系統管理

      系統管理屬于crm系統基礎功能模塊,包括:數據字典、賬戶管理、角色管理、權限管理、操作日志管理等

  4. SSH 框架

  5. Hibernate 的開發位置

    學習路線:

    • Hibernate 入門:主要是學習框架的入門,自己搭建框架,完成增刪改查的操作

    • Hibernate 一級緩存:主要學習一級緩存、事務管理和基本的查詢

    • Hibernate 進階:主要學習一對多和多對多的操作等

    • Hibernate 查詢優化:基本查詢和查詢的優化

2、Hibernate 框架概述

  1. Hibernate 框架的概述

    • Hibernate 是一個開放源代碼的對象關系映射(ORM)框架,它對 JDBC 進行了非常輕量級的對象封裝,使得 Java 程序員可以隨心所欲的使用對象編程思維來操縱數據庫。

    • Hibernate 可以應用在任何使用 JDBC 的場合,既可以在 Java 的客戶端程序使用,也可以在 Servlet/JSP 的 Web 應用中使用。

    • Hibernate 是輕量級 JavaEE 應用的持久層解決方案,是一個關系數據庫ORM框架

  2. 記住:Hibernate 是一個持久層的 ORM 框架!!!

  3. 什么是ORM(對象關系映射)

    • ORM映射:Object Relational Mapping

      • O:面向對象領域的 Object(JavaBean 對象)
      • R:關系數據庫領域的 Relational(表的結構)
      • M:映射 Mapping(XML 的配置文件)
    • 簡單一句話:Hibernate 使程序員通過操作對象的方式來操作數據庫表記錄

  4. Hibernate 優點:

    • Hibernate 對 JDBC 訪問數據庫的代碼做了封裝,大大簡化了數據訪問層繁瑣的重復性代碼。

    • Hibernate 是一個基于 jdbc 的主流持久化框架,是一個優秀的 ORM 實現,它很大程度的簡化了 DAO 層編碼工作。

    • Hibernate 的性能非常好,因為它是一個輕量級框架。映射的靈活性很出色。它支持很多關系型數據庫,從一對一到多對多的各種復雜關系。

3、Hibernate 快速入門

  1. 下載Hibernate 5的運行環境

  2. 創建表結構

    • 建表語句如下

        Create database hibernate_day01;
        Use hibernate_day01;
        CREATE TABLE `cst_customer` (
          `cust_id` bigint(32) NOT NULL AUTO_INCREMENT COMMENT '客戶編號(主鍵)',
          `cust_name` varchar(32) NOT NULL COMMENT '客戶名稱(公司名稱)',
          `cust_user_id` bigint(32) DEFAULT NULL COMMENT '負責人id',
          `cust_create_id` bigint(32) DEFAULT NULL COMMENT '創建人id',
          `cust_source` varchar(32) DEFAULT NULL COMMENT '客戶信息來源',
          `cust_industry` varchar(32) DEFAULT NULL COMMENT '客戶所屬行業',
          `cust_level` varchar(32) DEFAULT NULL COMMENT '客戶級別',
          `cust_linkman` varchar(64) DEFAULT NULL COMMENT '聯系人',
          `cust_phone` varchar(64) DEFAULT NULL COMMENT '固定電話',
          `cust_mobile` varchar(16) DEFAULT NULL COMMENT '移動電話',
          PRIMARY KEY (`cust_id`)
        ) ENGINE=InnoDB AUTO_INCREMENT=94 DEFAULT CHARSET=utf8;
      
  3. 搭建 Hibernate 的開發環境

    • 創建 WEB 工程,引入 Hibernate 開發所需要的 jar 包

      • MySQL的驅動jar包

      • Hibernate開發需要的jar包(資料/hibernate-release-5.0.7.Final/lib/required/所有jar包)

      • 日志jar包(資料/jar包/log4j/所有jar包)

  4. 編寫 JavaBean 實體類

    • Customer 類的代碼如下:

        public class Customer {
            // 以后都使用包裝類,默認值為 null
            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;
            // 省略get和set方法
        }
      
  5. 創建 類與表結構的 映射

    1. 在 JavaBean 所在的包下創建映射的配置文件

      • 默認的命名規則為:實體類名.hbm.xml

      • 在 實體類名.hbm.xml 配置文件中引入約束(引入的是 hibernate3.0 的 dtd 約束,不要引入 4 的約束)

          <!DOCTYPE hibernate-mapping PUBLIC 
              "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
              "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
        
    2. 如果不能上網,編寫配置文件是沒有提示的,需要自己來配置

      復制 http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd --> window --> preferences --> 搜索 xml --> 選擇 xml catalog --> 點擊 add --> 選擇 URI --> 粘貼復制的地址 --> 選擇 location,選擇本地的 DTD 的路徑

    3. 編寫映射的配置文件:實體類名.hbm.xml

       <?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">
               <!-- 配置 id 
                   見到 name 屬性,JavaBean 的屬性
                   見到 column 屬性,是表結構的字段
               -->
               <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"/>
               
           </class>
           
       </hibernate-mapping>    
      
  6. 編寫 Hibernate 核心的配置文件

    1. 在 src 目錄下,創建名稱為 hibernate.cfg.xml 的配置文件

    2. 在 XML 中引入 DTD 約束

       <!DOCTYPE hibernate-configuration PUBLIC
           "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
           "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
      
    3. 打開:資料/hibernate-release-5.0.7.Final/project/etc/hibernate.properties,可以查看具體的配置信息

      • 必須配置的4大參數

          #hibernate.connection.driver_class com.mysql.jdbc.Driver
          #hibernate.connection.url jdbc:mysql:///test
          #hibernate.connection.username gavin
          #hibernate.connection.password
        
      • 數據庫的方言(必須配置的)

          #hibernate.dialect org.hibernate.dialect.MySQLDialect
        
      • 可選的配置

          #hibernate.show_sql true
          #hibernate.format_sql true
          #hibernate.hbm2ddl.auto update
        
      • 引入映射配置文件(一定要注意,要引入映射文件,框架需要加載映射文件,如果不引入,則需要在 Java 代碼中手動加載)

          <mapping resource="com/itheima/domain/Customer.hbm.xml"/>               
        
    4. 具體的配置如下

       <?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>
           
           <!-- 記住:先配置SessionFactory標簽,一個數據庫對應一個SessionFactory標簽 -->
           <session-factory>
               
               <!-- 必須要配置的參數有5個,4大參數,數據庫的方言 -->
               <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
               <property name="hibernate.connection.url">jdbc:mysql:///hibernate_day01</property>
               <property name="hibernate.connection.username">root</property>
               <property name="hibernate.connection.password">liaohaolin</property>
               
               <!-- 數據庫的方言 -->
               <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
               
               <!-- 可選配置 -->
               <!-- 顯示SQL語句,在控制臺顯示 -->
               <property name="hibernate.show_sql">true</property>
               <!-- 格式化SQL語句 -->
               <property name="hibernate.format_sql">true</property>
               <!-- 生成數據庫的表結構 
                   update:如果沒有表結構,創建表結構。如果存在,不會創建,添加數據
               -->
               <property name="hibernate.hbm2ddl.auto">update</property>
               
               <!-- 映射配置文件,需要引入映射的配置文件 -->
               <mapping resource="com/itheima/domain/Customer.hbm.xml"/>
               
           </session-factory>
      
       </hibernate-configuration>  
      
  7. 編寫 Hibernate 入門代碼

    • 具體的代碼如下:

        /**
         * 測試保存客戶
         */
        @Test
        public void testSave(){
            /**
             *  1. 先加載配置文件
             *  2. 創建SessionFactory對象,生成Session對象
             *  3. 創建session對象
             *  4. 開啟事務
             *  5. 編寫保存的代碼
             *  6. 提交事務
             *  7. 釋放資源
             */
            // 1. 先加載配置文件
            // 簡寫的方法,默認加載src目錄下hibernate.cfg.xml的配置文件
            Configuration config = new Configuration().configure();
            
            // 2. 創建SessionFactory對象
            SessionFactory factory = config.buildSessionFactory();
            // 3. 創建session對象
            Session session = factory.openSession();
            // 4. 開啟事務
            Transaction tr = session.beginTransaction();
            
            // 5. 編寫保存的代碼
            Customer c = new Customer();
            // c.setCust_id(cust_id);   // 主鍵是自動遞增的,所以不用編寫
            c.setCust_name("測試3");
            c.setCust_level("2");
            c.setCust_phone("110");
            
            // 保存數據,操作對象就相當于操作數據庫的表結構
            session.save(c);
            
            // 6. 提交事務
            tr.commit();
            // 7. 釋放資源
            session.close();
            factory.close();
        }
      
    • 如果在 hibernate.cfg.xml 中不引入映射配置文件,則需要在上述代碼的第1點中這樣編寫:

        // 1. 先加載配置文件
        Configuration config = new Configuration();
        // 默認加載src目錄下hibernate.cfg.xml的配置文件
        config.configure();
        // 手動加載(了解即可)
        config.addResource("com/itheima/domain/Customer.hbm.xml");
      

回憶:快速入門

1. 下載 Hibernate 框架的開發包
2. 編寫數據庫和表結構
3. 創建WEB的項目,導入了開發的 jar 包
    * MySQL 驅動包、Hibernate 開發的必須要有的 jar 包、日志的 jar 包
4. 編寫 JavaBean,以后不使用基本數據類型,使用包裝類
5. 編寫映射的配置文件(核心),先導入開發的約束,里面正常配置標簽
6. 編寫 hibernate 的核心的配置文件,里面的內容是固定的
7. 編寫代碼,使用的類和方法

4、Hibernate 常用的配置文件

  1. 映射配置文件

    • 映射文件,即 Customer.hbm.xml 的配置文件

      • <class>標簽 -- 用來將類與數據庫表建立映射關系

        • name -- 類的全路徑
        • table -- 表名(如果類名與表名一致,那么 table 屬性也可以省略)
        • catalog -- 數據庫的名稱,基本上都會省略不寫
      • <id>標簽 -- 用來將類中的屬性與表中的主鍵建立映射,id 標簽就是用來配置主鍵的。

        • name -- 類中屬性名
        • column -- 表中的字段名.(如果類中的屬性名與表中的字段名一致,那么 column 可以省略.)
        • length -- 字段的程度,如果數據庫已經創建好了,那么 length 可以不寫。如果沒有創建好,生成表結構時,length 最好指定。
      • <property> -- 用來將類中的普通屬性與表中的字段建立映射.

        • name -- 類中屬性名
        • column -- 表中的字段名.(如果類中的屬性名與表中的字段名一致,那么 column 可以省略.)
        • length -- 數據長度
        • type -- 數據類型(一般都不需要編寫,如果寫需要按著規則來編寫)
          • Hibernate的數據類型 type="string"
          • Java的數據類型 type="java.lang.String"
          • 數據庫字段的數據類型 <column name="name" sql-type="varchar"/>
  2. 核心配置文件

    • 核心配置文件的兩種方式

      • 第一種方式是屬性文件的形式,即properties的配置文件

        • hibernate.properties
          • hibernate.connection.driver_class=com.mysql.jdbc.Driver
        • 缺點
          • 不能加載映射的配置文件,需要手動編寫代碼去加載
      • 第二種方式是 XML 文件的形式,開發基本都會選擇這種方式

        • hibernate.cfg.xml
          <property name="hibernate.connection.driver_class" >com.mysql.jdbc.Driver</property>
        • 優點
          • 格式比較清晰
          • 編寫有提示
          • 可以在該配置文件中加載映射的配置文件(最主要的優點)
    • 關于 hibernate.cfg.xml 的配置文件方式

      • 必須有的配置

        • 數據庫連接信息:

          hibernate.connection.driver_class -- 連接數據庫驅動程序
          hibernate.connection.url -- 連接數據庫 URL
          hibernate.connection.username -- 數據庫用戶名
          hibernate.connection.password -- 數據庫密碼

        • 方言:

          hibernate.dialect -- 操作數據庫方言

      • 可選的配置

        • hibernate.show_sql -- 顯示 SQL
        • hibernate.format_sql -- 格式化 SQL
        • hibernate.hbm2ddl.auto -- 通過映射轉成 DDL 語句,常用: update
          • create -- 每次都會創建一個新的表 --- 測試的時候
          • create-drop -- 每次都會創建一個新的表,當執行結束之后,將創建的這個表刪除 --- 測試的時候
          • update -- 如果有表,使用原來的表。沒有表,創建一個新的表,同時更新表結構(比如新增一個字段,但是不能刪除字段)
          • validate -- 如果有表,使用原來的表。同時校驗映射文件與表中字段是否一致,如果不一致就會報錯。
      • 加載映射

        • 如果XML方式:

            <mapping resource="cn/itcast/hibernate/domain/User.hbm.xml" />
          

5、Hibernate 常用的接口和類

  1. Configuration 類和作用

    • Configuration 類

      • Configuration 對象用于配置并且啟動 Hibernate。

      • Hibernate 應用通過該對象來獲得對象-關系映射文件中的元數據,以及動態配置 Hibernate 的屬性,然后創建 SessionFactory 對象。

      • 簡單一句話:加載 Hibernate 的配置文件,可以獲取 SessionFactory 對象。

    • Configuration 類的其他應用(了解)

      • 加載配置文件的種類,Hibernate 支持 xml 和 properties 類型的配置文件,在開發中基本都使用 XML 配置文件的方式。
        • 如果采用的是 properties 的配置文件,那么通過:

            Configuration configuration = new Configuration();
          

          就可以自動配置文件,但是還需要自己手動加載映射文件(xxx.hbm.xml):

            config.addResource("cn/itcast/domain/Student.hbm.xml");
          
        • 如果采用的XML的配置文件,通過:

            Configuration configuration = new Configuration().configure();
          

          加載配置文件。

  2. SessionFactory:重要

    • SessionFactory 是工廠類,是生成 Session 對象的工廠類
    • SessionFactory 類的特點
      • 由 Configuration 通過加載配置文件創建該對象。

      • SessionFactory 對象中保存了當前的數據庫配置信息和所有映射關系以及預定義的 SQL 語句。同時,SessionFactory 還負責維護 Hibernate 的二級緩存。

        • 預定義SQL語句
          • 使用 Configuration 類創建了 SessionFactory 對象是,已經在SessionFacotry 對象中緩存了一些 SQL 語句
          • 常見的 SQL 語句是增刪改查(通過主鍵來查詢)
          • 這樣做的目的是效率更高
      • 一個 SessionFactory 實例對應一個數據庫,應用從該對象中獲得 Session 實例。

      • SessionFactory 是線程安全的,意味著它的一個實例可以被應用的多個線程共享。

      • SessionFactory 是重量級的,意味著不能隨意創建或銷毀它的實例。如果只訪問一個數據庫,只需要創建一個 SessionFactory 實例,且在應用初始化的時候完成。

      • SessionFactory 需要一個較大的緩存,用來存放預定義的SQL語句及實體的映射信息。另外可以配置一個緩存插件,這個插件被稱之為 Hibernate 的二級緩存,被多線程所共享

    1. 總結

      • 一般應用使用一個 SessionFactory,最好是應用啟動時就完成初始化。
  3. 編寫HibernateUtil的工具類

    • 正因為 SessionFactory 比較特別,每次使用時都是固定的代碼,所以可以把代碼抽取出來,編寫工具類。

    • 具體代碼如下

        public class HibernateUtil {
            private static final Configuration cfg;
            private static final SessionFactory factory;
            static{
                // 給常量賦值 
                // 加載配置文件
                cfg = new Configuration().configure();
                // 生成factory對象
                factory = cfg.buildSessionFactory();
            }
            // 獲取Session對象
            public static Session openSession(){
                return factory.openSession();
            }
        }
      
  4. Session 接口

    • 概述

      • Session 是在 Hibernate 中使用最頻繁的接口。也被稱之為持久化管理器。它提供了和持久化有關的操作,比如添加、修改、刪除、加載和查詢實體對象

      • Session 是應用程序與數據庫之間交互操作的一個單線程對象,是 Hibernate 運作的中心

      • Session是線程不安全的

      • 所有持久化對象必須在 session 的管理下才可以進行持久化操作

      • Session 對象有一個一級緩存,顯式執行 flush 之前,所有的持久化操作的數據都緩存在 session 對象處

      • 持久化類與 Session 關聯起來后就具有了持久化的能力

    • 特點

      • 不是線程安全的。應避免多個線程使用同一個 Session 實例

      • Session 是輕量級的,它的創建和銷毀不會消耗太多的資源。應為每次客戶請求分配獨立的 Session 實例

      • Session 有一個緩存,被稱之為 Hibernate 的一級緩存。每個 Session 實例都有自己的緩存

    • 常用的方法

      • save(obj)

          /**
           * 測試工具類
           */
          @Test
          public void testSave2(){
              // 使用工具類簡化代碼
              Session session = HibernateUtils.getSession();
              Transaction tr = session.beginTransaction();
        
              Customer c = new Customer();
              c.setCust_name("小風");
              session.save(c);
        
              // 提交事務
              tr.commit();
              // 釋放資源
              session.close();
          }
        
      • get(Class,id)

        2個參數:class 表示要查詢的 JavaBean 的 class 對象,id 為主鍵的值。

        例如,需要查 Customer 對應的表中主鍵值為7(Long 類型)的記錄,代碼如下:

          Customer c = session.get(Customer.class, 7L);
        
      • delete(obj)

        注意:在這里是對數據庫進行操作,所以刪除的是數據庫的表中的某一行記錄,所以首先要調用上面的 get 方法,得到對象后,再刪除。

          Customer c = session.get(Customer.class, 7L);
          
          // 刪除客戶
          session.delete(c);
        
      • update(obj)

          Customer c = session.get(Customer.class, 95L);
          
          // 設置客戶的信息
          c.setCust_name("小蒼");
          c.setCust_level("3");
          
          // 修改
          session.update(c);
        
      • saveOrUpdate(obj) -- 保存或者修改(如果沒有數據,保存數據。如果有,修改數據)

        • 保存

            Customer c = new Customer();
            // c.setCust_id(10L);   這是錯誤做法!千萬不能自己設置主鍵去保存!
            c.setCust_name("測試");
            session.saveOrUpdate(c);
          
        • 修改

            // 先查詢再改
            Customer c = session.get(Customer.class, 6L);
            c.setCust_name("小澤");
            session.saveOrUpdate(c);
          
      • createQuery() -- HQL語句的查詢的方式

          // 創建查詢的接口
          Query query = session.createQuery("from Customer");
          // 查詢該表所有的數據
          List<Customer> list = query.list();
          for (Customer customer : list) {
              System.out.println(customer);
          }
        
  5. Transaction 接口

    • Transaction 是事務的接口

    • 常用的方法

      • commit() -- 提交事務

      • rollback() -- 回滾事務

    • 特點

      • Hibernate 框架默認情況下事務不自動提交.需要手動提交事務

      • 如果沒有開啟事務,那么每個 Session 的操作,都相當于一個獨立的事務

      在如上的代碼中,都開啟了事務,并且手動提交了事務。

    • 示例:

        /**
         * 測試保存
         */
        @Test
        public void testSave3(){
            Session session = null;
            Transaction tr = null;
            try {
                // 獲取session
                session = HibernateUtils.getSession();
                // 開啟事務
                tr = session.beginTransaction();
                // 執行代碼
                Customer c = new Customer();
                c.setCust_name("哈哈");
                // 保存
                session.save(c);
                // 提交事務事務
                tr.commit();
            } catch (Exception e) {
                // 回滾事務
                tr.rollback();
                e.printStackTrace();
            }finally{
                // 釋放資源
                session.close();
            }
        }
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,923評論 6 535
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,740評論 3 420
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,856評論 0 380
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,175評論 1 315
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,931評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,321評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,383評論 3 443
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,533評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,082評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,891評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,067評論 1 371
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,618評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,319評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,732評論 0 27
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,987評論 1 289
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,794評論 3 394
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,076評論 2 375

推薦閱讀更多精彩內容