JDBC概述及编程步骤详解
一、JDBC概述
Java Database Connectivity:数据库连接,是一种可执行SQL语句的API。
JDBC是面向接口编程的典型应用:关系型数据库系统类型多样(诸如MySQL,DB2,Oracle),为了实现统一简化开发,Sun公司制定这套标准的API(接口),不同的厂商提供实现,使得依据JDBC开发的数据库程序可以跨平台执行,使用时只需要不同数据库的驱动程序即可。

大部分的数据库系统都有相应的JDBC驱动程序,当连接某个特定的数据库时,必须有相应的数据库驱动程序。
二、JDBC编程步骤(以MySQL为例)
1、导入jar包
IDEA中,导入相应的JDBC驱动jar包到项目中,并通过add library添加到工作空间。
2、加载数据库驱动
加载数据库驱动,通常使用Class类的forName(驱动类全类名)加载驱动,例如MySQL中加载驱动的方法为:
Class.forName("com.mysql.jdbc.Driver");
需要注意的是,最新的JDBC驱动已经可以通过SPI自动注册驱动类,这种情况下jar中的META-INF/services目录下会包含java.sql.Driver的文件,已经指定了JDBC驱动类,所以该情况下,这步其实可以省略。

3、通过DriverManager获得Connection对象
利用DriverManager类的静态方法public static Connection getConnection(String url,String user, String password)获取连接对象Connection。
传递参数:数据库URL,用户名user,密码password。
数据库URL的书写方式:
jdbc:mysql://服务器名或IP地址:端口号/数据库名[?参数名=参数值]Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb2", "root", "123456");
如果服务器为本地,在MySQL中可以简写为:
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb2", "root", "123456");
另外getConnection还有个重载方法:public static Connection getConnection(String url,java.util.Properties info),将user和password存储到Properties对象中,传入方法即可。
Properties prop = new Properties();
prop.setProperty("user","root");
prop.setProperty("password","123456")
DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb2",prop);
3、定义SQL语句
String sql = "update orders set price = 500 where id = 1";//普通的sql语句
//如果需要执行某些相似的sql语句多次,只有某个地方有改动,可以使用带占位符的sql语句
String sql = "select * from user where username = ? and password = ?";//带占位符的sql语句
4、利用Connection创建Statement对象
//创建最基本的Statement对象
Statement statement = conn.createStatement();
//创建一个预编译sql语句的PreparedStatement对象,后者是前者的子接口。使用时需要将sql语句占位符部分进行填充。
PreparedStatement prs = conn.prepareStatement(sql);
Statement与PreparedStatement:
在执行多次相似的sql语句时,PreparedStatement预编译SQL语句性能更好。
PreparedStatement无需凭借SQL语句,编程更加简单(ps:确实简单)。
PreparedStatement可以防止SQL注入。
//SQL注入的例子:
String sql = "select * from user where username = '"+username+"'and password = '"+password+"'";
resultSet = statement.executeQuery(sql);
return resultSet.next();
当我用Statement对象执行拼接完成之后的SQL语句,目的是为了判断是否传入正确的用户名和密码。这时,如果随便输入不存在的用户名
dede,密码输入:' or true or ',这时SQL注入之后就会变成下面这个鬼样子:select * from user where username = 'dede'and password = ''or true or '';
相当于直接输入了true,非常不合理,而PreparedStatement可以避免SQL注入:
//PreparedStatement防止SQL注入
String sql = "select * from user where username = ? and password = ?";
preparedStatement.setString(1,username);
preparedStatement.setString(2,password);
resultSet = preparedStatement.executeQuery();
5、利用Statement执行SQL语句
无论是Statement还是它的子接口对象,都拥有执行SQL语句的方法,下面是比较重要的几个:
- boolean excute():可以执行任何的SQL语句,但是比较麻烦,通常不用。(这个方法在子接口里是没有的嗷),如果部清楚SQL语句的类型,可以使用该方法。
- int executeUpdate():用于执行DML和DDL语句,返回结果是受影响的行数。
//定义sql语句
String sql = "update orders set price = 500 where id = 1";
//获取执行sql的对象 Statement
Statement stmt = conn.createStatement();
//执行sql
int count = stmt.executeUpdate(sql);
- ResultSet executeQuery():只能执行查询语句,返回结果是一个ResultSet结果集。
PreparedStatement preparedStatement = null;
//定义sql语句
String sql = "select * from user where username = ? and password = ?";
//获取PreparedStatement对象
preparedStatement = conn.prepareStatement(sql);
//给对应的占位符赋值,如果不清楚参数类型可以使用setObject()传入参数
preparedStatement.setString(1,username);
preparedStatement.setString(2,password);
//执行查询语句,获取结果集
ResultSet resultSet = preparedStatement.executeQuery();
6、操作ResultSet对象
明确一点,ResultSet对象是通过excuteQuery执行查询语句的结果。原理类似于迭代器,通过指针的移动来获取值。
典型的方法:
next():指针一开始指向第一行之前,指针向下移动,返回一个boolean值,代表后面是否有记录,有就返回true,没有就返回false。所以判断是否存在记录可以直接用
ResultSet.next();判断。getXxx():用以获取指定行,特定列的值。有许多的重载方法:包括传递指定列数(从1开始,如
getInt(1)代表获取该行第一列的INT值),指定参数(传递列名,如getInt("id"),获取改行id字段的值)。
//打印所有记录
while(resultSet.next()) {
//获取数据
int id = resultSet.getInt(1);
String product = resultSet.getString("product");
int price = resultSet.getInt("price");
System.out.println(id + "--" + product + "--" + price);
}
7、回收数据库资源
回收数据库资源有两种方式:
Connection、Statement、ResultSet都继承了AutoCloseable接口,都可以使用Java7的try-with-resources的自动关闭资源的try语句来关闭:
public static void main(String[] args) throws Exception {
Class.forName("com.mysql.jdbc.Driver");
try (
Connection conn = DriverManager.getConnection(
"jdbc:mysql://localhost:3306/mydb2", "root", "123456");
Statement stmt = conn.createStatement())
{
String sql = "update orders set price = 500 where id = 1";
int count = stmt.executeUpdate(sql);
System.out.println(count);
}
}
还有就是传统的try……catch语句:
public static void main(String[] args){
Connection conn = null;
Statement stmt = null;
try {
Class.forName("com.mysql.jdbc.Driver");
conn = DriverManager.getConnection(
"jdbc:mysql://localhost:3306/mydb2", "root", "123456");
stmt = conn.createStatement();
String sql = "update orders set price = 500 where id = 1";
int count = stmt.executeUpdate(sql);
System.out.println(count);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
} finally {
//避免空指针异常
if(stmt!=null){
try {
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (conn!=null){
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
参考资料:《疯狂Java讲义》
JDBC概述及编程步骤详解的更多相关文章
- Java中JDBC连接数据库代码和步骤详解总结
JDBC连接数据库 •创建一个以JDBC连接数据库的程序,包含7个步骤: 1.加载JDBC驱动程序: 在连接数据库之前,首先要加载想要连接的数据库的驱动到JVM(Jav ...
- KEIl混合编程步骤详解
一.在keil中C函数调用汇编函数: 主要思路:先用C来编写所要实现及调用的汇编函数,然后由此C函数生成相应的汇编代码,这样我们就可以不用去管混合编程调用时复杂的函数接口,我们只要修改相应汇编函数中的 ...
- MD5算法步骤详解
转自MD5算法步骤详解 之前要写一个MD5程序,但是从网络上看到的资料基本上一样,只是讲了一个大概.经过我自己的实践,我决定写一个心得,给需要实现MD5,但又不要求很高深的编程知识的童鞋参考.不多说了 ...
- java并发编程 | 锁详解:AQS,Lock,ReentrantLock,ReentrantReadWriteLock
原文:java并发编程 | 锁详解:AQS,Lock,ReentrantLock,ReentrantReadWriteLock 锁 锁是用来控制多个线程访问共享资源的方式,java中可以使用synch ...
- Thrift实现C#调用Java开发步骤详解
概述 Thrift实现C#调用Java开发步骤详解 详细 代码下载:http://www.demodashi.com/demo/10946.html Apache Thrift 是 Facebook ...
- 搞懂分布式技术4:ZAB协议概述与选主流程详解
搞懂分布式技术4:ZAB协议概述与选主流程详解 ZAB协议 ZAB(Zookeeper Atomic Broadcast)协议是专门为zookeeper实现分布式协调功能而设计.zookeeper主要 ...
- 人工智能之深度学习-初始环境搭建(安装Anaconda3和TensorFlow2步骤详解)
前言: 本篇文章主要讲解的是在学习人工智能之深度学习时所学到的知识和需要的环境配置(安装Anaconda3和TensorFlow2步骤详解),以及个人的心得体会,汇集成本篇文章,作为自己深度学习的总结 ...
- ASP.NET连接Oracle数据库的步骤详解(转)
ASP.NET连接Oracle数据库的步骤详解 本文我们主要介绍了ASP.NET连接Oracle数据库的步骤及每个步骤需要进行的设置,希望能够对您有所帮助. 在用ASP.NET开发应用程序时, ...
- Oracle 11g客户端在Linux系统上的配置步骤详解
Oracle 11g客户端在Linux系统上的配置步骤详解 2011-07-26 10:47 newhappy2008 CSDN博客 字号:T | T 本文我们主要介绍了Oracle 11g客户端在L ...
随机推荐
- K - Wand(组合数+错排公式)
N wizards are attending a meeting. Everyone has his own magic wand. N magic wands was put in a line, ...
- VMware安装 RHEL安装完后,选择桥接模式如何与主机网络连通
.查看主机的ip与网关,dns配置,如图 2.在linux系统中打开cd /etc/sysconfig/network-scripts/ #进入网络配置文件目录 vi ifcfg-eno1677 ...
- The sequence and de novo assembly of the giant panda genome.ppt
sequencing:使用二代测序原因:高通量,短序列 不用长序列原因: 1.算法错误率高 2.长序列测序将嵌合体基因错误积累.嵌合体基因:通过重组由来源与功能不同的基因序列剪接而形成的杂合基因 se ...
- 源码分析SpringBoot启动
遇到一个问题,需要从yml文件中读取数据初始化到static的类中.搜索需要实现ApplicationRunner,并在其实现类中把值读出来再set进去.于是乎就想探究一下SpringBoot启动中都 ...
- LeetCode No.73,74,75
No.73 SetZeroes 矩阵置零 题目 给定一个 m x n 的矩阵,如果一个元素为 0,则将其所在行和列的所有元素都设为 0.请使用原地算法. 示例 输入: [ [1,1,1], [ ...
- Iterator迭代器解决[为何禁止在foreach内增删]
迭代器的应用场景: 1.对集合进行增加删除,禁止使用foreach,循环的动态操作2.倒序遍历3.遍历循环 步入正题:为何禁止在foreach内进行增删? 先看一下代码: /** * ...
- Windows 10操作系统针对不同环境下的安装方法
一.电脑系统能正常运行 1.解压win10镜像文件 到电脑的非系统分区,运行setup安装文件 2.点击setup应用程序,准备安装 3.准备安装 4.等待安装过程结束,重启即可. 二.光盘安装 1. ...
- Golang Slice 总结
数组 Go的切片是在数组之上的抽象数据类型,因此在了解切片之前必须要要理解数组.数组类型由指定和长度和元素类型定义.数组不需要显式的初始化:数组元素会自动初始化为零值:Go的数组是值语义.一个数组变量 ...
- Java基础 带你深刻理解自动装箱,拆箱含义
1.什么是装箱,什么是拆箱装箱:把基本数据类型转换为包装类.拆箱:把包装类转换为基本数据类型.基本数据类型所对应的包装类:int(几个字节4)- Integerbyte(1)- Byteshort(2 ...
- Struts2开发基本步骤
1 加载jar文件 commons-fileupload.jar commons-io.jar commons-lang.jar freemaker.jar ognl.jar ...