JDBC数据库的使用操作总结
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数据库的使用操作总结的更多相关文章
- 对于JDBC数据库的初始化操作
package com.bluesky.connection; import java.sql.Connection; import java.sql.DriverManager; import ja ...
- jdbc 数据库批处理insert操作
package blob; import java.sql.Connection; import java.sql.PreparedStatement; import jdbc.utils.*; // ...
- Java数据库连接——JDBC基础知识(操作数据库:增删改查)
一.JDBC简介 JDBC是连接java应用程序和数据库之间的桥梁. 什么是JDBC? Java语言访问数据库的一种规范,是一套API. JDBC (Java Database Connectivit ...
- 使用JDBC进行数据库的事务操作(1)
本篇讲述数据库中非常重要的事务概念和如何使用MySQL命令行窗口来进行数据库的事务操作.下一篇会讲述如何使用JDBC进行数据库的事务操作. 事务是指数据库中的一组逻辑操作,这个操作的特点就是在该组逻辑 ...
- 使用JDBC对数据库实现批处理操作
本篇讲述如何使用JDBC对数据库实现批处理操作.很多时候单条SQL命令不能满足我们的需求,我们需要对数据库一次实现很多操作,需要发送一批SQL命令给数据库执行. 而JDBC也提供了相应的方法给我们实现 ...
- Java类——JDBC链接、并操作MySQL数据库
Java——MySQL数据库操作类 package pkg.src.database; import java.sql.*; public class MYSQL_DBManager { // //定 ...
- 事务之使用JDBC进行事务的操作
本篇讲述数据库中非常重要的事务概念和如何使用MySQL命令行窗口来进行数据库的事务操作.下一篇会讲述如何使用JDBC进行数据库的事务操作. 事务是指数据库中的一组逻辑操作,这个操作的特点就是在该组逻辑 ...
- JDBC数据库基本操作
1.什么是JDBC? 在看JDBC的概念之前先来看看什么是数据库驱动. 数据库驱动中驱动的概念和平时听到的那种驱动的概念是一样的,比如平时购买的声卡,网卡直接插到计算机上面是不能用的,必须要安装相应的 ...
- JDBC数据库编程:PreparedStatement接口
使用PreparedStatement进行数据库的更新及查询操作. PreparedStatement PreparedStatement是statement子接口.属于预处理. 使用statemen ...
随机推荐
- vue 移动端项目切换页面,页面置顶
之前项目是pc端是使用router的方式实现置顶的 //main.js router.afterEach((to, from, next) => { window.scrollTo(0, 0) ...
- Fortran学习笔记:03 数组(Array)
Fortran学习笔记目录 书接上回:Fortran学习笔记:02 流控制语句 数组(Array) 定义数组 一维数组 program main implicit none integer :: i ...
- 寻找写代码感觉(五)之Mybatis官方代码生成器的使用
一.Mybatis Generator生成器 见名知意,官方给出的代码生成器.好处就是不用自己写实体类.接口.xml文件了,应对简单增删改查是可以的.复杂的还是需要自己手写sql的. 二.Mybati ...
- C#开发BIMFACE系列41 服务端API之模型对比
BIMFACE二次开发系列目录 [已更新最新开发文章,点击查看详细] 在建筑施工图审查系统中,设计单位提交设计完成的模型/图纸,审查专家审查模型/图纸.审查过程中如果发现不符合规范的地方,则流 ...
- 微服务架构理论&SpringCloud
一.什么是微服务? 微服务是一种程序架构模式,它提倡将单体应用程序划分成若干的小服务模块,服务之间互相协调.互相配合,为用户提供最终价值.每个服务运行在其独立的进程中,服务与服务间采用轻量级的通信机制 ...
- DDD领域驱动设计落地实践(十分钟看完,半小时落地)
一.引子 不知今年吹了什么风,忽然DDD领域驱动设计进入大家视野.该思想源于2003年 Eric Evans编写的"Domain-Driven Design领域驱动设计"简称DDD ...
- 创建HTML文档
目录 创建HTML文档 构筑基本的文档结构 DOCTYPE元素 DOCTYPE元素 代码清单1 使用DOCTYPE元素 html元素 html元素 代码清单2 使用html元素 head元素 head ...
- Docker--harbor私有仓库部署与管理
目录 一.Harbor简介 二.Harbor 部署 三.维护管理Harbor 一.Harbor简介 1.什么是Harbor ? Harbor 是 VMware 公司开源的企业级 Docker Re ...
- 重磅!微软发布 vscode.dev,把 VS Code 带入浏览器!
早在 2019 年,当.dev顶级域名开放时,我们赶紧注册了vscode.dev.像许多购买.dev域名的人一样,我们不知道我们将用它做啥.反正,也占个坑吧! 将 VS Code 带入浏览器 直到今天 ...
- 【Java虚拟机11】线程上下文类加载器
前言 目前学习到的类加载的知识,都是基于[双亲委托机制]的.那么JDK难道就没有提供一种打破双亲委托机制的类加载机制吗? 答案是否定的. JDK为我们提供了一种打破双亲委托模型的机制:线程上下文类加载 ...