第二章:使用QueryDSL與SpringDataJPA實現(xiàn)單表普通條件查詢

在企業(yè)開發(fā)中ORM框架有很多種如:Hibernate,Mybatis绒怨,JdbcTemplate等也榄。每一種框架的設(shè)計理念是不一樣的趟脂,Hibernate跟我們本章講解的SpringDataJPA是一致的框架都是全自動理念作為設(shè)計核心,讓用戶更少的去寫SQL語句通過簡單的配置就可以實現(xiàn)各種查詢抢韭。而Mybatis框架則是半自動理念作為設(shè)計核心薪贫,SQL讓用戶自己定義實現(xiàn)了更好的靈活性。

本章目標(biāo)

本章我們目標(biāo)實現(xiàn)QueryDSL通用查詢語言整合SpringDataJPA完成單表的查詢多樣化刻恭。

構(gòu)建項目

下面我們先來創(chuàng)建一個SpringBoot項目瞧省,具體如何使用Maven整合QueryDSL請訪問QueryDSL學(xué)習(xí)目錄第一章,創(chuàng)建項目時的依賴也與第一章一致吠各,pom.xml配置文件如下代碼塊所示:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.yuqiyu.querydsl.sample</groupId>
    <artifactId>chapter2</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>war</packaging>

    <name>chapter2</name>
    <description>Demo project for Spring Boot</description>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.5.4.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>
        <!--阿里巴巴數(shù)據(jù)庫連接池臀突,專為監(jiān)控而生 -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.0.26</version>
        </dependency>
        <!-- 阿里巴巴fastjson,解析json視圖 -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.15</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-tomcat</artifactId>
            <!--<scope>provided</scope>-->
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <!--queryDSL-->
        <dependency>
            <groupId>com.querydsl</groupId>
            <artifactId>querydsl-jpa</artifactId>
            <version>${querydsl.version}</version>
        </dependency>
        <dependency>
            <groupId>com.querydsl</groupId>
            <artifactId>querydsl-apt</artifactId>
            <version>${querydsl.version}</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.16.16</version>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
            <!--添加QueryDSL插件支持-->
            <plugin>
                <groupId>com.mysema.maven</groupId>
                <artifactId>apt-maven-plugin</artifactId>
                <version>1.1.3</version>
                <executions>
                    <execution>
                        <goals>
                            <goal>process</goal>
                        </goals>
                        <configuration>
                            <outputDirectory>target/generated-sources/java</outputDirectory>
                            <processor>com.querydsl.apt.jpa.JPAAnnotationProcessor</processor>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
</project>

上圖代碼塊有關(guān)配置如有不明白的地方請查看第一章:Maven環(huán)境下如何配置QueryDSL環(huán)境贾漏。

構(gòu)建數(shù)據(jù)庫信息表

我們先來創(chuàng)建一張普通信息表候学,創(chuàng)建表SQL如下所示:

DROP TABLE IF EXISTS `t_user`;
CREATE TABLE `t_user` (
  `t_id` int(11) NOT NULL AUTO_INCREMENT COMMENT '編號',
  `t_name` varchar(30) DEFAULT NULL COMMENT '名稱',
  `t_age` int(10) DEFAULT NULL COMMENT '年齡',
  `t_address` varchar(100) DEFAULT NULL COMMENT '家庭住址',
  `t_pwd` varchar(100) CHARACTER SET latin1 DEFAULT NULL COMMENT '用戶登錄密碼',
  PRIMARY KEY (`t_id`)
) ENGINE=MyISAM AUTO_INCREMENT=17 DEFAULT CHARSET=utf8;

測試數(shù)據(jù)這里就不添加了。

添加application.yml配置文件

在resource目錄下我們添加application.yml配置文件來代替application.properties文件纵散,添加對應(yīng)的數(shù)據(jù)庫連接池的配置信息梳码,代碼如下所示:

spring:
  datasource:
      type: com.alibaba.druid.pool.DruidDataSource
      url: jdbc:mysql://127.0.0.1:3306/test?characterEncoding=utf8
      username: root
      password: root
      driver-class-name: com.mysql.jdbc.Driver
      filters: stat
      maxActive: 20
      initialSize: 1
      maxWait: 60000
      minIdle: 1
      timeBetweenEvictionRunsMillis: 60000
      minEvictableIdleTimeMillis: 300000
      validationQuery: select 'x'
      testWhileIdle: true
      testOnBorrow: false
      testOnReturn: false
      poolPreparedStatements: true
      maxOpenPreparedStatements: 20
  jpa:
    properties:
      hibernate:
        show_sql: true
        format_sql: true

創(chuàng)建實體

我們根據(jù)數(shù)據(jù)庫內(nèi)對應(yīng)的字段創(chuàng)建一個實體類并添加對應(yīng)的SpringDataJPA的注解,實體類代碼如下所示:

package com.yuqiyu.querydsl.sample.chapter2.bean;
import lombok.Data;
import javax.persistence.*;
import java.io.Serializable;

/**
 * ========================
 * Created with IntelliJ IDEA.
 * User:恒宇少年
 * Date:2017/7/2
 * Time:18:31
 * 碼云:http://git.oschina.net/jnyqy
 * ========================
 */
@Data
@Entity
@Table(name = "t_user")
public class UserBean implements Serializable
{
    @Id
    @Column(name = "t_id")
    @GeneratedValue
    private Long id;
    @Column(name = "t_name")
    private String name;
    @Column(name = "t_age")
    private int age;
    @Column(name = "t_address")
    private String address;
    @Column(name = "t_pwd")
    private String pwd;
}

實體內(nèi)有個注解@Data比較特殊伍掀,之前也許大家沒有使用過掰茶,當(dāng)然你們肯定發(fā)現(xiàn)了我這個實體類內(nèi)并沒有對應(yīng)字段的Getter/Setter方法,如果沒有添加@Data注解在SpringDataJPA映射數(shù)據(jù)時會出現(xiàn)找不到對應(yīng)字段的Setter方法蜜笤,導(dǎo)致無法完成數(shù)據(jù)映射到實體的異常濒蒋!
在上面的實體源碼中可以看到@Data注解是在lombok包內(nèi),lombok其實是一個優(yōu)雅的第三方插件,它可以讓你的實體變得簡潔沪伙,可讀性也大大的得到了提升瓮顽。在使用這個插件的時候需要你們Idea開發(fā)工具支持,必填安裝相應(yīng)的Plugin才可以围橡,這里我就不多說相關(guān)lombok的配置問題了暖混,大家在跟本章聯(lián)系的時候可以使用Getter/Setter方法的形式代替@Data。

創(chuàng)建基類JPA

這里我們簡單的封裝下JPA翁授,我們添加一個接口去繼承我們需要的JPA接口并讓所有子類繼承我們的基類接口就可以了拣播,基類JPA代碼如下所示:

package com.yuqiyu.querydsl.sample.chapter2.jpa;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.data.querydsl.QueryDslPredicateExecutor;

/**
 * 核心JPA
 * ========================
 * Created with IntelliJ IDEA.
 * User:恒宇少年
 * Date:2017/7/2
 * Time:18:23
 * 碼云:http://git.oschina.net/jnyqy
 * ========================
 */
@NoRepositoryBean
public interface BaseJPA<T>
        extends JpaRepository<T,Long>,
        JpaSpecificationExecutor<T>,
        QueryDslPredicateExecutor<T>
{
}

上面的注解@NoRepositoryBean是為了避免SpringDataJPA自動實例化才添加的。

創(chuàng)建邏輯JPA

接下來我們開始創(chuàng)建對應(yīng)User模塊的數(shù)據(jù)邏輯接口JPA收擦,很簡單贮配,我們只需要創(chuàng)建一個接口繼承下我們的BaseJPA就可以了,代碼如下所示:

package com.yuqiyu.querydsl.sample.chapter2.jpa;
import com.yuqiyu.querydsl.sample.chapter2.bean.UserBean;

/**
 * ========================
 * Created with IntelliJ IDEA.
 * User:恒宇少年
 * Date:2017/7/2
 * Time:18:39
 * 碼云:http://git.oschina.net/jnyqy
 * ========================
 */
public interface UserJPA
        extends BaseJPA<UserBean>
{
  //../可以添加命名方法查詢
}

我們在繼承BaseJPA的時候用到了泛型炬守,因為我們在BaseJPA內(nèi)所繼承的接口都需要我們傳遞一個具體的實體類的類型牧嫉,所以這塊我們采用了泛型來處理,只有具體邏輯JPA繼承BaseJPA的時候傳遞具體的實體類型就可以了减途。

自動生成Q結(jié)構(gòu)查詢實體

我們之前說過了QueryDSL很神奇的地方就在于它是一個可通過Maven插件自動生成實體類型的結(jié)構(gòu)查詢實體酣藻,那么我們接下來使用maven compile命令來讓我們配置的JPAAnnotationProcessor去做他自己的使命。
idea工具為我們的maven項目自帶了比較全面的命令鳍置,我們直接使用就可以了辽剧,如下圖1所示:


圖1

雙擊紅色框內(nèi)的命令就可以執(zhí)行了,在這之前如果你想使用本地的maven環(huán)境需要在Setting->Build Tools ->maven頁面修改home dirctory税产。命令執(zhí)行完成后我們可以看到target目錄自動生成了并且為我們創(chuàng)建了一些目錄怕轿,展開目錄后可以看到QueryDSL為我們自動生成的查詢實體,如下圖2所示:


圖2

maven插件會為我們自動創(chuàng)建一堆目錄辟拷,我們的查詢實體的位置是以我們pom.xml配置文件內(nèi)配置的目錄為準(zhǔn)撞羽。打開自動創(chuàng)建的實體后可以看到QueryDSL自動為我們創(chuàng)建的查詢字段以及構(gòu)造函數(shù),具體查詢字段的含義后面會有所講解衫冻。

編寫查詢

下面我們開始編寫查詢诀紊,在編寫之前我們創(chuàng)建一個控制器用于查看我們查詢到的數(shù)據(jù),代碼如下所示:

package com.yuqiyu.querydsl.sample.chapter2.controller;
import com.yuqiyu.querydsl.sample.chapter2.jpa.UserJPA;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * ========================
 * Created with IntelliJ IDEA.
 * User:恒宇少年
 * Date:2017/7/2
 * Time:18:38
 * 碼云:http://git.oschina.net/jnyqy
 * ========================
 */
@RestController
@RequestMapping(value = "/user")
public class UserController
{
    @Autowired
    private UserJPA userJPA;

}

這里我并沒有追尋MVC三層的設(shè)計理念隅俘,因為這只是文章的測試Sample編寫邻奠,大家在實際開發(fā)項目中還是需要按照MVC設(shè)計模式來進(jìn)行設(shè)計架構(gòu)。

查詢?nèi)繑?shù)據(jù)并排序

我們先來一個簡單的查詢表內(nèi)的所有數(shù)據(jù)并根據(jù)主鍵進(jìn)行倒序为居,代碼如下所示:

@RestController
@RequestMapping(value = "/user")
public class UserController
{
    @Autowired
    private UserJPA usrJPA;

    //----以下是新添加內(nèi)容

    //實體管理者
    @Autowired
    private EntityManager entityManager;

    //JPA查詢工廠
    private JPAQueryFactory queryFactory;

    @PostConstruct
    public void initFactory()
    {
        queryFactory = new JPAQueryFactory(entityManager);
        System.out.println("init JPAQueryFactory successfully");
    }

    /**
     * 查詢?nèi)繑?shù)據(jù)并根據(jù)id倒序
     * @return
     */
    @RequestMapping(value = "/queryAll")
    public List<UserBean> queryAll()
    {
        //使用querydsl查詢
        QUserBean _Q_user = QUserBean.userBean;
        //查詢并返回結(jié)果集
        return queryFactory
                .selectFrom(_Q_user)//查詢源
                .orderBy(_Q_user.id.desc())//根據(jù)id倒序
                .fetch();//執(zhí)行查詢并獲取結(jié)果集
    }

在使用QueryDSL進(jìn)行查詢之前我們聲明了EntityManager的注入以及JPAQueryFactory工廠對象的創(chuàng)建碌宴,通過@PostConstruct注解在類初始化的時候完成對JPAQueryFactory對象的實例化。

我們在queryAll方法內(nèi)首先獲取了對應(yīng)UserBean的查詢實體QUserBean蒙畴,通過QUserBean內(nèi)自動生成的字段獲取贰镣,我們使用JPAQueryFactory工廠對象的selectFrom方法來簡化查詢,該方法代替了select&from兩個方法,注意:也是僅限單表操作時可以使用八孝。

而我們倒序的方式看起來就更簡單了董朝,這種實現(xiàn)方式完全就像是在編寫原始的SQL一樣,如果是根據(jù)asc的方式進(jìn)行排序則可以修改為: orderBy(_Q_user.id.asc())干跛,看起來是不是特別簡單?

在一系列的條件都添加完成后祟绊,調(diào)用fetch方法執(zhí)行我們的條件查詢并且獲取對應(yīng)selectFrom查詢實體的類型集合楼入,要注意一點(diǎn):這里如果selectFrom參數(shù)的實體類型不是UserBean那fetch方法返回集合的類型也不是List<UserBean>。

注意:在我們啟動項目之前牧抽,我們需要修改pom.xml配置文件添加相關(guān)inject的依賴嘉熊,SpringBoot內(nèi)部并沒有為我們提供該依賴。

<dependency>
    <groupId>javax.inject</groupId>
    <artifactId>javax.inject</artifactId>
    <version>1</version>
</dependency>

添加該依賴后才能完成JPAQueryFactory的實例化扬舒,下面我們啟動下項目訪問地址看界面輸出內(nèi)容如下圖3所示:


圖3

可以看到上圖3的輸出內(nèi)容數(shù)據(jù)是完全按照我們的查詢條件來執(zhí)行的阐肤,我們打開控制臺看看SpringDataJPA為我們自動生成的SQL

Hibernate: 
    select
        userbean0_.t_id as t_id1_0_,
        userbean0_.t_address as t_addres2_0_,
        userbean0_.t_age as t_age3_0_,
        userbean0_.t_name as t_name4_0_,
        userbean0_.t_pwd as t_pwd5_0_ 
    from
        t_user userbean0_ 
    order by
        userbean0_.t_id desc

可以看到在SQL上面輸出了Hibernate,StringDataJPA生成SQL這一塊是使用的Hibernate讲坎,所以我們可以完全使用HQL的查詢語言來編寫JPA的查詢孕惜。

根據(jù)主鍵查詢單條數(shù)據(jù)

查詢詳情方法是我們常用到的查詢之一,一般用于刪除晨炕、更新衫画。下面我們就來編寫一個detail方法來看來QueryDSL是如何完成查詢單挑數(shù)據(jù)的。

完全QueryDSL風(fēng)格

代碼如下所示:

 /**
     * 查詢詳情
     * @param id 主鍵編號
     * @return
     */
    @RequestMapping(value = "/detail/{id}")
    public UserBean detail(@PathVariable("id") Long id)
    {
        //使用querydsl查詢
        QUserBean _Q_user = QUserBean.userBean;
        //查詢并返回結(jié)果集
        return queryFactory
                .selectFrom(_Q_user)//查詢源
                .where(_Q_user.id.eq(id))//指定查詢具體id的數(shù)據(jù)
                .fetchOne();//執(zhí)行查詢并返回單個結(jié)果
    }

SpringDataJPA整合QueryDSL風(fēng)格

代碼如下所示:

    /**
     * SpringDataJPA & QueryDSL實現(xiàn)單數(shù)據(jù)查詢
     * @param id
     * @return
     */
    @RequestMapping(value = "/detail_2/{id}")
    public UserBean detail_2(@PathVariable("id") Long id)
    {
        //使用querydsl查詢
        QUserBean _Q_user = QUserBean.userBean;
        //查詢并返回指定id的單條數(shù)據(jù)
        return userJPA.findOne(_Q_user.id.eq(id));
    }

上面的兩種風(fēng)格都是可以根據(jù)id字段返回指定的單條數(shù)據(jù)瓮栗,當(dāng)然在上面的編寫看來還是使用SpringDataJPA & QueryDSL要簡單些削罩,也只是簡單的查詢整合風(fēng)格要比純QueryDSL要簡便,但是如果添加排序费奸、模糊查詢時還是純QueryDSL編寫更簡單一些弥激。

查詢指定主鍵時,我們使用了where方法并且指定了id字段需要eq參數(shù)id愿阐,這個eq是QueryDSL內(nèi)置的一個方法微服,用于查詢指定值數(shù)據(jù),當(dāng)然其他字段也同樣可以使用eq方法來完成條件查詢换况,都是可以變通使用的职辨。

重啟項目后我們來看下查詢詳情的運(yùn)行效果,如下圖4所示:


圖4

我們再來看下控制臺輸出的生成SQL戈二,如下代碼所示:

Hibernate: 
    select
        userbean0_.t_id as t_id1_0_,
        userbean0_.t_address as t_addres2_0_,
        userbean0_.t_age as t_age3_0_,
        userbean0_.t_name as t_name4_0_,
        userbean0_.t_pwd as t_pwd5_0_ 
    from
        t_user userbean0_ 
    where
        userbean0_.t_id=?

可以看到是根據(jù)我們指定的字段來作為查詢條件來檢索的數(shù)據(jù)舒裤,我們通過fetchOne方法來返回一個結(jié)果。

根據(jù)名稱模糊查詢

下面我們來根據(jù)字段name完成模塊查詢觉吭,先來看下我們的查詢條件代碼如下:

/**
     * 根據(jù)名稱模糊查詢
     * @param name
     * @return
     */
    @RequestMapping(value = "/likeQueryWithName")
    public List<UserBean> likeQueryWithName(String name)
    {
        //使用querydsl查詢
        QUserBean _Q_user = QUserBean.userBean;

        return queryFactory
                .selectFrom(_Q_user)//查詢源
                .where(_Q_user.name.like(name))//根據(jù)name模糊查詢
                .fetch();//執(zhí)行查詢并返回結(jié)果集
    }

可以看到我們where條件是根據(jù)name字段的like方法來完成的模糊查詢腾供,like方法也是QueryDSL內(nèi)置的方法,我們只需要傳入查詢的內(nèi)容就可以實現(xiàn)模糊查詢,下面我們來運(yùn)行訪問看下界面輸出內(nèi)容如下圖5所示:


圖5

我們可以看到僅輸出了name跟我們傳入'admin'相關(guān)的數(shù)據(jù)伴鳖,那我們看下控制臺是怎么給我們生成的SQL:

Hibernate: 
    select
        userbean0_.t_id as t_id1_0_,
        userbean0_.t_address as t_addres2_0_,
        userbean0_.t_age as t_age3_0_,
        userbean0_.t_name as t_name4_0_,
        userbean0_.t_pwd as t_pwd5_0_ 
    from
        t_user userbean0_ 
    where
        userbean0_.t_name like ? escape '!'

也是完全按照我們指定的模糊查詢字段生成的节值,到目前可以看到QueryDSL為我們減少了太多了查詢繁瑣的事情,讓我們能夠更好的投入到業(yè)務(wù)邏輯處理中榜聂。

總結(jié)

以上內(nèi)容就是本章的全部講解搞疗,本章主要講述了SpringDataJPA整合QueryDSL后完全使用QueryDSL來進(jìn)行單表的查詢,使用QueryDSL可以完全按照編寫原始SQL的思想來編寫查詢條件须肆,容易上手匿乃,方便快捷。由于QueryDSL的功能強(qiáng)大豌汇,有很多東西沒有講解到幢炸,希望大家可以在后期的項目中得到總結(jié)。

本章源碼已經(jīng)上傳到碼云:
SpringBoot配套源碼地址:https://gitee.com/hengboy/spring-boot-chapter
SpringCloud配套源碼地址:https://gitee.com/hengboy/spring-cloud-chapter

作者個人 博客
使用開源框架 ApiBoot 助你成為Api接口服務(wù)架構(gòu)師

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末拒贱,一起剝皮案震驚了整個濱河市宛徊,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌逻澳,老刑警劉巖闸天,帶你破解...
    沈念sama閱讀 221,635評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異赡盘,居然都是意外死亡号枕,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,543評論 3 399
  • 文/潘曉璐 我一進(jìn)店門陨享,熙熙樓的掌柜王于貴愁眉苦臉地迎上來葱淳,“玉大人,你說我怎么就攤上這事抛姑≡薏蓿” “怎么了?”我有些...
    開封第一講書人閱讀 168,083評論 0 360
  • 文/不壞的土叔 我叫張陵定硝,是天一觀的道長皿桑。 經(jīng)常有香客問我,道長蔬啡,這世上最難降的妖魔是什么诲侮? 我笑而不...
    開封第一講書人閱讀 59,640評論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮箱蟆,結(jié)果婚禮上沟绪,老公的妹妹穿的比我還像新娘。我一直安慰自己空猜,他們只是感情好绽慈,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,640評論 6 397
  • 文/花漫 我一把揭開白布恨旱。 她就那樣靜靜地躺著,像睡著了一般坝疼。 火紅的嫁衣襯著肌膚如雪搜贤。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,262評論 1 308
  • 那天钝凶,我揣著相機(jī)與錄音仪芒,去河邊找鬼。 笑死耕陷,一個胖子當(dāng)著我的面吹牛桌硫,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播啃炸,決...
    沈念sama閱讀 40,833評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼卓舵!你這毒婦竟也來了南用?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,736評論 0 276
  • 序言:老撾萬榮一對情侶失蹤掏湾,失蹤者是張志新(化名)和其女友劉穎裹虫,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體融击,經(jīng)...
    沈念sama閱讀 46,280評論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡筑公,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,369評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了尊浪。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片匣屡。...
    茶點(diǎn)故事閱讀 40,503評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖拇涤,靈堂內(nèi)的尸體忽然破棺而出捣作,到底是詐尸還是另有隱情,我是刑警寧澤鹅士,帶...
    沈念sama閱讀 36,185評論 5 350
  • 正文 年R本政府宣布券躁,位于F島的核電站,受9級特大地震影響掉盅,放射性物質(zhì)發(fā)生泄漏也拜。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,870評論 3 333
  • 文/蒙蒙 一趾痘、第九天 我趴在偏房一處隱蔽的房頂上張望慢哈。 院中可真熱鬧,春花似錦扼脐、人聲如沸岸军。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,340評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽艰赞。三九已至佣谐,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間方妖,已是汗流浹背狭魂。 一陣腳步聲響...
    開封第一講書人閱讀 33,460評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留党觅,地道東北人雌澄。 一個月前我還...
    沈念sama閱讀 48,909評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像杯瞻,于是被迫代替她去往敵國和親镐牺。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,512評論 2 359

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