Java数据库连接,(Java Database Connectivity,简称JDBC)是Java语言中用来规范客户端程序如何来访问数据库的应用程序接口,提供了诸如查询和更新数据库中数据的方法。JDBC是面向关系型数据库的,同时JDBC也是Hibernate、Mybatis等框架的基础。本文主要回顾下JDBC的基本知识。
JDBC使用步骤
我们都知道,使用JDBC不外乎遵循下面几个步骤:
- 加载特定的数据库驱动
- 获得连接对象
- 创建SQL语句
- 执行SQL语句(增、删、改、查)
- 拿到数据库中数据并进行相应的处理
- 关闭相关的资源
准备活动
要复习JDBC,离不开数据库,这里首先要用MySQL创建一张表跟插入几条数据:
1 | create database jdbc; |
三种语句
JDBC在java.sql包中提供了三个语句接口供程序员使用,分别是Statement、PreparedStatement以及CallableStatement它们之间的类图如下:
即PreparedStatement接口继承了Statement接口,而CallableStatement接口又继承了PreparedStatement接口。至于三种接口有什么区别,请看下文。
Statement
Statement用于执行一条静态的SQL语句并返回它执行的结果。
下面来看一个最简单的JDBC例子:
1 | public class TestStatement { |
运行上述代码,不出错的话会看到下列结果:
查看数据库,可以看到小王那条记录也成功插入了:
ps:不想在数据库工具与IDE来回切换的话可以在IDE(如eclipse,IDEA等)中进行相应配置,请自行搜索
然而,大部分我们不会直接使用Statement,而是使用运行速度更快且安全性更高的PreparedStatement。
PreparedStatement
PreparedStatement对象代表着一条预编译好的语句,因此相对于Statement执行效率更高。
下面看一个PreparedStatement的例子:
1 | public class TestPreparedStatement { |
ps:为节省空间,省去catch语句块和finally语句块的内容
查看数据库,应该可以看到记录插入成功。
以下是PreparedStatement和Statement的主要区别:
- PreparedStatement可以写动态参数化的查询(使用占位符”?”)
- 由于使用了预编译,PreparedStatement的运行速度更快
- PreparedStatement能过滤掉特殊字符(如单引号等),因此能有效防止SQL注入等攻击,安全性更高
从上面几点来看,我们都应该尽可能地使用PreparedStatement。然而,如果要调用存储过程,还得用到PreparedStatement的子接口CallableStatement。
CallableStatement
简介
存储过程(Stored Procedure)是在大型数据库系统中,一组为了完成特定功能的SQL语句集,存储在数据库中,经过第一次编译后再次调用不需要再次编译,用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它。
可以通过CallableStatement用来调用存储过程。先来看一下MySQL创建存储过程的语法:
1 | CREATE |
下面使用MySQL创建三个存储过程,分别不带参数,带输出参数和带输入参数:
1 | #无参数存储过程(查询所有记录) |
在MySQL中调用存储过程可使用call命令,如:1
call select_filter(1000);
查看存储过程有两种方法:
select
namefrom mysql.proc where db = 'your_db_name' and
type= 'PROCEDURE'
show procedure status;
查看存储过程创建:
1 | show create procedure proc_name; |
调用
接下来,使用JDBC调用存储过程。
为了方便,先创建一个Connection工具类:
1 | public class ConnectionUtil { |
不带参数的存储过程
调用不带参数的存储过程核心代码:
1 | public static void callProcedureWithoutP() throws SQLException { |
结果:
带输入参数的存储过程
调用带输入参数的存储过程核心代码:
1 | public static void callProcedureWithIn(double money) throws SQLException { |
结果:
带输出参数的存储过程
调用带输出参数的存储过程核心代码:
1 | public static void callProcedureWithOut() throws SQLException { |
结果:
总结
以上是JDBC的基本用法,包括主要包括JDBC编程步骤,三种Statement使用方法和一些MySQL的语法。为了避免篇幅过长,将更多用法如:批处理、事务和数据源等放在下一篇文章中。