JDBC流程
最近要学习Mybatis的源码,因此对JDBC的使用进行总结。
一、JDBC概述
JDBC(Java DataBase Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成。JDBC提供了一种基准,据此可以构建更高级的工具和接口,使数据库开发人员能够编写数据库应用程序,让我们通过程序操作数据库,是java的核心技术之一。
二、JDBC流程详解
JDBC操作数据库共包括6个步骤:
注冊驱动 (仅仅做一次)
建立连接(Connection)
创建传输器Statement
运行SQL语句
处理运行结果(ResultSet)
释放资源
下面就分别针对六个步骤进行说明。
第一步:注册驱动
注冊驱动有三种方式:
1、 Class.forName(“com.mysql.jdbc.Driver”);
推荐这样的方式,不会对详细的驱动类产生依赖
2、DriverManager.registerDriver(com.mysql.jdbc.Driver);
会对详细的驱动类产生依赖
3、System.setProperty(“jdbc.drivers”, “driver1:driver2”);
尽管不会对详细的驱动类产生依赖,但注冊不太方便,所以非常少使用
第二步:建立连接
通过Connection建立连接,Connection是一个接口类。其功能是与数据库进行连接(会话)。
建立Connection接口类对象:
Connection conn =DriverManager.getConnection(url, user, password);
user为登录数据库的username,如root
password为登录数据库的密码,为空填””
当中url的格式要求为:
//子协议:子名称//主机名:port/数据库名?属性名=属性值&…
url = "jdbc:mysql://localhost:3306/test“
第三步:创建传输器Statement
运行对象Statement负责运行SQL语句。由Connection对象产生。
Statement st = connection.createStatement();
Statement接口类还派生出两个接口类PreparedStatement和CallableStatement,这两个接口类对象为我们提供了更加强大的数据訪问功能。
PreparedStatement接口
PreparedStatement能够对SQL语句进行预编译,这样防止了SQL注入,提高了安全性。
PreparedStatement ps=connection.prepareStatement( "update user set id = ? where username = ?”);
//sql语句中用?作为通配符,变量值通过参数设入:ps.setObject(1, object);
此外预编译结果能够存储在PreparedStatement对象中,当多次运行SQL语句时能够提高效率。作为Statement的子类,PreparedStatement继承了Statement的全部函数。
CallableStatement接口
CallableStatement类继承了PreparedStatement类,他主要用于运行SQL存储过程。
在JDBC中运行SQL存储过程须要转义。
JDBC API提供了一个SQL存储过程的转义语法:
{call<procedure-name>[<arg1>,<arg2>, ...]}
//procedure-name:是所要运行的SQL存储过程的名字
//[<arg1>,<arg2>, ...]:是相相应的SQL存储过程所须要的參数
第四步:运行SQL语句
运行对象Statement 或 PreparedStatement 提供两个经常使用的方法来运行SQL语句:executeQuery和executeUpdate。
1、executeQuery(Stringsql),该方法用于运行实现查询功能的sql语句。返回类型为ResultSet(结果集)。
ResultSet rs =st.executeQuery(sql);
2、executeUpdate(Stringsql),该方法用于运行实现增、删、改功能的sql语句,返回类型为int,即受影响的行数。
int flag = st.executeUpdate(sql);
第五步:处理运行结果
ResultSet对象负责保存Statement运行后所产生的查询结果。结果集ResultSet是通过游标来操作的,游标就是一个可控制的、能够指向随意一条记录的指针。有了这个指针我们就能轻易地指出我们要对结果集中的哪一条记录进行改动、删除,或者要在哪一条记录之前插入数据。一个结果集对象中仅仅包括一个游标。另外,借助ResultSetMetaData ,可以将数据表的结构信息都查出来。
ResultSetMetaData rsmd= resultSet.getMetaData();
第六步:释放资源
数据库资源不关闭,其占用的内存不会被释放,消耗资源,影响系统。倒序释放资源:倒叙释放资源resultSet—>preparedStatement—>connection。
三、代码实现
数据库删除,修改和插入,使用executeUpdate()方法。
public class JDBCTest {
/**
* 加载的mysql的驱动
*/
public static final String JDBC_DRIVER = "com.mysql.jdbc.Driver";
/**
* 连接数据库的url
*/
public static final String JDBC_URL = "jdbc:mysql://localhost:3306/test";
/**
* 连接数据库用户名
*/
public static final String JDBC_USERNAME = "root";
/**
* 数据库密码
*/
public static final String JDBC_PASSWORD = "123456";
/**
* 测试数据库删除,修改和插入
*/
@Test
public void testUpdate() {
Connection connection = null;
PreparedStatement preparedStatement = null;
try {
// 加载Driver类,注册数据库驱动
Class.forName(JDBC_DRIVER);
// 通过DriverManager,使用url,用户名和密码建立连接(Connection)
connection = DriverManager.getConnection(JDBC_URL, JDBC_USERNAME, JDBC_PASSWORD);
// 通过Connection,使用sql语句打开Statement对象;
preparedStatement = connection.prepareStatement("UPDATE student SET age=20 WHERE name=?");
// 传入参数,防止sql注入
preparedStatement.setString(1, "xiaoming");
// 执行语句,将结果返回resultSet
int count = preparedStatement.executeUpdate();
// 对结果进行处理
System.out.println(count);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
} finally {
// 倒序释放资源
try {
if (preparedStatement != null && !preparedStatement.isClosed()) {
preparedStatement.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
try {
if (connection != null && connection.isClosed()) {
connection.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
/**
* 测试批量操作
*/
@Test
public void testBatch() {
Connection connection = null;
PreparedStatement preparedStatement = null;
String insertSql = "insert into student values(?,?)";
try {
// 加载Driver类,注册数据库驱动
Class.forName(JDBC_DRIVER);
// 通过DriverManager,使用url,用户名和密码建立连接(Connection)
connection = DriverManager.getConnection(JDBC_URL, JDBC_USERNAME, JDBC_PASSWORD);
// 通过Connection,使用sql语句打开Statement对象;
preparedStatement = connection.prepareStatement(insertSql);
// 传入参数,防止sql注入
for (int i = 0; i < 10; i++) {
preparedStatement.setString(1, 100 + i + "user");
preparedStatement.setInt(2, 100 + i);
preparedStatement.addBatch();
}
// 执行语句,将结果返回resultSet
int[] count = preparedStatement.executeBatch();
// 对结果进行处理
System.out.println(count);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
} finally {
// 倒序释放资源
try {
if (preparedStatement != null && !preparedStatement.isClosed()) {
preparedStatement.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
try {
if (connection != null && connection.isClosed()) {
connection.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
参考了:
https://www.cnblogs.com/homejim/p/8068199.html
https://www.cnblogs.com/lightandtruth/p/9473862.html
JDBC流程的更多相关文章
- JDBC 流程
转载地址:https://blog.csdn.net/suwu150/article/details/52744952 JDBC编程的六个步骤: 准备工作中导入ojdbc文件,然后右键选中添加路 ...
- 加载数据库驱动程序的方法和JDBC的流程
加载驱动方法 1.Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver"); 2. DriverManager.r ...
- JDBC详解系列(一)之流程
---[来自我的CSDN博客](http://blog.csdn.net/weixin_37139197/article/details/78838091)--- JDBC概述 使用JDBC也挺长 ...
- JDBC的使用
JDBC详解系列(一)之流程 ---[来自我的CSDN博客](http://blog.csdn.net/weixin_37139197/article/details/78838091)--- 使 ...
- JDBC详解系列(二)之加载驱动
---[来自我的CSDN博客](http://blog.csdn.net/weixin_37139197/article/details/78838091)--- 在JDBC详解系列(一)之流程中 ...
- JDBC详解系列(三)之建立连接(DriverManager.getConnection)
在JDBC详解系列(一)之流程中,我将数据库的连接分解成了六个步骤. JDBC流程: 第一步:加载Driver类,注册数据库驱动: 第二步:通过DriverManager,使用url,用户名和密码 ...
- Java面试通关要点汇总集
Java面试通关要点汇总集 2018-03-09 转自:Java面试通关要点汇总集 文章目录 1. 基础篇 1.1. 基本功 1.2. 集合 1.3. 线程 1.4. 锁机制2. 核心篇 2 ...
- Java面试题[转载]
目录 转载 简历篇 请自我介绍 请介绍项目 基础篇 基本功 面向对象的特征 final, finally, finalize 的区别 int 和 Integer 有什么区别 重载和重写的区别 抽象类和 ...
- Java基础知识盘点(一)- 基础篇
基本功 面向对象特征 封装.继承.多态和抽象 1.封装:给对象提供了隐藏内部特性和行为的能力.对象提供一些能被其他对象访问的方法,来改变它内部的数据. 在Java中,其访问权限有3种修饰符:publi ...
随机推荐
- “全栈2019”Java多线程第三十三章:await与signal/signalAll
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...
- java之Collection框架
Collection的一些框架类的关系图: 1 Collection简介 Collection的定义 public interface Collection<E> extends Iter ...
- 在express3里用ejs模版引擎时,如何使其支持'.html'后缀
①express 默认jade模板,改为ejs模板,需执行以下命令: express -e --ejs ②在app.js中,将 app.set('view engine', 'jade'); 替换为 ...
- python学习笔记14-函数
使用关键字def来创建函数 注意缩进 函数命名规则: 1.必须以下划线或者字母开头 2.区分大小写 3.不能是保留字 调用函数一定记得加括号 def print_info(name,age) pri ...
- vs2017配置pthread.h的方法
一.背景(以下为走不通的配置方法!) 笔者最开始配置pthread.h,采用的是vs自动安装的方法,如图所示. 点击完“管理NuGet程序包”之后,弹出一个页面,如下,在“浏览”中输入pthread. ...
- Windows+MyEclipse+MySQL【连接数据库报错caching_sha2_password】
在MyEclipse中打开[窗口]->[显示视图]-> MyEclipse Database Browser -> (图片里倒三角)New.... ①Driver template: ...
- Runtime 全方位装逼指南
Runtime是什么?见名知意,其概念无非就是“因为 Objective-C 是一门动态语言,所以它需要一个运行时系统……这就是 Runtime 系统”云云.对博主这种菜鸟而言,Runtime 在实际 ...
- 利用VS2017跨平台远程调试aspnetcore应用
vs2017开始支持跨平台远程调试coreclr的应用,通常用于调试linux与mac上运行的aspnetcore程序,而如果运行在docker中的应用 要使用跨平台远程调试功能,首先运行corecl ...
- JDK中ThreadDump诊断Java代码中的线程死锁问题
多线程的死锁..死锁不是死了而是线程互相等待... 在项目中可能就是在几十万行的代码中存在一个死锁的问题,如何发现这个问题并且解决这个问题. JavaJDK为我们提供了一个诊断工具叫做ThreadDu ...
- Android系统架构及启动流程