Mybatis 文檔篇 2.7:Configuration 之 Environments

1 Configuration Structure

2 Environments

MyBatis can be configured with multiple environments. This helps you to apply your SQL Maps to multiple databases for any number of reasons.
MyBatis 可以配置多個(gè)環(huán)境苇经。這將有助于你的 SQL 映射到多個(gè)數(shù)據(jù)庫(kù)。有很多理由要這樣做狮暑。

For example, you might have a different configuration for your Development, Test and Production environments. Or, you may have multiple production databases that share the same schema, and you’d like to use the same SQL maps for both.
例如秃嗜,你的開(kāi)發(fā)環(huán)境、測(cè)試環(huán)境蔓倍、生產(chǎn)環(huán)境可能需要不同的配置胰舆∽虻牵或者你可能有多個(gè)共享相同 Schema 的生產(chǎn)數(shù)據(jù)庫(kù)想要使用相同的 SQL 映射播演。

One important thing to remember though: While you can configure multiple environments, you can only choose ONE per SqlSessionFactory instance.So if you want to connect to two databases, you need to create two instances of SqlSessionFactory.
重要:當(dāng)你配置了多個(gè)環(huán)境冀瓦,你只能為每個(gè) SqlSessionFactory 實(shí)例選擇一個(gè)環(huán)境。因此写烤,如果你想要連接兩個(gè)數(shù)據(jù)庫(kù)翼闽,你需要?jiǎng)?chuàng)建兩個(gè) SqlSessionFactory 實(shí)例。

2.1 Environment

2.1.1 Build in Class

To specify which environment to build, you simply pass it to the SqlSessionFactoryBuilder as an optional parameter. The two signatures that accept the environment are:
指定要構(gòu)建哪個(gè)環(huán)境顶霞,你只需要將其作為一個(gè)可選參數(shù)傳遞給 SqlSessionFactoryBuilder肄程÷嗪穑可以接受環(huán)境配置的兩個(gè)方法簽名是:

SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(reader, environment);
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(reader, environment, properties);

If the environment is omitted, then the default environment is loaded, as follows:
如果忽略了 environment 參數(shù)选浑,那么默認(rèn)的環(huán)境將被加載:

SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(reader);
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(reader, properties);

2.1.2 Build in XML

The environments element defines how the environment is configured.
environments 元素定義了環(huán)境配置。

<environments default="development">
  <environment id="development">
    <transactionManager type="JDBC">
      <property name="..." value="..."/>
    </transactionManager>
    <dataSource type="POOLED">
      <property name="driver" value="${driver}"/>
      <property name="url" value="${url}"/>
      <property name="username" value="${username}"/>
      <property name="password" value="${password}"/>
    </dataSource>
  </environment>
</environments>

關(guān)鍵點(diǎn):

  • The default Environment ID (e.g. default="development").
    默認(rèn)的環(huán)境 ID(如 default="development")玄叠。

  • The Environment ID for each environment defined (e.g. id="development").
    為每個(gè)環(huán)境定義環(huán)境 ID(如 id="development")古徒。

  • The TransactionManager configuration (e.g. type="JDBC")
    配置事務(wù)管理器 TransactionManager (如 type="JDBC")

  • The DataSource configuration (e.g. type="POOLED")
    配置數(shù)據(jù)源 DataSource(如 type="POOLED")

The default environment and the environment IDs are self explanatory. Name them whatever you like, just make sure the default matches one of them.
默認(rèn)的環(huán)境和環(huán)境 ID 是自解釋的。你可以對(duì)環(huán)境隨意命名读恃,只要確保默認(rèn)的環(huán)境匹配其中之一隧膘。

2.2 transactionManager

2.2.1 默認(rèn)的 transactionManager

There are two TransactionManager types (i.e. type="[JDBC|MANAGED]") that are included with MyBatis:
MyBatis 提供兩種 TransactionManager 的類(lèi)型:

  • JDBC – This configuration simply makes use of the JDBC commit and rollback facilities directly. It relies on the connection retrieved from the dataSource to manage the scope of the transaction.
    JDBC:直接使用了 JDBC 的提交和回滾設(shè)置。它依賴(lài)從數(shù)據(jù)庫(kù)獲取的連接來(lái)管理事務(wù)的作用域寺惫。

  • MANAGED – This configuration simply does almost nothing. It never commits, or rolls back a connection. Instead, it lets the container manage the full lifecycle of the transaction (e.g. a JEE Application Server context). By default it does close the connection. However, some containers don’t expect this, and thus if you need to stop it from closing the connection, set the "closeConnection" property to false.
    MANAGED:這個(gè)配置幾乎什么也不做疹吃。它從來(lái)不提交或者回滾一個(gè)連接,而是讓容器來(lái)管理事務(wù)的全生命周期(例如 JEE 應(yīng)用服務(wù)器的上下文)西雀。默認(rèn)情況下萨驶,它是關(guān)閉連接的。然而艇肴,一些容器不希望這樣做腔呜,因此如果你需要開(kāi)啟連接,設(shè)置 closeConnection 屬性為 false 即可再悼。

<transactionManager type="MANAGED">
  <property name="closeConnection" value="false"/>
</transactionManager>

Node:If you are planning to use MyBatis with Spring there is no need to configure any TransactionManager because the Spring module will set its own one overriding any previously set configuration.
注意:如果你計(jì)劃使用 MyBatis + Spring核畴,那就沒(méi)有必要配置任何 TransactionManager,因?yàn)?Spring 模塊中自帶的事務(wù)管理器會(huì)覆蓋前面的配置冲九。

2.2.2 自定義 transactionManager

Neither of these TransactionManager types require any properties.However, they are both Type Aliases, so in other words, instead of using them, you could put your own fully qualified class name or Type Alias that refers to your own implementation of the TransactionFactory interface.
這兩種 TransactionManager 類(lèi)型都不需要任何屬性谤草。它們都是類(lèi)型別名,換句話(huà)說(shuō),你可以使用你自己的 TransactionFactory 接口的實(shí)現(xiàn)類(lèi)的完全限定類(lèi)名或類(lèi)型別名來(lái)替代丑孩。

public interface TransactionFactory {
  void setProperties(Properties props);
  Transaction newTransaction(Connection conn);
  Transaction newTransaction(DataSource dataSource, TransactionIsolationLevel level, boolean autoCommit);
}

Any properties configured in the XML will be passed to the setProperties() method after instantiation.
任何在 XML 中定義的屬性都會(huì)在實(shí)例化后傳遞給 setProperties() 方法泳炉。

Your implementation would also need to create a Transaction implementation, which is also a very simple interface:
你也需要?jiǎng)?chuàng)建一個(gè) Transaction 接口的實(shí)現(xiàn)類(lèi),這個(gè)接口也很簡(jiǎn)單:

public interface Transaction {
  Connection getConnection() throws SQLException;
  void commit() throws SQLException;
  void rollback() throws SQLException;
  void close() throws SQLException;
  Integer getTimeout() throws SQLException;
}

Using these two interfaces, you can completely customize how MyBatis deals with Transactions.
使用這兩個(gè)接口嚎杨,你可以完全定制化地使用 MyBatis 的事務(wù)處理花鹅。

2.3 dataSource

The dataSource element configures the source of JDBC Connection objects using the standard JDBC DataSource interface.
dataSource 元素使用標(biāo)準(zhǔn)的 JDBC 數(shù)據(jù)源接口來(lái)配置 JDBC 連接對(duì)象的資源。

Most MyBatis applications will configure a dataSource as in the example. However, it’s not required. Realize though, that to facilitate Lazy Loading, this dataSource is required.
大多數(shù)的應(yīng)用會(huì)像例子中那樣配置一個(gè) dataSource枫浙。但這也不是必須的刨肃。盡管如此,為了使用懶加載箩帚,dataSource 還是必要的真友。

2.3.1 使用內(nèi)置 DataSource

There are three build-in dataSource types (i.e. type="[UNPOOLED|POOLED|JNDI]"):
有三種內(nèi)置的 dataSource 類(lèi)型UNPOOLED、POOLED 和 JNDI紧帕。

2.3.1.1 UNPOOLED

This implementation of DataSource simply opens and closes a connection each time it is requested.
作用:這種 DataSource 的實(shí)現(xiàn)僅僅負(fù)責(zé)每次被請(qǐng)求的時(shí)候打開(kāi)和關(guān)閉一個(gè)連接盔然。

While it’s a bit slower, this is a good choice for simple applications that do not require the performance of immediately available connections.
雖然有點(diǎn)慢,但對(duì)于數(shù)據(jù)庫(kù)連接及時(shí)可用性要求不高的簡(jiǎn)單應(yīng)用來(lái)說(shuō)這是個(gè)很好的選擇是嗜。

Different databases are also different in this performance area, so for some it may be less important to pool and this configuration will be ideal.
不同的數(shù)據(jù)庫(kù)在此性能方面表現(xiàn)也是不一樣的愈案,所以對(duì)于某些數(shù)據(jù)庫(kù)來(lái)說(shuō),使用連接池并沒(méi)那么重要鹅搪,因此這個(gè)配置對(duì)于這種情況是理想的站绪。

The UNPOOLED DataSource is configured with only five properties:
UNPOOLED 類(lèi)型的 DataSource 只有五個(gè)屬性:

  • driver – This is the fully qualified Java class of the JDBC driver (NOT of the DataSource class if your driver includes one).
    driver:JDBC 驅(qū)動(dòng)的 Java 類(lèi)的完全限定名(不是驅(qū)動(dòng)中可能包含的 DataSource 類(lèi))。

  • url – This is the JDBC URL for your database instance.
    url:數(shù)據(jù)庫(kù)實(shí)例的 JDBC URL丽柿。

  • username – The database username to log in with.
    username:數(shù)據(jù)庫(kù)的登錄用戶(hù)名

  • password - The database password to log in with.
    password:數(shù)據(jù)庫(kù)的登錄密碼恢准。

  • defaultTransactionIsolationLevel – The default transaction isolation level for connections.
    defaultTransactionIsolationLevel:連接默認(rèn)的事務(wù)隔離級(jí)別。

Optionally, you can pass properties to the database driver as well. To do this, prefix the properties with driver., for example:driver.encoding=UTF8.This will pass the property encoding, with the value UTF8, to your database driver via the DriverManager.getConnection(url, driverProperties) method.
作為可選項(xiàng)甫题,你也可以傳遞屬性給數(shù)據(jù)庫(kù)驅(qū)動(dòng)馁筐。這樣做的話(huà),在屬性前面需要加上 driver. 前綴坠非,例如:driver.encoding=UTF8敏沉。這將通過(guò) DriverManager.getConnection(url, driverProperties) 方法將值為 UTF-8 的屬性 encoding 傳遞給你的數(shù)據(jù)庫(kù)驅(qū)動(dòng)。

2.3.1.2 POOLED

This implementation of DataSource pools JDBC Connection objects to avoid the initial connection and authentication time required to create a new Connection instance.
作用:這種以連接池的形式來(lái)做的 DataSource 實(shí)現(xiàn)將 JDBC 連接對(duì)象組織起來(lái)麻顶,避免了創(chuàng)建新的連接實(shí)例時(shí)需要初始化連接和認(rèn)證而浪費(fèi)的時(shí)間赦抖。

This is a popular approach for concurrent web applications to achieve the fastest response.
這是一種使并發(fā)的 web 應(yīng)用獲取最快響應(yīng)的流行的方式。

In addition to the (UNPOOLED) properties above, there are many more properties that can be used to configure the POOLED datasource:
除了上述提到的(UNPOOLED)屬性以外辅肾,在 POOLED 方式的數(shù)據(jù)源中還有更多的屬性可以被配置:

  • poolMaximumActiveConnections – This is the number of active (i.e. in use) connections that can exist at any given time. Default: 10
    poolMaximumActiveConnections :在任意時(shí)間可以活動(dòng)的(即正在使用的)連接數(shù)队萤。默認(rèn)是10。

  • poolMaximumIdleConnections – The number of idle connections that can exist at any given time.
    poolMaximumIdleConnections :在任意時(shí)間可以存在的空閑連接數(shù)矫钓。

  • poolMaximumCheckoutTime – This is the amount of time that a Connection can be "checked out" of the pool before it will be forcefully returned. Default: 20000ms (i.e. 20 seconds)
    poolMaximumCheckoutTime :在被強(qiáng)制返回之前要尔,池中連接被檢出的時(shí)間舍杜。默認(rèn)是 20000ms(即 20s)。

  • poolTimeToWait – This is a low level setting that gives the pool a chance to print a log status and re-attempt the acquisition of a connection in the case that it’s taking unusually long (to avoid failing silently forever if the pool is misconfigured). Default: 20000ms (i.e. 20 seconds)
    poolTimeToWait :這是個(gè)底層設(shè)置赵辕,如果獲取連接花了相當(dāng)長(zhǎng)的時(shí)間既绩,就會(huì)給連接池一個(gè)機(jī)會(huì)打印日志狀態(tài)并重試獲取連接(避免誤配置的情況下一直悄悄的失敗)还惠。默認(rèn)是 20000ms(即 20s)饲握。

  • poolMaximumLocalBadConnectionTolerance – This is a low level setting about tolerance of bad connections got for any thread. If a thread got a bad connection, it may still have another chance to re-attempt to get another connection which is valid. But the retrying times should not more than the sum of poolMaximumIdleConnections and poolMaximumLocalBadConnectionTolerance. Default: 3 (Since: 3.4.5)
    poolMaximumLocalBadConnectionTolerance :這是個(gè)關(guān)于任意線程中容忍壞連接獲取的底層設(shè)置。如果一個(gè)線程獲取了一個(gè)壞連接蚕键,它將會(huì)有另外的機(jī)會(huì)重新嘗試獲取另外一個(gè)有效的連接救欧。但是重試次數(shù)不能超過(guò) poolMaximumIdleConnections 和 poolMaximumLocalBadConnectionTolerance 的總和。默認(rèn)為3(從3.4.5開(kāi)始)锣光。

  • poolPingQuery – The Ping Query is sent to the database to validate that a connection is in good working order and is ready to accept requests. The default is "NO PING QUERY SET", which will cause most database drivers to fail with a decent error message.
    poolPingQuery :發(fā)送到數(shù)據(jù)庫(kù)的偵測(cè)查詢(xún)笆怠,用來(lái)檢測(cè)連接是否正常且準(zhǔn)備接受請(qǐng)求。默認(rèn)設(shè)置是“NO PING QUERY SET”誊爹,該設(shè)置使得大多數(shù)的數(shù)據(jù)庫(kù)驅(qū)動(dòng)失敗時(shí)拋出一個(gè)恰當(dāng)?shù)腻e(cuò)誤消息蹬刷。

  • poolPingEnabled – This enables or disables the ping query. If enabled, you must also set the poolPingQuery property with a valid SQL statement (preferably a very fast one). Default: false.
    poolPingEnabled :偵測(cè)查詢(xún)的開(kāi)關(guān)。如果打開(kāi)频丘,你必須為 poolPingQuery 屬性設(shè)置一個(gè)有效的 SQL 語(yǔ)句(最好是速度很快的一個(gè))办成。默認(rèn)是 false。

  • poolPingConnectionsNotUsedFor – This configures how often the poolPingQuery will be used. This can be set to match the typical timeout for a database connection, to avoid unnecessary pings. Default: 0 (i.e. all connections are pinged every time – but only if poolPingEnabled is true of course).
    poolPingConnectionsNotUsedFor :設(shè)置 poolPingQuery 被使用的頻率椎镣。它可以被設(shè)置為和數(shù)據(jù)庫(kù)連接超時(shí)時(shí)間一樣以避免不必要的 ping诈火。默認(rèn)是0(即在 poolPingEnabled 打開(kāi)時(shí)兽赁,所有連接每一時(shí)刻都會(huì) ping)状答。

2.3.1.3 JNDI

This implementation of DataSource is intended for use with containers such as EJB or Application Servers that may configure the DataSource centrally or externally and place a reference to it in a JNDI context.
作用:這種 DataSource 的實(shí)現(xiàn)是為了在像 EJB 或應(yīng)用服務(wù)器這類(lèi)的容器中使用,容器可以集中或者在外部配置 DataSource刀崖,并設(shè)置一個(gè) JNDI 上下文的引用惊科。

This DataSource configuration only requires two properties:
這種 DataSource 的配置只需要兩個(gè)屬性:

  • initial_context – This property is used for the Context lookup from the InitialContext (i.e. initialContext.lookup(initial_context)). This property is optional, and if omitted, then the data_source property will be looked up against the InitialContext directly.
    initial_context :這個(gè)屬性被用來(lái)從 InitialContext 中尋找上下文(即 initialContext.lookup(initial_context))。該屬性是可選的亮钦,如果忽略該屬性馆截,data_source 元素就會(huì)直接從 InitialContext 中尋找。

  • data_source – This is the context path where the reference to the instance of the DataSource can be found. It will be looked up against the context returned by the initial_context lookup, or against the InitialContext directly if no initial_context is supplied.
    data_source :可以找到的 DataSource 實(shí)例的引用位置的上下文路徑蜂莉。它將會(huì)在 initial_context 查找返回的上下文中查找蜡娶,或者在未設(shè)置 initial_context 時(shí)直接在 InitialContext 中查找。

Similar to the other DataSource configurations, it’s possible to send properties directly to the InitialContext by prefixing those properties with env., for example:env.encoding=UTF8.This would send the property encoding with the value of UTF8 to the constructor of the InitialContext upon instantiation.
和其他 DataSource 的配置一樣映穗,它也可以通過(guò)添加前綴 env. 直接傳遞屬性到 InitialContext窖张。如:env.encoding=UTF8。這樣就可以在 InitialContext 實(shí)例化時(shí)蚁滋,向其構(gòu)造器傳遞值為 UTF8 的屬性 encoding 屬性宿接。

2.3.2 使用第三方 DataSource

You can plug any 3rd party DataSource by implementing the interface org.apache.ibatis.datasource.DataSourceFactory:
你可以通過(guò)實(shí)現(xiàn)接口 org.apache.ibatis.datasource.DataSourceFactory 來(lái)使用任意的第三方數(shù)據(jù)源:

public interface DataSourceFactory {
  void setProperties(Properties props);
  DataSource getDataSource();
}

org.apache.ibatis.datasource.unpooled.UnpooledDataSourceFactory can be used as super class to build new datasource adapters. For example this is the code needed to plug C3P0:
org.apache.ibatis.datasource.unpooled.UnpooledDataSourceFactory 可以被用作父類(lèi)來(lái)構(gòu)建新的數(shù)據(jù)源適配器赘淮。例如這是插入 C3P0 數(shù)據(jù)源所必須的代碼:

import org.apache.ibatis.datasource.unpooled.UnpooledDataSourceFactory;
import com.mchange.v2.c3p0.ComboPooledDataSource;
        
public class C3P0DataSourceFactory extends UnpooledDataSourceFactory {
  public C3P0DataSourceFactory() {
    this.dataSource = new ComboPooledDataSource();
  }
}

To set it up, add a property for each setter method you want MyBatis to call. Follows below a sample configuration which connects to a PostgreSQL database:
為了使其工作,需要為每個(gè)想要 MyBatis 調(diào)用的 setter 方法在配置文件中增加對(duì)應(yīng)的屬性睦霎。下面是可以連接 PostgreSQL 數(shù)據(jù)庫(kù)的配置的例子:

<dataSource type="org.myproject.C3P0DataSourceFactory">  
  <property name="driver" value="org.postgresql.Driver"/>  
  <property name="url" value="jdbc:postgresql:mydb"/>  
  <property name="username" value="postgres"/>  
  <property name="password" value="root"/>
</dataSource>

最后

說(shuō)明:MyBatis 官網(wǎng)提供了簡(jiǎn)體中文的翻譯梢卸,但個(gè)人覺(jué)得較為生硬,甚至有些地方邏輯不通副女,于是自己一個(gè)個(gè)重新敲著翻譯的(都不知道哪里來(lái)的自信...)蛤高,有些地方同官網(wǎng)翻譯有出入,有些倔強(qiáng)地保留了自己的碑幅,有的實(shí)在別扭則保留了官網(wǎng)的襟齿,這些都會(huì)在實(shí)踐中一一更正。鑒于個(gè)人英文能力有限枕赵,文章中保留了官方文檔原英文介紹(個(gè)別地方加以調(diào)整修剪)猜欺,希望有緣看到這里的朋友們能夠有自己的理解,不會(huì)被我可能錯(cuò)誤或不合理的翻譯帶跑偏(〃'▽'〃)拷窜,歡迎指正开皿!

當(dāng)前版本:mybatis-3.5.0
官網(wǎng)文檔:MyBatis
官網(wǎng)翻譯:MyBatis 簡(jiǎn)體中文
項(xiàng)目實(shí)踐:MyBatis Learn

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市篮昧,隨后出現(xiàn)的幾起案子赋荆,更是在濱河造成了極大的恐慌,老刑警劉巖懊昨,帶你破解...
    沈念sama閱讀 206,214評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件窄潭,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡酵颁,警方通過(guò)查閱死者的電腦和手機(jī)嫉你,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)躏惋,“玉大人幽污,你說(shuō)我怎么就攤上這事〔疽蹋” “怎么了距误?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,543評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)扁位。 經(jīng)常有香客問(wèn)我准潭,道長(zhǎng),這世上最難降的妖魔是什么域仇? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,221評(píng)論 1 279
  • 正文 為了忘掉前任刑然,我火速辦了婚禮,結(jié)果婚禮上殉簸,老公的妹妹穿的比我還像新娘闰集。我一直安慰自己沽讹,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,224評(píng)論 5 371
  • 文/花漫 我一把揭開(kāi)白布武鲁。 她就那樣靜靜地躺著爽雄,像睡著了一般。 火紅的嫁衣襯著肌膚如雪沐鼠。 梳的紋絲不亂的頭發(fā)上挚瘟,一...
    開(kāi)封第一講書(shū)人閱讀 49,007評(píng)論 1 284
  • 那天,我揣著相機(jī)與錄音饲梭,去河邊找鬼乘盖。 笑死,一個(gè)胖子當(dāng)著我的面吹牛憔涉,可吹牛的內(nèi)容都是我干的订框。 我是一名探鬼主播,決...
    沈念sama閱讀 38,313評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼兜叨,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼穿扳!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起国旷,我...
    開(kāi)封第一講書(shū)人閱讀 36,956評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤矛物,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后跪但,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體履羞,經(jīng)...
    沈念sama閱讀 43,441評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,925評(píng)論 2 323
  • 正文 我和宋清朗相戀三年屡久,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了忆首。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,018評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡涂身,死狀恐怖雄卷,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情蛤售,我是刑警寧澤,帶...
    沈念sama閱讀 33,685評(píng)論 4 322
  • 正文 年R本政府宣布妒潭,位于F島的核電站悴能,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏雳灾。R本人自食惡果不足惜漠酿,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,234評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望谎亩。 院中可真熱鬧炒嘲,春花似錦宇姚、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,240評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至夭拌,卻和暖如春魔熏,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背鸽扁。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,464評(píng)論 1 261
  • 我被黑心中介騙來(lái)泰國(guó)打工蒜绽, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人桶现。 一個(gè)月前我還...
    沈念sama閱讀 45,467評(píng)論 2 352
  • 正文 我出身青樓躲雅,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親骡和。 傳聞我的和親對(duì)象是個(gè)殘疾皇子吏夯,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,762評(píng)論 2 345

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