JDBC
Posted songsong_p_blue
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JDBC相关的知识,希望对你有一定的参考价值。
JDBC实战--打通数据库
代码实现:
1 package com.imooc.db; 2 3 import java.sql.Connection; 4 import java.sql.DriverManager; 5 import java.sql.ResultSet; 6 import java.sql.SQLException; 7 import java.sql.Statement; 8 9 import com.imooc.model.Goddess; 10 11 public class DBUtil { 12 13 private static final String URL = "jdbc:mysql://127.0.0.1:3306/imooc?useUnicode=true&characterEncoding=utf-8"; 14 private static final String USER = "root"; 15 private static final String PASSWORD = "123456"; 16 17 public static void main(String[] args) throws Exception { 18 // 1.加载驱动程序 19 Class.forName("com.mysql.jdbc.Driver");// 反射机制,通过一个类名去反向的将这个类加载到我们的环境中 20 // 2.获得数据库的连接 21 Connection conn = DriverManager.getConnection(URL, USER, PASSWORD);// DriverManager驱动类 22 // 3.通过数据库的连接操作数据库,实现增删改查 23 Statement stmt = conn.createStatement(); 24 // 执行查询,返回ResultSet对象 25 ResultSet rs = stmt 26 .executeQuery("select user_name,age from imooc_goddess"); 27 // rs.next()返回的是true,证明对象rs里面有数据 28 while (rs.next()) { 29 // 如果对象rs里面有数据,就会循环打印出来,如果没有,这个循环就不会走 30 System.out.println(rs.getString("user_name") + "," 31 + rs.getInt("age")); 32 } 33 34 } 35 }
数据库数据
imooc/imooc_goddess
运行结果:
测试数据库连接成功,能够从数据库读取到数据。
控制台输出
模型(三层架构)主要包括两个部分:对应数据库映射、对数据库映射的抽象方法(CRUD:增、删、改、查)
控制层:控制数据流通过程。把数据拼装起来,展示给视图层
视图层:对数据的展示
模型层:数据处理,业务逻辑
把视图层的展示、业务逻辑、数据存储的过程分离开来,通过控制层来协调控制。
视图层:是用来数据展示用的,为了给用户展示出程序运行的结果
控制层(Controller):更新模型层,更新视图层
java基础——静态块:静态块执行的是最早的
JDBC实战--搭建模型层(DAO层)
数据库对应的实体类
1 package com.imooc.model; 2 3 import java.util.Date; 4 5 public class Goddess { 6 //这些属性分别对应数据库的字段 7 private Integer id; 8 private String user_name; 9 private Integer sex; 10 private Integer age; 11 private Date birthday; 12 private String email; 13 private String mobile; 14 private String create_user; 15 private String update_user; 16 private Date create_date; 17 private Date update_date; 18 private Integer isdel; 19 20 public Integer getId() { 21 return id; 22 } 23 24 public void setId(Integer id) { 25 this.id = id; 26 } 27 28 public String getUser_name() { 29 return user_name; 30 } 31 32 public void setUser_name(String user_name) { 33 this.user_name = user_name; 34 } 35 36 public Integer getSex() { 37 return sex; 38 } 39 40 public void setSex(Integer sex) { 41 this.sex = sex; 42 } 43 44 public Integer getAge() { 45 return age; 46 } 47 48 public void setAge(Integer age) { 49 this.age = age; 50 } 51 52 public Date getBirthday() { 53 return birthday; 54 } 55 56 public void setBirthday(Date birthday) { 57 this.birthday = birthday; 58 } 59 60 public String getEmail() { 61 return email; 62 } 63 64 public void setEmail(String email) { 65 this.email = email; 66 } 67 68 public String getMobile() { 69 return mobile; 70 } 71 72 public void setMobile(String mobile) { 73 this.mobile = mobile; 74 } 75 76 public String getCreate_user() { 77 return create_user; 78 } 79 80 public void setCreate_user(String create_user) { 81 this.create_user = create_user; 82 } 83 84 public String getUpdate_user() { 85 return update_user; 86 } 87 88 public void setUpdate_user(String update_user) { 89 this.update_user = update_user; 90 } 91 92 public Date getCreate_date() { 93 return create_date; 94 } 95 96 public void setCreate_date(Date create_date) { 97 this.create_date = create_date; 98 } 99 100 public Date getUpdate_date() { 101 return update_date; 102 } 103 104 public void setUpdate_date(Date update_date) { 105 this.update_date = update_date; 106 } 107 108 public Integer getIsdel() { 109 return isdel; 110 } 111 112 public void setIsdel(Integer isdel) { 113 this.isdel = isdel; 114 } 115 116 @Override 117 public String toString() { 118 return "Goddess [id=" + id + ", user_name=" + user_name + ", sex=" 119 + sex + ", age=" + age + ", birthday=" + birthday + ", email=" 120 + email + ", mobile=" + mobile + ", create_user=" + create_user 121 + ", update_user=" + update_user + ", create_date=" 122 + create_date + ", update_date=" + update_date + ", isdel=" 123 + isdel + "]"; 124 } 125 }
模型层:CRUD(增、删、改、查)
控制层:接收视图层的参数,调用模型层,模型层把结果通知给控制层,控制层把结果更新给视图层,展示给用户,起着桥梁的作用
新的执行sql语句的方法:预编译sql语句
测试新增女神的方法:
测试结果:
数据库更新
java.sql.Date是java.util.Date的子集
新增女神代码实现:
1 //新增女神 2 public void addGoddess(Goddess g) throws Exception{ 3 Connection conn=DBUtil.getConnection();//1、获得数据库连接 4 //编译sql语句,给sql语句传递参数 5 //2、拼写sql语句,执行SQL语句 6 String sql="" + 7 "insert into imooc_goddess" + 8 "(user_name,sex,age,birthday,email,mobile," + 9 "create_user,create_date,update_user,update_date,isdel)" + 10 "values(" + 11 //参数用问号表示,相当于占位符,有几个参数就有几个问号,再给这些参数来进行赋值,到真正执行的时候,这些参数会加载到这个sql语句,把这个sql语句拼接完整,再去执行。这样就会减少对数据库操作 12 //要是不用前台传递参数,可以在sql语句里面直接写入。例:current_date() 13 "?,?,?,?,?,?,?,current_date(),?,current_date(),?)"; 14 //将sql语句加载到驱动程序的执行程序中,但是并不直接执行,而是当它调用execute方法的时候才真正执行 15 //3、预编译 16 PreparedStatement ptmt=conn.prepareStatement(sql); 17 18 //4、传参给预编译符?去赋值 19 //ptmt.setString(1,user_name); 20 //传递参数,user_name这个值不能写死,应该通过方法来传进来,这样我们就可以在视图层插入数据 21 //前台只需将值通过setter方法,就可以把数据集成的传递过来 22 ptmt.setString(1, g.getUser_name());//传递第一个参数,设置第一个?占位符的值 23 ptmt.setInt(2, g.getSex()); 24 ptmt.setInt(3, g.getAge()); 25 //ptmt.setDate(4, g.getBirthday());需要的参数是sql.Date类型的日期类型,但是传进来的值是java.util.Date,类型不符,需要转换 26 ////定义一个java.sql.Date类型的data,new Date(date),然后将我们的值g.getBirthday().getTime()传进去 27 //getTime() 方法可返回距 1970 年 1 月 1 日之间的毫秒数。 28 ptmt.setDate(4, new Date(g.getBirthday().getTime())); 29 ptmt.setString(5, g.getEmail()); 30 ptmt.setString(6, g.getMobile()); 31 ptmt.setString(7, g.getCreate_user()); 32 ptmt.setString(8, g.getUpdate_user()); 33 ptmt.setInt(9, g.getIsdel()); 34 //5、调用execute方法的时候才真正执行 35 ptmt.execute(); 36 }
新增女神功能测试:
1 public static void main(String[] args) throws Exception { 2 3 //1、测试新增女神功能 4 GoddessDao g=new GoddessDao(); 5 6 //定义女神对象 7 Goddess g1=new Goddess(); 8 9 g1.setUser_name("小夏"); 10 g1.setAge(22); 11 g1.setSex(1); 12 g1.setBirthday(new Date()); 13 g1.setEmail("xiaxia@imooc.com"); 14 g1.setMobile("18766888866"); 15 g1.setCreate_user("ADMIN"); 16 g1.setUpdate_user("ADMIN"); 17 g1.setIsdel(1); 18 19 g.addGoddess(g1); 20 }
运行结果:
数据库表格imooc_goddess数据更新:
JDBC实战--搭建视图层
课程总结
检验代码采用MVC三层架构模式
模型层:实体类+DAO层(封装了对数据库操作的代码),和数据库打交道
Control(控制层):负责调用模型层
View(视图层):调用控制层
这种方式将应用程序和数据库分开了,没有中间的过程,没有中间ODBC,厂商API,也没有中间服务器,是直接和数据库打交道,所有效率上会很高。
具体代码实现:
模型层:实体类+DAO层
1 package com.imooc.model; 2 3 import java.util.Date; 4 //模型层(实体类+DAO层:封装了对数据库操作的代码) 5 //实体类第一个字母一定要大写 6 public class Goddess { 7 //这些属性分别对应数据库的字段 8 private Integer id; 9 private String user_name; 10 private Integer sex; 11 private Integer age; 12 private Date birthday; 13 private String email; 14 private String mobile; 15 private String create_user;//创建人 16 private String update_user;//更新人 17 private Date create_date;//创建时间 18 private Date update_date;//更新时间 19 private Integer isdel;//是否删除的标记。setIsdel(1):不删除 20 21 public Integer getId() { 22 return id; 23 } 24 25 public void setId(Integer id) { 26 this.id = id; 27 } 28 29 public String getUser_name() { 30 return user_name; 31 } 32 33 public void setUser_name(String user_name) { 34 this.user_name = user_name; 35 } 36 37 public Integer getSex() { 38 return sex; 39 } 40 41 public void setSex(Integer sex) { 42 this.sex = sex; 43 } 44 45 public Integer getAge() { 46 return age; 47 } 48 49 public void setAge(Integer age) { 50 this.age = age; 51 } 52 53 public Date getBirthday() { 54 return birthday; 55 } 56 57 public void setBirthday(Date birthday) { 58 this.birthday = birthday; 59 } 60 61 public String getEmail() { 62 return email; 63 } 64 65 public void setEmail(String email) { 66 this.email = email; 67 } 68 69 public String getMobile() { 70 return mobile; 71 } 72 73 public void setMobile(String mobile) { 74 this.mobile = mobile; 75 } 76 77 public String getCreate_user() { 78 return create_user; 79 } 80 81 public void setCreate_user(String create_user) { 82 this.create_user = create_user; 83 } 84 85 public String getUpdate_user() { 86 return update_user; 87 } 88 89 public void setUpdate_user(String update_user) { 90 this.update_user = update_user; 91 } 92 93 public Date getCreate_date() { 94 return create_date; 95 } 96 97 public void setCreate_date(Date create_date) { 98 this.create_date = create_date; 99 } 100 101 public Date getUpdate_date() { 102 return update_date; 103 } 104 105 public void setUpdate_date(Date update_date) { 106 this.update_date = update_date; 107 } 108 109 public Integer getIsdel() { 110 return isdel; 111 } 112 113 public void setIsdel(Integer isdel) { 114 this.isdel = isdel; 115 } 116 117 //重写一个toString方法 118 @Override 119 public String toString() { 120 return "Goddess [id=" + id + ", user_name=" + user_name + ", sex=" 121 + sex + ", age=" + age + ", birthday=" + birthday + ", email=" 122 + email + ", mobile=" + mobile + ", create_user=" + create_user 123 + ", update_user=" + update_user + ", create_date=" 124 + create_date + ", update_date=" + update_date + ", isdel=" 125 + isdel + "]"; 126 } 127 }
1 package com.imooc.dao; 2 3 import java.sql.Connection; 4 import java.sql.Date; 5 import java.sql.PreparedStatement; 6 import java.sql.ResultSet; 7 import java.sql.SQLException; 8 import java.util.ArrayList; 9 import java.util.List; 10 import java.util.Map; 11 12 import com.imooc.db.DBUtil; 13 import com.imooc.model.Goddess; 14 //模型层(实体类+DAO层:封装了对数据库操作的代码) 15 //执行业务方法 16 public class GoddessDao { 17 //新增女神 18 public void addGoddess(Goddess g) throws Exception{ 19 Connection conn=DBUtil.getConnection();//1、获得数据库连接 20 //编译sql语句,给sql语句传递参数 21 //2、拼写sql语句,执行SQL语句 22 String sql="" + 23 "insert into imooc_goddess" + 24 "(user_name,sex,age,birthday,email,mobile," + 25 "create_user,create_date,update_user,update_date,isdel)" + 26 "values(" + 27 //参数用问号表示,相当于占位符,有几个参数就有几个问号,再给这些参数来进行赋值,到真正执行的时候,这些参数会加载到这个sql语句,把这个sql语句拼接完整,再去执行。这样就会减少对数据库操作 28 //要是不用前台传递参数,可以在sql语句里面直接写入。例:current_date() 29 "?,?,?,?,?,?,?,current_date(),?,current_date(),?)"; 30 //将sql语句加载到驱动程序的执行程序中,但是并不直接执行,而是当它调用execute方法的时候才真正执行 31 //3、预编译 32 PreparedStatement ptmt=conn.prepareStatement(sql); 33 34 //4、传参给预编译符?去赋值 35 36 //ptmt.setString(1,user_name); 37 //传递参数,user_name这个值不能写死,应该通过方法来传进来,这样我们就可以在视图层插入数据 38 //前台只需将值通过setter方法,就可以把数据集成的传递过来 39 ptmt.setString(1, g.getUser_name());//传递第一个参数,设置第一个?占位符的值 40 ptmt.setInt(2, g.getSex()); 41 ptmt.setInt(3, g.getAge()); 42 //ptmt.setDate(4, g.getBirthday());需要的参数是sql.Date类型的日期类型,但是传进来的值是java.util.Date,类型不符,需要转换 43 ////定义一个java.sql.Date类型的data,new Date(date),然后将我们的值g.getBirthday().getTime()传进去 44 //getTime() 方法可返回距 1970 年 1 月 1 日之间的毫秒数。 45 ptmt.setDate(4, new Date(g.getBirthday().getTime())); 46 ptmt.setString(5, g.getEmail());以上是关于JDBC的主要内容,如果未能解决你的问题,请参考以下文章