Spring Data JPA-基礎(chǔ)篇(二)

前置文章:

Spring Data JPA-基礎(chǔ)篇(一)

前言:

前置文章中我們已經(jīng)介紹了基礎(chǔ)JPA的使用方式,JPA是操作數(shù)據(jù)庫的一種ORM規(guī)范,而文章中使用的Hibernate是其具體的實(shí)現(xiàn)似嗤。
本文則是使用Spring Data JPA來進(jìn)行具體的CRUD操作柴我。

零鸦列、本文綱要

一发乔、基礎(chǔ)準(zhǔn)備

  1. pom.xml配置
  2. applicationContext.xml
  3. Customer實(shí)體類
  4. CustomerDao接口

二茄螃、基礎(chǔ)CRUD

  1. 測試準(zhǔn)備
  2. 測試查詢
  3. 測試保存
  4. 測試刪除
  5. 測試查詢所有
  6. 測試聚合查詢
  7. 判斷是否存在

三气筋、JPQL形式查詢

  1. 條件查詢
  2. 多條件查詢
  3. 更新操作

四拆内、SQL形式查詢

  1. 查詢?nèi)?/li>
  2. 模糊匹配

五、方法命名規(guī)則查詢

  1. 條件查詢
  2. 模糊匹配
  3. 多條件查詢

一宠默、基礎(chǔ)準(zhǔn)備

1. pom.xml配置

① 屬性控制
    <!--屬性控制-->
    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
        <spring.version>5.1.20.RELEASE</spring.version>
        <hibernate.version>5.0.7.Final</hibernate.version>
        <javax.el.version>2.2.4</javax.el.version>
        <slf4j.version>1.6.6</slf4j.version>
    </properties>
② 依賴管理

此處依賴部分并沒有過多說明麸恍,因?yàn)楝F(xiàn)在大家使用的Spring Boot、Spring Cloud都在淡化我們依賴配置的內(nèi)容,更關(guān)注代碼開發(fā)本身抹沪。

    <!--依賴管理-->
    <dependencies>
        <!--Junit-->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
        </dependency>
        <!--Spring-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-core</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context-support</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-orm</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-beans</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-aop</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjweaver</artifactId>
            <version>1.6.0</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.data</groupId>
            <artifactId>spring-data-jpa</artifactId>
            <version>1.9.0.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-test</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <!--el-->
        <dependency>
            <groupId>javax.el</groupId>
            <artifactId>javax.el-api</artifactId>
            <version>${javax.el.version}</version>
        </dependency>
        <dependency>
            <groupId>org.glassfish.web</groupId>
            <artifactId>javax.el</artifactId>
            <version>${javax.el.version}</version>
        </dependency>
        <!--hibernate-->
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-core</artifactId>
            <version>${hibernate.version}</version>
        </dependency>
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-entitymanager</artifactId>
            <version>${hibernate.version}</version>
        </dependency>
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-validator</artifactId>
            <version>5.2.1.Final</version>
        </dependency>
        <!--MySQL-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.30</version>
        </dependency>
        <!--c3p0數(shù)據(jù)庫連接池-->
        <dependency>
            <groupId>c3p0</groupId>
            <artifactId>c3p0</artifactId>
            <version>0.9.1.2</version>
        </dependency>
        <!--log-->
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.17</version>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>${slf4j.version}</version>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-log4j12</artifactId>
            <version>${slf4j.version}</version>
        </dependency>
    </dependencies>

2. applicationContext.xml

① 基礎(chǔ)約束準(zhǔn)備

引入了beans刻肄、aop、context融欧、jdbc敏弃、tx、jpa這些命名空間噪馏。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:jdbc="http://www.springframework.org/schema/jdbc"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xmlns:jpa="http://www.springframework.org/schema/data/jpa"
       xsi:schemaLocation="
       http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd
       http://www.springframework.org/schema/aop
       http://www.springframework.org/schema/aop/spring-aop.xsd
       http://www.springframework.org/schema/context
       http://www.springframework.org/schema/context/spring-context.xsd
       http://www.springframework.org/schema/jdbc
       http://www.springframework.org/schema/jdbc/spring-jdbc.xsd
       http://www.springframework.org/schema/tx
       http://www.springframework.org/schema/tx/spring-tx.xsd
       http://www.springframework.org/schema/data/jpa
       http://www.springframework.org/schema/data/jpa/spring-jpa.xsd">

</beans>
② 數(shù)據(jù)源配置
    <!-- 1. 創(chuàng)建數(shù)據(jù)庫連接池 -->
    <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
        <property name="driverClass" value="com.mysql.cj.jdbc.Driver"/>
        <property name="jdbcUrl" value="jdbc:mysql:///test"/>
        <property name="user" value="root"/>
        <property name="password" value="root"/>
    </bean>
③ 創(chuàng)建entityManagerFactory對(duì)象
    <!-- 2. 創(chuàng)建entityManagerFactory對(duì)象 -->
    <bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
        <!-- ① 配置數(shù)據(jù)源 -->
        <property name="dataSource" ref="dataSource"/>

        <!-- ② 指定實(shí)體類所在的包 -->
        <property name="packagesToScan" value="com.stone.domain"/>

        <!-- ③ 配置JPA的實(shí)現(xiàn)廠商(供應(yīng)商) -->
        <property name="persistenceProvider">
            <bean class="org.hibernate.jpa.HibernatePersistenceProvider"/>
        </property>

        <!-- ④ JPA的供應(yīng)商適配器 -->
        <property name="jpaVendorAdapter">
            <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
                <!-- a麦到、配置是否自動(dòng)創(chuàng)建數(shù)據(jù)庫表 -->
                <property name="generateDdl" value="false"/>
                <!-- b、指定數(shù)據(jù)庫類型 -->
                <property name="database" value="MYSQL"/>
                <!-- c欠肾、數(shù)據(jù)庫方言:支持的特有語法瓶颠,MySQL分頁limit,Oracle分頁ROWNUM -->
                <property name="databasePlatform" value="org.hibernate.dialect.MySQLDialect"/>
                <!-- d董济、是否顯示SQL語句 -->
                <property name="showSql" value="true"/>
            </bean>
        </property>

        <!--⑤ JPA方言:高級(jí)特性-->
        <property name="jpaDialect">
            <bean class="org.springframework.orm.jpa.vendor.HibernateJpaDialect"/>
        </property>
    </bean>
④ 配置事務(wù)管理器
    <!-- 3. 配置事務(wù)管理器 -->
    <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
        <property name="entityManagerFactory" ref="entityManagerFactory"/>
    </bean>
⑤ 整合Spring Data JPA
    <!-- 4. 整合Spring Data JPA -->
    <jpa:repositories base-package="com.stone.dao" transaction-manager-ref="transactionManager"
                      entity-manager-factory-ref="entityManagerFactory"/>
⑥ 聲明式事務(wù)

此處非必要

    <!-- txAdvice -->
    <tx:advice id="txAdvice" transaction-manager="transactionManager">
        <tx:attributes>
            <tx:method name="save" propagation="REQUIRED"/>
            <tx:method name="insert" propagation="REQUIRED"/>
            <tx:method name="update" propagation="REQUIRED"/>
            <tx:method name="delete" propagation="REQUIRED"/>
            <tx:method name="get*" read-only="true"/>
            <tx:method name="find*" read-only="true"/>
            <tx:method name="*" propagation="REQUIRED"/>
        </tx:attributes>
    </tx:advice>
    <!-- aop -->
    <aop:config>
        <aop:pointcut id="pointcut" expression="execution(* com.stone.service.*.*(..))"/>
        <aop:advisor advice-ref="txAdvice" pointcut-ref="pointcut"/>
    </aop:config>
⑦ 配置包掃描
    <context:component-scan base-package="com.stone"/>
⑧ 整合其他配置文件

此處暫時(shí)沒有步清。

3. Customer實(shí)體類

/**
 * 客戶實(shí)體類
 * → 配置映射關(guān)系
 *      1. 實(shí)體類和表的映射關(guān)系;
 *      2. 實(shí)體類中屬性和表中字段的映射關(guān)系虏肾;
 * → 實(shí)體類和表的映射關(guān)系
 *      ① @Entity:聲明實(shí)體類;
 *      ② @Table:配置實(shí)體類和表的映射關(guān)系欢搜;
 *          → name:配置數(shù)據(jù)庫表名稱封豪;
 * → 實(shí)體類中屬性和表中字段的映射關(guān)系
 *      ① @Id:聲明主鍵的配置;
 *      ② @GeneratedValue:配置主鍵生成策略炒瘟;
 *          → strategy:主鍵策略
 *              a吹埠、 GenerationType.IDENTITY  自增,MySQL數(shù)據(jù)庫疮装;
 *                  底層數(shù)據(jù)庫必須支持自動(dòng)增長缘琅,采用數(shù)據(jù)庫自增方式對(duì)ID進(jìn)行自增。
 *              b廓推、 GenerationType.SEQUENCE  序列刷袍,Oracle數(shù)據(jù)庫;
 *                  底層數(shù)據(jù)庫支持序列樊展。
 *              c呻纹、 GenerationType.TABLE
 *                  JPA提供的一種機(jī)制,通過一張數(shù)據(jù)庫表的形式幫助完成主鍵自增专缠。
 *              d雷酪、 GenerationType.AUTO
 *                  由程序自動(dòng)選擇主鍵生成策略。
 *      ③ Column:實(shí)體類屬性與表字段映射
 *          → name:數(shù)據(jù)庫表字段名稱
 */
@Table(name = "cst_customer")
@Entity
public class Customer {

    /*客戶主鍵*/
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "cust_id")
    private Long custId;

    /*客戶名稱*/
    @Column(name = "cust_name")
    private String custName;

    /*客戶資源來源*/
    @Column(name = "cust_source")
    private String custSource;

    /*客戶級(jí)別*/
    @Column(name = "cust_level")
    private String custLevel;

    /*客戶所屬行業(yè)*/
    @Column(name = "cust_industry")
    private String custIndustry;

    /*客戶的聯(lián)系方式*/
    @Column(name = "cust_phonoe")
    private String custPhone;

    /*客戶地址*/
    @Column(name = "cust_address")
    private String custAddress;

    ...

}

4. CustomerDao接口

NOTE
JpaRepository<T, ID>涝婉,該接口封裝了基礎(chǔ)CRUD操作:
→ T:操作的實(shí)體類類型哥力;
→ ID:實(shí)體類中主鍵屬性的類型。

JpaSpecificationExecutor<T>墩弯,該接口封裝了復(fù)雜查詢(分頁):
→ T:操作的實(shí)體類類型吩跋。

/**
 * 符合SpringDataJpa規(guī)范的接口
 * → JpaRepository<T, ID>蟀淮,該接口封裝了基礎(chǔ)CRUD操作
 * T:操作的實(shí)體類類型;
 * ID:實(shí)體類中主鍵屬性的類型钞澳。
 * → JpaSpecificationExecutor<T>怠惶,該接口封裝了復(fù)雜查詢(分頁)
 * T:操作的實(shí)體類類型。
 */
public interface CustomerDao extends JpaRepository<Customer, Long>, 
JpaSpecificationExecutor<Customer> {
    ...
}

二轧粟、基礎(chǔ)CRUD

1. 測試準(zhǔn)備

@RunWith(SpringJUnit4ClassRunner.class) //聲明Spring提供的單元測試環(huán)境
@ContextConfiguration(locations = "classpath:applicationContext.xml") //指定Spring容器配置信息
public class CustomerDaoTest {

    @Autowired
    private CustomerDao customerDao;

    ...

}

2. 測試查詢

NOTE
findOne → em.find() → 立即加載策治;
getOne → em.getReference() → 延遲加載;

    /**
     * 測試跟據(jù)ID查詢兰吟,findOne方法
     */
    @Test
    public void testFindOne() {
        Customer customer = customerDao.findOne(1L);
        System.out.println(customer);
    }

    /**
     * 跟據(jù)ID從數(shù)據(jù)庫查詢通惫,getOne方法需要使用@Transactional注解
     * findOne → em.find():立即加載
     * getOne → em.getReference():延遲加載
     */
    @Test
    @Transactional
    public void testGetOne() {
        Customer customer = customerDao.getOne(5L);
        System.out.println(customer);
    }

3. 測試保存

NOTE
① 實(shí)體對(duì)象未設(shè)置主鍵屬性值:直接保存;
② 實(shí)體對(duì)象設(shè)置主鍵屬性值:
→ a混蔼、主鍵存在履腋,進(jìn)行更新;
→ b惭嚣、主鍵不存在遵湖,跟據(jù)主鍵策略生成主鍵進(jìn)行插入(保存)。

    /**
     * 測試更新|保存晚吞,save方法
     * → 先查詢延旧,后更新|保存
     * 如果沒有設(shè)置ID屬性,則進(jìn)行保存操作槽地;如果設(shè)置了ID屬性迁沫,則會(huì)進(jìn)行更新|保存。
     * ① 如果指定ID數(shù)據(jù)存在捌蚊,則進(jìn)行更新操作集畅;
     * ② 如果指定ID數(shù)據(jù)不存在,則進(jìn)行保存操作(注意:保存時(shí)主鍵會(huì)依據(jù)主鍵策略自動(dòng)生成缅糟,而不是指定的主鍵)挺智。
     */
    @Test
    public void testSave() {
        Customer customer = new Customer();
        customer.setCustId(22L);
        customer.setCustName("Stone");
        customerDao.save(customer);
    }

4. 測試刪除

    /**
     * 測試刪除delete
     * → 先查詢,后刪除
     */
    @Test
    public void testDelete() {
        customerDao.delete(21L);
    }

5. 測試查詢所有

    /**
     * 測試查詢所有findAll
     */
    @Test
    public void testFindAll() {
        List<Customer> customers = customerDao.findAll();
        for (Customer customer : customers) {
            System.out.println(customer);
        }
    }

6. 測試聚合查詢

    /**
     * 測試聚合(統(tǒng)計(jì))查詢
     */
    @Test
    public void testCount() {
        long count = customerDao.count();
        System.out.println(count);
    }

7. 判斷是否存在

    /**
     * 測試查詢判斷是否存在
     * 傳統(tǒng)方式:
     * ① 判斷查詢結(jié)果是否為空null溺拱;
     * ② 判斷查詢結(jié)果條數(shù)是否大于0逃贝;【JPA采用此方式】
     */
    @Test
    public void testExists() {
        boolean exists = customerDao.exists(4L);
        System.out.println(exists);
    }

三、JPQL形式查詢

1. 條件查詢

① 接口方法準(zhǔn)備
    /**
     * 跟據(jù)客戶名稱查詢客戶信息
     * JPQL:FROM Customer WHERE custName = ?
     * 注意:在@Query注解的value屬性中迫摔,需要使用"?1"來指定具體占位沐扳。
     *
     * @param custName 客戶名稱
     * @return 客戶信息
     */
    @Query(value = "FROM Customer WHERE custName = ?1")
    public Customer findJpql(String custName);
② 測試
    /**
     * 測試JPQL查詢
     */
    @Test
    public void testJpql() {
        Customer yinRui = customerDao.findJpql("Yin Rui");
        System.out.println(yinRui);
    }

2. 多條件查詢

① 接口方法準(zhǔn)備
    /**
     * JPQL:FROM Customer WHERE custName = ? AND custId = ?
     *
     * @param custName 客戶名稱
     * @param custId   客戶ID
     * @return 客戶信息
     */
    @Query(value = "FROM Customer WHERE custName = ?1 AND custId = ?2")
    public Customer findCustNameAndCustId(String custName, Long custId);
② 測試
    /**
     * 測試JPQL多條件查詢
     */
    @Test
    public void testJpqlAnd() {
        Customer nicholasDunn = customerDao.findCustNameAndCustId("Nicholas Dunn", 19L);
        System.out.println(nicholasDunn);
    }

3. 更新操作

① 接口方法準(zhǔn)備

NOTE
相比于查詢方法,此處需要配合 @Modifying 注解一起使用句占。

    /**
     * 更新客戶姓名(@Query:代表進(jìn)行查詢沪摄;@Modifying:代表當(dāng)前執(zhí)行方法進(jìn)行更新操作。)
     * SQL:UPDATE cst_customer SET cust_name = ? WHERE cust_id = ?
     * JPQL:UPDATE Customer SET custName = ? WHERE custId = ?
     *
     * @param custName
     * @param custId
     */
    @Query(value = "UPDATE Customer SET custName = ?1 WHERE custId = ?2")
    @Modifying //(@Modifying+@Query)一起使用,代表更新操作杨拐。
    public void updateCustomer(String custName, Long custId);
② 測試
    /**
     * 測試JPQL更新操作
     * → SpringDataJpa中使用jpql完成 更新|刪除操作 需要手動(dòng)添加事務(wù)支持祈餐;
     * → 在@Test注解下,默認(rèn)SpringDataJpa執(zhí)行完成會(huì)進(jìn)行數(shù)據(jù)回滾哄陶;
     * → 使用@Rollback(value = false)帆阳,關(guān)閉自動(dòng)回滾。
     */
    @Test
    @Transactional //添加事務(wù)支持
    @Rollback(value = false)
    public void testUpdate() {
        customerDao.updateCustomer("Jeff Stone", 1L);
    }

四屋吨、SQL形式查詢

1. 查詢?nèi)?/h4>

① 接口方法準(zhǔn)備
    /**
     * SQL:SELECT * FROM cst_customer
     * → 使用@Query注解蜒谤,配置:
     * ① value屬性:sql;
     * ② nativeQuery屬性:使用本地sql查詢至扰,true鳍徽;反之,false敢课。
     *
     * @return 查詢對(duì)象集合
     */
    @Query(value = "SELECT * FROM cst_customer", nativeQuery = true)
    public List<Object[]> findSql();
② 測試
    /**
     * 測試使用本地SQL查詢?nèi)靠蛻粜畔?     */
    @Test
    public void testSql() {
        List<Object[]> objects = customerDao.findSql();
        for (Object[] object : objects) {
            System.out.println(Arrays.toString(object));
        }
    }

2. 模糊匹配

① 接口方法準(zhǔn)備
    /**
     * 使用SQL查詢阶祭,進(jìn)行模糊匹配
     * SQL:SELECT * FROM cst_customer WHERE cust_name LIKE ?
     *
     * @param custName 客戶名稱
     * @return 客戶信息
     */
    @Query(value = "SELECT * FROM cst_customer WHERE cust_name LIKE ?1", nativeQuery = true)
    public List<Object[]> findSqlLike(String custName);
② 測試
    /**
     * 測試SQL查詢,模糊匹配
     */
    @Test
    public void testSqlLike() {
        List<Object[]> objects = customerDao.findSqlLike("%Hicks");
        for (Object[] object : objects) {
            System.out.println(Arrays.toString(object));
        }
    }

五直秆、方法命名規(guī)則查詢

1. 條件查詢

① 接口方法準(zhǔn)備

NOTE
查詢方法寫法:findBy + 屬性名稱(field_name)濒募,等值匹配

    /**
     * 方法命名規(guī)則查詢,是對(duì)JPQL查詢的更深層的封裝切厘,使用該規(guī)則可以不用再寫JPQL語句萨咳。
     * → 查詢方法寫法:findBy + 屬性名稱(field_name),等值匹配
     * ① 以findBy開頭疫稿;
     * ② 拼接對(duì)象中的屬性,屬性首字母改為大寫鹃两;
     *
     * @param custName 客戶名稱
     * @return 客戶信息
     */
    public Customer findByCustName(String custName);
② 測試
    /**
     * 測試按照方法命名規(guī)則查詢
     */
    @Test
    public void testFindByCustName() {
        Customer itoRiku = customerDao.findByCustName("Ito Riku");
        System.out.println(itoRiku);
    }

2. 模糊匹配

① 接口方法準(zhǔn)備

NOTE
查詢方法寫法:findBy + 屬性名稱(field_name) + 查詢方式[Like|Isnull]

    /**
     * 跟據(jù)方法命名規(guī)則遗座,進(jìn)行模糊匹配
     * → 查詢方法寫法:findBy + 屬性名稱(field_name) + 查詢方式[Like|Isnull]
     *
     * @param custName 客戶名稱
     * @return 客戶信息
     */
    public List<Customer> findByCustNameLike(String custName);
② 測試
    /**
     * 測試模糊匹配查詢(注意:由于時(shí)占位符的形式進(jìn)行填充,"%"的位置信息需要自己判斷俊扳。)
     */
    @Test
    public void testFindByCustNameLike() {
        List<Customer> customers = customerDao.findByCustNameLike("%Yuito");
        for (Customer customer : customers) {
            System.out.println(customer);
        }
    }

3. 多條件查詢

① 接口方法準(zhǔn)備

NOTE
查詢方法寫法:findBy + 屬性名稱(field_name) + 查詢方式[Like|Isnull] + 多條件連接符(And|Or) + 屬性名稱(field_name) + 查詢方式[Like|Isnull]

    /**
     * 跟據(jù)方法命名規(guī)則途蒋,進(jìn)行多條件查詢
     * → 查詢方法寫法:findBy + 屬性名稱(field_name) + 查詢方式[Like|Isnull] + 多條件連接符(And|Or)
     * + 屬性名稱(field_name) + 查詢方式[Like|Isnull]
     *
     * @param CustName 客戶名稱
     * @param CustAddress 客戶地址
     * @return 客戶信息
     */
    public List<Customer> findByCustNameLikeAndCustAddress(String CustName, String CustAddress);
② 測試
    /**
     * 測試多條件查詢
     */
    @Test
    public void testFindByCustNameLikeAndCustAddress() {
        List<Customer> customers =
                customerDao.findByCustNameLikeAndCustAddress("Xue%", "536 Wall Street");
        for (Customer customer : customers) {
            System.out.println(customer);
        }
    }

六、結(jié)尾

以上即為Spring Data JPA-基礎(chǔ)篇(二)的全部內(nèi)容馋记,感謝閱讀号坡。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市梯醒,隨后出現(xiàn)的幾起案子宽堆,更是在濱河造成了極大的恐慌,老刑警劉巖茸习,帶你破解...
    沈念sama閱讀 218,682評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件畜隶,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)籽慢,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,277評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門浸遗,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人箱亿,你說我怎么就攤上這事跛锌。” “怎么了届惋?”我有些...
    開封第一講書人閱讀 165,083評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵髓帽,是天一觀的道長。 經(jīng)常有香客問我盼樟,道長氢卡,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,763評(píng)論 1 295
  • 正文 為了忘掉前任晨缴,我火速辦了婚禮译秦,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘击碗。我一直安慰自己筑悴,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,785評(píng)論 6 392
  • 文/花漫 我一把揭開白布稍途。 她就那樣靜靜地躺著阁吝,像睡著了一般。 火紅的嫁衣襯著肌膚如雪械拍。 梳的紋絲不亂的頭發(fā)上突勇,一...
    開封第一講書人閱讀 51,624評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音坷虑,去河邊找鬼甲馋。 笑死,一個(gè)胖子當(dāng)著我的面吹牛迄损,可吹牛的內(nèi)容都是我干的定躏。 我是一名探鬼主播,決...
    沈念sama閱讀 40,358評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼芹敌,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼痊远!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起氏捞,我...
    開封第一講書人閱讀 39,261評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤碧聪,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后幌衣,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體矾削,經(jīng)...
    沈念sama閱讀 45,722評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡壤玫,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了哼凯。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片欲间。...
    茶點(diǎn)故事閱讀 40,030評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖断部,靈堂內(nèi)的尸體忽然破棺而出猎贴,到底是詐尸還是另有隱情,我是刑警寧澤蝴光,帶...
    沈念sama閱讀 35,737評(píng)論 5 346
  • 正文 年R本政府宣布她渴,位于F島的核電站,受9級(jí)特大地震影響蔑祟,放射性物質(zhì)發(fā)生泄漏趁耗。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,360評(píng)論 3 330
  • 文/蒙蒙 一疆虚、第九天 我趴在偏房一處隱蔽的房頂上張望苛败。 院中可真熱鬧,春花似錦径簿、人聲如沸罢屈。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,941評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽缠捌。三九已至,卻和暖如春译蒂,著一層夾襖步出監(jiān)牢的瞬間曼月,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,057評(píng)論 1 270
  • 我被黑心中介騙來泰國打工柔昼, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留十嘿,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,237評(píng)論 3 371
  • 正文 我出身青樓岳锁,卻偏偏與公主長得像,于是被迫代替她去往敵國和親蹦魔。 傳聞我的和親對(duì)象是個(gè)殘疾皇子激率,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,976評(píng)論 2 355

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