hibernate

簡(jiǎn)介

Hibernate是一個(gè)開放源代碼的對(duì)象關(guān)系映射框架催跪,它對(duì)JDBC進(jìn)行了非常輕量級(jí)的對(duì)象封裝锁蠕,它將POJO與數(shù)據(jù)庫表建立映射關(guān)系,是一個(gè)全自動(dòng)的orm框架懊蒸,hibernate可以自動(dòng)生成SQL語句荣倾,自動(dòng)執(zhí)行,使得Java程序員可以隨心所欲的使用對(duì)象編程思維來操縱數(shù)據(jù)庫骑丸。 Hibernate可以應(yīng)用在任何使用JDBC的場(chǎng)合舌仍,既可以在Java的客戶端程序使用,也可以在Servlet/JSP的Web應(yīng)用中使用通危,最具革命意義的是铸豁,Hibernate可以在應(yīng)用EJB的J2EE架構(gòu)中取代CMP,完成數(shù)據(jù)持久化的重任黄鳍。

特點(diǎn)

面向?qū)ο?br> 不用寫sql語句
簡(jiǎn)潔
要寫dao實(shí)現(xiàn)

缺點(diǎn)

不能處理批量

hibernate快速入門

1推姻、導(dǎo)包

image.png

2、配置文件

<!DOCTYPE hibernate-configuration PUBLIC
        "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
    <session-factory>
        <!-- 四大參數(shù) -->
        <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
        <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/hibernate</property>
        <property name="hibernate.connection.username">root</property>
        <property name="hibernate.connection.password"></property>
        <!-- SQL 方言 框沟,注意使用MySQLInnoDBDialect,才可以使用Innodb引擎-->
        <property name="dialect">org.hibernate.dialect.MySQL5InnoDBDialect</property>
        <!-- 打印出sql -->
        <property name="show_sql">true</property>       
        <!-- 格式化sql -->
        <property name="format_sql">true</property>
        <!-- 有表更新表增炭,沒有表自動(dòng)創(chuàng)建表 -->
        <property name="hbm2ddl.auto">update</property>     
        <!-- 加載映射文件 -->
        <mapping resource="User.hbm.xml"/>
    </session-factory>
</hibernate-configuration>
注意:主配置文件名忍燥,一般默認(rèn)是hibernate.cfg.xml,并且在src根目錄中 上面的配置文件隙姿,可以參考etc文件夾下的配置文件

創(chuàng)建類

public class User {
    private int uid;
    private String username;
    private String password;
    //get/set方法 必須要有
}

3梅垄、映射文件

<!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.hibernate.entity.User" table="user">
        <id name="uid" column="uid">
            <!-- 使用數(shù)據(jù)庫默認(rèn)的生成主鍵的方案 -->
            <generator class="native"/>
        </id>
        <property name="username" column="username"/>
        <property name="password" column="password"/>
    </class>
</hibernate-mapping>

4、事務(wù)

Configuration configure = new Configuration().configure("hibernate.cfg.xml");
    SessionFactory factory = configure.buildSessionFactory();
    Session session = factory.openSession();// 獲取連接
    // 開啟事務(wù)
    Transaction tx = session.beginTransaction();
    User user = new User("黃蓉", "123");
    session.save(user);
    tx.commit();// 提交事務(wù)
    session.close();// 關(guān)閉連接
image.png

sessioin查詢api

save输玷、delete队丝、update

get 不支持延遲查詢

load 延遲查詢:如果使用了對(duì)象中非id的屬性時(shí)才會(huì)發(fā)送sql語句

saveOrUpdate

瞬時(shí)態(tài)執(zhí)行save(),游離態(tài)執(zhí)行update()

merge

兩個(gè)相同id的對(duì)象合并

實(shí)體類的三種狀態(tài)

瞬時(shí)態(tài):

無id欲鹏,與session無關(guān)聯(lián)机久,與數(shù)據(jù)庫無關(guān)聯(lián)

持久態(tài):

有id,與session有關(guān)聯(lián)赔嚎,與數(shù)據(jù)庫關(guān)聯(lián) 持久態(tài)對(duì)象修改數(shù)據(jù)膘盖,會(huì)自動(dòng)修改數(shù)據(jù)庫的數(shù)據(jù)

游離態(tài)(離線):

有id,與session無關(guān)聯(lián)尤误,與數(shù)據(jù)庫有關(guān)

image.png

關(guān)聯(lián)關(guān)系

多對(duì)一

多個(gè)Customer對(duì)應(yīng)一個(gè)User

image.png

一對(duì)多

一個(gè)User對(duì)應(yīng)多個(gè)Customer

image.png

多對(duì)多

image.png

hibernate查詢api

oid

就是根據(jù)對(duì)象的id查詢侠畔,例如get()、load()

hql Query

// -----------------條件查詢-------------------
    @Test
    public void test1() {
        String hql = "from User u where u.uid=1";
        Query<User> query = session.createQuery(hql);
        User u = query.uniqueResult();
        System.out.println(u);
    }

    @Test
    public void test2() {
        String hql = "from User u where u.username='lisi' and u.password='123'";
        Query<User> query = session.createQuery(hql);
        User u = query.uniqueResult();
        System.out.println(u);
    }

    // ---------------占位符條件查詢------------------
    // 占位符條件查詢 ?
    @Test
    public void test3() {
        String hql = "from User u where u.username=? and u.password=?";
        Query<User> query = session.createQuery(hql);
        query.setParameter(0, "lisi");
        query.setParameter(1, "123");
        User u = query.uniqueResult();
        System.out.println(u);
    }

    // 命名占位符條件查詢1 parameter
    @Test
    public void test4() {
        String hql = "from User where username=:username and password=:password";
        Query<User> query = session.createQuery(hql);
        query.setParameter("username", "lisi");
        query.setParameter("password", "123");
        User u = query.uniqueResult();
        System.out.println(u);
    }

    // 命名占位符條件查詢2 javabean
    @Test
    public void test5() {
        String hql = "from User where username=:username and password=:password";
        Query<User> query = session.createQuery(hql);
        User user = new User("lisi", "123");
        query.setProperties(user);
        User u = query.uniqueResult();
        System.out.println(u);
    }

    // 命名占位符條件查詢3 map,可以解決命名占位符與實(shí)際參數(shù)名不一樣的問題
    @Test
    public void test6() {
        String hql = "from User where username=:user and password=:pwd";
        Query<User> query = session.createQuery(hql);
        Map<String, String> map = new HashMap<>();
        map.put("user", "lisi");
        map.put("pwd", "123");
        query.setProperties(map);
        User u = query.uniqueResult();
        System.out.println(u);
    }

    // 模糊查詢
    @Test
    public void test7() {
        String hql = "from User where username like ?";
        Query<User> query = session.createQuery(hql);
        query.setParameter(0, "%七%");
        List<User> list = query.getResultList();
        System.out.println(list);
    }

    // 查詢列表,并且排序
    @Test
    public void test8() {
        String hql = "from User order by password desc";
        Query<User> query = session.createQuery(hql);
        List<User> list = query.getResultList();
        System.out.println(list);
    }

    // 分頁查詢
    @Test
    public void test9() {
        String hql = "from User";
        Query<User> query = session.createQuery(hql);
        query.setFirstResult(0);
        query.setMaxResults(3);
        List<User> list = query.getResultList();
        System.out.println(list);
    }

    // 動(dòng)態(tài)查詢
    @Test
    public void test10() {
        User user = new User();
        user.setPassword("123");

        String hql = "from User where 1=1";
        StringBuffer sb = new StringBuffer(hql);

        if (user.getPassword() != null && user.getPassword() != "") {
            sb.append(" and password=:password");
        }

        Query<User> query = session.createQuery(sb.toString());
        query.setProperties(user);

        List<User> list = query.getResultList();
        System.out.println(list);
    }

    // --------------------連接------------------------
    // 內(nèi)連接损晤,封裝成數(shù)組软棺,對(duì)象數(shù)組 查詢r(jià)oleid=1的用戶
    @Test
    public void test11() {
        String hql = "from User u inner join u.roleSet ro where ro.roleid=1";
        Query<Object[]> query = session.createQuery(hql);
        List<Object[]> list = query.getResultList();
        for (Object[] obj : list) {
            System.out.println(Arrays.toString(obj));
        }
    }

    // 迫切內(nèi)連接,直接封裝成對(duì)象 查詢custid=1的用戶
    @Test
    public void test12() {
        String hql = "from User u inner join fetch u.custSet c where c.custid=1";
        Query<User> query = session.createQuery(hql);
        List<User> list = query.getResultList();
        System.out.println(list.size());
        System.out.println(list.get(0) + ":" + list.get(0).getCustSet());
    }

    @Test
    public void test13() {
        String hql = "from User u where u.username='洪七公'";
        Query<User> query = session.createQuery(hql);
        List<User> list = query.list();
        System.out.println(list.size());
        System.out.println(list.get(0).getCustSet());
    }

    // -----------------投影查詢--------------------

    // 投影查詢 object[]
    @Test
    public void test14() {
        String hql = "select username,password from User u where u.uid=1";
        Query<Object[]> query = session.createQuery(hql);
        Object[] obj = query.uniqueResult();
        System.out.println(Arrays.toString(obj));
    }

    // 查詢一個(gè)值的時(shí)候尤勋,只能使用Object喘落,不能用數(shù)組
    @Test
    public void test15() {
        String hql = "select count(*) from User";
        Query<Object> query = session.createQuery(hql);
        Object obj = query.uniqueResult();
        System.out.println(obj);
    }

    // 投影查詢 list集合
    @Test
    public void test16() {
        String hql = "select new list(username,password) from User u where u.uid=1";
        Query<List<String>> query = session.createQuery(hql);
        List<String> list = query.uniqueResult();
        System.out.println(list);
    }

    // 投影查詢 map集合
    @Test
    public void test17() {
        String hql = "select new map(username,password) from User u where u.uid=1";
        Query<Map<String, String>> query = session.createQuery(hql);
        Map<String, String> map = query.uniqueResult();
        System.out.println(map);
    }

    // 投影查詢 自定義對(duì)象
    // 注意:new User(uid,username,password)會(huì)調(diào)用對(duì)應(yīng)的構(gòu)造方法茵宪,沒有就會(huì)報(bào)錯(cuò)
    @Test
    public void test18() {
        String hql = "select new User(username,password) from User u where u.uid=1";
        Query<User> query = session.createQuery(hql);
        User user = query.uniqueResult();
        System.out.println(user);
    }

qbc Citira

// 模糊查詢
    @Test
    public void test2() {
        Criteria criteria = session.createCriteria(User.class)
                .add(Restrictions.like("username", "%七%"));
        List<User> list = criteria.list();
        System.out.println(list);
    }

    // 多條件查詢
    @Test
    public void test3() {
        Criteria criteria = session.createCriteria(User.class)
                .add(Restrictions.eq("username", "李四"))
                .add(Restrictions.eq("password", "123"));
        List<User> list = criteria.list();
        System.out.println(list);
    }

    //排序
    @Test
    public void test4() {
        Criteria criteria = session.createCriteria(User.class)
                .addOrder(Order.desc("password"));//降序
        List<User> list = criteria.list();
        System.out.println(list);
    }
    //分頁
    @Test
    public void test5() {
        Criteria criteria = session.createCriteria(User.class)
                .setFirstResult(3)
                .setMaxResults(3);
        List<User> list = criteria.list();
        System.out.println(list);
    }

    //---------------------投影查詢---------------------

    //聚合函數(shù) count()
    @Test
    public void test6(){
        Criteria criteria = session.createCriteria(User.class);
        criteria.setProjection(Projections.rowCount());//count()
        Object result = criteria.uniqueResult();
        System.out.println(result);
    }

    //分組計(jì)算
    @Test
    public void test7(){
        Criteria criteria = session.createCriteria(User.class);
        criteria.setProjection(Projections.projectionList()
                .add(Projections.rowCount())
                .add(Projections.groupProperty("password")));
        List<Object[]> list = criteria.list();
        for (Object[] objects : list) {
            System.out.println(Arrays.toString(objects));
        }
    }

    //選出部分字段
    @Test
    public void test8(){
        Criteria criteria = session.createCriteria(User.class);
        criteria.setProjection(Projections.projectionList()
                .add(Projections.property("username"))
                .add(Projections.property("password")));
        List<Object[]> list = criteria.list();
        for (Object[] objects : list) {
            System.out.println(Arrays.toString(objects));
        }
    }

hibernate緩存

一級(jí)緩存

第一次查找,去緩存中找揖盘,沒有數(shù)據(jù)眉厨,從數(shù)據(jù)庫獲取,然后存入一級(jí)緩存兽狭,并且存入快照區(qū)憾股;session沒有關(guān)閉,并且執(zhí)行第二次查找箕慧,先從一級(jí)緩存中獲取服球。如果對(duì)象修改了數(shù)據(jù),一級(jí)緩存中的數(shù)據(jù)也修改了颠焦,那么會(huì)將一級(jí)緩存和快照區(qū)的數(shù)據(jù)進(jìn)行比對(duì)斩熊,如果不相同,就將數(shù)據(jù)存入數(shù)據(jù)庫伐庭。

第一級(jí)別的緩存是 Session 級(jí)別的緩存粉渠,它是屬于事務(wù)范圍的緩存(session的一級(jí)緩存)

二級(jí)緩存

二級(jí)緩存屬于SessionFactory級(jí)別的緩存,緩存的對(duì)象根據(jù)提供的實(shí)現(xiàn)類不同圾另,放置的位置也不同霸株,主要就是內(nèi)存和硬盤中。二級(jí)緩存是緩存對(duì)象的Id集乔,所以只有通過id查詢的去件,二級(jí)緩存才能生效。

第二級(jí)別的緩存是 SessionFactory 級(jí)別的緩存扰路,它是屬于進(jìn)程范圍的緩存

二級(jí)緩存的實(shí)現(xiàn)有很多尤溜,我們使用ehcache來實(shí)現(xiàn)二級(jí)緩存

1、導(dǎo)包
<dependency>
     <groupId>org.hibernate</groupId>
     <artifactId>hibernate-ehcache</artifactId>
     <version>5.0.12.Final</version>
</dependency>

<dependency>
    <groupId>net.sf.ehcache</groupId>
    <artifactId>ehcache-core</artifactId>
    <version>2.6.11</version>
</dependency>
2汗唱、在spring-hibernate.xml中配置
<!-- 開啟二級(jí)緩存:根據(jù)id來查詢 -->
<prop key="hibernate.cache.use_second_level_cache">true</prop>
<!-- 開啟查詢緩存:根據(jù)非id來查詢宫莱,需要在query中設(shè)置setCacheable(true) -->
<prop key="hibernate.cache.use_query_cache">true</prop>
<!-- 高速緩存提供程序 -->
<prop key="hibernate.cache.region.factory_class">org.hibernate.cache.ehcache.SingletonEhCacheRegionFactory</prop>
3、在resources根目錄中添加ehcache.xml文件
<ehcache>  
      <!--
      指定二級(jí)緩存存放在磁盤上的位置渡嚣,可以使用磁盤目錄
        也可以使用Java System Property目錄
        user.home是用戶目錄
        user.dir是用戶當(dāng)前工作目錄
        java.io.tmpdir是默認(rèn)臨時(shí)文件路徑
      -->
    <diskStore path="java.io.tmpdir/cache"/>

    <!-- ehcache將緩存分為多個(gè)不同的區(qū)域梢睛,不同的區(qū)域可以設(shè)置不同的緩存策略 -->

    <!--緩存策略:
        name:Cache的唯一標(biāo)識(shí)。
        maxElementsInMemory:內(nèi)存中最大緩存對(duì)象數(shù)识椰。
        eternal:Element是否永久有效绝葡,一旦設(shè)置true,timeout將不起作用腹鹉。
        timeToIdleSeconds:設(shè)置Element在失效前的允許閑置時(shí)間藏畅。僅當(dāng)element不是永久有效時(shí)使用,可選屬性,默認(rèn)值是0愉阎,也就是可閑置時(shí)間無窮大绞蹦。
        timeToLiveSeconds:設(shè)置Element在失效前允許存活時(shí)間。最大時(shí)間介于創(chuàng)建時(shí)間和失效時(shí)間之間榜旦。僅當(dāng)element不是永久有效時(shí)使用幽七,默認(rèn)是0.,也就是element存活時(shí)間無窮大溅呢。
        overflowToDisk:配置此屬性澡屡,當(dāng)內(nèi)存中Element數(shù)量達(dá)到maxElementsInMemory時(shí),Ehcache將會(huì)Element寫到磁盤中咐旧。
        maxElementsOnDisk:磁盤中最大緩存對(duì)象數(shù)驶鹉,若是0表示無窮大。
        memoryStoreEvictionPolicy:當(dāng)達(dá)到maxElementsInMemory限制時(shí)铣墨,Ehcache將會(huì)根據(jù)指定的策略
        去清理緩存中的內(nèi)容室埋。默認(rèn)策略是LRU(最近最少使用),你也可以設(shè)置為FIFO(先進(jìn)先出)或是LFU(較少使用) -->
      
    <defaultCache
            maxElementsInMemory="10000"
            eternal="false"
            timeToIdleSeconds="120"
            timeToLiveSeconds="120"
            overflowToDisk="true"
    />

    <cache name="simple"
           maxElementsInMemory="1000"
           eternal="true"
           timeToIdleSeconds="0"
           timeToLiveSeconds="0"
           overflowToDisk="false"
    />

    <!--可以給每個(gè)實(shí)體類指定一個(gè)配置文件伊约,通過name屬性指定姚淆,要使用類的全名-->
    <!--<cache name="com.study.entity.User"-->
    <!--maxElementsInMemory="10000"-->
    <!--eternal="false"-->
    <!--timeToIdleSeconds="300"-->
    <!--timeToLiveSeconds="600"-->
    <!--overflowToDisk="true"-->
    <!--/>-->
</ehcache>
4、在需要使用二級(jí)緩存的類上添加注解
//region:標(biāo)示要使用的區(qū)域屡律,不同的區(qū)域使用的緩存策略不一樣肉盹,見上面第3點(diǎn)說明
//usage:指定使用的并非策略
@org.hibernate.annotations.Cache(region ="simple",usage = CacheConcurrencyStrategy.READ_ONLY)
ehcache的四種緩存并發(fā)策略如下:
read-write(讀寫型):

提供Read Committed事務(wù)隔離級(jí)別
在非集群的環(huán)境中適用
適用經(jīng)常被讀,很少修改的數(shù)據(jù)
可以防止臟讀
更新緩存的時(shí)候會(huì)鎖定緩存中的數(shù)據(jù)

nonstrict-read-write(非嚴(yán)格讀寫型):

適用極少被修改疹尾,偶爾允許臟讀的數(shù)據(jù)(兩個(gè)事務(wù)同時(shí)修改數(shù)據(jù)的情況很少見)
不保證緩存和數(shù)據(jù)庫中數(shù)據(jù)的一致性
為緩存數(shù)據(jù)設(shè)置很短的過期時(shí)間,從而盡量避免臟讀
不鎖定緩存中的數(shù)據(jù)

read-only(只讀型):

適用從來不會(huì)被修改的數(shù)據(jù)(如參考數(shù)據(jù))
在此模式下骤肛,如果對(duì)數(shù)據(jù)進(jìn)行更新操作纳本,會(huì)有異常
事務(wù)隔離級(jí)別低,并發(fā)性能高
在集群環(huán)境中也能完美運(yùn)作

5腋颠、測(cè)試
        AppInfo appInfo = appInfoService.findOneById(1);
        System.out.println(appInfo);

        AppInfo appInfo1 = appInfoService.findOneById(1);
        System.out.println(appInfo1);
注意:

1繁成、list()只查詢一級(jí)緩存,而iterator()會(huì)從二級(jí)緩存中查

2淑玫、list()方法返回的對(duì)象都是實(shí)體對(duì)象巾腕,而iterator()返回的是代理對(duì)象

查詢緩存

Query Cache只是在特定的條件下才會(huì)發(fā)揮作用,而且要求相當(dāng)嚴(yán)格:

完全相同的HQL重復(fù)執(zhí)行絮蒿。(注意尊搬,只有hql)
重復(fù)執(zhí)行期間,Query Cache對(duì)應(yīng)的數(shù)據(jù)表不能有數(shù)據(jù)變動(dòng)(比如添土涝、刪佛寿、改操作)

絕大多數(shù)的查詢并不能從查詢緩存中受益,所以Hibernate默認(rèn)是不進(jìn)行查詢緩存的但壮。查詢緩存適用于以下場(chǎng)合:

在應(yīng)用程序運(yùn)行時(shí)經(jīng)常使用的查詢語句(參數(shù)相同)
很少對(duì)與查詢語句檢索到的數(shù)據(jù)進(jìn)行插入冀泻、刪除或更新操作

Query query = session.createQuery(hql);     
query.setCacheable(true); //啟用查詢緩存  
query.setCacheRegion(“queryCacheRegion”); //設(shè)置查詢緩存區(qū)域(數(shù)據(jù)過期策略)  
query.list();  
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末常侣,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子弹渔,更是在濱河造成了極大的恐慌胳施,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,122評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件肢专,死亡現(xiàn)場(chǎng)離奇詭異舞肆,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)鸟召,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,070評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門胆绊,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人欧募,你說我怎么就攤上這事压状。” “怎么了跟继?”我有些...
    開封第一講書人閱讀 164,491評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵种冬,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我舔糖,道長(zhǎng)娱两,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,636評(píng)論 1 293
  • 正文 為了忘掉前任金吗,我火速辦了婚禮十兢,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘摇庙。我一直安慰自己旱物,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,676評(píng)論 6 392
  • 文/花漫 我一把揭開白布卫袒。 她就那樣靜靜地躺著宵呛,像睡著了一般。 火紅的嫁衣襯著肌膚如雪夕凝。 梳的紋絲不亂的頭發(fā)上宝穗,一...
    開封第一講書人閱讀 51,541評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音码秉,去河邊找鬼逮矛。 笑死,一個(gè)胖子當(dāng)著我的面吹牛泡徙,可吹牛的內(nèi)容都是我干的橱鹏。 我是一名探鬼主播,決...
    沈念sama閱讀 40,292評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼莉兰!你這毒婦竟也來了挑围?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,211評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤糖荒,失蹤者是張志新(化名)和其女友劉穎杉辙,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體捶朵,經(jīng)...
    沈念sama閱讀 45,655評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡蜘矢,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,846評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了综看。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片品腹。...
    茶點(diǎn)故事閱讀 39,965評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖红碑,靈堂內(nèi)的尸體忽然破棺而出舞吭,到底是詐尸還是另有隱情,我是刑警寧澤析珊,帶...
    沈念sama閱讀 35,684評(píng)論 5 347
  • 正文 年R本政府宣布羡鸥,位于F島的核電站,受9級(jí)特大地震影響忠寻,放射性物質(zhì)發(fā)生泄漏惧浴。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,295評(píng)論 3 329
  • 文/蒙蒙 一奕剃、第九天 我趴在偏房一處隱蔽的房頂上張望衷旅。 院中可真熱鬧,春花似錦纵朋、人聲如沸芜茵。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,894評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至绞佩,卻和暖如春寺鸥,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背品山。 一陣腳步聲響...
    開封第一講書人閱讀 33,012評(píng)論 1 269
  • 我被黑心中介騙來泰國打工胆建, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人肘交。 一個(gè)月前我還...
    沈念sama閱讀 48,126評(píng)論 3 370
  • 正文 我出身青樓笆载,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子凉驻,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,914評(píng)論 2 355

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