为了帮助大家熟练应用JDBC编程,接下来,在本节将通过一个综合案例来讲解JDBC的基本操作,确保大家能够深刻理解JDBC的增、删、改、查,灵活利用JDBC完成对数据库的各项操作。

  1. 创建一个Java类Student

  在工程chapter01下创建com.qfedu.jdbc.domain包,并在该包下创建用于保存学生数据的类Student,具体代码如例1-1所示。

  【例1-1】 Student.java

  1 package com.qfedu.jdbc.domain;

  2 public class Student {

  3 private int id;

  4 private String sname;

  5 private String age;

  6 private String course;

  7 public Student() {

  8 super();

  9 }

  10 public Student(int id, String sname, String age, String course) {

  11 super();

  12 this.id = id;

  13 this.sname = sname;

  14 this.age = age;

  15 this.course = course;

  16 }

  17 public int getId() {

  18 return id;

  19 }

  20 public void setId(int id) {

  21 this.id = id;

  22 }

  23 public String getSname() {

  24 return sname;

  25 }

  26 public void setSname(String sname) {

  27 this.sname = sname;

  28 }

  29 public String getAge() {

  30 return age;

  31 }

  32 public void setAge(String age) {

  33 this.age = age;

  34 }

  35 public String getCourse() {

  36 return course;

  37 }

  38 public void setCourse(String course) {

  39 this.course = course;

  40 }

  41 @Override

  42 public String toString() {

  43 return "Student [id=" + id + ", sname=" + sname + ", age=" + age +

  44 ", course=" + course + "]";

  45 }

  46 }

  2. 创建JDBCUtils工具类

  在开发过程中,每次对数据库的操作都需要注册驱动、获取连接、关闭资源等,造成大量重复代码。为了降低冗余,提升开发效率,一般将JDBC的相关操作封装到JDBC工具类中。在src目录下新建com.qfedu.jdbc.utils包,并在该包下创建JDBCUtils工具类,具体代码如例1-2所示。

  【例1-2】 JDBCUtils.java

  1 import java.sql.Connection;

  2 import java.sql.DriverManager;

  3 import java.sql.PreparedStatement;

  4 import java.sql.ResultSet;

  5 import java.sql.SQLException;

  6 public class JDBCUtils {

  7 private static String url = "jdbc:mysql://localhost:3306/chapter01";

  8 private static String user = "root";

  9 private static String pass = "root";

  10 private static Connection conn = null;

  11 static{

  12 try{

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

  14 conn = DriverManager.getConnection(url, user, pass);

  15 }catch(Exception ex){

  16 ex.printStackTrace();

  17 //数据库连接失败,直接停止程序,抛出运行时期异常

  18 throw new RuntimeException("数据库连接失败");

  19 }

  20 }

  21 //获取链接

  22 public static Connection getConnecton(){

  23 return conn;

  24 }

  25 //释放资源

  26 public static void release(Connection conn,PreparedStatement

  27 pstat,ResultSet rs) {

  28 if (rs!=null) {

  29 try {

  30 rs.close();

  31 } catch (SQLException e) {

  32 e.printStackTrace();

  33 }

  34 rs=null;

  35 }

  36 release(conn,pstat);

  37 }

  38 public static void release(Connection conn,PreparedStatement pstat) {

  39 if (pstat!=null) {

  40 try {

  41 pstat.close();

  42 } catch (SQLException e) {

  43 e.printStackTrace();

  44 }

  45 pstat=null;

  46 }

  47 if (conn !=null) {

  48 try {

  49 conn.close();

  50 } catch (SQLException e) {

  51 e.printStackTrace();

  52 }

  53 conn=null;

  54 }

  55 }

  56 }

  3. 新建StudentDao类

  在src目录下新建com.qfedu.jdbc.dao包,并在该包下新建StudentDao类,该类提供对数据库表的增加、修改、删除、查询等操作,具体代码如例1-3所示。

  【例1-3】 StudentDao.java

  1 package com.qfedu.jdbc.dao;

  2 import java.sql.Connection;

  3 import java.sql.PreparedStatement;

  4 import java.sql.ResultSet;

  5 import java.sql.SQLException;

  6 import java.util.ArrayList;

  7 import com.qfedu.jdbc.domain.Student;

  8 import com.qfedu.jdbc.utils.JDBCUtils;

  9 public class StudentDao {

  10 //添加Student

  11 public boolean insert(Student student){

  12 boolean flag =false ;

  13 PreparedStatement pstat = null;

  14 Connection conn = JDBCUtils.getConnecton();

  15 String sql ="insert into student(sid,sname,age,course)

  16 values(?,?,?,?)";

  17 try {

  18 pstat = conn.prepareStatement(sql);

  19 pstat.setInt(1, student.getSid());

  20 pstat.setString(2, student.getSname());

  21 pstat.setString(3, student.getAge());

  22 pstat.setString(4, student.getCourse());

  23 int num = pstat.executeUpdate();

  24 if (num>0) {

  25 flag =true;

  26 }

  27 } catch (SQLException e) {

  28 e.printStackTrace();

  29 }finally {

  30 JDBCUtils.release(conn, pstat);

  31 }

  32 return flag;

  33 }

  34 //更新Student

  35 public boolean update(Student student){

  36 boolean flag =false ;

  37 PreparedStatement pstat = null;

  38 Connection conn = JDBCUtils.getConnecton();

  39 String sql ="update student set sname=?,age=?,course=? where

  40 sid=? ";

  41 try {

  42 pstat = conn.prepareStatement(sql);

  43 pstat.setInt(4, student.getSid());

  44 pstat.setString(1, student.getSname());

  45 pstat.setString(2, student.getAge());

  46 pstat.setString(3, student.getCourse());

  47 int num = pstat.executeUpdate();

  48 if (num>0) {

  49 flag =true;

  50 }

  51 } catch (SQLException e) {

  52 e.printStackTrace();

  53 }finally {

  54 JDBCUtils.release(conn, pstat);

  55 }

  56 return flag;

  57 }

  58 //删除Student

  59 public boolean delete(Student student){

  60 boolean flag =false ;

  61 PreparedStatement pstat = null;

  62 Connection conn = JDBCUtils.getConnecton();

  63 String sql ="delete from student where sid=?";

  64 try {

  65 pstat = conn.prepareStatement(sql);

  66 pstat.setInt(1, student.getSid());

  67 int num = pstat.executeUpdate();

  68 if (num>0) {

  69 flag =true;

  70 }

  71 } catch (SQLException e) {

  72 e.printStackTrace();

  73 }finally {

  74 JDBCUtils.release(conn, pstat);

  75 }

  76 return flag;

  77 }

  78 //查询所有Student

  79 public ArrayListselectAll(){

  80 PreparedStatement pstat = null;

  81 Connection conn = JDBCUtils.getConnecton();

  82 String sql ="select * from student";

  83 ArrayListlist = new ArrayList<>();

  84 try {

  85 pstat = conn.prepareStatement(sql);

  86 ResultSet rs = pstat.executeQuery(sql);

  87 while (rs.next()) {

  88 Student newStudent = new Student();

  89 newStudent.setSid(rs.getInt("sid"));

  90 newStudent.setSname( rs.getString("sname"));

  91 newStudent.setAge(rs.getString("age"));

  92 newStudent.setCourse(rs.getString("course"));

  93 list.add(newStudent);

  94 }

  95 } catch (SQLException e) {

  96 e.printStackTrace();

  97 }finally {

  98 JDBCUtils.release(conn, pstat);

  99 }

  100 return list;

  101 }

  102 //查询单个Student

  103 public Student selectOne(Student student){

  104 PreparedStatement pstat = null;

  105 Connection conn = JDBCUtils.getConnecton();

  106 String sql ="select * from student where sid = ? ";

  107 Student newStudent = new Student();

  108 try {

  109 pstat = conn.prepareStatement(sql);

  110 pstat.setInt(1, student.getSid());

  111 ResultSet rs = pstat.executeQuery();

  112 while (rs.next()) {

  113 newStudent.setSid(rs.getInt("sid"));

  114 newStudent.setSname( rs.getString("sname"));

  115 newStudent.setAge(rs.getString("age"));

  116 newStudent.setCourse(rs.getString("course"));

  117 }

  118 } catch (SQLException e) {

  119 e.printStackTrace();

  120 }finally {

  121 JDBCUtils.release(conn, pstat);

  122 }

  123 return newStudent;

  124 }

  125 }

  4. 编写测试类TestInsert

  在src目录下新建com.qfedu.jdbc.test包,并在该包下新建TestInsert类,该类用于测试向表中添加数据的操作,具体代码如例1-4所示。

  【例1-4】 TestInsert.java

  1 package com.qfedu.jdbc.test;

  2 import com.qfedu.jdbc.dao.StudentDao;

  3 import com.qfedu.jdbc.domain.Student;

  4 public class TestInsert {

  5 public static void main(String[] args) {

  6 StudentDao studentDao = new StudentDao();

  7 Student student = new Student();

  8 student.setSid(10);

  9 student.setSname("sunqi");

  10 student.setAge("23");

  11 student.setCourse("python");

  12 studentDao.insert(student);

  13 }

  14 }

  执行TestInsert类,向数据表student中插入数据,通过SQL语句测试数据是否添加成功,执行结果如下所示。

  mysql> SELECT * FROM STUDENT;

  +-----+-------------+------+--------+

  | sid | sname | age | course |

  +-----+-------------+------+--------+

  | 1 | zhangsan | 20 | Java |

  | 2 | lisi | 21 | Java |

  | 3 | wangwu | 22 | Java |

  | 4 | zhaoliu | 22 | Python |

  | 5 | sunqi | 22 | PHP |

  | 6 | zhangsansan | 22 | PHP |

  | 7 | name0 | 22 | Java |

  | 8 | name1 | 22 | Java |

  | 9 | name2 | 22 | Java |

  | 10 | sunqi | 23 | Python |

  +-----+-------------+------+--------+

  10 rows in set (0.00 sec)

  从以上执行结果可以看出,程序成功向数据表添加一条数据。

  5. 编写测试类TestUpdate

  在src目录下的com.qfedu.jdbc.test包下新建TestUpdate类,该类用于测试更新表中数据的操作,具体代码如例1-5所示。

  【例1-5】 TestUpdate.java

  1 package com.qfedu.jdbc.test;

  2 import com.qfedu.jdbc.dao.StudentDao;

  3 import com.qfedu.jdbc.domain.Student;

  4 public class TestUpdate {

  5 public static void main(String[] args) {

  6 StudentDao studentDao = new StudentDao();

  7 Student student = new Student();

  8 student.setSid(10);

  9 student.setSname("zhouba");

  10 student.setAge("24");

  11 student.setCourse("Java");

  12 studentDao.update(student);

  13 }

  14 }

  执行TestUpdate类,更新数据库中sid值为10的数据信息,通过SQL语句测试数据是否更新成功,执行结果如下所示。

  mysql> SELECT * FROM STUDENT;

  +-----+-------------+------+--------+

  | sid | sname | age | course |

  +-----+-------------+------+--------+

  | 1 | zhangsan | 20 | Java |

  | 2 | lisi | 21 | Java |

  | 3 | wangwu | 22 | Java |

  | 4 | zhaoliu | 22 | Python |

  | 5 | sunqi | 22 | PHP |

  | 6 | zhangsansan | 22 | PHP |

  | 7 | name0 | 22 | Java |

  | 8 | name1 | 22 | Java |

  | 9 | name2 | 22 | Java |

  | 10 | zhouba | 24 | Java |

  +-----+-------------+------+--------+

  10 rows in set (0.00 sec)

  从以上执行结果可以看出,程序成功更新sid值为10的数据。

  6. 编写测试类TestDelete

  在src目录下的com.qfedu.jdbc.test包下新建TestDelete类,该类用于测试删除表中数据的操作,具体代码如例1-6所示。

  【例1-6】 TestDelete.java

  1 package com.qfedu.jdbc.test;

  2 import com.qfedu.jdbc.dao.StudentDao;

  3 import com.qfedu.jdbc.domain.Student;

  4 public class TestDelete {

  5 public static void main(String[] args) {

  6 StudentDao studentDao = new StudentDao();

  7 Student student = new Student();

  8 student.setSid(10);

  9 studentDao.delete(student);

  10 }

  11 }

  执行TestDelete类,删除数据库中sid值为10的数据信息,通过SQL语句测试数据是否删除成功,执行结果如下所示。

  mysql> SELECT * FROM STUDENT;

  +-----+-------------+------+--------+

  | sid | sname | age | course |

  +-----+-------------+------+--------+

  | 1 | zhangsan | 20 | Java |

  | 2 | lisi | 21 | Java |

  | 3 | wangwu | 22 | Java |

  | 4 | zhaoliu | 22 | Python |

  | 5 | sunqi | 22 | PHP |

  | 6 | zhangsansan | 22 | PHP |

  | 7 | name0 | 22 | Java |

  | 8 | name1 | 22 | Java |

  | 9 | name2 | 22 | Java |

  +-----+-------------+------+--------+

  9 rows in set (0.00 sec)

  从以上执行结果可以看出,程序成功删除sid值为10的数据。

  7. 编写测试类TestSelectOne

  在src目录下的com.qfedu.jdbc.test包下新建TestSelectOne类,该类用于测试查询表中单条数据的操作,具体代码如例1-7所示。

  【例1-7】 TestSelectOne.java

  1 package com.qfedu.jdbc.test;

  2 import com.qfedu.jdbc.dao.StudentDao;

  3 import com.qfedu.jdbc.domain.Student;

  4 public class TestSelectOne {

  5 public static void main(String[] args) {

  6 StudentDao studentDao = new StudentDao();

  7 Student student = new Student();

  8 student.setSid(1);

  9 Student findStudent = studentDao.selectOne(student);

  10 System.out.println(findStudent.toString());

  11 }

  12 }

  执行TestSelectOne类,程序的运行结果如图1.1所示。

  图1.1 运行结果

  从以上执行结果可以看出,程序成功查询出sid值为1的数据并输出到控制台。

  8. 编写测试类TestSelectAll

  在src目录下的com.qfedu.jdbc.test包下新建TestSelectAll类,该类用于测试查询表中所有数据的操作,具体代码如例1-8所示。

  【例1-8】 TestSelectAll.java

  1 package com.qfedu.jdbc.test;

  2 import java.util.ArrayList;

  3 import com.qfedu.jdbc.dao.StudentDao;

  4 import com.qfedu.jdbc.domain.Student;

  5 public class TestSelectAll {

  6 public static void main(String[] args) {

  7 StudentDao studentDao = new StudentDao();

  8 ArrayListlist = studentDao.selectAll();

  9 for (Student student : list) {

  10 System.out.println(student.toString());

  11 }

  12 }

  13 }

  执行TestSelectAll类,程序的运行结果如图1.2所示。

  图1.2 运行结果

  从以上执行结果可以看出,程序成功查询出表student中所有数据并输出到控制台。

Java学习路线教程之JDBC基本操作的更多相关文章

  1. 分享篇——我的Java学习路线

    虽然之前我是开发出身,但是我学习的语言是Objective-c,这个语言使用起来范围比较窄,对于自动化学习来说也是无用武之地,所以我自己学习了Java,对于一个有开发经验的人来说学习一门新语言相对来说 ...

  2. java学习路线(好资源大家分享)

    对于入门java将近两年的时间,曾经迷惘过,一直想知道java的具体学习路线,看过了许许多多的java经验分享的帖子,评论,以及其他各种培训机构所谓的学习路线,发现没有一个符合我个人需求的学习路线,根 ...

  3. java学习路线推荐,希望能帮到你

    很多小白刚开始学习java时,肯定迷惘过,因为对java基本是啥也不懂的,一直想知道java的具体学习路线,我曾经也看了许许多多的java经验分享的帖子,评论,以及其他各种培训机构所谓的学习路线,特别 ...

  4. 从入门到精通,Java学习路线导航

    引言最近也有很多人来向我"请教",他们大都是一些刚入门的新手,还不了解这个行业,也不知道从何学起,开始的时候非常迷茫,实在是每天回复很多人也很麻烦,所以在这里统一作个回复吧. Ja ...

  5. 从入门到精通,Java学习路线导航(附学习资源)

    原文链接:https://blog.csdn.net/qq_42453117/article/details/100655512 引言 最近也有很多人来向我"请教",他们大都是一些 ...

  6. Java学习路线【转】

    Java学习路线[转] 第一阶段:JavaSE(Java基础部分) Java开发前奏 计算机基本原理,Java语言发展简史以及开发环境的搭建,体验Java程序的开发,环境变量的设置,程序的执行过程,相 ...

  7. 最新java学习路线:含阶段性java视频教程完整版

    最新java学习路线:带阶段性java视频教程版本 第一阶段:Java基础 学习目标: 掌握基本语法.面向对象.常用类.正则.集合.Io流.多线程.Nio.网络编程.JDK新特性.函数式编程 知识点细 ...

  8. 一份最中肯的Java学习路线+资源分享(拒绝傻逼式分享)

    这是一篇针对Java初学者,或者说在Java学习路线上出了一些问题(不知道该学什么.不知道整体的学习路线是什么样的) 第一步:Java基础(一个月左右) 推荐视频: 下面的是黑马内部视频,我比较推荐的 ...

  9. 【Todo】Java学习路线(方向指导)

    在网上搜了下Java学习路线(关键词:学习,因为众所周知,实践出牛人,在平时工作不怎么深入的情况下,才强调学习的方向的重要性 ^_^) 发现下面知乎这个回答写的真好.mark如下: https://w ...

随机推荐

  1. 报错解决——ctypes.ArgumentError: argument 1:……….. : wrong type

    运行 python darknet.py 结果报错如下: Traceback (most recent call last): File “darknet.py”, line 136, in net ...

  2. Unable to cast COM object of type 'Shell32.ShellClass' to interface type 'Shell32.IShellDispatch6'.

    VS 里面的Interop.Shell32.dll(1.0) 这个版本太低了,需要高版本的(我使用的是1.2.107.0) 具体下载地址  自己找吧

  3. axios post、get 请求参数和headers配置

    axios.post("http://xxx.com/xxx/xxx/xxx?", { 'queslistid':this.kemuid }, { headers: {'token ...

  4. ie6-ie8支持CSS3选择器的解决办法

    引入nwmatcher.js和selectivizr.js <!--[if lt IE 10]> <script src="html5shiv.js">&l ...

  5. PHP自动加载SPL的四种处理方式

    libs目录下有3个类文件: Test.class.php <?php class Test { public function __construct() { echo "Loadi ...

  6. Python 全栈开发八 文件处理

    一.基本流程 打开文件得到文件句柄 将文件句柄赋值给一个变量 通过文件句柄对文件进行操作 关闭文件 二.基本操作 1.文件句柄 f = open("a.txt",encoding= ...

  7. 【Java】-NO.12.Java.2.OCJP.1.001-【Java OCJP】-

    1.0.0 Summary Tittle:[Java]-NO.12.Java.2.OCJP.1.001-[Java OCJP]- Style:Java Series:OCJP Since:2017-0 ...

  8. left join不同写法导致数据差异

    select m.*, p.specification, p.sales_price, p.promotion_price from product_detail p left join PRODUC ...

  9. Python 命名笔记

    类名开头大写,驼峰命名 函数名,变量名都小写, 全局常量 如COUNT, 使用全部大写 https://www.cnblogs.com/lytwajue/p/7324724.html 这个是全局变量关 ...

  10. 多级代理 haproxy 传递X-Forwarded-Proto

    有时候后端需要知道客户端是用的http请求还是https请求,所以一般在haproxy加上一个X-Forwarded-Proto头 http-request set-header X-Forwarde ...