H2(Java嵌入式數(shù)據(jù)庫(kù))

目錄
  1. 下載H2數(shù)據(jù)庫(kù)
  2. 在JavaWeb項(xiàng)目中使用H2
  3. 在JavaWeb項(xiàng)目中嵌入H2
  4. 向H2數(shù)據(jù)庫(kù)注冊(cè)自定義的數(shù)據(jù)庫(kù)函數(shù)

簡(jiǎn)介

優(yōu)勢(shì):
  1. H2采用純Java編寫,因此不受平臺(tái)的限制。
  2. H2只有一個(gè)jar文件谬墙,非常適合作為嵌入式數(shù)據(jù)庫(kù)(不需要安裝獨(dú)立的客戶端和服務(wù)器端)。
  3. H2提供了一個(gè)十分方便的web控制臺(tái)用于操作和管理數(shù)據(jù)庫(kù)內(nèi)容。

1. 下載H2數(shù)據(jù)庫(kù)

  1. 下載H2數(shù)據(jù)庫(kù)

下載最新版本的H2數(shù)據(jù)庫(kù)(選擇Platform-IndependentZip),并解壓到指定目錄(如:/Users/cx/H2Database)

H2數(shù)據(jù)庫(kù)的目錄結(jié)構(gòu)

H2數(shù)據(jù)庫(kù)的目錄結(jié)構(gòu)說明
  h2
  |---bin
  |    |---h2-2.1.214.jar     // H2數(shù)據(jù)庫(kù)的jar包(驅(qū)動(dòng)也在里面)
  |    |---h2.bat             // Windows控制臺(tái)啟動(dòng)腳本
  |    |---h2.sh               // Linux/MAC控制臺(tái)啟動(dòng)腳本
  |    |---h2w.bat             // Windows控制臺(tái)啟動(dòng)腳本(不帶黑屏窗口)
  |---docs                     // H2數(shù)據(jù)庫(kù)的幫助文檔(內(nèi)有H2數(shù)據(jù)庫(kù)的使用手冊(cè))
  |---service   // 通過wrapper包裝成服務(wù)浓若。
  |---src       // H2數(shù)據(jù)庫(kù)的源代碼
  |---build.bat // Windows構(gòu)建腳本
  |---build.sh  // Linux構(gòu)建腳本
  1. 啟動(dòng)H2數(shù)據(jù)庫(kù)服務(wù)
在終端執(zhí)行:
  cd /Users/cx/H2Database/h2/bin 
  sh h2.sh

在瀏覽器中訪問H2數(shù)據(jù)庫(kù)的WebConsole:http://localhost:8082
H2數(shù)據(jù)庫(kù)的Web控制臺(tái)
  1. 創(chuàng)建并連接數(shù)據(jù)庫(kù)、創(chuàng)建表
點(diǎn)擊頂部的綠色小圖標(biāo)蛇数,選擇Create a new database

創(chuàng)建數(shù)據(jù)庫(kù)挪钓,會(huì)在h2/bin目錄下創(chuàng)建test.mv.db數(shù)據(jù)庫(kù)文件

測(cè)試連接

點(diǎn)擊連接,登錄到test數(shù)據(jù)庫(kù)的WebConsole耳舅,執(zhí)行創(chuàng)建表SQL碌上,在左側(cè)可以看到創(chuàng)建的users表

2. 在JavaWeb項(xiàng)目中使用H2

1. 創(chuàng)建Web項(xiàng)目(Dynamic Web Project)
2. 導(dǎo)入H2依賴包
  將h2-xxx.jar復(fù)制到WEB-INF/lib目錄下
3. 以嵌入式(本地)連接方式連接H2數(shù)據(jù)庫(kù)(方式1)
  默認(rèn)情況下只允許有一個(gè)客戶端連接到H2數(shù)據(jù)庫(kù)(有客戶端連接到H2數(shù)據(jù)庫(kù)之后倚评,此時(shí)數(shù)據(jù)庫(kù)文件就會(huì)被鎖定,其他客戶端無(wú)法再連接)馏予。
  連接語(yǔ)法:jdbc:h2:[file:][<path>]<databaseName>
    例:
      jdbc:h2:~/test // 連接位于用戶目錄下的test數(shù)據(jù)庫(kù)
      jdbc:h2:file:/data/sample
      jdbc:h2:file:E:/H2/test(Windows系統(tǒng)下)

===》Test.java
package com.sst.cx;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
public class Test {
    // 數(shù)據(jù)庫(kù)連接URL
    private static final String JDBC_URL = "jdbc:h2:~/H2Database/h2/bin/test";
    // 連接數(shù)據(jù)庫(kù)的用戶名
    private static final String USER = "sa";
    // 連接數(shù)據(jù)庫(kù)的密碼
    private static final String PASSWORD = "密碼";
    // 連接數(shù)據(jù)庫(kù)的驅(qū)動(dòng)類(H2數(shù)據(jù)庫(kù)提供)
    private static final String DRIVER_CLASS="org.h2.Driver";
    public static void main(String[] args) throws Exception {
        // 加載H2數(shù)據(jù)庫(kù)驅(qū)動(dòng)
        Class.forName(DRIVER_CLASS);
        // 根據(jù)連接URL天梧,用戶名,密碼獲取數(shù)據(jù)庫(kù)連接
        Connection conn = DriverManager.getConnection(JDBC_URL, USER, PASSWORD);
        Statement stmt = conn.createStatement();
        // 如果存在USERS表就先刪除USERS表
        stmt.execute("DROP TABLE IF EXISTS USERS");
        // 創(chuàng)建users表
        stmt.execute("create table users("
                + "    id int primary key,"
                + "    name varchar(40),"
                + "    password varchar(40))");
        // 新增
        stmt.executeUpdate("INSERT INTO users VALUES(1,'張三','12')");
        stmt.executeUpdate("INSERT INTO users VALUES(2,'李四','34')");
        stmt.executeUpdate("INSERT INTO users VALUES(3,'王五','56')");
        stmt.executeUpdate("INSERT INTO users VALUES(4,'麻六','78')");
        stmt.executeUpdate("INSERT INTO users VALUES(5,'鄒七','90')");
        // 刪除
        stmt.executeUpdate("DELETE FROM users WHERE name='張三'");
        // 修改
        stmt.executeUpdate("UPDATE users SET name='李二' WHERE name='李四'");
        // 查詢
        ResultSet rs = stmt.executeQuery("SELECT * FROM users");
        // 遍歷結(jié)果集
        while (rs.next()) {
            System.out.println(rs.getString("id") + "," + rs.getString("name")+ "," + rs.getString("password"));
        }
        // 釋放資源
        stmt.close();
        // 關(guān)閉連接
        conn.close();
    }
}
項(xiàng)目結(jié)構(gòu)

查詢結(jié)果
3. 使用TCP/IP的服務(wù)器模式(遠(yuǎn)程連接)方式連接H2數(shù)據(jù)庫(kù)(方式2  推薦) 
  連接方式和其他數(shù)據(jù)庫(kù)類似(基于Service的形式進(jìn)行連接)霞丧,因此允許多個(gè)客戶端同時(shí)連接到H2數(shù)據(jù)庫(kù)呢岗。
  連接語(yǔ)法:jdbc:h2:tcp://<server>[:<port>]/[<path>]<databaseName>
  例:
    jdbc:h2:tcp://localhost/~/test

===》Test2.java
package com.sst.cx;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
public class Test2 {
   // 數(shù)據(jù)庫(kù)連接URL
   private static final String JDBC_URL = "jdbc:h2:tcp://127.0.0.1/~/H2Database/h2/bin/test";
   // 連接數(shù)據(jù)庫(kù)的用戶名
   private static final String USER = "sa";
   // 連接數(shù)據(jù)庫(kù)的密碼
   private static final String PASSWORD = "密碼";
   // 連接數(shù)據(jù)庫(kù)的驅(qū)動(dòng)類(由H2數(shù)據(jù)庫(kù)提供)
   private static final String DRIVER_CLASS="org.h2.Driver";
   public static void main(String[] args) throws Exception {
       // 加載H2數(shù)據(jù)庫(kù)驅(qū)動(dòng)
       Class.forName(DRIVER_CLASS);
       // 根據(jù)連接URL,用戶名蛹尝,密碼獲取數(shù)據(jù)庫(kù)連接
       Connection conn = DriverManager.getConnection(JDBC_URL, USER, PASSWORD);
       Statement stmt = conn.createStatement();
       //如果存在users表就先刪除users表
       stmt.execute("DROP TABLE IF EXISTS USERS");
       // 創(chuàng)建users表
       stmt.execute("create table users("
            + "    id int primary key,"
            + "    name varchar(40),"
            + "    password varchar(40))");
       // 新增
       stmt.executeUpdate("INSERT INTO users VALUES(1,'張三','12')");
       stmt.executeUpdate("INSERT INTO users VALUES(2,'李四','34')");
       stmt.executeUpdate("INSERT INTO users VALUES(3,'王五','56')");
       stmt.executeUpdate("INSERT INTO users VALUES(4,'麻六','78')");
       stmt.executeUpdate("INSERT INTO users VALUES(5,'鄒七','90')");
       // 刪除
       stmt.executeUpdate("DELETE FROM users WHERE name='張三'");
       // 修改
       stmt.executeUpdate("UPDATE users SET name='李二' WHERE name='李四'");
       // 查詢
       ResultSet rs = stmt.executeQuery("SELECT * FROM users");
       // 遍歷結(jié)果集
       while (rs.next()) {
           System.out.println(rs.getString("id") + "," + rs.getString("name")+ "," + rs.getString("password"));
       }
       // 釋放資源
       stmt.close();
       // 關(guān)閉連接
       conn.close();
   }
}

3. 在JavaWeb項(xiàng)目中嵌入H2

1. 創(chuàng)建Web項(xiàng)目(Dynamic Web Project)
2. 導(dǎo)入依賴包
  將h2-xxx.jar后豫、servlet-api.jar復(fù)制到WEB-INF/lib目錄下
3. 創(chuàng)建一個(gè)專門用于啟動(dòng)H2數(shù)據(jù)庫(kù)服務(wù)的監(jiān)聽器

===》H2DBServerStartListener.java
package com.sst.cx.web.listener;
import java.sql.SQLException;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import org.h2.tools.Server;
// 用于啟動(dòng)H2數(shù)據(jù)庫(kù)服務(wù)的Listener
public class H2DBServerStartListener implements ServletContextListener {
    // H2數(shù)據(jù)庫(kù)服務(wù)器啟動(dòng)實(shí)例
    private Server server;
    // Web應(yīng)用初始化時(shí)啟動(dòng)H2數(shù)據(jù)庫(kù)
    public void contextInitialized(ServletContextEvent sce) {
        try {
            System.out.println("正在啟動(dòng)h2數(shù)據(jù)庫(kù)...");
            // 使用org.h2.tools.Server這個(gè)類創(chuàng)建一個(gè)H2數(shù)據(jù)庫(kù)的服務(wù)并啟動(dòng)服務(wù),由于沒有指定任何參數(shù)突那,那么H2數(shù)據(jù)庫(kù)啟動(dòng)時(shí)默認(rèn)占用的端口就是8082
            server = Server.createTcpServer().start();
            System.out.println("h2數(shù)據(jù)庫(kù)啟動(dòng)成功...");
        } catch (SQLException e) {
            System.out.println("啟動(dòng)h2數(shù)據(jù)庫(kù)出錯(cuò):" + e.toString());
            e.printStackTrace();
            throw new RuntimeException(e);
        }
    }
    // Web應(yīng)用銷毀時(shí)停止H2數(shù)據(jù)庫(kù)
    public void contextDestroyed(ServletContextEvent sce) {
        if (this.server != null) {
            // 停止H2數(shù)據(jù)庫(kù)
            this.server.stop();
            this.server = null;
        }
    }
}
4. 在web.xml文件中添加
    <!-- 配置監(jiān)聽器:?jiǎn)?dòng)和停止H2數(shù)據(jù)庫(kù)服務(wù) -->
    <listener>
        <listener-class>com.sst.cx.web.listener.H2DBServerStartListener</listener-class>
    </listener>
    <!-- 配置用于訪問H2數(shù)據(jù)庫(kù)Console的Servlet -->
    <servlet>
        <servlet-name>H2Console</servlet-name>
        <servlet-class>org.h2.server.web.WebServlet</servlet-class>
        <init-param>
            <param-name>webAllowOthers</param-name>
            <param-value></param-value>
        </init-param>
        <init-param>
            <param-name>trace</param-name>
            <param-value></param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <!-- 映射H2控制臺(tái)的訪問路徑 -->
    <servlet-mapping>
        <servlet-name>H2Console</servlet-name>
        <url-pattern>/console/*</url-pattern>
    </servlet-mapping>
5. 測(cè)試

部署到Tomcat挫酿,并啟動(dòng)Tomcat。
在瀏覽器中輸入http://localhost:8080/hello/console/ 可訪問H2的Web控制臺(tái)愕难。

4. 向H2數(shù)據(jù)庫(kù)注冊(cè)自定義的數(shù)據(jù)庫(kù)函數(shù)

1. 實(shí)現(xiàn)自定義數(shù)據(jù)庫(kù)函數(shù)
  創(chuàng)建一個(gè)普通類早龟,創(chuàng)建一個(gè)public static修飾的方法并實(shí)現(xiàn)。
  例:
    public class Hello{
      public static String hi(){
        return "hello";    // 根據(jù)自身需求猫缭,編寫功能
      }
    }
2. 注冊(cè)到H2數(shù)據(jù)庫(kù)中(在H2的Web控制臺(tái)中執(zhí)行)
  CREATE ALIAS [IF NOT EXISTS] newFunctionAliasName [DETERMINISTIC] FOR classAndMethodName
  例:
    CREATE ALIAS hello FOR "com.sst.cx.Hello.hi"
3. 測(cè)試
  select hello()
注冊(cè)到H2數(shù)據(jù)庫(kù)

測(cè)試

例(一次性向H2數(shù)據(jù)庫(kù)注冊(cè)多個(gè)函數(shù))

===》1. H2DBFunctionExt.java(定義數(shù)據(jù)庫(kù)函數(shù))
package com.sst.cx;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.UUID;
public class Hello {
    public static String hi(){
        return "hello";
    }
    public static String my_uuid(){
        return "com.sst.cx"+UUID.randomUUID().toString();
    }
    public static String now(){
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        Date date = new Date();
        String dateStr = simpleDateFormat.format(date);
        return dateStr;
    }
    public static String getIp(){
        try {
            InetAddress addr = InetAddress.getLocalHost();
            // 獲得本機(jī)IP
            return addr.getHostAddress();
        } catch (UnknownHostException e) {
            e.printStackTrace();
            return "未知的IP地址";
        }
    }
    public static String date_format(String date,String pattern){
        if (date != null) {
            SimpleDateFormat sdf = new SimpleDateFormat(pattern);
            try {
                Date temp = sdf.parse(date);
                return sdf.format(temp);
            } catch (ParseException e) {
                e.printStackTrace();
            }
        }
        return "";
    }
}

===》2. RegisterH2ExtFuncServlet.java(注冊(cè)數(shù)據(jù)庫(kù)函數(shù))
package com.sst.cx;
import java.sql.Connection;
import java.sql.Statement;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
public class RegisterH2ExtFuncServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;
    public void init() throws ServletException {
        // 0拄衰、注冊(cè)hi函數(shù)的SQL語(yǔ)句
        String sql0 = "CREATE ALIAS IF NOT EXISTS hello FOR \"com.sst.cx.H2DBFunctionExt.hi\"";
        // 1、注冊(cè)u(píng)uid函數(shù)的SQL語(yǔ)句
        String sql1 = "CREATE ALIAS IF NOT EXISTS my_uuid FOR \"com.sst.cx.H2DBFunctionExt.my_uuid\"";
        // 2饵骨、注冊(cè)currentTime函數(shù)的SQL語(yǔ)句
        String sql2 = "CREATE ALIAS IF NOT EXISTS currentTime FOR \"com.sst.cx.H2DBFunctionExt.now\"";
        // 3、注冊(cè)IP函數(shù)的SQL語(yǔ)句
        String sql3 = "CREATE ALIAS IF NOT EXISTS IP FOR \"com.sst.cx.H2DBFunctionExt.getIp\"";
        // 4茫打、注冊(cè)date_format函數(shù)的SQL語(yǔ)句
        String sql4 = "CREATE ALIAS IF NOT EXISTS date_format FOR \"com.sst.cx.H2DBFunctionExt.date_format\"";
        Connection connection = null;
        Statement stmt = null;
        try {
            // 獲取數(shù)據(jù)庫(kù)連接
            connection = JdbcUtil.getConnection();
            // 獲取Statement對(duì)象
            stmt = connection.createStatement();
            // 添加要執(zhí)行的SQL
            stmt.addBatch(sql0);
            stmt.addBatch(sql1);
            stmt.addBatch(sql2);
            stmt.addBatch(sql3);
            stmt.addBatch(sql4);
            // 批量執(zhí)行
            stmt.executeBatch();
            System.out.println("H2數(shù)據(jù)庫(kù)擴(kuò)展函數(shù)注冊(cè)成功居触!");
            stmt.clearBatch();
        } catch (Exception e) {
            System.out.println("H2數(shù)據(jù)庫(kù)擴(kuò)展函數(shù)注冊(cè)失敗老赤!");
            e.printStackTrace();
        }finally{
            try {
                stmt.close();
                connection.close();
            } catch (Exception e2) {
                e2.printStackTrace();
            }
        }
    }
}

===》3. 在web.xml文件中轮洋,添加
    <servlet>
        <description>注冊(cè)H2數(shù)據(jù)庫(kù)的擴(kuò)展函數(shù)</description>
        <servlet-name>RegisterH2DBExtFunction</servlet-name>
        <servlet-class>com.sst.cx.RegisterH2ExtFuncServlet</servlet-class>
    <!--
    1、load-on-startup元素標(biāo)記容器是否在啟動(dòng)的時(shí)候就加載這個(gè)servlet(實(shí)例化并調(diào)用其init()方法)抬旺。
    2弊予、它的值必須是一個(gè)整數(shù),表示servlet應(yīng)該被載入的順序
    3开财、當(dāng)值為0或者大于0時(shí)汉柒,表示容器在應(yīng)用啟動(dòng)時(shí)就加載并初始化這個(gè)servlet;
    4责鳍、當(dāng)值小于0或者沒有指定時(shí)碾褂,則表示容器在該servlet被選擇時(shí)才會(huì)去加載。
    5历葛、正數(shù)的值越小正塌,該servlet的優(yōu)先級(jí)越高,應(yīng)用啟動(dòng)時(shí)就越先加載。
    6乓诽、當(dāng)值相同時(shí)帜羊,容器就會(huì)自己選擇順序來加載。
    所以鸠天,<load-on-startup>x</load-on-startup>讼育,中x的取值1,2粮宛,3窥淆,4,5代表的是優(yōu)先級(jí)巍杈,而非啟動(dòng)延遲時(shí)間忧饭。
     -->
        <load-on-startup>1</load-on-startup>
    </servlet>

===》4. JdbcUtil.java(提供JDBC連接)
package com.sst.cx;
import java.io.InputStream;
import java.sql.Connection;
import java.util.Properties;
import org.h2.jdbcx.JdbcConnectionPool;
public class JdbcUtil {
   private static JdbcConnectionPool cp = null;
   static{
       try {
           // 加載src目錄下的h2config.properties
           InputStream in = JdbcUtil.class.getClassLoader().getResourceAsStream("h2config.properties");
           Properties prop = new Properties();
           prop.load(in);
           // 創(chuàng)建數(shù)據(jù)庫(kù)連接池
           cp = JdbcConnectionPool.create(prop.getProperty("JDBC_URL"), prop.getProperty("USER"), prop.getProperty("PASSWORD"));
       } catch (Exception e) {
           System.out.println("連接池初始化異常");
           e.printStackTrace();
       }
   }
   public static Connection getConnection() throws Exception{
       return cp.getConnection();
   }
   public static JdbcConnectionPool getCp() {
       return cp;
   }
}
===》5. 創(chuàng)建h2config.properties文件(src目錄下)
JDBC_URL=jdbc:h2:tcp://127.0.0.1/~/H2Database/h2/bin/test
USER=sa
PASSWORD=密碼
測(cè)試
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市筷畦,隨后出現(xiàn)的幾起案子词裤,更是在濱河造成了極大的恐慌,老刑警劉巖鳖宾,帶你破解...
    沈念sama閱讀 206,968評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件吼砂,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡鼎文,警方通過查閱死者的電腦和手機(jī)渔肩,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來拇惋,“玉大人周偎,你說我怎么就攤上這事〕盘” “怎么了蓉坎?”我有些...
    開封第一講書人閱讀 153,220評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)胡嘿。 經(jīng)常有香客問我蛉艾,道長(zhǎng),這世上最難降的妖魔是什么衷敌? 我笑而不...
    開封第一講書人閱讀 55,416評(píng)論 1 279
  • 正文 為了忘掉前任勿侯,我火速辦了婚禮,結(jié)果婚禮上逢享,老公的妹妹穿的比我還像新娘罐监。我一直安慰自己,他們只是感情好瞒爬,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,425評(píng)論 5 374
  • 文/花漫 我一把揭開白布弓柱。 她就那樣靜靜地躺著沟堡,像睡著了一般。 火紅的嫁衣襯著肌膚如雪矢空。 梳的紋絲不亂的頭發(fā)上航罗,一...
    開封第一講書人閱讀 49,144評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音屁药,去河邊找鬼粥血。 笑死,一個(gè)胖子當(dāng)著我的面吹牛酿箭,可吹牛的內(nèi)容都是我干的复亏。 我是一名探鬼主播,決...
    沈念sama閱讀 38,432評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼缭嫡,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼缔御!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起妇蛀,我...
    開封第一講書人閱讀 37,088評(píng)論 0 261
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤耕突,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后评架,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體眷茁,經(jīng)...
    沈念sama閱讀 43,586評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,028評(píng)論 2 325
  • 正文 我和宋清朗相戀三年纵诞,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了上祈。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,137評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡浙芙,死狀恐怖雇逞,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情茁裙,我是刑警寧澤,帶...
    沈念sama閱讀 33,783評(píng)論 4 324
  • 正文 年R本政府宣布节仿,位于F島的核電站晤锥,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏廊宪。R本人自食惡果不足惜矾瘾,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,343評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望箭启。 院中可真熱鬧壕翩,春花似錦、人聲如沸傅寡。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,333評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至芜抒,卻和暖如春珍策,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背宅倒。 一陣腳步聲響...
    開封第一講書人閱讀 31,559評(píng)論 1 262
  • 我被黑心中介騙來泰國(guó)打工攘宙, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人拐迁。 一個(gè)月前我還...
    沈念sama閱讀 45,595評(píng)論 2 355
  • 正文 我出身青樓蹭劈,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親线召。 傳聞我的和親對(duì)象是個(gè)殘疾皇子铺韧,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,901評(píng)論 2 345

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