提醒:编写JDBC程序前记得启动数据库服务器,并导入JDBC驱动jar包

JDBC编程6步曲:

第1步:注册mysql数据库驱动

第2步:通过DriverManager类获取数据库连接

第3步:通过Connection对象获取Statement对象

第4步:使用Statement执行SQL语句,返回一个ResultSet结果集对象

第5步:使用操作ResultSet结果集

第6步:关闭连接,释放资源

下面让我们来编写一个JDBC程序:

先创建数据库studentMS 和 数据库表student,并插入三条记录

create database studentMS default character set utf8;use studentMScreate table student (id int(25) primary key,name varchar (255) not null,age int (25) not null,specialty varchar (255) not null
); insert into student values(170701,'张三',18,'中医学');
insert into student values(170702,'李四',20,'计算机');
insert into student values(170703,'王五',21,'社会学');

程序代码:

import java.sql.*;public class JDBC {//根据学号获取学生信息public static void getStudentById(String id){String driverClass="com.mysql.cj.jdbc.Driver";String Url="jdbc:mysql://localhost:3306/studentMS?serverTimezone=GMT%2B8";String username="root";String userpass="root";Connection conn=null;Statement stmt=null;ResultSet rs=null;try{// 1.注册mysql数据库驱动Class.forName(driverClass);// 2.通过DriverManager类获取数据库连接conn= DriverManager.getConnection(Url,username,userpass);// 3.通过Connection对象获取Statement对象stmt=conn.createStatement();// 4.使用Statement执行SQL语句,返回一个ResultSet结果集String sql="select*from student where id="+id;rs=stmt.executeQuery(sql);// 5.操作ResultSet结果集System.out.println("学号"+" | "+"姓名"+" | "+"年龄"+" | "+"专业");if(rs.next()){//通过数据库表的列名来指定字段的值(当然也可以通过字段号来指定)System.out.print(rs.getInt("id")+" | ");System.out.print(rs.getString("name")+" | ");System.out.print(rs.getInt("age")+" | ");System.out.println(rs.getString("specialty"));}} catch (Exception e) {e.printStackTrace();} finally {// 6.关闭数据库连接,释放资源(数据库资源很宝贵,所以别忘了这一步了)try {if (rs!=null){rs.close();}if(stmt!=null){stmt.close();}if(conn!=null||!conn.isClosed()){conn.close();}} catch (SQLException e) {e.printStackTrace();}}}//查询所有学生信息public static void getAllStudent(){String driverClass="com.mysql.cj.jdbc.Driver";String Url="jdbc:mysql://localhost:3306/studentMS?serverTimezone=GMT%2B8";String username="root";String userpass="root";Connection conn=null;Statement stmt=null;ResultSet rs=null;try{// 1.注册数据库驱动Class.forName(driverClass);// 2.通过DriverManager类获取数据库连接conn= DriverManager.getConnection(Url,username,userpass);// 3.通过Connection对象获取Statement对象stmt=conn.createStatement();// 4.使用Statement执行SQL语句,返回一个ResultSet结果集String sql="select*from student order by id";rs=stmt.executeQuery(sql);// 5.操作ResultSet结果集System.out.println("学号"+" | "+"姓名"+" | "+"年龄"+" | "+"专业");while(rs.next()){//通过数据库表的列名来指定字段的值(当然也可以通过字段号来指定)System.out.print(rs.getInt("id")+" | ");System.out.print(rs.getString("name")+" | ");System.out.print(rs.getInt("age")+" | ");System.out.println(rs.getString("specialty"));}} catch (Exception e) {e.printStackTrace();} finally {// 6.关闭数据库连接,释放资源(数据库资源很宝贵,所以别忘了这一步了)try {if (rs!=null){rs.close();}if(stmt!=null){stmt.close();}if(conn!=null||!conn.isClosed()){conn.close();}} catch (SQLException e) {e.printStackTrace();}}}}

建一个测试类TestJDBC来测试一下

public class TestJDBC {public static void main(String[] args) {System.out.println("查询个人的信息:");getStudentById("170701");System.out.println("\n查询所以人的信息:");getAllStudent();}
}

控制台输出结果:

OK,完成一个JDBC程序后,我们来了解一下每一步的作用及注意事项
第1步:注册mysql数据库驱动

 String driverClass="com.mysql.cj.jdbc.Driver"; Class.forName(driverClass);

com.mysql.cj.jdbc.Driver是mysql驱动类

注意:
在注册JDBC驱动前记得现导入驱动jar包,
如果使用新版mysql驱动jar包,须使用com.mysql.cj.jdbc.Driver驱动类进行注册,
不要用com.mysql.jdbc.Driver驱动类注册

第2步:通过DriverManager类获取数据库连接

String Url="jdbc:mysql://localhost:3306/studentMS"+"?serverTimezone=GMT%2B8";
String username="root";
String userpass="root";
Connection conn = DriverManager.getConnection(Url,username,userpass);

jdbc:mysql 指定jdbc连接的数据库类型,这里指定的是mysql数据库

localhost 是本地主机名,如果连接的数据库在其他电脑上,则将localhost改为那个电脑的IP

3306 是服务器端口号,mysql默认端口号为3306

studentMS 是连接的数据库的名称

serverTimezone=GMT%2B8 表示将mysql服务器的时区设置为东八区(中国)的时区

username 是数据库用户名

userpass 是数据库用户密码

注意:
如果使用新版mysql驱动jar包,须将mysql服务器时区(serverTimezone)设置为当前系统的时区(GMT%2B8),
GMT%2B8代表东八区,mysql服务器默认为美国时区
如果是旧版的mysql驱动jar包,则无需设置时区

第3步:通过Connection对象获取Statement对象

Statement stmt=conn.createStatement();

第4步:使用Statement执行SQL语句,返回一个ResultSet结果集对象

String sql="select*from student where id="+id;
ResultSet rs=stmt.executeQuery(sql);

Statement接口有三种执行SQL语句的方法

  • 分别为:executeQuery()executeUpdate()execute()

执行查询语句时,一般用executeQuery()方法,该方法执行成功后,会返回一个ResultSet结果集对象。

执行增,删,改语句时,使用executeUpdate()方法,因为增,删,改操作不需要返回结果集对象, 只需返回更改的记录数,比如:增加记录的个数(行数),删除记录的个数,修改记录的个数

execute()方法可以用来执行任何SQL语句
但执行查询语句时,不会返回结果集,而是返回true
执行增,删,改语句时,也不会返回更改的记录数,而是返回false
所以execute()方法一般在不清楚执行的是查询,还是增,删,改语句时才使用,即在动态执行SQL语句的方法中使用execute()方法

第5步:使用操作ResultSet结果集

//遍历结果集
while(rs.next()){//通过数据库表的列名来指定字段的值(当然也可以通过字段号来指定)System.out.print(rs.getInt("id")+" | ");System.out.print(rs.getString("name")+" | ");System.out.print(rs.getInt("age")+" | ");System.out.println(rs.getString("specialty"));
}

不知道你们在刚接触JDBC的时候有没有这种疑惑?
为什么获取结果集的数据前,要先调用next()方法,next()有什么作用,难道不能直接获取结果集中的数据?
为什么上面代码中的while循环去掉,直接获取结果集中的数据会报错!!

在idea中用鼠标选中ResultSet对象,然后按ctrl+shift+B快捷键,查看ResultSet接口的源码后,
你会发现
ResultSet有游标的概念,刚开始时,游标指向结果集的第一行之前
所以如果结果集的数据的行数>=1,那么调用next()方法首先会将游标移动到结果集的第一行,
第二次调用游标就会移动到结果集的第二行,以此类推,每一次调用next()方法,都会将结果集向下一行移动,直至游标位于结果集最后一行之后,就会返回false退出while循环
如果结果集中一行数据都没有,则直接返回false
所以,获取结果集的数据前,要先调用next()方法,将游标移动到结果集的第一行

从结果集中取出各列的值时,使用getXXX(列名/列号)方法,xxx为当前列的数据类型,即你所操作数据库表中字段的数据类型。
getString() 取字符串型字段的值
getInt() 取整型字段的值
getDouble() 取double型字段的值
getBoolean() 取布尔型字段的值
getDate() 取日期型字段的值

比如上面代码中的id字段为int类型的字段,所以获取id字段值的方法为:rs.getInt("id") 或者 rs.getInt(1),id字段所在列号为1

第6步:关闭连接,释放资源

finally {// 6.关闭数据库连接,释放资源(数据库资源很宝贵,所以别忘了这一步了)try {if (rs!=null){rs.close();}if(stmt!=null){stmt.close();}if(conn!=null||!conn.isClosed()){conn.close();}} catch (SQLException e) {e.printStackTrace();}}

数据库资源很宝贵,数据库允许的并发访问连接数量有限,所以当操作数据库结束后,一定要记得关闭数据库连接,释放资源。
为了保证资源的释放,释放资源的操作建议放在finall代码块中。

第一个JDBC程序实现了,并且也讲解了每一步的注意事项,但不知道你们有没有发现上面的代码,每一个方法中都要配置连接数据库,完成连接数据库,释放资源的操作,并且这些操作在每个方法中都是一样的,而在做项目的时候可能还会定义,增,改,删等其它方法,如果每个方法中都有一大推这种一样的代码,这样代码看起来就会很乱,可读性差。

所以我们在做项目的时候,一般都会将数据库连接,关闭数据库连接,释放ResultSet和Statement资源的操作拿出来放到一个辅助类的方法中,这样在需要连接数据库,释放资源时,就直接调用辅助类中相应的方法即可

还是直接上代码吧,代码才是检验真理的唯一标准

辅助类DBConnection

import java.sql.*;public class DBConnection {private static final String driverClass="com.mysql.cj.jdbc.Driver";private static final String Url="jdbc:mysql://localhost:3306/studentMS?serverTimezone=GMT%2B8";private static final String username="root";private static final String userpass="root";/*** 建立连接* @return*/public static Connection getConnection(){Connection conn=null;try {Class.forName(driverClass);conn= DriverManager.getConnection(Url,username,userpass);} catch (SQLException e) {e.printStackTrace();} catch (ClassNotFoundException e) {e.printStackTrace();}return conn;}/*** 关闭连接*/public static void closeConnection(Connection conn){try{if(conn!=null||!conn.isClosed()){conn.close();}} catch (SQLException e) {e.printStackTrace();}}/*** 关闭Statement*/public static void closeStatement(Statement stmt){try{if(stmt!=null){stmt.close();}} catch (SQLException e) {e.printStackTrace();}}/*** 关闭Statement*/public static void closeResultSet(ResultSet rs){try{if(rs!=null){rs.close();}} catch (SQLException e) {e.printStackTrace();}}}

数据库操作

import java.sql.*;public class JDBC {//根据学号获取学生信息public static void getStudentById(String id){Connection conn=null;Statement stmt=null;ResultSet rs=null;try{// 1,2注册数据库驱动,并连接数据库conn=DBConnection.getConnection();// 3.通过Connection对象获取Statement对象stmt=conn.createStatement();// 4.使用Statement执行SQL语句,返回一个ResultSet结果集String selectSQL="select*from student where id="+id;rs=stmt.executeQuery(selectSQL);// 5.操作ResultSet结果集System.out.println("学号"+" | "+"姓名"+" | "+"年龄"+" | "+"专业");while(rs.next()){//通过数据库表的列名来指定字段的值(当然也可以通过字段号来指定)System.out.print(rs.getInt("id")+" | ");System.out.print(rs.getString("name")+" | ");System.out.print(rs.getInt("age")+" | ");System.out.println(rs.getString("specialty"));}} catch (Exception e) {e.printStackTrace();} finally {// 6.关闭数据库连接,释放资源DBConnection.closeResultSet(rs);DBConnection.closeStatement(stmt);DBConnection.closeConnection(conn);}}// 查询所有学生信息public static void getAllStudent(){Connection conn=null;Statement stmt=null;ResultSet rs=null;try{// 1,2注册数据库驱动,并连接数据库conn=DBConnection.getConnection();// 3.通过Connection对象获取Statement对象stmt=conn.createStatement();// 4.使用Statement执行SQL语句,返回一个ResultSet结果集String selectSQL="select*from student order by id";rs=stmt.executeQuery(selectSQL);// 5.操作ResultSet结果集System.out.println("学号"+" | "+"姓名"+" | "+"年龄"+" | "+"专业");while(rs.next()){//通过数据库表的列名来指定字段的值(当然也可以通过字段号来指定)System.out.print(rs.getInt("id")+" | ");System.out.print(rs.getString("name")+" | ");System.out.print(rs.getInt("age")+" | ");System.out.println(rs.getString("specialty"));}} catch (Exception e) {e.printStackTrace();} finally {// 6.关闭数据库连接,释放资源DBConnection.closeResultSet(rs);DBConnection.closeStatement(stmt);DBConnection.closeConnection(conn);}}}

测试类

public class TestJDBC {public static void main(String[] args) {System.out.println("查询个人的信息:");getStudentById("170701");System.out.println("\n查询所以人的信息:");getAllStudent();}
}

控制台输出结果:

OK,这样看起来代码是不是干净了很多

问题又来了
看了辅助类DBConnection的代码后,发现,为什么关闭ResultSet,Statement 和Connection资源的操作要分开放在各自的方法中,不能放在同一个方法中?
因为这是要考虑到执行增,删,改操作时,不会返回ResultSet结果集对象,所以在执行增,删,改操作的方法中不用关闭ResultSet资源,所以将关闭ResultSet,Statement 和Connection资源的操作要分开放在各自的方法中

传统 JDBC 编程详解相关推荐

  1. Java8函数式编程详解

    Java8 函数式编程详解 Author:Dorae Date:2017年11月1日23:03:26 转载请注明出处 说起Java8,可能很多人都已经知道其最大的改进,就是引入了Lambda表达式与S ...

  2. java IO编程详解

    java IO编程详解 一.Socket 1. Sock概述 Socket,套接字就是两台主机之间逻辑连接的端点.TCP/IP协议是传输层协议,主要解决数据如何在网络中传输,而HTTP协议是应用层协议 ...

  3. [原创]手把手教你Linux下的多线程设计--Linux下多线程编程详解(一)

    本文可任意转载,但必须注明作者和出处. [原创]手把手教你Linux下的多线程设计(一)                                       --Linux下多线程编程详解 原 ...

  4. Java 1.8 函数式编程详解

    Java 1.8 函数式编程详解 文章目录 Java 1.8 函数式编程详解 一. 概述 1.1 java 8 新特性: 二. 函数式接口 2.1 函数式接口概述 2.2 Lambda表达式概述 2. ...

  5. windows批处理 (cmd/bat) 编程详解

    2019独角兽企业重金招聘Python工程师标准>>> windows批处理 (cmd/bat) 编程详解 开始之前先简单说明下cmd文件和bat文件的区别:在本质上两者没有区别,都 ...

  6. PHP SOCKET编程详解

    这篇文章主要介绍了PHP SOCKET编程详解,需要的朋友可以参考下 1. 预备知识 一直以来很少看到有多少人使用php的socket模块来做一些事情,大概大家都把它定位在脚本语言的范畴内吧,但是其实 ...

  7. iOS-NSThread编程详解

    note:文明看帖转载是对自己的尊重也是对学者的鼓励,欢迎批评讨论 iOS多线程-NSThread编程详解 再iOS开发中存在三种比较常用的实现多线程编程的方法,NSThread,NSOperatio ...

  8. Linux网络编程---详解TCP

    Linux网络编程---详解TCP的三次握手和四次挥手_shanghx_123的博客-CSDN博客_tcp的协议数据单元被称为 TCP协议详解(TCP报文.三次握手.四次挥手.TIME_WAIT状态. ...

  9. Java中JDBC连接数据库详解

    今天动力节点java学院小编分享的是JDBC连接数据库的相关知识,希望通过看过此文,各位小伙伴对DBC连接数据库有所了解,下面就跟随小编一起来看看JDBC连接数据库的知识吧. 一.JDBC连接数据库概 ...

最新文章

  1. 周志华教授:AI领域如何做优秀研究并写高水平论文?
  2. c程序语言设定定义域,4.22C语言学习日记:变量的定义域及编译预处理
  3. node.js linux shell,bash – Node.js Shell脚本和参数
  4. hdu3724 字典树(商品条形码)
  5. 7-7 有重复元素的全排列 (10 分)(set容器做法思路加详解)
  6. Java面试2021,java黑马百度云
  7. 前端接入HTTP协议浅析
  8. 【ElasticSearch】Es 源码之 NodeService 源码解读
  9. 3 - Spring AOP
  10. 报表FineReport部署Tomcat服务器
  11. ubuntu之安装typora
  12. 什么是领域模型(domain model)?贫血模型(anaemic domain model) 和充血模型(rich domain model)有什么区别...
  13. POJ 3415 Common Substrings (后缀数组,长度不小于k的公共子串的个数)
  14. java遍历文件夹_java中File类应用遍历文件夹下所有文件
  15. 关于MD5的那点事,你都了解清楚了吗?
  16. 手机修图软件测试,10款好用的手机图片编辑器软件排行榜
  17. 16S rRNArDNA测序分析
  18. ssh-keygen的使用方法
  19. iOS Swift之RxSwift初探
  20. 批改网作文提交时分析不出来_人物专访 I 苗晋:我的生活都为“批改作文”而让路...

热门文章

  1. 你准备好了吗,he is coming
  2. jQuery怎么改变img的src
  3. 小汤学编程之JAVA经典例题——嵌套集合
  4. socketserver库的使用
  5. 检查服务器端口占用情况命令
  6. 寻找两个有序数组中的中位数
  7. bug的一生:如何体现测试专业度?
  8. MySQL报错this is incompatible with sql_mode=only_full_group_by
  9. 001 Hello Security 的框架搭建
  10. 《Java多线程编程核心技术》读后感(十四)