创建jdbc应用(4+6+6+6)

第1天(4课时)

创建jdbc应用

创建jdbc应用步骤分7步

1)载入jdbc驱动(指定我要连接到哪种数据库,连接不同数据库用不同驱动)

2)定义连接url(连接准备 url,端口,用户名,密码)

3)建立连接

4)创建PreparedStatement(动态) Statement(静态的)(拼sql语句)

5)执行数据库命令(crud)

6)结果的处理

7)关闭连接

浓缩

1,2连接准备---> 3 连接 ----> 4,5给数据库下指令---> 6处理结果---> 7关闭连接

连接各数据库的文档放在

E:\java16\javase\手册\JDBC—数据库的连接字符串及连接方法(各类数据库)

代码开始

建包

右键src new-package-输入com.neuedu.jdbc -ok

建类

右键包-new class-JdbcInsert.java

public class JdbcInsert {

@Test

public void insert(){

}

}

引入junit

用@Test因为没有引junit会报错,鼠标点击红色叉号,接eclipse指示引入junit

1)载入jdbc驱动(指定我要连接到哪种数据库,连接不同数据库用不同驱动)

https://www.runoob.com/w3cnote/java-class-forname.html

Class.forName("com.mysql.jdbc.Driver");

注意,要把mysql jar包引到工程里。

操作方法:工程右键-build path-configure build path-add libraries选项卡-add exteral jar -选中mysql的jar包-ok

2)定义连接url(连接准备 url,端口,用户名,密码)

String url="jdbc:mysql://localhost:3306/java16?characterEncoding=UTF-8&useUnicode=true";String user="root";String password="root";

3)建立连接

Connection conn=DriverManager.getConnection(url, user, password);

4)创建PreparedStatement(动态) Statement(静态的)(拼sql语句)

Statement st=conn.createStatement();

5)执行数据库命令(crud)

executeUpdate:  用于 insert update delete

executeQuery:  用于 select

ResultSet rs= st.executeQuery("select empno,ename,deptno from emp where deptno=10");

6)结果的处理

while(rs.next()){//双引号里是数据库里的字段名,Stringe_name=rs.getString("ename");System.out.println(e_name);intemp_no=rs.getInt("empno");System.out.println(emp_no);intdeptno=rs.getInt("deptno");System.out.println(deptno);}

7)关闭连接

rs.close();st.close();conn.close();

完整代码

@Testpublicvoidquery()throws ClassNotFoundException,SQLException{//1)载入jdbc驱动(指定我要连接到哪种数据库,连接不同数据库用不同驱动)Class.forName("com.mysql.jdbc.Driver");//2)定义连接url(连接准备 url,端口,用户名,密码)Stringurl="jdbc:mysql://localhost:3306/java16?characterEncoding=UTF-8&useUnicode=true";Stringuser="root";Stringpassword="root";//3)建立连接Connectionconn=DriverManager.getConnection(url,user,password);//4)创建PreparedStatement(动态) Statement(静态的)(拼sql语句)Statementst=conn.createStatement();//5)执行数据库命令(crud)  //executeUpdate  insert update delete//executeQuery select//查询10号部门的员工的员工编号,员工姓名,部门编号ResultSetrs=st.executeQuery("select empno,ename,deptno from emp where deptno=10");//6)结果的处理while(rs.next()){//双引号里是数据库里的字段名,Stringe_name=rs.getString("ename");System.out.println(e_name);intemp_no=rs.getInt("empno");System.out.println(emp_no);intdeptno=rs.getInt("deptno");System.out.println(deptno);}//7)关闭连接rs.close();st.close();conn.close();}

发现异常不显示,改造代码

@Testpublicvoidquery1(){Connectionconn=null;Statementst=null;ResultSetrs=null;try{// 1)载入jdbc驱动(指定我要连接到哪种数据库,连接不同数据库用不同驱动)Class.forName("com.mysql.jdbc.Driver");// 2)定义连接url(连接准备 url,端口,用户名,密码)Stringurl="jdbc:mysql://localhost:3306/java16?characterEncoding=UTF-8&useUnicode=true";Stringuser="root";Stringpassword="root";// 3)建立连接conn=DriverManager.getConnection(url,user,password);// 4)创建PreparedStatement(动态) Statement(静态的)(拼sql语句)st=conn.createStatement();// 5)执行数据库命令(crud)// executeUpdate insert update delete// executeQuery select// 查询10号部门的员工的员工编号,员工姓名,部门编号rs=st.executeQuery("select empno,ename,deptno from emp where deptno=10");// 6)结果的处理while(rs.next()){// 双引号里是数据库里的字段名,Stringe_name=rs.getString("ename");System.out.println(e_name);intemp_no=rs.getInt("empno");System.out.println(emp_no);intdeptno=rs.getInt("deptno");System.out.println(deptno);}}catch(Exceptione){e.printStackTrace();}finally{// 7)关闭连接try{rs.close();st.close();conn.close();}catch(SQLExceptione){// TODO Auto-generated catch blocke.printStackTrace();}}}

添加 修改 删除执行的是executeUpdate 返回类型为int而不是ResultSet,所以,这三种操作没有结果集

删除代码如下:

@Testpublicvoiddel(){Connection conn=null;Statement st=null;try{// 1)载入jdbc驱动(指定我要连接到哪种数据库,连接不同数据库用不同驱动)Class.forName("com.mysql.jdbc.Driver");// 2)定义连接url(连接准备 url,端口,用户名,密码)String url="jdbc:mysql://localhost:3306/java16?characterEncoding=UTF-8&useUnicode=true";String user="root";String password="root";// 3)建立连接conn=DriverManager.getConnection(url,user,password);// 4)创建PreparedStatement(动态) Statement(静态的)(拼sql语句)st=conn.createStatement();// 5)执行数据库命令(crud)// executeUpdate insert update delete// executeQuery select// 查询10号部门的员工的员工编号,员工姓名,部门编号int count=st.executeUpdate("delete from emp_back where ename='SCOTT'");System.out.println(count);}catch(Exceptione){e.printStackTrace();}finally{// 7)关闭连接try{st.close();conn.close();}catch(SQLExceptione){// TODO Auto-generated catch blocke.printStackTrace();}}}

作业

1)练习修改和删除

2)写添加和修改

第2天(6课时)

项目阶段(正常)

1)立项

2)需求分析(需求规格说明书)

3)概要设计(界面原型 部署模型 架构)

4)详细设计(包 类 内部接口(输入、输出) 流程图  外部接口)

5)编码(实现类)

6)测试(单元测试 集成测试 模拟现场环境做一个测试环境 性能测试)

7)部署实施(部署到生产环境)

8)上线运行

项目阶段(有时)

1)立项

2)需求分析(需求规格说明书)

3)概要设计(界面原型 部署模型 架构)

5)编码(实现类)

6)测试(单元测试 集成测试 模拟现场环境做一个测试环境 性能测试)

7)部署实施(部署到生产环境)

8)详细设计(包 类 内部接口(输入、输出) 流程图  外部接口)

9)上线运行

10)验收

用户注册

字段:用户id,用户名,密码,邮箱,权限

表名:t_*****

建表语句

/*

Navicat MySQL Data Transfer

Source Server : mysql

Source Server Version : 50553

Source Host  : localhost:3306

Source Database  : java16

Target Server Type: MYSQL

Target Server Version : 50553

File Encoding : 65001

Date: 2018-10-17 10:30:43

*/SET FOREIGN_KEY_CHECKS=0;--------------------------------Table structurefort_user------------------------------DROP TABLE IF EXISTS`t_user`;CREATE TABLE`t_user`(`user_id`int(11)NOT NULL AUTO_INCREMENT,`user_name`varchar(20)NOT NULL,`user_pwd`varchar(20)NOT NULL,`user_email`varchar(100)DEFAULT NULL,`user_power`int(11)NOT NULL,PRIMARY KEY(`user_id`))ENGINE=InnoDB DEFAULT CHARSET=utf8;SET FOREIGN_KEY_CHECKS=1;

实体类

publicclassUser{// 用户idprivateintid;// 登录名privateString name;// 密码privateString password;// 邮箱privateString email;// 权限 0-普通用户 1-管理员privateintpower=0;publicintgetId(){returnid;}publicvoidsetId(intid){this.id=id;}publicStringgetName(){returnname;}publicvoidsetName(String name){this.name=name;}publicStringgetPassword(){returnpassword;}publicvoidsetPassword(String password){this.password=password;}publicStringgetEmail(){returnemail;}publicvoidsetEmail(String email){this.email=email;}publicintgetPower(){returnpower;}publicvoidsetPower(intpower){this.power=power;}}

开发主页

package com.neuedu.jdbc.menu;import java.util.Scanner;publicclassMainMenu{publicstaticvoidmain(String[]args){while(true){System.out.println("欢迎使用neusoft用户管理系统");System.out.println("======================");System.out.println("用户登录---------------1");System.out.println("用户注册---------------2");System.out.println("退出程序---------------3");Scannersc=newScanner(System.in);//接受用户输入intchoice=sc.nextInt();switch(choice){//根据用户输入,进入不同界面case1:// @todo进入用户登录界面System.out.println("用户登录");break;case2://用户注册RegMenuregMenu=newRegMenu();regMenu.show();break;case3:System.exit(0);default:System.out.println("不好意思,您输入错误!");break;}}}}

开发注册页

package com.neuedu.jdbc.menu;import java.util.Scanner;import com.neuedu.jdbc.dao.UserManagerDao;import com.neuedu.jdbc.pojo.User;publicclassRegMenu{publicvoidshow(){//业务层,中间如果有涉及数据库的,咱们调用dao(数据访问对象)类去存库//让用户输入个人信息System.out.println("用户注册界面");System.out.println("======================");Scannersc=newScanner(System.in);System.out.println("请输入您的用户名:");StringuserName=sc.next();System.out.println("请输入您的密码:");StringuserPwd=sc.next();System.out.println("请输入您的邮箱:");Stringemail=sc.next();//@todo做一些必要验证//封装好一个对象,用于调用存库方法时用Useruser=newUser();user.setEmail(email);user.setUserName(userName);user.setUserPwd(userPwd);//把个人信息存库  int 型的结果//需要调用 dao层进行存库UserManagerDaoumd=newUserManagerDao();intresult=umd.addUser(user);//根据返回结果给用户提示if(result>0){System.out.println("注册成功");}else{System.out.println("注册失败");}//回到主界面return;}}

创建实现类

packagecom.neuedu.jdbc.dao;importjava.sql.Connection;importjava.sql.DriverManager;importjava.sql.PreparedStatement;importjava.sql.SQLException;importcom.neuedu.jdbc.pojo.User;publicclassUserManagerDao{publicintaddUser(Useruser){Connectionconn=null;PreparedStatementptst=null;intresult=0;try{Class.forName("com.mysql.jdbc.Driver");Stringurl="jdbc:mysql://localhost:3306/java13?characterEncoding=UTF-8&useUnicode=true";Stringusername="root";Stringpassword="root";conn=DriverManager.getConnection(url,username,password);ptst=conn.prepareStatement("insert into t_user values(null,?,?,?,?)");ptst.setString(1,user.getUserName());ptst.setString(2,user.getUserPwd());ptst.setString(3,user.getEmail());ptst.setInt(4,user.getUserPower());result=ptst.executeUpdate();}catch(ClassNotFoundException|SQLExceptione){// TODO Auto-generated catch blocke.printStackTrace();}finally{try{ptst.close();conn.close();}catch(SQLExceptione){// TODO Auto-generated catch blocke.printStackTrace();}}returnresult;}}

作业

练习注册功能

思考用户登录功能开发

第3天(6课时)

第一项任务:把昨天写的代码全删除,从头来一遍(3课时)

新建项目-定义实体类-写main方法-定义menu-写dao接口-写dao实现类,整个上午做完注册全流程

第二项任务:登录功能开发

登录功能

登录用户缓存

packagecom.neuedu.jdbc.menu;importcom.neuedu.jdbc.pojo.User;/**

    * 虚拟缓存

    * @author Administrator

    *

    */publicclassLoginUser{//共享对象publicstaticUsercurrentUser;publicstaticUsergetCurrentUser(){returncurrentUser;}publicstaticvoidsetCurrentUser(UsercurrentUser){LoginUser.currentUser=currentUser;}}

LoginMenu

package com.neuedu.jdbc.menu;import java.util.Scanner;import com.neuedu.jdbc.dao.UserManagerDao;import com.neuedu.jdbc.pojo.User;publicclassLoginMenu{publicvoidshow(){System.out.println("欢迎登录界面");System.out.println("======================");Scannersc=newScanner(System.in);System.out.println("请输入您的用户名");StringuserName=sc.next();System.out.println("请输入您的密码");StringuserPwd=sc.next();//封装一个user对象Useruser=newUser();user.setUserName(userName);user.setUserPwd(userPwd);//调用dao的鉴权方法,验证用户名密码正确性UserManagerDaoumd=newUserManagerDao();//根据用户名密码查询用户UserdbUser=umd.findUserByNameAndPassword(user);//如果用户查询到了,进一步做if(null!=dbUser){System.out.println("登录成功!");LoginUser.currentUser=dbUser;//向缓存里存一个user对象,static 的,修改成功后,把对象更新if(dbUser.getUserPower()==0){//跳转到普通用户界面UserMenuum=newUserMenu();um.show();}else{//跳转到管理员界面 学生独立完成}}else{System.out.println("没有查询到该用户");return;}}}

UserManagerDao

publicUserfindUserByNameAndPassword(User user){User db_user=null;Connection conn=null;PreparedStatement ps=null;ResultSet rs=null;try{//加载驱动Class.forName("com.mysql.jdbc.Driver");String url="jdbc:mysql://localhost:3306/java13?characterEncoding=UTF-8&useUnicode=true";String userName="root";String password="root";//获取连接conn=DriverManager.getConnection(url,userName,password);//新建查询,预处理语句//根据用户名和密码查询用户ps=conn.prepareStatement("select * from t_user where user_name=? and user_pwd=?");ps.setString(1,user.getUserName());ps.setString(2,user.getUserPwd());//查询要返回结果集rs=ps.executeQuery();//对结果集进行处理 如果确认返回结果是一行用if,如果是多条,用whileif(rs.next()){//?db_user=newUser();db_user.setId(rs.getInt("user_id"));db_user.setUserName(rs.getString("user_name"));db_user.setUserPwd(rs.getString("user_pwd"));db_user.setEmail(rs.getString("user_email"));db_user.setUserPower(rs.getInt("user_power"));}}catch(ClassNotFoundException|SQLException e){// TODO Auto-generated catch blocke.printStackTrace();}finally{try{rs.close();ps.close();conn.close();}catch(SQLException e){// TODO Auto-generated catch blocke.printStackTrace();}}// TODO Auto-generated method stubreturndb_user;}

UserMenu

package com.neuedu.jdbc.menu;import java.util.Scanner;import com.neuedu.jdbc.pojo.User;publicclassUserMenu{//四种//无参无返回值的 public void  methodName();//无参有返回值的public String methodName();//有参无返回值的 public void methodName(String username,String password);//          public void methodName(User);//有参有返回值的 public void methodName(String username,String password);//返回权限修饰符  返回值类型  方法名(参数列表)//这个方法可以接受参数类型为User的,返回为void的,方法名为show()publicvoidshow(){while(true){System.out.println(LoginUser.currentUser.getUserName()+"您好:"+"您的权限是普通用户");System.out.println("=========================");System.out.println("修改个人信息---------------1");System.out.println("查询个人信息---------------2");System.out.println("退出程序------------------3");Scannersc=newScanner(System.in);//接受用户输入intchoice=sc.nextInt();switch(choice){case1:System.out.println("修改自己的信息");UpdateUserMenuupdateMenu=newUpdateUserMenu();updateMenu.show();break;case2://查询个人信息System.out.println(LoginUser.currentUser.getId()+" "+LoginUser.currentUser.getUserName()+" "+LoginUser.currentUser.getUserPwd()+" "+LoginUser.currentUser.getEmail()+"普通用户");break;case3:System.exit(0);break;default:System.out.println("选项错误!");break;}}}}

UpdateUserMenu

package com.neuedu.jdbc.menu;importjava.util.Scanner;importcom.neuedu.jdbc.dao.UserManagerDao;importcom.neuedu.jdbc.pojo.User;publicclassUpdateUserMenu{publicvoidshow(){//从缓存中获取当前用户信息Userold_user=LoginUser.currentUser;System.out.println("您现在的信息是"+old_user.getId()+old_user.getUserName()+old_user.getUserPower()+old_user.getEmail());System.out.println("================");Scannersc=newScanner(System.in);System.out.println("请输入要修改的姓名");Stringnew_Name=sc.next();System.out.println("请输入要修改的密码");Stringnew_Pwd=sc.next();System.out.println("请输入要修改的邮箱");Stringnew_email=sc.next();Usernew_user=newUser();new_user.setId(old_user.getId());new_user.setEmail(new_email);new_user.setUserName(new_Name);new_user.setUserPwd(new_Pwd);//给dao传过去,入库去UserManagerDaoupDate=newUserManagerDao();//添加,修改,删除都返回intintcount=upDate.updateUser(new_user);if(count>0){System.out.println("修改成功");//更新组成存的用户信息LoginUser.currentUser=new_user;}else{System.out.println("修改失败");}}}

MainMenu

......

case 1:

//用户登录

LoginMenu loginMenu=new LoginMenu();

loginMenu.show();

break;

......

修改用户信息关键代码

public intupdateUser(User new_user){Connection conn=null;PreparedStatement ps=null;int result=0;try{Class.forName("com.mysql.jdbc.Driver");String url="jdbc:mysql://localhost:3306/java13?characterEncoding=UTF-8&useUnicode=true";String userName="root";String password="root";conn=DriverManager.getConnection(url,userName,password);ps=conn.prepareStatement("update t_user set user_name=?,user_pwd=?,user_email=? where user_id=? ");ps.setString(1,new_user.getUserName());ps.setString(2,new_user.getUserPwd());ps.setString(3,new_user.getEmail());ps.setInt(4,new_user.getId());//返回条数result=ps.executeUpdate();}catch(ClassNotFoundException|SQLException e){// TODO Auto-generated catch blocke.printStackTrace();}finally{try{ps.close();conn.close();}catch(SQLExceptione){// TODO Auto-generated catch blocke.printStackTrace();}}returnresult;}

第四天

制作数据库工具类

第一步:建包

new -package-com.neuedu.utils

制作数据库工具类

第一步:建包

new -package-com.neuedu.utils

publicclassDBUtil{// 用于数据库连接的方法publicstaticConnectiongetConnection(){Connectionconn=null;try{Class.forName("com.mysql.jdbc.Driver");Stringurl="jdbc:mysql://localhost:3306/java16?characterEncoding=UTF-8&useUnicode=true";StringUserName="root";Stringpassword="root";conn=DriverManager.getConnection(url,UserName,password);}catch(Exceptione){e.printStackTrace();System.out.println("数据库连接异常"+e.getMessage());}returnconn;}publicstaticvoidcloseConnection(ResultSetrs,Statementst,Connectionconn){try{if(rs!=null){rs.close();}if(st!=null){st.close();}if(conn!=null){conn.close();}}catch(SQLExceptione){e.printStackTrace();System.out.println("关闭连接异常"+e.getMessage());}}}

引入db.propertis

driver=com.mysql.jdbc.Driverurl=jdbc:mysql://localhost:3306/java16?characterEncoding=UTF-8&useUnicode=trueuserName=rootpassWord=root

完整代码

packagecom.neuedu.utils;importjava.sql.Connection;importjava.sql.DriverManager;importjava.sql.ResultSet;importjava.sql.SQLException;importjava.sql.Statement;importjava.util.Properties;publicclassDBUtil{// 用于数据库连接的方法publicstaticConnectiongetConnection(){Connection conn=null;try{//载入资源文件Properties prop=newProperties();prop.load(DBUtil.class.getResourceAsStream("/db.properties"));//读取资源文件各属性String driver=prop.getProperty("driver");String url=prop.getProperty("url");String UserName=prop.getProperty("userName");String password=prop.getProperty("passWord");Class.forName(driver);conn=DriverManager.getConnection(url,UserName,password);}catch(Exception e){e.printStackTrace();System.out.println("数据库连接异常"+e.getMessage());}returnconn;}publicstaticvoidcloseConnection(ResultSet rs,Statement st,Connection conn){try{if(rs!=null){rs.close();}if(st!=null){st.close();}if(conn!=null){conn.close();}}catch(SQLException e){e.printStackTrace();System.out.println("关闭连接异常"+e.getMessage());}}}

查询所有用户关键代码

dao实现类

@OverridepublicList<User>findAll(){conn=DBUtil.getConnection();List<User>userList=newArrayList();try{st=conn.prepareStatement("select * from t_user");rs=st.executeQuery();while(rs.next()){//每次都新实例化一个对象Useruser=newUser();//把从数据库查询到的记录封装到对象里user.setId(rs.getInt("user_id"));user.setName(rs.getString("user_name"));user.setPassword(rs.getString("user_pwd"));user.setEmail(rs.getString("user_email"));user.setPower(rs.getInt("user_power"));//把对象放到list里userList.add(user);}}catch(SQLExceptione){// TODO Auto-generated catch blocke.printStackTrace();}returnuserList;}

页面展示

System.out.println("查询结果");for(Useru:userlist){System.out.println(u.getId()+"  "+u.getName()+"  "+u.getPassword()+"  "+u.getEmail()+"  "+u.getPower());System.out.println("================================================");}

作业:

学生独立完成项目

转至:↓↓↓

链接:https://www.jianshu.com/p/0d1803e78d37

来源:简书

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,214评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,307评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,543评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,221评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,224评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,007评论 1 284
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,313评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,956评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,441评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,925评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,018评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,685评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,234评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,240评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,464评论 1 261
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,467评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,762评论 2 345