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的主要内容,如果未能解决你的问题,请参考以下文章

面试常用的代码片段

mysql jdbc源码分析片段 和 Tomcat's JDBC Pool

JDBC操作数据库之查询数据

如何在片段中填充列表视图?

在 myeclipse中进行连接sql server的测试

MYBATIS05_ifwherechoosewhentrimsetforEach标签sql片段