JDBC是一组能够执行SQL语句的API

由于传统的数据库操作方式需要程序员掌握各个不同的数据库的API,极其不便

因此java定义了JDBC这一标准的接口和类,为程序员操作数据库提供了统一的方式

JDBC的操作方式比较单一,由五个流程组成:

1.通过数据库厂商提供的JDBC类库向DriverManager注册数据库驱动

2.使用DriverManager提供的getConnection()方法连接到数据库

3.通过数据库的连接对象的createStatement方法建立SQL语句对象

4.执行SQL语句,并将结果集合返回到ResultSet中

5.使用while循环读取结果

6.关闭数据库资源

下面来看看具体操作Mysql数据库的方法

准备工作

首先我们需要建立一个数据库和一张简单的表

 1 mysql> create database person;
2 Query OK, 1 row affected (0.00 sec)
3
4 mysql> use person;
5 Database changed
6 mysql> create table student(
7 -> id int,
8 -> name varchar(20),
9 -> birth year
10 -> ) default charset=utf8;
11 Query OK, 0 rows affected (0.10 sec)

然后往里面插入几条数据

1 mysql> insert into student values
2 -> (1,'张三',1990),
3 -> (2,'李四',1991),
4 -> (3,'王五',1992);
5 Query OK, 3 rows affected (0.02 sec)
6 Records: 3 Duplicates: 0 Warnings: 0

这样一张简单的表就建好了

1 mysql> select * from student;
2 +------+--------+-------+
3 | id | name | birth |
4 +------+--------+-------+
5 | 1 | 张三 | 1990 |
6 | 2 | 李四 | 1991 |
7 | 3 | 王五 | 1992 |
8 +------+--------+-------+
9 rows in set (0.00 sec)

接下来,去mysql官网下载数据库连接器这个包

其中这个包里面含有一份文档,里面列举了基本的使用方法,可以参考

我们的操作也是按照这份文档中的内容进行,然后最主要的地方就是导入这个jar包

为了操作方便,这里使用eclipse来导入

右键项目-->构件路径-->添加外部归档,添加好了之后如下所示

现在我们正式开始使用java来操作mysql数据库(关于这个步骤,上几篇文章有介绍)

JDBC操作实例1:最简单的查询操作

import java.sql.*;

public class Demo {
//为了代码紧凑性,暂时抛出所有异常
public static void main(String[] args) throws Exception {
//注册数据库驱动
Class.forName("com.mysql.jdbc.Driver");
//建立数据库连接
//参数一:jdbc:mysql//地址:端口/数据库,参数二:用户名,参数三:密码
Connection conn = DriverManager.getConnection
("jdbc:mysql://localhost:3306/person","root","admin");
//创建SQL语句
Statement st = conn.createStatement();
//执行语句,返回结果
ResultSet rt = st.executeQuery("show tables");
//循环取出结果
while(rt.next()) {
//获取字段
System.out.println(rt.getString("Tables_in_person"));
}
//关闭资源,最先打开的最后关
rt.close();
st.close();
conn.close();
}
}

运行结果:student

如此便可执行show tables语句查询出当前数据库含有多少张表

其中rt.getString()方法是获取字段,这点需要注意

关闭资源的方式也与以往相反

不过,上面的操作方式灵活性不大,并且不严谨

实例2:优化的查询操作

 1 import java.sql.Connection;
2 import java.sql.DriverManager;
3 import java.sql.ResultSet;
4 import java.sql.SQLException;
5 import java.sql.Statement;
6
7 public class Demo {
8 public static void main(String[] args) {
9 String url = "jdbc:mysql://localhost:3306/person";
10 String user = "root";
11 String pwd = "admin";
12 String sql = "select * from student";
13
14 Connection conn = null;
15 Statement st = null;
16 ResultSet rs = null;
17 try {
18 Class.forName("com.mysql.jdbc.Driver");
19 conn = DriverManager.getConnection(url,user,pwd);
20 st = conn.createStatement();
21 //执行查询语句,另外也可以用execute(),代表执行任何SQL语句
22 rs = st.executeQuery(sql);
23 while(rs.next()) {
24 System.out.println(rs.getObject(1) + " " +
25 rs.getObject(2) + " " + rs.getInt("birth"));
26 }
27 //分别捕获异常
28 } catch (ClassNotFoundException e) {
29 e.printStackTrace();
30 } catch (SQLException e) {
31 e.printStackTrace();
32 } finally {
33 try {
34 //判断资源是否存在
35 if(rs != null) {
36 rs.close();
37 //显示的设置为空,提示gc回收
38 rs = null;
39 }
40 if(st != null) {
41 st.close();
42 st = null;
43 }
44 if(conn != null) {
45 conn.close();
46 conn = null;
47 }
48 } catch (SQLException e) {
49 e.printStackTrace();
50 }
51 }
52 }
53 }

这里把异常给分别捕获了,并且相关的字符串全部用变量定义

需要注意下循环取出数据里面的getInt()方法,此处必须知道类型和字段才能取出

如果不知道可以使用getObject(1)取出第一列,getObject(2)取出第二列,以此类推

实例3:自定义变量插入到数据库

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement; public class Demo {
public static void main(String[] args) {
//参数检查
if (args.length != 3) {
System.out.println("参数形式不对");
System.exit(0);
}
String id = args[0];
String name = args[1];
String birth = args[2];
String sql = "insert into student values(" + id + ",'" + name +
"'," + "'" + birth + "')";
System.out.println(sql); String url = "jdbc:mysql://localhost:3306/person";
String user = "root";
String pwd = "admin"; Connection conn = null;
Statement st = null;
try {
Class.forName("com.mysql.jdbc.Driver");
conn = DriverManager.getConnection(url,user,pwd);
st = conn.createStatement();
//注意,此处是excuteUpdate()方法执行
st.executeUpdate(sql);
//分别捕获异常
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
} finally {
try {
if(st != null) {
st.close();
st = null;
}
if(conn != null) {
conn.close();
conn = null;
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}

这里运行需要设置自变量,窗口中右键-->运行方式-->运行配置

然后在自变量里面写4 susan 1993,我没有写中文,因为产生乱码,目前还不清楚原因

需要注意的是,执行插入的SQL语句比较难写,最好是打印出SQL语句用以检查

实例4:PreparedStatement应用

从上面的Demo可以看到,插入数据的时候,SQL操作相当不便

这里可以使用PreparedStatement对象来简化SQL语句的建立

 1 import java.sql.Connection;
2 import java.sql.DriverManager;
3 import java.sql.PreparedStatement;
4 import java.sql.SQLException;
5
6 public class Demo {
7
8 public static void main(String[] args) {
9 if (args.length != 3) {
10 System.out.println("参数形式不对");
11 System.exit(0);
12 }
13 String id = args[0];
14 String name = args[1];
15 String birth = args[2];
16
17 String url = "jdbc:mysql://localhost:3306/person";
18 String user = "root";
19 String pwd = "admin";
20
21 Connection conn = null;
22 //声明PreparedStatement对象的引用
23 PreparedStatement pst = null;
24 try {
25 Class.forName("com.mysql.jdbc.Driver");
26 conn = DriverManager.getConnection(url,user,pwd);
27 //使用?代替变量
28 pst = conn.prepareStatement("insert into student values (?,?,?)");
29 //给指定参数的位置设定变量
30 pst.setString(1, id);
31 pst.setString(2, name);
32 pst.setString(3, birth);
33 pst.executeUpdate();
34 } catch (ClassNotFoundException e) {
35 e.printStackTrace();
36 } catch (SQLException e) {
37 e.printStackTrace();
38 } finally {
39 try {
40 if(pst != null) {
41 pst.close();
42 pst = null;
43 }
44 if(conn != null) {
45 conn.close();
46 conn = null;
47 }
48 } catch (SQLException e) {
49 e.printStackTrace();
50 }
51 }
52 }
53 }

实例5:Batch批处理

 1 import java.sql.Connection;
2 import java.sql.DriverManager;
3 import java.sql.SQLException;
4 import java.sql.Statement;
5
6 public class Demo {
7
8 public static void main(String[] args) {
9
10 String url = "jdbc:mysql://localhost:3306/person";
11 String user = "root";
12 String pwd = "admin";
13
14 Connection conn = null;
15 Statement st = null;
16 try {
17 Class.forName("com.mysql.jdbc.Driver");
18 conn = DriverManager.getConnection(url,user,pwd);
19 st = conn.createStatement();
20 //添加批处理
21 st.addBatch("insert into student values(6,'Jerry','1995')");
22 st.addBatch("insert into student values(7,'Greg','1996')");
23 st.addBatch("insert into student values(8,'Ryan','1997')");
24 //执行批处理
25 st.executeBatch();
26 } catch (ClassNotFoundException e) {
27 e.printStackTrace();
28 } catch (SQLException e) {
29 e.printStackTrace();
30 } finally {
31 try {
32 if(st != null) {
33 st.close();
34 st = null;
35 }
36 if(conn != null) {
37 conn.close();
38 conn = null;
39 }
40 } catch (SQLException e) {
41 e.printStackTrace();
42 }
43 }
44 }
45 }

批处理比较简单,只需先建立Statement对象,然后逐个添加批处理即可

最后使用executeBatch()方法执行批处理

此外,PreparedStatement对象也可以使用批处理

1 PreparedStatement ps = conn.prepareStatement("insert into student values(?,?,?)");
2 ps.setInt(1,8);
3 ps.setString(2,"GG");
4 ps.setString(3,"1996");
5 ps.addBatch();
6 ps.executeBatch();

实例6:Transaction事务处理

事务处理是要求sql以单元的形式更新数据库,要求其确保一致性

如银行的转账业务,一方转出后,另一方则增加

如果出现异常,那么所有的操作则会回滚

 1 import java.sql.Connection;
2 import java.sql.DriverManager;
3 import java.sql.SQLException;
4 import java.sql.Statement;
5
6 public class Demo {
7
8 public static void main(String[] args) {
9
10 String url = "jdbc:mysql://localhost:3306/person";
11 String user = "root";
12 String pwd = "admin";
13
14 Connection conn = null;
15 Statement st = null;
16 try {
17 Class.forName("com.mysql.jdbc.Driver");
18 conn = DriverManager.getConnection(url,user,pwd);
19 //取消自动提交
20 conn.setAutoCommit(false);
21 st = conn.createStatement();
22 st.addBatch("insert into student values(6,'Jerry','1995')");
23 st.addBatch("insert into student values(7,'Greg','1996')");
24 st.addBatch("insert into student values(8,'Ryan','1997')");
25 st.executeBatch();
26 //提交后设置自动提交
27 conn.commit();
28 conn.setAutoCommit(true);
29 } catch (ClassNotFoundException e) {
30 e.printStackTrace();
31
32 } catch (SQLException e) {
33 e.printStackTrace();
34
35 if(conn != null) {
36 try {
37 //出现异常则回滚操作,然后设置自动提交
38 conn.rollback();
39 conn.setAutoCommit(true);
40 } catch (SQLException e1) {
41 e1.printStackTrace();
42 }
43 }
44 } finally {
45 try {
46 if(st != null) {
47 st.close();
48 st = null;
49 }
50 if(conn != null) {
51 conn.close();
52 conn = null;
53 }
54 } catch (SQLException e) {
55 e.printStackTrace();
56 }
57 }
58 }
59 }

JDBC数据库的使用操作总结的更多相关文章

  1. 对于JDBC数据库的初始化操作

    package com.bluesky.connection; import java.sql.Connection; import java.sql.DriverManager; import ja ...

  2. jdbc 数据库批处理insert操作

    package blob; import java.sql.Connection; import java.sql.PreparedStatement; import jdbc.utils.*; // ...

  3. Java数据库连接——JDBC基础知识(操作数据库:增删改查)

    一.JDBC简介 JDBC是连接java应用程序和数据库之间的桥梁. 什么是JDBC? Java语言访问数据库的一种规范,是一套API. JDBC (Java Database Connectivit ...

  4. 使用JDBC进行数据库的事务操作(1)

    本篇讲述数据库中非常重要的事务概念和如何使用MySQL命令行窗口来进行数据库的事务操作.下一篇会讲述如何使用JDBC进行数据库的事务操作. 事务是指数据库中的一组逻辑操作,这个操作的特点就是在该组逻辑 ...

  5. 使用JDBC对数据库实现批处理操作

    本篇讲述如何使用JDBC对数据库实现批处理操作.很多时候单条SQL命令不能满足我们的需求,我们需要对数据库一次实现很多操作,需要发送一批SQL命令给数据库执行. 而JDBC也提供了相应的方法给我们实现 ...

  6. Java类——JDBC链接、并操作MySQL数据库

    Java——MySQL数据库操作类 package pkg.src.database; import java.sql.*; public class MYSQL_DBManager { // //定 ...

  7. 事务之使用JDBC进行事务的操作

    本篇讲述数据库中非常重要的事务概念和如何使用MySQL命令行窗口来进行数据库的事务操作.下一篇会讲述如何使用JDBC进行数据库的事务操作. 事务是指数据库中的一组逻辑操作,这个操作的特点就是在该组逻辑 ...

  8. JDBC数据库基本操作

    1.什么是JDBC? 在看JDBC的概念之前先来看看什么是数据库驱动. 数据库驱动中驱动的概念和平时听到的那种驱动的概念是一样的,比如平时购买的声卡,网卡直接插到计算机上面是不能用的,必须要安装相应的 ...

  9. JDBC数据库编程:PreparedStatement接口

    使用PreparedStatement进行数据库的更新及查询操作. PreparedStatement PreparedStatement是statement子接口.属于预处理. 使用statemen ...

随机推荐

  1. ThreadLocal概念以及使用场景

    ThreadLocal概念以及使用场景 根据自身的知识深度,这里只限于自己使用和学习的知识点整理,原理的解释还需要再沉淀. 该文章从项目开发中举例,希望能帮助到各位,不了解ThreadLocal的朋友 ...

  2. 【c++ Prime 学习笔记】目录索引

    第1章 开始 第Ⅰ部分 C++基础 第2章 变量和基本类型 第3章 字符串.向量和数组 第4章 表达式 第5章 语句 第6章 函数 第7章 类 第 Ⅱ 部分 C++标准库 第8章 IO库 第9章 顺序 ...

  3. Java中的函数式编程(七)流Stream的Map-Reduce操作

    写在前面 Stream 的 Map-Reduce 操作是Java 函数式编程的精华所在,同时也是最为复杂的部分.但一旦你啃下了这块硬骨头,那你就真正熟悉Java的函数式编程了. 如果你有大数据的编程经 ...

  4. the Agiles Scrum Meeting 6

    会议时间:2020.4.14 20:00 1.每个人的工作 今天已完成的工作 增量组:开发广播正文展开收起功能 issues:增量组:广播正文展开收起功能实现 完善组:修复冲刺部分的bug issue ...

  5. Canal Server发送binlog消息到Kafka消息队列中

    Canal Server发送binlog消息到Kafka消息队列中 一.背景 二.需要修改的地方 1.canal.properties 配置文件修改 1.修改canal.serverMode的值 2. ...

  6. git为单独的仓库设置提交的用户名

    在我们平时的学习中可能有这么一种需求,在公司进行开发的时候,一般会参与多个项目的开发,而项目提交代码时,一般请求情况下提供的用户都是同一个,而我们为了方便可能会使用全局进行git 用户名的配置.但是空 ...

  7. VS2019、Qt5.12及QGis3.16开发常见问题汇总

    在C++.Qt软件开发过程中,常常遇到一些编译错误或警告:本文将VS2019.Qt5.12.10和QGis3.16.10的二次开发过程常见的问题做了整理,供大家参考,也便于日后查阅.该内容分为四部分: ...

  8. matlab添加永久路径

    addpath('D:\MATLAB6p5\toolbox\svm'); 临时添加路径,不能添加子目录 addpath(genpath('D:\MATLAB6p5\toolbox\svm'));临时添 ...

  9. f(sinx)到底是啥

    总结一句:cosx是偶次就一定可以用.

  10. 攻防世界 杂项 9.a_good_idea

    题目描述: 汤姆有个好主意 解题思路: 首先按照隐写思路找了一下没找到flag,接着使用winhex打开图片,发现图片里面又包含了一张图片,然后马上改了一下后缀为zip, 解压后发现里面有:hint. ...