JDBC实战--打通数据库

代码实现:

 package com.imooc.db;

 import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement; import com.imooc.model.Goddess; public class DBUtil { private static final String URL = "jdbc:mysql://127.0.0.1:3306/imooc?useUnicode=true&characterEncoding=utf-8";
private static final String USER = "root";
private static final String PASSWORD = "123456"; public static void main(String[] args) throws Exception {
// 1.加载驱动程序
Class.forName("com.mysql.jdbc.Driver");// 反射机制,通过一个类名去反向的将这个类加载到我们的环境中
// 2.获得数据库的连接
Connection conn = DriverManager.getConnection(URL, USER, PASSWORD);// DriverManager驱动类
// 3.通过数据库的连接操作数据库,实现增删改查
Statement stmt = conn.createStatement();
// 执行查询,返回ResultSet对象
ResultSet rs = stmt
.executeQuery("select user_name,age from imooc_goddess");
// rs.next()返回的是true,证明对象rs里面有数据
while (rs.next()) {
// 如果对象rs里面有数据,就会循环打印出来,如果没有,这个循环就不会走
System.out.println(rs.getString("user_name") + ","
+ rs.getInt("age"));
} }
}

数据库数据

imooc/imooc_goddess

运行结果:

测试数据库连接成功,能够从数据库读取到数据。

控制台输出

模型(三层架构)主要包括两个部分:对应数据库映射、对数据库映射的抽象方法(CRUD:增、删、改、查)

控制层:控制数据流通过程。把数据拼装起来,展示给视图层

视图层:对数据的展示

模型层:数据处理,业务逻辑

把视图层的展示、业务逻辑、数据存储的过程分离开来,通过控制层来协调控制。

视图层:是用来数据展示用的,为了给用户展示出程序运行的结果

控制层(Controller):更新模型层,更新视图层

java基础——静态块:静态块执行的是最早的

JDBC实战--搭建模型层(DAO层)

数据库对应的实体类

 package com.imooc.model;

 import java.util.Date;

 public class Goddess {
//这些属性分别对应数据库的字段
private Integer id;
private String user_name;
private Integer sex;
private Integer age;
private Date birthday;
private String email;
private String mobile;
private String create_user;
private String update_user;
private Date create_date;
private Date update_date;
private Integer isdel; public Integer getId() {
return id;
} public void setId(Integer id) {
this.id = id;
} public String getUser_name() {
return user_name;
} public void setUser_name(String user_name) {
this.user_name = user_name;
} public Integer getSex() {
return sex;
} public void setSex(Integer sex) {
this.sex = sex;
} public Integer getAge() {
return age;
} public void setAge(Integer age) {
this.age = age;
} public Date getBirthday() {
return birthday;
} public void setBirthday(Date birthday) {
this.birthday = birthday;
} public String getEmail() {
return email;
} public void setEmail(String email) {
this.email = email;
} public String getMobile() {
return mobile;
} public void setMobile(String mobile) {
this.mobile = mobile;
} public String getCreate_user() {
return create_user;
} public void setCreate_user(String create_user) {
this.create_user = create_user;
} public String getUpdate_user() {
return update_user;
} public void setUpdate_user(String update_user) {
this.update_user = update_user;
} public Date getCreate_date() {
return create_date;
} public void setCreate_date(Date create_date) {
this.create_date = create_date;
} public Date getUpdate_date() {
return update_date;
} public void setUpdate_date(Date update_date) {
this.update_date = update_date;
} public Integer getIsdel() {
return isdel;
} public void setIsdel(Integer isdel) {
this.isdel = isdel;
} @Override
public String toString() {
return "Goddess [id=" + id + ", user_name=" + user_name + ", sex="
+ sex + ", age=" + age + ", birthday=" + birthday + ", email="
+ email + ", mobile=" + mobile + ", create_user=" + create_user
+ ", update_user=" + update_user + ", create_date="
+ create_date + ", update_date=" + update_date + ", isdel="
+ isdel + "]";
}
}

模型层:CRUD(增、删、改、查)

控制层:接收视图层的参数,调用模型层,模型层把结果通知给控制层,控制层把结果更新给视图层,展示给用户,起着桥梁的作用

新的执行sql语句的方法:预编译sql语句

测试新增女神的方法:

测试结果:

数据库更新

java.sql.Date是java.util.Date的子集

新增女神代码实现:

 //新增女神
public void addGoddess(Goddess g) throws Exception{
Connection conn=DBUtil.getConnection();//1、获得数据库连接
//编译sql语句,给sql语句传递参数
//2、拼写sql语句,执行SQL语句
String sql="" +
"insert into imooc_goddess" +
"(user_name,sex,age,birthday,email,mobile," +
"create_user,create_date,update_user,update_date,isdel)" +
"values(" +
//参数用问号表示,相当于占位符,有几个参数就有几个问号,再给这些参数来进行赋值,到真正执行的时候,这些参数会加载到这个sql语句,把这个sql语句拼接完整,再去执行。这样就会减少对数据库操作
//要是不用前台传递参数,可以在sql语句里面直接写入。例:current_date()
"?,?,?,?,?,?,?,current_date(),?,current_date(),?)";
//将sql语句加载到驱动程序的执行程序中,但是并不直接执行,而是当它调用execute方法的时候才真正执行
//3、预编译
PreparedStatement ptmt=conn.prepareStatement(sql); //4、传参给预编译符?去赋值
//ptmt.setString(1,user_name);
//传递参数,user_name这个值不能写死,应该通过方法来传进来,这样我们就可以在视图层插入数据
//前台只需将值通过setter方法,就可以把数据集成的传递过来
ptmt.setString(1, g.getUser_name());//传递第一个参数,设置第一个?占位符的值
ptmt.setInt(2, g.getSex());
ptmt.setInt(3, g.getAge());
//ptmt.setDate(4, g.getBirthday());需要的参数是sql.Date类型的日期类型,但是传进来的值是java.util.Date,类型不符,需要转换
////定义一个java.sql.Date类型的data,new Date(date),然后将我们的值g.getBirthday().getTime()传进去
//getTime() 方法可返回距 1970 年 1 月 1 日之间的毫秒数。
ptmt.setDate(4, new Date(g.getBirthday().getTime()));
ptmt.setString(5, g.getEmail());
ptmt.setString(6, g.getMobile());
ptmt.setString(7, g.getCreate_user());
ptmt.setString(8, g.getUpdate_user());
ptmt.setInt(9, g.getIsdel());
//5、调用execute方法的时候才真正执行
ptmt.execute();
}

新增女神功能测试:

 public static void main(String[] args) throws Exception {

         //1、测试新增女神功能
GoddessDao g=new GoddessDao(); //定义女神对象
Goddess g1=new Goddess(); g1.setUser_name("小夏");
g1.setAge(22);
g1.setSex(1);
g1.setBirthday(new Date());
g1.setEmail("xiaxia@imooc.com");
g1.setMobile("18766888866");
g1.setCreate_user("ADMIN");
g1.setUpdate_user("ADMIN");
g1.setIsdel(1); g.addGoddess(g1);
}

运行结果:

数据库表格imooc_goddess数据更新:

JDBC实战--搭建视图层

课程总结

检验代码采用MVC三层架构模式

模型层:实体类+DAO层(封装了对数据库操作的代码),和数据库打交道

Control(控制层):负责调用模型层

View(视图层):调用控制层

这种方式将应用程序和数据库分开了,没有中间的过程,没有中间ODBC,厂商API,也没有中间服务器,是直接和数据库打交道,所有效率上会很高。

具体代码实现:

模型层:实体类+DAO层

 package com.imooc.model;

 import java.util.Date;
//模型层(实体类+DAO层:封装了对数据库操作的代码)
//实体类第一个字母一定要大写
public class Goddess {
//这些属性分别对应数据库的字段
private Integer id;
private String user_name;
private Integer sex;
private Integer age;
private Date birthday;
private String email;
private String mobile;
private String create_user;//创建人
private String update_user;//更新人
private Date create_date;//创建时间
private Date update_date;//更新时间
private Integer isdel;//是否删除的标记。setIsdel(1):不删除 public Integer getId() {
return id;
} public void setId(Integer id) {
this.id = id;
} public String getUser_name() {
return user_name;
} public void setUser_name(String user_name) {
this.user_name = user_name;
} public Integer getSex() {
return sex;
} public void setSex(Integer sex) {
this.sex = sex;
} public Integer getAge() {
return age;
} public void setAge(Integer age) {
this.age = age;
} public Date getBirthday() {
return birthday;
} public void setBirthday(Date birthday) {
this.birthday = birthday;
} public String getEmail() {
return email;
} public void setEmail(String email) {
this.email = email;
} public String getMobile() {
return mobile;
} public void setMobile(String mobile) {
this.mobile = mobile;
} public String getCreate_user() {
return create_user;
} public void setCreate_user(String create_user) {
this.create_user = create_user;
} public String getUpdate_user() {
return update_user;
} public void setUpdate_user(String update_user) {
this.update_user = update_user;
} public Date getCreate_date() {
return create_date;
} public void setCreate_date(Date create_date) {
this.create_date = create_date;
} public Date getUpdate_date() {
return update_date;
} public void setUpdate_date(Date update_date) {
this.update_date = update_date;
} public Integer getIsdel() {
return isdel;
} public void setIsdel(Integer isdel) {
this.isdel = isdel;
} //重写一个toString方法
@Override
public String toString() {
return "Goddess [id=" + id + ", user_name=" + user_name + ", sex="
+ sex + ", age=" + age + ", birthday=" + birthday + ", email="
+ email + ", mobile=" + mobile + ", create_user=" + create_user
+ ", update_user=" + update_user + ", create_date="
+ create_date + ", update_date=" + update_date + ", isdel="
+ isdel + "]";
}
}
 package com.imooc.dao;

 import java.sql.Connection;
import java.sql.Date;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map; import com.imooc.db.DBUtil;
import com.imooc.model.Goddess;
//模型层(实体类+DAO层:封装了对数据库操作的代码)
//执行业务方法
public class GoddessDao {
//新增女神
public void addGoddess(Goddess g) throws Exception{
Connection conn=DBUtil.getConnection();//1、获得数据库连接
//编译sql语句,给sql语句传递参数
//2、拼写sql语句,执行SQL语句
String sql="" +
"insert into imooc_goddess" +
"(user_name,sex,age,birthday,email,mobile," +
"create_user,create_date,update_user,update_date,isdel)" +
"values(" +
//参数用问号表示,相当于占位符,有几个参数就有几个问号,再给这些参数来进行赋值,到真正执行的时候,这些参数会加载到这个sql语句,把这个sql语句拼接完整,再去执行。这样就会减少对数据库操作
//要是不用前台传递参数,可以在sql语句里面直接写入。例:current_date()
"?,?,?,?,?,?,?,current_date(),?,current_date(),?)";
//将sql语句加载到驱动程序的执行程序中,但是并不直接执行,而是当它调用execute方法的时候才真正执行
//3、预编译
PreparedStatement ptmt=conn.prepareStatement(sql); //4、传参给预编译符?去赋值 //ptmt.setString(1,user_name);
//传递参数,user_name这个值不能写死,应该通过方法来传进来,这样我们就可以在视图层插入数据
//前台只需将值通过setter方法,就可以把数据集成的传递过来
ptmt.setString(1, g.getUser_name());//传递第一个参数,设置第一个?占位符的值
ptmt.setInt(2, g.getSex());
ptmt.setInt(3, g.getAge());
//ptmt.setDate(4, g.getBirthday());需要的参数是sql.Date类型的日期类型,但是传进来的值是java.util.Date,类型不符,需要转换
////定义一个java.sql.Date类型的data,new Date(date),然后将我们的值g.getBirthday().getTime()传进去
//getTime() 方法可返回距 1970 年 1 月 1 日之间的毫秒数。
ptmt.setDate(4, new Date(g.getBirthday().getTime()));
ptmt.setString(5, g.getEmail());
ptmt.setString(6, g.getMobile());
ptmt.setString(7, g.getCreate_user());
ptmt.setString(8, g.getUpdate_user());
ptmt.setInt(9, g.getIsdel());
//5、调用execute方法的时候才真正执行
ptmt.execute();
}
//修改女神
public void updateGoddess(Goddess g) throws SQLException{//参数通过对象的形式Goddess g传进来
Connection conn=DBUtil.getConnection();
//sql语句之间加上空格,因为等到执行的时候会变成一行,如果不加空格的话,前后的字符就会在一起,这样就会报sql错误
String sql="" +
//更新女神表
" update imooc_goddess " +
//设置用户名···等于新的值
" set user_name=?,sex=?,age=?,birthday=?,email=?,mobile=?, " +
//更新人,更新时间,是否删除
" update_user=?,update_date=current_date(),isdel=? " +
//通过where条件更新其中一条记录,而不是更新所有记录即整个女神表
" where id=? ";
PreparedStatement ptmt=conn.prepareStatement(sql); ptmt.setString(1, g.getUser_name());
ptmt.setInt(2, g.getSex());
ptmt.setInt(3, g.getAge());
ptmt.setDate(4, new Date(g.getBirthday().getTime()));
ptmt.setString(5, g.getEmail());
ptmt.setString(6, g.getMobile());
ptmt.setString(7, g.getUpdate_user());
ptmt.setInt(8, g.getIsdel());
ptmt.setInt(9, g.getId());
ptmt.execute();
}
//删除女神
public void delGoddess(Integer id) throws SQLException{//参数不用传递对象,只需要传递一个id进来就可以了
Connection conn=DBUtil.getConnection(); String sql="" +
" delete from imooc_goddess " +
//根据主键id来删
" where id=? ";
PreparedStatement ptmt=conn.prepareStatement(sql);
//需要一个参数id就可以了
ptmt.setInt(1, id);
ptmt.execute();
}
//查询女神,相当于全部查询,不管这张表里面有对少条记录我们都会查询出来,没有加过滤条件
public List<Goddess> query() throws Exception{
List<Goddess> result=new ArrayList<Goddess>(); Connection conn=DBUtil.getConnection();
StringBuilder sb=new StringBuilder();
sb.append("select id,user_name,age from imooc_goddess ");//没有加过滤条件 PreparedStatement ptmt=conn.prepareStatement(sb.toString());
//执行查询,返回ResultSet对象
ResultSet rs=ptmt.executeQuery(); Goddess g=null;
//rs.next()返回的是true,证明对象rs里面有数据
while(rs.next()){
g=new Goddess();
g.setId(rs.getInt("id"));
g.setUser_name(rs.getString("user_name"));
g.setAge(rs.getInt("age"));
result.add(g);
}
return result;
} //优化的查询方法,加一个查询参数:女神姓名
//查询女神,相当于全部查询,不管这张表里面有对少条记录我们都会查询出来,没有加过滤条件
public List<Goddess> query(String name) throws Exception{
List<Goddess> result=new ArrayList<Goddess>(); Connection conn=DBUtil.getConnection();
StringBuilder sb=new StringBuilder();
sb.append("select * from imooc_goddess "); sb.append(" where user_name=? ");
//预编译sql语句
PreparedStatement ptmt=conn.prepareStatement(sb.toString());
//把参数传入
ptmt.setString(1, name);
//将sql语句打印出来
System.out.println(sb.toString());
//执行查询
ResultSet rs=ptmt.executeQuery(); Goddess g=null;
//rs.next()返回的是true,证明对象rs里面有数据
//遍历结果集
while(rs.next()){
g=new Goddess();
g.setId(rs.getInt("id"));
g.setUser_name(rs.getString("user_name"));
g.setAge(rs.getInt("age"));
g.setSex(rs.getInt("sex"));
g.setBirthday(rs.getDate("birthday"));
g.setEmail(rs.getString("email"));
g.setMobile(rs.getString("mobile"));
g.setCreate_date(rs.getDate("create_date"));
g.setCreate_user(rs.getString("create_user"));
g.setUpdate_date(rs.getDate("update_date"));
g.setUpdate_user(rs.getString("update_user"));
g.setIsdel(rs.getInt("isdel")); result.add(g);
}
return result;
} //通过一个参数一个参数传进来
//查询女神,参数:姓名、手机号、邮箱,按照女神的姓名、手机号、邮箱来查询
public List<Goddess> query(String name,String mobile,String email) throws Exception{
List<Goddess> result=new ArrayList<Goddess>(); Connection conn=DBUtil.getConnection();
StringBuilder sb=new StringBuilder();
sb.append("select * from imooc_goddess ");//全部查询,没有过滤条件
//加上查询参数
sb.append(" where user_name like ? and mobile like ? and email like ?"); PreparedStatement ptmt=conn.prepareStatement(sb.toString());
//这边的查询参数是写死的,但可以通过集合方式传进来,更加便捷
ptmt.setString(1, "%"+name+"%");//%通配符
ptmt.setString(2, "%"+mobile+"%");
ptmt.setString(3, "%"+email+"%");
System.out.println(sb.toString());
ResultSet rs=ptmt.executeQuery(); Goddess g=null;
while(rs.next()){
g=new Goddess();
g.setId(rs.getInt("id"));
g.setUser_name(rs.getString("user_name"));
g.setAge(rs.getInt("age"));
g.setSex(rs.getInt("sex"));
g.setBirthday(rs.getDate("birthday"));
g.setEmail(rs.getString("email"));
g.setMobile(rs.getString("mobile"));
g.setCreate_date(rs.getDate("create_date"));
g.setCreate_user(rs.getString("create_user"));
g.setUpdate_date(rs.getDate("update_date"));
g.setUpdate_user(rs.getString("update_user"));
g.setIsdel(rs.getInt("isdel"));
//循环放到集合里面,返回集合
result.add(g);
}
return result;
}
//不通过一个参数一个参数传进来,传递一个集合,通过集合的方式List ,把这些参数放到集合里面,然后再传进来,查询的条件也可以通过集合方式Map<String, Object>传进来,这种方式更便捷
//查询参数通过集合传过来params
public List<Goddess> query(List<Map<String, Object>> params) throws Exception{
List<Goddess> result=new ArrayList<Goddess>(); Connection conn=DBUtil.getConnection();
StringBuilder sb=new StringBuilder();
//1=1永远成立,后面再追加and就没问题了,where后面不能直接加and
sb.append("select * from imooc_goddess where 1=1 ");
//判断集合是否为空
if(params!=null&&params.size()>0){
//遍历集合
for (int i = 0; i < params.size(); i++) {
Map<String, Object> map=params.get(i);
//拼装sql语句,查询变量name,查询关系rela(例:=),变量的值value
//就不会像sb.append(" where user_name like ? and mobile like ? and email like ?");把查询条件写死
//这里可以改变查询参数
//如果把and去掉,第一条参数可以,第二条就没有and来连接了,所以可以在前面的sql语句加上where 1=1
//name:要查询的字段,rela:查询的关系(=,>,<,like),value:要传输查询参数的值
sb.append(" and "+map.get("name")+" "+map.get("rela")+" "+map.get("value")+" "); }
} PreparedStatement ptmt=conn.prepareStatement(sb.toString()); System.out.println(sb.toString());//打印sql语句
ResultSet rs=ptmt.executeQuery(); Goddess g=null;
while(rs.next()){
g=new Goddess();
g.setId(rs.getInt("id"));
g.setUser_name(rs.getString("user_name"));
g.setAge(rs.getInt("age"));
g.setSex(rs.getInt("sex"));
g.setBirthday(rs.getDate("birthday"));
g.setEmail(rs.getString("email"));
g.setMobile(rs.getString("mobile"));
g.setCreate_date(rs.getDate("create_date"));
g.setCreate_user(rs.getString("create_user"));
g.setUpdate_date(rs.getDate("update_date"));
g.setUpdate_user(rs.getString("update_user"));
g.setIsdel(rs.getInt("isdel")); result.add(g);
}
return result;
}
//查询一个女神,得到其中一个女神的详细信息
public Goddess get(Integer id) throws SQLException{//根据id来查
Goddess g=null;
Connection conn=DBUtil.getConnection();
String sql="" +
" select * from imooc_goddess " +
" where id=? ";
//预编译sql语句
PreparedStatement ptmt=conn.prepareStatement(sql);
//传入参数
ptmt.setInt(1, id);
//execute()方法用来执行更改数据库的操作,包括新增、修改、删除。
//executeQuery()方法:查询
ResultSet rs=ptmt.executeQuery();//执行查询,返回结果集rs
//遍历结果集
while(rs.next()){
g=new Goddess();
g.setId(rs.getInt("id"));
g.setUser_name(rs.getString("user_name"));
g.setAge(rs.getInt("age"));
g.setSex(rs.getInt("sex"));
//g.setBirthday:java.util.Date
//rs.getDate:java.sql.Date
//注意:这里的java.sql.Date不需要转成java.util.Date,因为java.sql.Date是java.util.Date的子集
g.setBirthday(rs.getDate("birthday"));
g.setEmail(rs.getString("email"));
g.setMobile(rs.getString("mobile"));
g.setCreate_date(rs.getDate("create_date"));
g.setCreate_user(rs.getString("create_user"));
g.setUpdate_date(rs.getDate("update_date"));
g.setUpdate_user(rs.getString("update_user"));
g.setIsdel(rs.getInt("isdel"));
}
return g;//返回女神对象
}
}

控制层

 package com.imooc.action;
//控制层
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map; import com.imooc.dao.GoddessDao;
import com.imooc.model.Goddess; public class GoddessAction { public void add(Goddess goddess) throws Exception{
GoddessDao dao=new GoddessDao();
goddess.setSex(1);
goddess.setCreate_user("ADMIN");
goddess.setUpdate_user("ADMIN");
goddess.setIsdel(0);
dao.addGoddess(goddess);
} public Goddess get(Integer id) throws SQLException{
GoddessDao dao=new GoddessDao();
return dao.get(id);
} public void edit(Goddess goddess) throws Exception{
GoddessDao dao=new GoddessDao();
dao.updateGoddess(goddess);
}
public void del(Integer id) throws SQLException{
GoddessDao dao=new GoddessDao();
dao.delGoddess(id);
} public List<Goddess> query() throws Exception{
GoddessDao dao=new GoddessDao();
return dao.query();
}
public List<Goddess> query(List<Map<String, Object>> params) throws Exception{
GoddessDao dao=new GoddessDao();
return dao.query(params);
} public static void main(String[] args) throws Exception { // //1、测试新增女神功能
// GoddessDao g=new GoddessDao();
//
// //定义女神对象
// Goddess g1=new Goddess();
//
// g1.setUser_name("小夏");
// g1.setAge(22);
// g1.setSex(1);
// g1.setBirthday(new Date());
// g1.setEmail("xiaxia@imooc.com");
// g1.setMobile("18766888866");
// g1.setCreate_user("ADMIN");
// g1.setUpdate_user("ADMIN");
// g1.setIsdel(1);
//
// g.addGoddess(g1);
/**************************************************************************/
// //1-1、测试新增女神功能
// GoddessDao g=new GoddessDao();
//
// //定义女神对象
// Goddess g1=new Goddess();
//
// g1.setUser_name("小美");
// g1.setAge(22);
// g1.setSex(1);
// g1.setBirthday(new Date());
// g1.setEmail("xiaxia@imooc.com");
// g1.setMobile("18766888866");
// g1.setCreate_user("ADMIN");
// g1.setUpdate_user("ADMIN");
// g1.setIsdel(1);
//
// g.addGoddess(g1);
/**************************************************************************/
// //2、测试更新女神功能
// GoddessDao g=new GoddessDao();
//
// //定义女神对象
// Goddess g1=new Goddess();
//
// g1.setUser_name("小夏");
// g1.setAge(21);
// g1.setSex(1);
// g1.setBirthday(new Date());
// g1.setEmail("xiaxia@imooc.com");
// g1.setMobile("18712345678");
// g1.setUpdate_user("ADMIN");
// g1.setIsdel(1);
//
// g1.setId(7);
//
// g.updateGoddess(g1); /**************************************************************************/
// //3、测试删除女神功能
// GoddessDao g=new GoddessDao();
//
// //定义女神对象
// Goddess g1=new Goddess();
//
// g1.setUser_name("小夏");
// g1.setAge(21);
// g1.setSex(1);
// g1.setBirthday(new Date());
// g1.setEmail("xiaxia@imooc.com");
// g1.setMobile("18712345678");
// g1.setUpdate_user("ADMIN");
// g1.setIsdel(1);
//
// g1.setId(7);
//
// g.delGoddess(7); /**************************************************************************/
// //4、测试查询单个女神的信息
// GoddessDao g=new GoddessDao();
//
// //定义女神对象
// Goddess g1=new Goddess();
//
// g1.setUser_name("小夏");
// g1.setAge(21);
// g1.setSex(1);
// g1.setBirthday(new Date());
// g1.setEmail("xiaxia@imooc.com");
// g1.setMobile("18712345678");
// g1.setUpdate_user("ADMIN");
// g1.setIsdel(1);
//
// g1.setId(7);
//
// //返回一个女神对象
// Goddess g2=g.get(9);
// //把查询到的女神信息打印到控制台
// System.out.println(g2.toString()); /**************************************************************************/
// //5、测试查询女神的信息
// GoddessDao g=new GoddessDao();
// //查询小美的信息
// List<Goddess> result=g.query("小夏");
// //遍历结果集
// for (int i = 0; i < result.size(); i++) {
// //将信息打印到控制台上面
// System.out.println(result.get(i).toString());
// }
// //定义女神对象
// Goddess g1=new Goddess();
//
// g1.setUser_name("小美");
// g1.setAge(22);
// g1.setSex(1);
// g1.setBirthday(new Date());
// g1.setEmail("xiaxia@imooc.com");
// g1.setMobile("18766888866");
// g1.setCreate_user("ADMIN");
// g1.setUpdate_user("ADMIN");
// g1.setIsdel(1); /**************************************************************************/
//6、测试通过集合方式查询女神的信息
GoddessDao g=new GoddessDao(); List<Map<String, Object>> params=new ArrayList<Map<String,Object>>();
Map<String,Object> param=new HashMap<String,Object>();
param.put("name", "user_name");
// param.put("rela", "=");
// param.put("value", "'小夏'"); param.put("rela", "like");
param.put("value", "'%小美%'");
//把参数放到集合里面去
params.add(param);//这一句一定要加,否则会被后面的覆盖
/**************************************************************************/
//加入查询条件:按手机号查询
param=new HashMap<String,Object>();
param.put("name", "mobile");
// param.put("rela", "=");
// param.put("value", "'18712345678'"); param.put("rela", "like");
param.put("value", "'%18712345678%'");
//把参数放到集合里面去
params.add(param);
/**************************************************************************/
param=new HashMap<String,Object>();
param.put("name", "email");
param.put("rela", "=");
param.put("value", "'xiaxia@imooc.com'");
//把参数放到集合里面去
params.add(param);
/**************************************************************************/ List<Goddess> result=g.query(params);
//遍历结果集
for (int i = 0; i < result.size(); i++) {
//将信息打印到控制台上面
System.out.println(result.get(i).toString());
}
// 定义女神对象
Goddess g1=new Goddess(); g1.setUser_name("小美");
g1.setAge(22);
g1.setSex(1);
g1.setBirthday(new Date());
g1.setEmail("xiaxia@imooc.com");
g1.setMobile("18766888866");
g1.setCreate_user("ADMIN");
g1.setUpdate_user("ADMIN");
g1.setIsdel(1);
} }

视图层

 package com.imooc.view;

 import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.Scanner; import com.imooc.action.GoddessAction;
import com.imooc.model.Goddess; public class View {
//提示语
private static final String CONTEXT="欢迎来到女神禁区:\n" +
"下面是女神禁区的功能列表:\n" +
"[MAIN/M]:主菜单\n" +
"[QUERY/Q]:查看全部女神的信息\n" +
"[GET/G]:查看某位女神的详细信息\n" +
"[ADD/A]:添加女神信息\n" +
"[UPDATE/U]:更新女神信息\n" +
"[DELETE/D]:删除女神信息\n" +
"[SEARCH/S]:查询女神信息(根据姓名、手机号来查询)\n" +
"[EXIT/E]:退出女神禁区\n" +
"[BREAK/B]:退出当前功能,返回主菜单";
//操作标记
private static final String OPERATION_MAIN="MAIN";//访问主菜单(功能列表)
private static final String OPERATION_QUERY="QUERY";
private static final String OPERATION_GET="GET";
private static final String OPERATION_ADD="ADD";
private static final String OPERATION_UPDATE="UPDATE";
private static final String OPERATION_DELETE="DELETE";
private static final String OPERATION_SEARCH="SEARCH";
private static final String OPERATION_EXIT="EXIT";
private static final String OPERATION_BREAK="BREAK"; public static void main(String[] args) { System.out.println(CONTEXT);
//怎么保持程序一直运行,永真循环 while(true){} //接收控制台输入参数
Scanner scan=new Scanner(System.in);
Goddess goddess=new Goddess();
GoddessAction action=new GoddessAction();
String prenious=null;//记忆变量,记忆上一次请求的是哪一个分支哪一个模块
Integer step=1;//标记步骤
while(scan.hasNext()){//有输入值的时候才循环
String in=scan.next().toString();
if(OPERATION_EXIT.equals(in.toUpperCase())
//OPERATION_EXIT.substring(0, 1)截取E,toUpperCase()转换成大写
||OPERATION_EXIT.substring(0, 1).equals(in.toUpperCase())){
System.out.println("您已成功退出女神禁区。");
break;
}else if(OPERATION_QUERY.equals(in.toUpperCase())
||OPERATION_QUERY.substring(0, 1).equals(in.toUpperCase())){
try {
List<Goddess> list=action.query();
for (Goddess go : list) {
System.out.println(go.getId()+",姓名:"+go.getUser_name());
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
} }else if(OPERATION_ADD.equals(in.toUpperCase())
||OPERATION_ADD.substring(0, 1).equals(in.toUpperCase())
||OPERATION_ADD.equals(prenious)){
prenious=OPERATION_ADD;
//新增女神 if(1==step){
System.out.println("请输入女神的[姓名]");
}else if(2==step){
goddess.setUser_name(in);
System.out.println("请输入女神的[年龄]");
}else if(3==step){
goddess.setAge(Integer.valueOf(in));
System.out.println("请输入女神的[生日],格式如:yyyy-MM-dd");
}else if(4==step){
SimpleDateFormat sf=new SimpleDateFormat("yyyy-MM-dd");
Date birthday=null;
try {
birthday = sf.parse(in);
goddess.setBirthday(birthday);
System.out.println("请输入女神的[邮箱]");
} catch (ParseException e) {
e.printStackTrace();
System.out.println("您输入的格式有误,请重新输入");
step=3;
}
}else if(5==step){
goddess.setEmail(in);
System.out.println("请输入女神的[手机号]");
}else if(6==step){
goddess.setMobile(in); try {
action.add(goddess);
System.out.println("新增女神成功");
} catch (Exception e) {
e.printStackTrace();
System.out.println("新增女神失败");
}
}
if(OPERATION_ADD.equals(prenious)){
step++;
}
}else{
System.out.println("您输入的值为:"+in);
} }
}
}

数据库

 package com.imooc.db;

 import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
//获得数据库连接
public class DBUtil { private static final String URL="jdbc:mysql://127.0.0.1:3306/imooc?useUnicode=true&characterEncoding=utf-8";
private static final String USER="root";
private static final String PASSWORD="123456"; private static Connection conn=null; static {
try {
//1.加载驱动程序
Class.forName("com.mysql.jdbc.Driver");
//2.获得数据库的连接
conn=DriverManager.getConnection(URL, USER, PASSWORD);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
}
//对外提供一个方法来获得数据库连接
public static Connection getConnection(){
return conn;
} }

JDBC上的更多相关文章

  1. 第三十一天 慵懒的投射在JDBC上的暖阳 —Hibernate的使用(四)

    6月19日,小雨."黄梅时节家家雨.青草池塘处处蛙.有约不来过夜半,闲敲棋子落灯花." 面向对象无限包容的个性,给对SQL和数据库一窍不通的澳大利亚人Gavin King创造了极大 ...

  2. 第二十五天 慵懒的投射在JDBC上的暖阳 —Hibernate的使用(四)

    版权声明:本文为博主原创文章.未经博主同意不得转载. https://blog.csdn.net/zwszws/article/details/28493209            6月4日.晴天. ...

  3. JDBC(上)

    1. 课程回顾 mysql加强 1)数据约束(表约束) 默认值: default 默认值 非空:   not null 唯一: unique 主键: primary key (非空+唯一) 自增长: ...

  4. JDBC上关于数据库中多表操作一对多关系和多对多关系的实现方法

    黑马程序员 我们知道,在设计一个Javabean的时候,要把这些BEAN 的数据存放在数据库中的表结构,然而这些数据库中的表直接又有些特殊的关系,例如员工与部门直接有一对多的关系,学生与老师直接又多对 ...

  5. 被缠上了,小王问我怎么在 Spring Boot 中使用 JDBC 连接 MySQL

    上次帮小王入了 Spring Boot 的门后,他觉得我这个人和蔼可亲.平易近人,于是隔天小王又微信我说:"二哥,快教教我,怎么在 Spring Boot 项目中使用 JDBC 连接 MyS ...

  6. 加速JDBC的快捷方法

    JAVA 应用必须通过 JDBC 从数据库中取数,有时候我们会发现,数据库的负担一点也不重而且 SQL 很简单,但取数的速度仍然很慢.仔细测试会发现,性能瓶颈主要在 JDBC 上,比如 MySQL 的 ...

  7. Java开发工程师(Web方向) - 03.数据库开发 - 第1章.JDBC

    第1章--JDBC JDBC基础 通过Java Database Connectivity可以实现Java程序对后端数据库的访问 一个完整的数据库部署架构,通常是由客户端和服务器端两部分组成 客户端封 ...

  8. (十八)JDBC优化使用(一)

    一.将增删改方法合并,优化代码 第十七篇的UserPOImpl.java类代码可以进行优化,因为增删改方法用的都是同一种执行方法executeUpdate(),对十七篇的例子进行优化如下: 2.1 搭 ...

  9. 走进JavaWeb技术世界3:JDBC的进化与连接池技术

    走进JavaWeb技术世界3:JDBC的进化与连接池技术 转载公众号[码农翻身] 网络访问 随着 Oracle, Sybase, SQL Server ,DB2,  Mysql 等人陆陆续续住进数据库 ...

随机推荐

  1. 【Gstreamer开发】用 GStreamer 简化 Linux 多媒体开发

    原文:http://www.ibm.com/developerworks/cn/linux/l-gstreamer/ 一.基本概念 GStreamer 作为 GNOME 桌面环境推荐的流媒体应用框架, ...

  2. PowerPoint储存此文件时发生错误 出现错误的问题解决方法

    .单击“文件”,单击“选项”,然后单击“加载项”. . 在管理下拉框中选择“COM加载项”,单击“转到”按钮. . 检查是否存在有任何加载项,清除所有复选框来禁用它们. . 关闭PPT并重新启动,测试 ...

  3. ubuntu下java的安装与执行

    一.安装java sudo add-apt-repository ppa:linuxuprising/java sudo apt-get update sudo apt-get install ora ...

  4. ubuntu 连接宽带

    ubuntu 连接宽带 链接: https://blog.csdn.net/selous/article/details/55520765 主要命令 pppoeconf pon dsl-provide ...

  5. 剑指offer23:输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。输出Yes OR No。

    1 题目描述 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则输出Yes,否则输出No.假设输入的数组的任意两个数字都互不相同. 2 思路和方法 二叉搜索树:二叉查找树(Bin ...

  6. Python基础 第四章 字典(1)

    通过名称来访问其各个值的数据结构,映射(mapping). 字典,是Python中唯一的内置映射类型,其中的值不按顺序排列,而是存储在键下.(键,可能是数.字符串.元组). 1.1 字典由 键 及其相 ...

  7. urllib基础

    import urllib.request # urlretrieve(网址,本地路径) 直接下载网页到本地 urllib.request.urlretrieve("http://www.b ...

  8. webpack打包时删除console.log,和debugger

    开发过程中我们不可避免的需要console.log调试,然而在上线时如果不删除这些console.log可能会造成内存泄漏,因为console.log出来的变量是不会被GC的,webpack给我们提供 ...

  9. C++反汇编第四讲,认识多重继承,菱形继承的内存结构,以及反汇编中的表现形式.

    目录: 1.多重继承在内存中的表现形式 多重继承在汇编中的表现形式 2.菱形继承 普通的菱形继承 虚继承 汇编中的表现形式 一丶多重继承在内存中的表现形式 高级代码: class Father1 { ...

  10. 维护solr索引库

    一 2)solrcore    一个solr下可以有多个solrcore,每个solrcore就是一个独立的索引库3)solrconfig.xml    lib:配置solr的扩展包的位置,不指定路径 ...