---来自我的CSDN博客---

JDBC概述

  使用JDBC也挺长时间了,最近因为想学习mybatis的源码,因此打算重新复习一下JDBC的使用。

定义:JDBC(Java DataBase Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成。JDBC提供了一种基准,据此可以构建更高级的工具和接口,使数据库开发人员能够编写数据库应用程序。

  也就是说JDBC是SUN公司提出来的一系列规范,但它只定义了接口规范,具体的实现则交给各个数据库的厂商去做。这类似以前的软件要调用打印机的时候都要自己去给各种类型的打印机实现驱动,但微软在操作系统定义了打印机驱动接口,由各个打印机厂商去实现,而软件供应商只需要调用接口即可(不然每个数据库都要自己去实现驱动,会累死的)。我想这也符合JAVA跨平台的思想,实现“Write once, run anywhere!”。

JDBC使用详解

  先上代码,一个简单的连接,查询用户信息:

/**
* 如果你要使用我的代码,在此之前请在mysql创建jdbc_test数据库,并建立student表,两个字段,name和age
*/
public class JDBCTest {
/**
* 数据库相关参数
*/
//这是驱动名称,此例子中我们加载的是mysql的驱动,在之前需要导入mysql的驱动jar包
public static final String JDBC_DRIVER = "com.mysql.jdbc.Driver"; //连接数据库的url,各个数据库厂商不一样,此处为mysql的;后面是创建的数据库名称
public static final String JDBC_URL = "jdbc:mysql://localhost:3306/jdbc_test"; //连接数据库所需账户名
public static final String JDBC_USERNAME = "root"; //用户名对应的密码,我的mysql密码是123456
public static final String JDBC_PASSWORD ="123456"; public static void main(String[] args) {
List<Student> students = new ArrayList<Student>(); Connection connection = null;
PreparedStatement preparedStatement = null;
ResultSet resultSet = 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("select * from student where age =?");
//传入参数,之所以这样是为了防止sql注入
preparedStatement.setInt(1, 18);
//第四步:执行语句,将结果返回resultSet
resultSet = preparedStatement.executeQuery();
//第五步:对结果进行处理
while (resultSet.next()){
String name = resultSet.getString("name");
int age = resultSet.getInt("age"); Student student = new Student();
student.setAge(age);
student.setName(name);
students.add(student);
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}finally {
//第六步:倒叙释放资源resultSet-》preparedStatement-》connection
try {
if (resultSet!=null && !resultSet.isClosed()){
resultSet.close();
}
} catch (SQLException e) {
e.printStackTrace();
} 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();
}
} for (Student student:students
) {
System.out.println(student.getName()+"="+student.getAge());
} }
}

  以上就是JDBC查询的基本连接过程,后续一些复杂的数据库操作过程只不过是在上面进行一些增改而已。大体步骤如注释:

JDBC流程:

第一步:加载Driver类,注册数据库驱动;

第二步:通过DriverManager,使用url,用户名和密码建立连接(Connection);

第三步:通过Connection,使用sql语句打开Statement对象;

第四步:执行语句,将结果返回resultSet;

第五步:对结果resultSet进行处理;

第六步:倒叙释放资源resultSet-》preparedStatement-》connection。

  如果是删除,修改和插入,使用executeUpdate()即可:

/**
* 如果你要使用我的代码,在此之前请在mysql创建jdbc_test数据库,并建立student表,两个字段,name和age
*/
public class JDBCTest {
/**
* 数据库相关参数
*/
//这是驱动名称,此例子中我们加载的是mysql的驱动,在之前需要导入mysql的驱动jar包
public static final String JDBC_DRIVER = "com.mysql.jdbc.Driver"; //连接数据库的url,各个数据库厂商不一样,此处为mysql的;后面是创建的数据库名称
public static final String JDBC_URL = "jdbc:mysql://localhost:3306/jdbc_test"; //连接数据库所需账户名
public static final String JDBC_USERNAME = "root"; //用户名对应的密码,我的mysql密码是123456
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 {
//第六步:倒叙释放资源resultSet-》preparedStatement-》connection 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 {
//第六步:倒叙释放资源resultSet-》preparedStatement-》connection 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();
}
}
}

  今天大概介绍了JDBC连接数据库进行操作的一些具体的流程,后面我会对流程上的各个步骤进行分析,以便在后续学习mybatis源码时有一个更深刻的理解。

---[来自我的CSDN博客](http://blog.csdn.net/weixin_37139197/article/details/78838091)---

JDBC详解系列(一)之流程的更多相关文章

  1. JDBC详解系列(二)之加载驱动

    ---[来自我的CSDN博客](http://blog.csdn.net/weixin_37139197/article/details/78838091)---   在JDBC详解系列(一)之流程中 ...

  2. JDBC详解系列(三)之建立连接(DriverManager.getConnection)

      在JDBC详解系列(一)之流程中,我将数据库的连接分解成了六个步骤. JDBC流程: 第一步:加载Driver类,注册数据库驱动: 第二步:通过DriverManager,使用url,用户名和密码 ...

  3. JDBC详解系列(四)之建立Stament和执行SQL语句

    建立Stament   在获得连接之后,我们就可以跟数据库进行交互了.   在JDBC中,我们发送SQL语句到数据库这些操作时通过Stament,Preparement,CallableStateme ...

  4. Spring框架系列(7) - Spring IOC实现原理详解之IOC初始化流程

    上文,我们看了IOC设计要点和设计结构:紧接着这篇,我们可以看下源码的实现了:Spring如何实现将资源配置(以xml配置为例)通过加载,解析,生成BeanDefination并注册到IoC容器中的. ...

  5. Android高效率编码-第三方SDK详解系列(二)——Bmob后端云开发,实现登录注册,更改资料,修改密码,邮箱验证,上传,下载,推送消息,缩略图加载等功能

    Android高效率编码-第三方SDK详解系列(二)--Bmob后端云开发,实现登录注册,更改资料,修改密码,邮箱验证,上传,下载,推送消息,缩略图加载等功能 我的本意是第二篇写Mob的shareSD ...

  6. JDBC详解1

    JDBC详解1 JDBC整体思维导图 JDBC入门 导jar包:驱动! 加载驱动类:Class.forName("类名"); 给出url.username.password,其中u ...

  7. 源码详解系列(六) ------ 全面讲解druid的使用和源码

    简介 druid是用于创建和管理连接,利用"池"的方式复用连接减少资源开销,和其他数据源一样,也具有连接数控制.连接可靠性测试.连接泄露控制.缓存语句等功能,另外,druid还扩展 ...

  8. 源码详解系列(七) ------ 全面讲解logback的使用和源码

    什么是logback logback 用于日志记录,可以将日志输出到控制台.文件.数据库和邮件等,相比其它所有的日志系统,logback 更快并且更小,包含了许多独特并且有用的特性. logback ...

  9. 源码详解系列(八) ------ 全面讲解HikariCP的使用和源码

    简介 HikariCP 是用于创建和管理连接,利用"池"的方式复用连接减少资源开销,和其他数据源一样,也具有连接数控制.连接可靠性测试.连接泄露控制.缓存语句等功能,另外,和 dr ...

随机推荐

  1. LeetCode 题解之 Positions of Large Groups

    1.题目描述 2.问题分析 从头遍历字符串,使用一个局部迭代器和局部变量记录该字符个数.如果个数>= 3 ,则将此时的迭代器位置和局部迭代器的位置保存到局部vector中.再将这个局部vecto ...

  2. Python数据类型之dict和set

    Python内置了字典:dict的支持.在其他语言中也成为map,使用键-值(key-value)存储,具有极快的查找速度. 把数据放入dict的方法,除了初始化时指定外,还可以通过key放入. 由于 ...

  3. 最近用到的 sql 统计操作

    统计操作 1.分组统计group by select id,name,count(*) as '总数'  from test1 group by id,name     --group by   分组 ...

  4. 参数innodb_force_recovery影响了整个InnoDB存储引擎的恢复状况

    参数innodb_force_recovery影响了整个InnoDB存储引擎的恢复状况.该值默认为0,表示当需要恢复时执行所有的恢复操作.当不能进行有效恢复时,如数据页发生了corruption,My ...

  5. 【linux命令】lscpu、etc/cpuinfo详解

    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 i2000:~ # lscpu Architecture:          x86_ ...

  6. [转]Java虚拟机是如何判断变量类型的

    [原文]https://www.toutiao.com/i6591766777745637891/ 概述 众所周知,Java支持平台无关性.安全性和网络移动性.而Java平台由Java虚拟机和Java ...

  7. 1.js基础(以通俗易懂的语言解释JavaScript)

    1.JavaScript组成: ECMAScript: 解释器.翻译 -->几乎没有兼容问题 DOM: Document Object Model -->有一些操作不兼容 BOM: Bro ...

  8. CentOS7安装Java

    通过下载Oracle官网的jdk来安装 不使用openjdk 访问 http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downl ...

  9. js节流

    function _throttling(fn,wait,mustRun){ var time=null; var startTime= new Date() return function(){ c ...

  10. python第三十一课--递归(3.递归的弊端)

    演示递归的弊端: def mySum(num): if num == 1: return 1 return num+mySum(num-1) mySum(998) [注意]:递归可以解决绝大多数循环能 ...