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 ...
随机推荐
- Jarque-Bera test|pp图|K-S检验|
Jarque-Bera test: 如何绘制pp图? 找该直线的截距和斜率,通过截距和斜率的值找到正态参数均值和方差,可对这些正态参数进行正态检验. K-S检验的的特点? 并不是只针对正态分布,是 ...
- 安装Rational Rose启动报错:无法启动此程序,因为计算机中丢失 suite objects.dll。
运行Rational Rose的时候如果出现这样的错误,先检查环境变量有没有common的地址,如果没有直接配上就OK:配置如下:D:\Program Files\Rational\Common; 我 ...
- springboot学习笔记:12.解决springboot打成可执行jar在linux上启动慢的问题
有时候,当你把你的springboot项目打成可执行的jar,放在linux上启动时,发现启动超级慢: 这往往是因为springboot内置tomcat启动时实例化SecureRandom对象随机数策 ...
- 【flask】RestFul的基本鉴权
编写API的基本鉴权 #!/usr/bin/env python # -*- coding: utf-8 -*- # @Author : shenqiang from flask import Fla ...
- String截取字符串的指定字节长度
/** TODO:截取字符串的指定字节长度 * @Author wenjing * @Date 11:02 2019/5/15 * @Param [str, bengin, end] * @retur ...
- 2.Redis数据类型
Redis中存储数据是通过key-value存储的,对于value的类型有以下几种: 字符串 Hash类型 List Set SortedSet(zset) 注:在redis中的命令语句中,命令是忽略 ...
- K3CLOUD表关联
销售订单关联发货通知单 销售订单表 T_SAL_ORDER A T_SAL_ORDERENTRY B T_SAL_ORDERENTRY_LK C 发货通知单表 T_SAL_DELIVERYNOTICE ...
- 识别ios系统设备并获取版本号
let isIOS = userAgent.toLowerCase().indexOf("like mac os x") > 0; //ios终端 if (isIOS) { ...
- CAD安装错误1625:系统策略禁止这个安装,请与系统管理员联系。
在安装Autodesk CAD/3DMAX/Maya/Revit/Inventor等的时候,出现“安装错误1625:系统策略禁止这个安装,请与系统管理员联系.”,或是Error 1625,同时还会提示 ...
- Telnet和SSH区别
首先,telnet和ssh都是连接远程计算机的连接协议,可以完成对完成计算机的控制,方便维护.其次,他们都是基于TCP/IP协议下的,所以连接时都需要知道目标机的网址或者域名,第三,他们都是与远程主机 ...