Spring整合Mybatis

一 州袒、 Mybatis概覽

說(shuō)到mybatis就不得不說(shuō)ORM框架瞬内,即對(duì)象-關(guān)系映射(Object-Relational Mapping)角钩,面向?qū)ο蟮拈_發(fā)方法是當(dāng)今企業(yè)級(jí)應(yīng)用開發(fā)環(huán)境中的主流開發(fā)方法呐舔,關(guān)系數(shù)據(jù)庫(kù)是企業(yè)級(jí)應(yīng)用環(huán)境中永久存放數(shù)據(jù)的主流數(shù)據(jù)存儲(chǔ)系統(tǒng)烹棉。對(duì)象和關(guān)系數(shù)據(jù)是業(yè)務(wù)實(shí)體的兩種表現(xiàn)形式,業(yè)務(wù)實(shí)體在內(nèi)存中表現(xiàn)為對(duì)象忧陪,在數(shù)據(jù)庫(kù)中表現(xiàn)為關(guān)系數(shù)據(jù)扣泊。內(nèi)存中的對(duì)象之間存在關(guān)聯(lián)和繼承關(guān)系近范,而在數(shù)據(jù)庫(kù)中,關(guān)系數(shù)據(jù)無(wú)法直接表達(dá)多對(duì)多關(guān)聯(lián)和繼承關(guān)系延蟹。因此评矩,對(duì)象-關(guān)系映射(ORM)系統(tǒng)一般以中間件的形式存在,主要實(shí)現(xiàn)程序?qū)ο蟮疥P(guān)系數(shù)據(jù)庫(kù)數(shù)據(jù)的映射阱飘。

1. Mybatis的框架設(shè)計(jì)

MyBatis本是apache的一個(gè)開源項(xiàng)目iBatis, 2010年這個(gè)項(xiàng)目由apache software foundation遷移到了google code斥杜,并且改名為MyBatis 。iBATIS一詞來(lái)源于“internet”和“abatis”的組合沥匈,是一個(gè)基于Java的持久層框架


mybatis框架圖
接口層

Mybatis和數(shù)據(jù)庫(kù)交互的兩種方式:

  • 使用傳統(tǒng)的Mybatis提供的api
    傳遞查詢語(yǔ)句和查詢參數(shù)給SqlSession對(duì)象蔗喂,使用SqlSession對(duì)象完成和數(shù)據(jù)庫(kù)的交互;Mybatis提供了非常方便的api高帖,供用戶實(shí)現(xiàn)對(duì)數(shù)據(jù)庫(kù)的增刪改查缰儿。


    mybatis api

    具體的SqlSession提供的接口如下:

    public interface SqlSession extends Closeable {
    <T> T selectOne(String var1);
    
    <T> T selectOne(String var1, Object var2);
    
    <E> List<E> selectList(String var1);
    
    <E> List<E> selectList(String var1, Object var2);
    
    <E> List<E> selectList(String var1, Object var2, RowBounds var3);
    
    <K, V> Map<K, V> selectMap(String var1, String var2);
    
    <K, V> Map<K, V> selectMap(String var1, Object var2, String var3);
    
    <K, V> Map<K, V> selectMap(String var1, Object var2, String var3, RowBounds var4);
    
    <T> Cursor<T> selectCursor(String var1);
    
    <T> Cursor<T> selectCursor(String var1, Object var2);
    
    <T> Cursor<T> selectCursor(String var1, Object var2, RowBounds var3);
    
    void select(String var1, Object var2, ResultHandler var3);
    
    void select(String var1, ResultHandler var2);
    
    void select(String var1, Object var2, RowBounds var3, ResultHandler var4);
    
    int insert(String var1);
    
    int insert(String var1, Object var2);
    
    int update(String var1);
    
    int update(String var1, Object var2);
    
    int delete(String var1);
    
    int delete(String var1, Object var2);
    //事務(wù)提交
    void commit();
    
    void commit(boolean var1);
    //事務(wù)回滾
    void rollback();
    
    void rollback(boolean var1);
    
    List<BatchResult> flushStatements();
     //關(guān)閉連接
    void close();
    
    void clearCache();
    
    Configuration getConfiguration();
    
    <T> T getMapper(Class<T> var1);
    //連接數(shù)據(jù)庫(kù)
    Connection getConnection();
    }    
    

上述使用MyBatis 的方法,是創(chuàng)建一個(gè)和數(shù)據(jù)庫(kù)打交道的SqlSession對(duì)象散址,然后根據(jù)Statement Id 和參數(shù)來(lái)操作數(shù)據(jù)庫(kù)返弹,這種方式固然很簡(jiǎn)單和實(shí)用,但是它不符合面向?qū)ο笳Z(yǔ)言的概念和面向接口編程的編程習(xí)慣爪飘。由于面向接口的編程是面向?qū)ο蟮拇筅厔?shì)义起,MyBatis 為了適應(yīng)這一趨勢(shì),增加了第二種使用MyBatis 支持接口(Interface)調(diào)用方式师崎。

  • 使用Mapper接口
    MyBatis 將配置文件中的每一個(gè)<mapper> 節(jié)點(diǎn)抽象為一個(gè) Mapper 接口默终,而這個(gè)接口中聲明的方法和跟<mapper> 節(jié)點(diǎn)中的<select|update|delete|insert> 節(jié)點(diǎn)項(xiàng)對(duì)應(yīng),即<select|update|delete|insert> 節(jié)點(diǎn)的id值為Mapper 接口中的方法名稱犁罩,parameterType 值表示Mapper 對(duì)應(yīng)方法的入?yún)㈩愋推氡危鴕esultMap 值則對(duì)應(yīng)了Mapper 接口表示的返回值類型或者返回結(jié)果集的元素類型。

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
      "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
    <mapper namespace="org.cloud.dao.RandomGener_Dao">
    
    <resultMap type="org.cloud.model.RandomId" id="getId_List">
      <id column="id" property="id"/>
    </resultMap>
    <select id="selectUnusingId" resultType="Integer">
      SELECT id FROM randomID where tag = 0 limit 1 for UPDATE
     </select>
      <update id="updateId" parameterType="Integer">
      UPDATE  randomID  set tag=1 where id = #{id}
    </update>
    </mapper>
    

然后編寫對(duì)應(yīng)接口文件

  public interface RandomGener_Dao {
//搜索tag不為1的id
 Integer selectUnusingId();
//更新tag 為1
void updateId(@Param("id") Integer id);
}

根據(jù)MyBatis 的配置規(guī)范配置好后床估,通過(guò)SqlSession.getMapper(XXXMapper.class) 方法含滴,MyBatis 會(huì)根據(jù)相應(yīng)的接口聲明的方法信息,通過(guò)動(dòng)態(tài)代理機(jī)制生成一個(gè)Mapper 實(shí)例丐巫,我們使用Mapper 接口的某一個(gè)方法時(shí)谈况,MyBatis 會(huì)根據(jù)這個(gè)方法的方法名和參數(shù)類型,確定Statement Id递胧,底層還是通過(guò)SqlSession.select("statementId",parameterObject);或者SqlSession.update("statementId",parameterObject); 等等來(lái)實(shí)現(xiàn)對(duì)數(shù)據(jù)庫(kù)的操作碑韵。

數(shù)據(jù)處理層

數(shù)據(jù)處理層是Mybatis 的核心,它主要完成三個(gè)功能:

  • 通過(guò)傳入?yún)?shù)構(gòu)建動(dòng)態(tài)sql語(yǔ)句
    動(dòng)態(tài)語(yǔ)句生成可以說(shuō)是MyBatis框架非常優(yōu)雅的一個(gè)設(shè)計(jì)缎脾,MyBatis 通過(guò)傳入的參數(shù)值祝闻,使用 Ognl 來(lái)動(dòng)態(tài)地構(gòu)造SQL語(yǔ)句,使得MyBatis 有很強(qiáng)的靈活性和擴(kuò)展性遗菠。參數(shù)映射指的是對(duì)于java 數(shù)據(jù)類型和jdbc數(shù)據(jù)類型之間的轉(zhuǎn)換:這里有包括兩個(gè)過(guò)程:查詢階段联喘,我們要將java類型的數(shù)據(jù)华蜒,轉(zhuǎn)換成jdbc類型的數(shù)據(jù),通過(guò) preparedStatement.setXXX() 來(lái)設(shè)值豁遭;另一個(gè)就是對(duì)resultset查詢結(jié)果集的jdbcType 數(shù)據(jù)轉(zhuǎn)換成java 數(shù)據(jù)類型叭喜。
  • sql語(yǔ)句的執(zhí)行
  • 封裝查詢結(jié)果轉(zhuǎn)化為L(zhǎng)ist<E>
框架支撐層
  • 事務(wù)管理機(jī)制
  • 連接池管理機(jī)制
  • 緩存機(jī)制
    為了提高數(shù)據(jù)利用率和減小服務(wù)器和數(shù)據(jù)庫(kù)的壓力,MyBatis 會(huì)對(duì)于一些查詢提供會(huì)話級(jí)別的數(shù)據(jù)緩存堤框,會(huì)將對(duì)某一次查詢,放置到SqlSession 中纵柿,在允許的時(shí)間間隔內(nèi)蜈抓,對(duì)于完全相同的查詢,MyBatis 會(huì)直接將緩存結(jié)果返回給用戶昂儒,而不用再到數(shù)據(jù)庫(kù)中查找沟使。
引導(dǎo)層

引導(dǎo)層是配置和啟動(dòng)MyBatis 配置信息的方式。MyBatis 提供兩種方式來(lái)引導(dǎo)MyBatis :基于XML配置文件的方式和基于Java API 的方式渊跋,我們將在下面介紹spring整合mybatis的配置信息腊嗡。

2. Mybatis的主要構(gòu)件及相互關(guān)系

mybatis的主要核心部件:

組件 說(shuō)明
SqlSession 每一個(gè)SqlSession實(shí)例代表應(yīng)用程序和數(shù)據(jù)庫(kù)的一次連接 ,每次打開一個(gè)SqlSession都會(huì)綁定一個(gè)事務(wù)管理實(shí)例,執(zhí)行器實(shí)例拾酝。
Executor MyBatis執(zhí)行器燕少,是MyBatis 調(diào)度的核心,負(fù)責(zé)SQL語(yǔ)句的生成和查詢緩存的維護(hù)
MappedStatement MappedStatement維護(hù)了一條<select update delete insert>節(jié)點(diǎn)的封裝
Configuration MyBatis所有的配置信息都維持在Configuration對(duì)象之中蒿囤。

二客们、Spring整合mybatis

1. 配置Mybatis

  • 在pom中添加mybatis包

    <!--mybatis 包-->
      <dependency>
          <groupId>org.mybatis</groupId>
          <artifactId>mybatis</artifactId>
          <version>3.4.2</version>
      </dependency>
    <!--mybatis 整合spring的適配包-->
      <dependency>
          <groupId>org.mybatis</groupId>
          <artifactId>mybatis-spring</artifactId>
          <version>1.3.1</version>
      </dependency>
     <!--數(shù)據(jù)庫(kù)連接池-->
      <dependency>
          <groupId>c3p0</groupId>
          <artifactId>c3p0</artifactId>
          <version>0.9.1.2</version>
      </dependency>
      <!--java mysql驅(qū)動(dòng)版本要與mysql數(shù)據(jù)庫(kù)的版本對(duì)應(yīng)-->
      <dependency>
          <groupId>mysql</groupId>
          <artifactId>mysql-connector-java</artifactId>
          <version>8.0.11</version>
      </dependency>
    
  • 在spring容器的配置文件中整合mybatis

      <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
      <property name="jdbcUrl" value="${db.url}"></property>
      <property name="driverClass" value="${db.driver}"></property>
      <property name="user" value="${db.user}"></property>
      <property name="password" value="${db.pw}"></property>
    </bean>
    <!--整合 mybatis-->
    <bean id="sessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
      <!--指定mybatis的全局配置文件-->
      <property name="configLocation" value="classpath:mybatis-config.xml"></property>
      <property name="mapperLocations" value="classpath:mapper/*.xml"></property>
      <property name="dataSource" ref="dataSource"></property>
      <!--<property name="mapperLocations" value="classpath*:mapper/*.xml"></property>-->
      </bean>
    <!--配置掃描器 將mybatis接口實(shí)現(xiàn)加入到ioc容器中-->
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
      <property name="basePackage" value="com.hust.dao" ></property>
    </bean>
    <!--事務(wù)控制 為了便于管理數(shù)據(jù)庫(kù)-->
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
      <!--配置數(shù)據(jù)源-->
      <property name="dataSource" ref="dataSource"/>
      <!--開啟基于注解的事務(wù) 或者是xml配置事務(wù)-->
    </bean>
    <!--配置一個(gè)可以批量執(zhí)行的sqlSession-->
    <bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">
      <constructor-arg name="sqlSessionFactory" ref="sessionFactory"/>
      <constructor-arg name="executorType" value="BATCH"/>
    </bean>
    

    Spring 中的 DataSourceTransactionManager用來(lái)管理事務(wù),它允許mybatis參與到Spring的事務(wù)管理中材诽,而不是為mybatis創(chuàng)建一個(gè)新的特定的事務(wù)管理器底挫。要注意, 為事務(wù)管理器指定的 DataSource 必須和用來(lái)創(chuàng)建 SqlSessionFactoryBean 的 是同一個(gè)數(shù)據(jù)源,否則事務(wù)管理器就無(wú)法工作了。

  • mybatis逆向生成工具
    mybatsi逆向生成工具可以根據(jù)數(shù)據(jù)庫(kù)中的的字段脸侥,創(chuàng)建相應(yīng)的pojo類以及其對(duì)應(yīng)的mapper.xml文件建邓,mapper中包含一些常用的CRUD方法。
    首先在pom中加入依賴

     <!--mybatis 逆向生成工具-->
      <dependency>
          <groupId>org.mybatis.generator</groupId>
          <artifactId>mybatis-generator-core</artifactId>
          <version>1.3.5</version>
      </dependency>
    

    然后添加mbg.xml配置文件

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE generatorConfiguration
      PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
      "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
    
    <generatorConfiguration>
    <properties resource="db.properties"></properties>
    <!--配置數(shù)據(jù)庫(kù)連接信息-->
    <context id="DB2Tables" targetRuntime="MyBatis3">
      <!--不讓生成注釋-->
      <commentGenerator>
          <property name="suppressAllComments" value="true"></property>
      </commentGenerator>
      <!--idea 將&當(dāng)成了特殊符號(hào) 這里需要轉(zhuǎn)義 & = &amp;-->
      <jdbcConnection driverClass="com.mysql.cj.jdbc.Driver"
                      connectionURL="jdbc:mysql://localhost:3306/gm?useUnicode=true&amp;characterEncoding=utf8&amp;serverTimezone=GMT&amp;useSSL=false"
                      userId="root"
                      password="root">
      </jdbcConnection>
    
      <javaTypeResolver >
          <property name="forceBigDecimals" value="false" />
      </javaTypeResolver>
      <!--指定javabean的生成位置-->
      <javaModelGenerator targetPackage="com.hust.bean" targetProject=".\src\main\java">
          <property name="enableSubPackages" value="true" />
          <property name="trimStrings" value="true" />
      </javaModelGenerator>
      <!--指定sql映射文件的位置-->
      <sqlMapGenerator targetPackage="mapper"  targetProject=".\src\main\resources">
          <property name="enableSubPackages" value="true" />
      </sqlMapGenerator>
      <!--指定dao接口的生成位置-->
      <javaClientGenerator type="XMLMAPPER" targetPackage="com.hust.dao"  targetProject=".\src\main\java">
          <property name="enableSubPackages" value="true" />
      </javaClientGenerator>
      <!--指定每個(gè)表的生成策略-->
      <table tableName="mg_employee" domainObjectName="Employee" ></table>
      <table tableName="mg_inventory" domainObjectName="Inventory"></table>
      <table tableName="mg_sale" domainObjectName="Sale"></table>
      <table tableName="mg_user" domainObjectName="User"></table>
    </context>
    </generatorConfiguration>
    

配置文件中的注釋對(duì)各個(gè)節(jié)點(diǎn)的作用進(jìn)行了詳細(xì)的說(shuō)明
編寫一個(gè)測(cè)試類生成對(duì)應(yīng)的pojo類和mapper文件

public class Mbg {
public static void main(String[] args) throws Exception {
    List<String> warnings = new ArrayList<>();
    boolean overwrite = true;
    File configFile = new File("E:mbg.xml");
    ConfigurationParser cp = new ConfigurationParser(warnings);
    Configuration configuration = cp.parseConfiguration(configFile);
    //是否覆蓋已有的文件
    DefaultShellCallback callback = new DefaultShellCallback(overwrite);
    MyBatisGenerator generator = new MyBatisGenerator(configuration,callback,warnings);
    generator.generate(null);
    Logger logger = LogManager.getLogger("info");
    logger.info("mybatis逆向生成工具完成任務(wù)");
    }
}

三睁枕、pageHelper分頁(yè)工具

pagehelper是一款由國(guó)人編寫的開源免費(fèi)的mybatis第三方物理插件官边,我們可以在github上看到它的源碼,下面我們介紹一下mybatis的基本使用以及它的實(shí)現(xiàn)原理外遇。

1. PageHelper的配置

引入maven依賴

 <!--分頁(yè)工具-->
    <dependency>
        <groupId>com.github.pagehelper</groupId>
        <artifactId>pagehelper</artifactId>
        <version>5.0.0</version>
    </dependency>

將pagehelper整合到mybatis中

 <!--配置分頁(yè)插件-->
<plugins>
    <plugin interceptor="com.github.pagehelper.PageInterceptor">
    <!--指定數(shù)據(jù)庫(kù)-->
        <property name="dialect" value="mysql" />
<!-- 該參數(shù)默認(rèn)為false -->
<!-- 設(shè)置為true時(shí)拒逮,會(huì)將RowBounds第一個(gè)參數(shù)offset當(dāng)成pageNum頁(yè)碼使用 -->
<!-- 和startPage中的pageNum效果一樣 -->
<property name="offsetAsPageNum" value="false" />
<!-- 該參數(shù)默認(rèn)為false -->
<!-- 設(shè)置為true時(shí),使用RowBounds分頁(yè)會(huì)進(jìn)行count查詢 -->
<property name="rowBoundsWithCount" value="true" />

<!-- 設(shè)置為true時(shí)臀规,如果pageSize=0或者RowBounds.limit = 0就會(huì)查詢出全部的結(jié)果 -->
<!-- (相當(dāng)于沒有執(zhí)行分頁(yè)查詢滩援,但是返回結(jié)果仍然是Page類型) <property name="pageSizeZero" value="true"/> -->

<!-- 3.3.0版本可用 - 分頁(yè)參數(shù)合理化,默認(rèn)false禁用 -->
<!-- 啟用合理化時(shí)塔嬉,如果pageNum<1會(huì)查詢第一頁(yè)玩徊,如果pageNum>pages會(huì)查詢最后一頁(yè) -->
<!-- 禁用合理化時(shí)租悄,如果pageNum<1或pageNum>pages會(huì)返回空數(shù)據(jù) -->
<property name="reasonable" value="true" />
<!-- 3.5.0版本可用 - 為了支持startPage(Object params)方法 -->
<!-- 增加了一個(gè)`params`參數(shù)來(lái)配置參數(shù)映射,用于從Map或ServletRequest中取值 -->
<!-- 可以配置pageNum,pageSize,count,pageSizeZero,reasonable,不配置映射的用默認(rèn)值 -->
<!-- 不理解該含義的前提下恩袱,不要隨便復(fù)制該配置 <property name="params" value="pageNum=start;pageSize=limit;"/> -->
    </plugin>
</plugins>

2. PageHelper原理分析

pagehelper通過(guò)mybatis的plugin實(shí)現(xiàn)了interceptor接口

分頁(yè)實(shí)現(xiàn)過(guò)程

實(shí)現(xiàn)原理:
pageHelper會(huì)使用ThreadLocal獲取到同一線程中的變量信息泣棋,各個(gè)線程之間的Threadlocal不會(huì)相互干擾,也就是Thread1中的ThreadLocal1之后獲取到Tread1中的變量的信息畔塔,不會(huì)獲取到Thread2中的信息
所以在多線程環(huán)境下潭辈,各個(gè)Threadlocal之間相互隔離,可以實(shí)現(xiàn)澈吨,不同thread使用不同的數(shù)據(jù)源或不同的Thread中執(zhí)行不同的SQL語(yǔ)句
所以把敢,PageHelper利用這一點(diǎn)通過(guò)攔截器獲取到同一線程中的預(yù)編譯好的SQL語(yǔ)句之后將SQL語(yǔ)句包裝成具有分頁(yè)功能的SQL語(yǔ)句,并將其再次賦值給下一步操作谅辣,所以實(shí)際執(zhí)行的SQL語(yǔ)句就是有了分頁(yè)功能的SQL語(yǔ)句
關(guān)于pagehelper的更詳細(xì)的實(shí)現(xiàn)修赞,可以查看這篇博文

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市桑阶,隨后出現(xiàn)的幾起案子柏副,更是在濱河造成了極大的恐慌,老刑警劉巖蚣录,帶你破解...
    沈念sama閱讀 222,378評(píng)論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件割择,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡萎河,警方通過(guò)查閱死者的電腦和手機(jī)锨推,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,970評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)公壤,“玉大人换可,你說(shuō)我怎么就攤上這事∠梅” “怎么了沾鳄?”我有些...
    開封第一講書人閱讀 168,983評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)确憨。 經(jīng)常有香客問(wèn)我译荞,道長(zhǎng),這世上最難降的妖魔是什么休弃? 我笑而不...
    開封第一講書人閱讀 59,938評(píng)論 1 299
  • 正文 為了忘掉前任吞歼,我火速辦了婚禮,結(jié)果婚禮上塔猾,老公的妹妹穿的比我還像新娘篙骡。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,955評(píng)論 6 398
  • 文/花漫 我一把揭開白布糯俗。 她就那樣靜靜地躺著尿褪,像睡著了一般。 火紅的嫁衣襯著肌膚如雪得湘。 梳的紋絲不亂的頭發(fā)上杖玲,一...
    開封第一講書人閱讀 52,549評(píng)論 1 312
  • 那天,我揣著相機(jī)與錄音淘正,去河邊找鬼摆马。 笑死,一個(gè)胖子當(dāng)著我的面吹牛鸿吆,可吹牛的內(nèi)容都是我干的囤采。 我是一名探鬼主播,決...
    沈念sama閱讀 41,063評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼伞剑,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼斑唬!你這毒婦竟也來(lái)了市埋?” 一聲冷哼從身側(cè)響起黎泣,我...
    開封第一講書人閱讀 39,991評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎缤谎,沒想到半個(gè)月后抒倚,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,522評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡坷澡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,604評(píng)論 3 342
  • 正文 我和宋清朗相戀三年托呕,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片频敛。...
    茶點(diǎn)故事閱讀 40,742評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡项郊,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出斟赚,到底是詐尸還是另有隱情着降,我是刑警寧澤,帶...
    沈念sama閱讀 36,413評(píng)論 5 351
  • 正文 年R本政府宣布拗军,位于F島的核電站任洞,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏发侵。R本人自食惡果不足惜交掏,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,094評(píng)論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望刃鳄。 院中可真熱鬧盅弛,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,572評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至狰住,卻和暖如春张吉,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背催植。 一陣腳步聲響...
    開封第一講書人閱讀 33,671評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工肮蛹, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人创南。 一個(gè)月前我還...
    沈念sama閱讀 49,159評(píng)論 3 378
  • 正文 我出身青樓伦忠,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親稿辙。 傳聞我的和親對(duì)象是個(gè)殘疾皇子昆码,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,747評(píng)論 2 361

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