ubuntu

# ubuntu

## DBUtils 基本介紹

commons-dbutils是Apache組織提供的一個開源JDBC工具類庫射富,它是對JDBC的簡單封裝羊始。簡化了jdbc編碼的工作量

## 地址

![image-20201217194115785](ubuntu.assets/image-20201217194115785.png)

## **代碼**

update()方法可用于Insert桥滨、update、delete

```java

public class JDBCTest06 {

? ? // 刪除delete

? ? public JDBCTest06() throws SQLException {

? ? ? ? // 1. 創(chuàng)建QueryRunner 的實現類

? ? ? ? QueryRunner queryRunner = new QueryRunner();

? ? ? ? // 2. 使用其update 方法

? ? ? ? String sql = "DELETE FROM customers " + "WHERE id IN(?,>)";

? ? ? ? DataSource dataSource = new ComboPooledDataSource("helloc3p0");

? ? ? ? // 3. 在連接池獲取連接

? ? ? ? Connection connection =? dataSource.getConnection();

? ? ? ? queryRunner.update(connection,sql,12,13); // update方法可用于刪除勒叠、更新、添加

? ? ? ? connection.close();

? ? }

}

```

通過實現ResultSetHandler接口實現查詢

創(chuàng)建 ResultSetHandler接口 的實現類与倡,實現handle方法狈茉,queryRunner.query()的返回值取決于handle的返回值

```java

public class DBUtilsTest {

? ? QueryRunner queryRunner = new QueryRunner();

? ? // 1. 創(chuàng)建 ResultSetHandler接口 的實現類刁卜,實現handle方法,queryRunner.query()的返回值取決于handle的返回值

? ? class MyResultSetHandler implements ResultSetHandler{

? ? ? ? @Override

? ? ? ? public Object handle(ResultSet rs) throws SQLException {

? ? ? ? ? ? List<Customer> customers = new ArrayList<>();


? ? ? ? ? ? while (rs.next()){

? ? ? ? ? ? ? ? Integer id = rs.getInt(1);

? ? ? ? ? ? ? ? String name = rs.getString(2);

? ? ? ? ? ? ? ? String email = rs.getString(3);

? ? ? ? ? ? ? ? Date birth = rs.getDate(4);

? ? ? ? ? ? ? ? Customer customer = new Customer(id,name,email,birth);

? ? ? ? ? ? ? ? customers.add(customer);

? ? ? ? ? ? }

? ? ? ? ? ? return customers;

? ? ? ? }

? ? }

? ? public void testQuery() throws SQLException {

? ? ? ? Connection connection = null;

? ? ? ? String sql = "select id,name,email,birth" + "from customers";

? ? ? ? Object object = queryRunner.query(connection, sql, new MyResultSetHandler());

? ? ? ? System.out.println(object);

? ? ? ? connection.close();

? ? }

}

```

queryRunner.query()源碼分析

```csharp

//1. QueryRunner 類的query()方法

public <T> T query(Connection conn, String sql, ResultSetHandler<T> rsh, Object... params) throws SQLException {

? ? ? ? return this.<T>query(conn, false, sql, rsh, params);// 返回值是調用當前的類query的重載方法

? ? }

// 2.當前的類query的重載方法

private <T> T query(Connection conn, boolean closeConn, String sql, ResultSetHandler<T> rsh, Object... params)

? ? ? ? ? ? throws SQLException {? ? ? ?

? ? ? ? PreparedStatement stmt = null;

? ? ? ? ResultSet rs = null;

? ? ? ? T result = null;

? ? ? ? try {

? ? ? ? ? ? stmt = this.prepareStatement(conn, sql);

? ? ? ? ? ? this.fillStatement(stmt, params);

? ? ? ? ? ? rs = this.wrap(stmt.executeQuery()); // wrap() 返回的是ResultSet

? ? ? ? ? ? result = rsh.handle(rs); //? handle()是ResultSetHandler接口定義的方法

? ? ? ? } catch (SQLException e) {

? ? ? ? ? ? this.rethrow(e, sql, params);

? ? ? ? } finally {

? ? ? ? ? ? try {

? ? ? ? ? ? ? ? close(rs);

? ? ? ? ? ? } finally {

? ? ? ? ? ? ? ? close(stmt);

? ? ? ? ? ? ? ? if (closeConn) {

? ? ? ? ? ? ? ? ? ? close(conn);

? ? ? ? ? ? ? ? }

? ? ? ? ? ? }

? ? ? ? }

? ? ? ? return result;

? ? }

```

通過BeanHandler類實現查詢

把結果集的第一條記錄轉為創(chuàng)建BeanHandler對象時傳入的class參數對應的對象

```java

? ? public void testBeanHandler() throws SQLException {

? ? ? ? QueryRunner queryRunner = new QueryRunner();

? ? ? ? Connection connection = null;

? ? ? ? String sql = "select id,name,email,birth" + "from customers where id >= ?";

? ? ? ? Object object = queryRunner.query(connection, sql, new BeanHandler(Customer.class),5);

? ? ? ? System.out.println(object);

? ? ? ? connection.close();

? ? }

```

通過BeanListHandler類實現查詢

把結果集轉為一個List,該List不為null韩玩,但可能為空集合(size()方法返回為0)杨箭,若SQL語句有查詢記錄牺陶,List中存放創(chuàng)建BeanListHandler轉入Class對象對應的對象

```java

? ? public void testBeanListHandler() throws SQLException {

? ? ? ? QueryRunner queryRunner = new QueryRunner();

? ? ? ? Connection connection = null;

? ? ? ? String sql = "select id,name,email,birth" + "from customers";

? ? ? ? List<Customer> customers = queryRunner.query(connection,sql,new BeanListHandler<Customer>(Customer.class));

? ? ? ? Object object = queryRunner.query(connection, sql, new BeanHandler(Customer.class),5);

? ? ? ? System.out.println(object);

? ? ? ? connection.close();

? ? }

```

通過MapHandler類實現查詢

返回SQL對應的第一條記錄對應的Map對象,鍵值對:鍵SQL查詢的列名(不是別名)掰伸,列的值

```dart

public void testMapHandler() throws SQLException {

? ? ? ? QueryRunner queryRunner = new QueryRunner();

? ? ? ? Connection connection = null;

? ? ? ? String sql = "select id,name,email,birth" + "from customers";

? ? ? ? Map<String,Object> customers = queryRunner.query(connection,sql,new MapHandler());

? ? ? ? Object object = queryRunner.query(connection, sql, new BeanHandler(Customer.class),5);

? ? ? ? System.out.println(object);

? ? ? ? connection.close();

? ? }

```

通過MapListHandler類實現查詢

將結果集轉為一個Map的List皱炉,Map對應查詢的一條記錄:鍵值堆:鍵SQL查詢的列名(不是列的別名),值:列的值狮鸭,而MapListHandler:返回的多條記錄對應的Map的集合

```dart

? ? public void testMapListHandler() throws SQLException {

? ? ? ? QueryRunner queryRunner = new QueryRunner();

? ? ? ? Connection connection = null;

? ? ? ? String sql = "select id,name,email,birth" + "from customers";

? ? ? ? List<Map<String,Object>> result = queryRunner.query(connection,sql,new MapListHandler());

? ? ? ? Object object = queryRunner.query(connection, sql, new BeanHandler(Customer.class),5);

? ? ? ? System.out.println(object);

? ? ? ? connection.close();

? ? }

```

ScalarHandler:把結果集轉為一個數值(可以是任意基本數據類型和字符串娃承,Date等)返回

```dart

public void ScalarHandler() throws SQLException {

? ? ? ? QueryRunner queryRunner = new QueryRunner();

? ? ? ? Connection connection = null;

? ? ? ? String sql = "select name" + "from customers"; // 如果是兩列的情況返回一列

? ? ? ? List<Map<String,Object>> result = queryRunner.query(connection,sql,new MapListHandler());

? ? ? ? Object object = queryRunner.query(connection, sql, new ScalarHandler<>(),5);

? ? ? ? System.out.println(object);

? ? ? ? connection.close();

? ? }

```

## 做的完善的欣知商城

entity

```Java

package com.xinzhi.entity;

import com.xinzhi.Cart;

/**

* @author 楊智超

* @date 2020/12/17

*/

public class User {

? ? private int id;

? ? //用戶名

? ? private String userName;

? ? //密碼

? ? private String passWord;

? ? //地址

? ? private String site;

? ? //余額

? ? private double balance;

? ? private Cart cart = new Cart();

? ? public String getUserName() {

? ? ? ? return userName;

? ? }

? ? public void setUserName(String userName) {

? ? ? ? this.userName = userName;

? ? }

? ? public String getPassWord() {

? ? ? ? return passWord;

? ? }

? ? public void setPassWord(String passWord) {

? ? ? ? this.passWord = passWord;

? ? }

? ? public String getSite() {

? ? ? ? return site;

? ? }

? ? public void setSite(String site) {

? ? ? ? this.site = site;

? ? }

? ? public double getBalance() {

? ? ? ? return balance;

? ? }

? ? public void setBalance(double balance) {

? ? ? ? this.balance = balance;

? ? }

? ? public Cart getCart() {

? ? ? ? return cart;

? ? }

? ? public void setCart(Cart cart) {

? ? ? ? this.cart = cart;

? ? }

? ? public int getId() {

? ? ? ? return id;

? ? }

? ? public void setId(int id) {

? ? ? ? this.id = id;

? ? }

? ? @Override

? ? public String toString() {

? ? ? ? return "User{" +

? ? ? ? ? ? ? ? "id=" + id +

? ? ? ? ? ? ? ? ", userName='" + userName + '\'' +

? ? ? ? ? ? ? ? ", passWord='" + passWord + '\'' +

? ? ? ? ? ? ? ? ", site='" + site + '\'' +

? ? ? ? ? ? ? ? ", balance=" + balance +

? ? ? ? ? ? ? ? ", cart=" + cart +

? ? ? ? ? ? ? ? '}';

? ? }

}

```

service

```Java

package com.xinzhi.service;

import com.xinzhi.Order;

import com.xinzhi.dao.impl.FileUserDaoImpl;

import com.xinzhi.dao.impl.MysqlUserDaoImpl;

import com.xinzhi.entity.User;

import com.xinzhi.dao.UserDao;

import com.xinzhi.util.ScannerUtil;

import java.util.List;

/**

* @author 楊智超

* @date 2020/12/17

*/

public class UserService {

? ? UserDao userDao = new MysqlUserDaoImpl();

? ? public boolean longin(User user2){

? ? ? ? System.out.print("請輸入用戶名:");

? ? ? ? String userName = ScannerUtil.getInput();

? ? ? ? System.out.println();

? ? ? ? System.out.print("請輸入密碼:");

? ? ? ? String passWord = ScannerUtil.getInput();

? ? ? ? User user = userDao.getUsersByName(userName);

? ? ? ? if (!userName.equals(user.getUserName())){

? ? ? ? ? ? System.out.println("用戶不存在,登錄失敗");

? ? ? ? ? ? return true;

? ? ? ? }

? ? ? ? if (!passWord.equals(user.getPassWord())){

? ? ? ? ? ? System.out.println("密碼不對怕篷,登錄失敗");

? ? ? ? ? ? return false;

? ? ? ? }

? ? ? ? user2.setUserName(userName);

? ? ? ? user2.setPassWord(passWord);

? ? ? ? System.out.println("登錄成功歡迎" + user2.getUserName() +"用戶的到來历筝,祝您有個好的購物心情!");

? ? ? ? return true;

? ? }

? ? public boolean regist(){

? ? ? ? System.out.print("請輸入用戶名:");

? ? ? ? String userName = ScannerUtil.getInput();

? ? ? ? System.out.println();

? ? ? ? System.out.print("請輸入密碼:");

? ? ? ? String passWord = ScannerUtil.getInput();

? ? ? ? System.out.println();

? ? ? ? System.out.println("請輸入您的收貨地址:");

? ? ? ? String site = ScannerUtil.getInput();

? ? ? ? User user = new User();

? ? ? ? //創(chuàng)建用戶

? ? ? ? user.setUserName(userName);

? ? ? ? user.setPassWord(passWord);

? ? ? ? user.setSite(site);

? ? ? ? user.setBalance(0);

? ? ? ? userDao.saveUser(user,true);

? ? ? ? System.out.println("注冊成功");

? ? ? ? return true;

? ? }

? ? //查看購物車

? ? public void lookAtCart(User user){

? ? ? ? List<Order> cartMessage = user.getCart().getCartMessage();

? ? ? ? System.out.println("以下為購物車:");

? ? ? ? for (int i = 0; i < cartMessage.size(); i++) {

? ? ? ? ? ? System.out.println((i+1) + ":" +

? ? ? ? ? ? ? ? ? ? cartMessage.get(i).getGoodsName() + "\t" +

? ? ? ? ? ? ? ? ? ? cartMessage.get(i).getGoodsPrice() + "\t" +

? ? ? ? ? ? ? ? ? ? cartMessage.get(i).getGoodsCount() + "\t" +

? ? ? ? ? ? ? ? ? ? cartMessage.get(i).getTotalMoney() + "\t"

? ? ? ? ? ? );

? ? ? ? }

? ? ? ? System.out.println("--------------------------------\n");

? ? }

? ? //結賬

? ? public void pay(User user2) {

? ? ? ? List<Order> cartMessage = user2.getCart().getCartMessage();

? ? ? ? double cartTotalMoney = 0;

? ? ? ? for (Order order : cartMessage) {

? ? ? ? ? ? cartTotalMoney += order.getTotalMoney();

? ? ? ? }

? ? ? ? User user = userDao.getUsersByName(user2.getUserName());

? ? ? ? if (user.getBalance() >= cartTotalMoney){

? ? ? ? ? ? double balance = user.getBalance() - cartTotalMoney;

? ? ? ? ? ? userDao.updateBalance(user2.getUserName(),balance);

? ? ? ? ? ? user.getCart().clear();

? ? ? ? ? ? System.out.println("支付成功");

? ? ? ? ? ? System.out.println("本次支付:" + cartTotalMoney + "廊谓,您的余額剩余:" + balance + "元");

? ? ? ? }else {

? ? ? ? ? ? System.out.println("余額不足梳猪,請在充值");

? ? ? ? }

? ? }

? ? //查看用戶信息

? ? public void userManger(User user2){

? ? ? ? User user = userDao.getUsersByName(user2.getUserName());

? ? ? ? System.out.println("用戶名:" + user.getUserName());

? ? ? ? System.out.println("剩余金額:" + user.getBalance());

? ? }

? ? //充值

? ? public void showUserManger(User user2){

? ? ? ? User user = userDao.getUsersByName(user2.getUserName());

? ? ? ? System.out.println("當前余額:" + user.getBalance() + "元");

? ? ? ? System.out.println("請輸入要充值的金額");

? ? ? ? String input = ScannerUtil.getInput();

? ? ? ? double newBalance = user.getBalance() + Double.parseDouble(input);

? ? ? ? userDao.updateBalance(user.getUserName(),newBalance);

? ? ? ? System.out.println("剩余金額:" + newBalance + "元。");

? ? }

? ? public boolean addGoodsToCart(String id, int goodCount,User user){

? ? ? ? user.getCart().addGoods(id, goodCount);

? ? ? ? return true;

? ? }

}

```

dao

![image-20201217194319164](ubuntu.assets/image-20201217194319164.png)

UserDao接口

```Java

package com.xinzhi.dao;

import com.xinzhi.Constant;

import com.xinzhi.entity.User;

import java.io.*;

import java.util.ArrayList;

import java.util.List;

/**

* @author 楊智超

* @date 2020/12/17

*/

public interface UserDao {

? ? /**

? ? * 獲取所有USER

? ? * @param url

? ? * @return

? ? */

? ? List<User> getAllUsers(String url);

? ? /**

? ? * 修改價格

? ? * @param name

? ? * @return

? ? */

? ? User getUsersByName(String name);

? ? /**

? ? *? 修改余額

? ? * @param userName

? ? * @param newBalance

? ? */

? ? void updateBalance(String userName,double newBalance);

? ? /**

? ? *? 保存數據

? ? * @param user

? ? * @param append

? ? * @return

? ? */

? ? boolean saveUser(User user,boolean append);

}

```

FileUserDaoImpl

```Java

package com.xinzhi.dao.impl;

import com.xinzhi.Constant;

import com.xinzhi.dao.UserDao;

import com.xinzhi.entity.User;

import java.io.*;

import java.util.ArrayList;

import java.util.List;

/**

* @author 楊智超

* @date 2020/12/17

*/

public class FileUserDaoImpl implements UserDao {

? ? @Override

? ? public List<User> getAllUsers(String url){

? ? ? ? List<User> users = new ArrayList<>();

? ? ? ? try (FileReader fs = new FileReader(url);

? ? ? ? ? ? BufferedReader bf = new BufferedReader(fs)){

? ? ? ? ? ? String userStr = null;

? ? ? ? ? ? while ((userStr = bf.readLine()) != null) {

? ? ? ? ? ? ? ? String[] str = userStr.split("---");

? ? ? ? ? ? ? ? User user = new User();

? ? ? ? ? ? ? ? user.setUserName(str[0]);

? ? ? ? ? ? ? ? user.setPassWord(str[1]);

? ? ? ? ? ? ? ? users.add(user);

? ? ? ? ? ? }

? ? ? ? }catch (IOException ex){

? ? ? ? ? ? ex.printStackTrace();

? ? ? ? }

? ? ? ? return users;

? ? }

? ? @Override

? ? public User getUsersByName(String name) {

? ? ? ? List<User> users = getAllUsers(Constant.BASE_PATH);

? ? ? ? for (User user : users) {

? ? ? ? ? ? if (user.getUserName().equals(name)) {

? ? ? ? ? ? ? ? return user;

? ? ? ? ? ? }

? ? ? ? }

? ? ? ? return null;

? ? }

? ? @Override

? ? //修改余額

? ? public void updateBalance(String userName,double newBalance){

? ? ? ? List<User> allUsers = getAllUsers(Constant.BASE_PATH);

? ? ? ? if (userName == null){

? ? ? ? ? ? return;

? ? ? ? }

? ? ? ? for (int i = 0; i < allUsers.size(); i++) {

? ? ? ? ? ? if (userName.equals(allUsers.get(i).getUserName())){

? ? ? ? ? ? ? ? allUsers.get(i).setBalance(newBalance);

? ? ? ? ? ? }

? ? ? ? ? ? if (i == 0){

? ? ? ? ? ? ? ? saveUser(allUsers.get(i),false);

? ? ? ? ? ? }else {

? ? ? ? ? ? ? ? saveUser(allUsers.get(i),true);

? ? ? ? ? ? }

? ? ? ? }

? ? }

? ? @Override

? ? //保存數據

? ? public boolean saveUser(User user,boolean append){

? ? ? ? FileWriter fw = null;

? ? ? ? BufferedWriter bw = null;

? ? ? ? try {

? ? ? ? ? ? fw = new FileWriter(Constant.BASE_PATH,true);

? ? ? ? ? ? bw = new BufferedWriter(fw);

? ? ? ? ? ? bw.append(user.getUserName()).append("---").append(user.getPassWord()).append("---").append(user.getSite());

? ? ? ? ? ? bw.newLine();

? ? ? ? ? ? bw.flush();

? ? ? ? }catch (IOException ex){

? ? ? ? ? ? ex.printStackTrace();

? ? ? ? }finally {

? ? ? ? ? ? try {

? ? ? ? ? ? ? ? if (bw != null) {

? ? ? ? ? ? ? ? ? ? bw.close();

? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? if (fw != null) {

? ? ? ? ? ? ? ? ? ? fw.close();

? ? ? ? ? ? ? ? }

? ? ? ? ? ? }catch (IOException ex){

? ? ? ? ? ? ? ? ex.printStackTrace();

? ? ? ? ? ? }

? ? ? ? }

? ? ? ? return true;

? ? }

}

```

MysqlUserDaoImpl

```Java

package com.xinzhi.dao.impl;

import com.xinzhi.dao.UserDao;

import com.xinzhi.entity.User;

import com.xinzhi.util.PollUtil;

import org.apache.commons.dbutils.QueryRunner;

import org.apache.commons.dbutils.ResultSetHandler;

import java.sql.ResultSet;

import java.sql.SQLException;

import java.util.ArrayList;

import java.util.List;

/**

* @author 楊智超

* @date 2020/12/17

*/

public class MysqlUserDaoImpl implements UserDao {

? ? ResultSetHandler<User> userHandler = new ResultSetHandler<User>() {

? ? ? ? @Override

? ? ? ? public User handle(ResultSet resultSet) throws SQLException {

? ? ? ? ? ? User user = new User();

? ? ? ? ? ? resultSet.next();

? ? ? ? ? ? user.setId(resultSet.getInt("id"));

? ? ? ? ? ? user.setUserName(resultSet.getString("name"));

? ? ? ? ? ? user.setPassWord(resultSet.getString("password"));

? ? ? ? ? ? user.setSite(resultSet.getString("site"));

? ? ? ? ? ? return null;

? ? ? ? }

? ? };

? ? ResultSetHandler<List<User>> userListHandler = new ResultSetHandler<List<User>>() {

? ? ? ? @Override

? ? ? ? public List<User> handle(ResultSet resultSet) throws SQLException {

? ? ? ? ? ? List<User> users = new ArrayList<>();

? ? ? ? ? ? while (resultSet.next()) {

? ? ? ? ? ? ? ? User user = new User();

? ? ? ? ? ? ? ? user.setId(resultSet.getInt("id"));

? ? ? ? ? ? ? ? user.setUserName(resultSet.getString("name"));

? ? ? ? ? ? ? ? user.setPassWord(resultSet.getString("password"));

? ? ? ? ? ? ? ? user.setSite(resultSet.getString("site"));

? ? ? ? ? ? ? ? users.add(user);

? ? ? ? ? ? }

? ? ? ? ? ? return users;

? ? ? ? }

? ? };

? ? @Override

? ? public List<User> getAllUsers(String url) {

? ? ? ? QueryRunner runner = new QueryRunner(PollUtil.getDataSource());

? ? ? ? List<User> users = null;

? ? ? ? try {

? ? ? ? ? ? users = runner.query("select * from comsumer",userListHandler);

? ? ? ? } catch (SQLException throwables) {

? ? ? ? ? ? throwables.printStackTrace();

? ? ? ? }

? ? ? ? return users;

? ? }

? ? @Override

? ? public User getUsersByName(String name) {

? ? ? ? QueryRunner runner = new QueryRunner(PollUtil.getDataSource());

? ? ? ? User user = null;

? ? ? ? try {

? ? ? ? ? ? user = (User) runner.query("select * from comsumer where name=?",userListHandler,name);

? ? ? ? } catch (SQLException throwables) {

? ? ? ? ? ? throwables.printStackTrace();

? ? ? ? }

? ? ? ? return user;

? ? }

? ? @Override

? ? public void updateBalance(String userName, double newBalance) {

? ? ? ? QueryRunner runner = new QueryRunner(PollUtil.getDataSource());

? ? ? ? try {

? ? ? ? ? ? runner.update("update consumer set site=? where name=?",newBalance,userName);

? ? ? ? } catch (SQLException throwables) {

? ? ? ? ? ? throwables.printStackTrace();

? ? ? ? }

? ? }

? ? @Override

? ? public boolean saveUser(User user, boolean append) {

? ? ? ? QueryRunner runner = new QueryRunner(PollUtil.getDataSource());

? ? ? ? int rowd = 0;

? ? ? ? try {

? ? ? ? ? rowd = runner.update("insert into consumer (name,password,site) values(?,?,?)",user.getId(),user.getUserName(),user.getPassWord(),user.getSite());

? ? ? ? } catch (SQLException throwables) {

? ? ? ? ? ? throwables.printStackTrace();

? ? ? ? }

? ? ? ? return rowd > 0;

? ? }

}

```

?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末蒸痹,一起剝皮案震驚了整個濱河市春弥,隨后出現的幾起案子,更是在濱河造成了極大的恐慌叠荠,老刑警劉巖匿沛,帶你破解...
    沈念sama閱讀 218,036評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現場離奇詭異榛鼎,居然都是意外死亡逃呼,警方通過查閱死者的電腦和手機,發(fā)現死者居然都...
    沈念sama閱讀 93,046評論 3 395
  • 文/潘曉璐 我一進店門者娱,熙熙樓的掌柜王于貴愁眉苦臉地迎上來抡笼,“玉大人,你說我怎么就攤上這事黄鳍⊥埔觯” “怎么了?”我有些...
    開封第一講書人閱讀 164,411評論 0 354
  • 文/不壞的土叔 我叫張陵框沟,是天一觀的道長藏古。 經常有香客問我增炭,道長粘我,這世上最難降的妖魔是什么檬输? 我笑而不...
    開封第一講書人閱讀 58,622評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮悠抹,結果婚禮上防症,老公的妹妹穿的比我還像新娘。我一直安慰自己哎甲,他們只是感情好蔫敲,可當我...
    茶點故事閱讀 67,661評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著炭玫,像睡著了一般奈嘿。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上吞加,一...
    開封第一講書人閱讀 51,521評論 1 304
  • 那天裙犹,我揣著相機與錄音,去河邊找鬼衔憨。 笑死叶圃,一個胖子當著我的面吹牛,可吹牛的內容都是我干的践图。 我是一名探鬼主播掺冠,決...
    沈念sama閱讀 40,288評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼码党!你這毒婦竟也來了德崭?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,200評論 0 276
  • 序言:老撾萬榮一對情侶失蹤揖盘,失蹤者是張志新(化名)和其女友劉穎眉厨,沒想到半個月后,有當地人在樹林里發(fā)現了一具尸體兽狭,經...
    沈念sama閱讀 45,644評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡憾股,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,837評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現自己被綠了箕慧。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片荔燎。...
    茶點故事閱讀 39,953評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖销钝,靈堂內的尸體忽然破棺而出有咨,到底是詐尸還是另有隱情,我是刑警寧澤蒸健,帶...
    沈念sama閱讀 35,673評論 5 346
  • 正文 年R本政府宣布座享,位于F島的核電站婉商,受9級特大地震影響,放射性物質發(fā)生泄漏渣叛。R本人自食惡果不足惜丈秩,卻給世界環(huán)境...
    茶點故事閱讀 41,281評論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望淳衙。 院中可真熱鬧蘑秽,春花似錦、人聲如沸箫攀。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,889評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽休偶。三九已至,卻和暖如春八秃,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背骤肛。 一陣腳步聲響...
    開封第一講書人閱讀 33,011評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人观蓄。 一個月前我還...
    沈念sama閱讀 48,119評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像亲茅,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子袭祟,可洞房花燭夜當晚...
    茶點故事閱讀 44,901評論 2 355

推薦閱讀更多精彩內容