JDBC

概述


什么是JDBC


JDBC全称是Java数据库连接(Java Database Connectivity),应用程序可通过这套API连接到关系数据库,并使用SQL语句来完成对数据库中数据的查询、更新和删除等操作。是一套用于执行SQL语句的Java API。





Java的数据库连接接口。它是Java API中的一部分,通过它可以将Java程序和关系数据库集成在一起。

应用程序通过调用JDBC来操作数据库的过程,其实是由数据库厂商提供的JDBC驱动程序来负责的。如果要更换数据库,只要更换驱动程序,并在JDBC中载入新的驱动程序来源,即可完成数据库系统的变更。

JDBC允许任何使用Java语言编写的小应用程序或应用程序访问数据库。通过使用SQL语句可以对数据库中的数据进行相应的插入、删除和更新操作。

JDBC由Java语言编写的相关类和接口组成

驱动程序
DriverManager类、Driver 接口

与特定数据库连接
Connection接口

执行SQL语句
Statement接口、PreparedStatement接口

提供数据库信息
DatabaseMetaData接口

结果集
ResultSet接口





DriverManager类,用来管理JDBC驱动程序,主要用于跟踪和加载驱动程序并负责选取数据库驱动程序和建立新的数据库连接

Driver 接口,每个驱动程序类必须实现的接口。该接口可以将API的调用映射到数据库的操作

Connection接口,用来连接应用程序与指定的数据库

Statement接口,用来执行静态SQL语句并得到SQL语句并得到执行后的结果

PreparedStatement接口,用来返回有关数据、数据库和驱动程序等与底层数据库有关的信息

DatabaseMetaData接口,提供对数据库表的访问,执行查询后返回的结果集。通过ResultSet对象是通过执行一个查询数据库的语句生成

连接


在连接数据库时需要指明数据源,以及相关的一些参数。数据源主要包括两部分,其中protocol表示连接到数据库的驱动程序,DatabaseName表示数据库的名字

jdbc:<protocol>:<DatabaseName>

在连接数据库时,需要找到使用JDBC驱动程序类的名称。不同的数据库供应商的数据库产品都有自己的驱动程序,不同数据库的URL和驱动程序也有所不同。

使用Java与数据库连接进行数据存取的过程:加载驱动程序-->Collection建立连接(连接数据库)-->创建Statement对象(执行SQL语句)-->取得ResultSet结果集

具体过程


(1)首先要加载当前数据源的驱动程序。通常使用Class.forName()方法加载

(2)建立数据库的连接。可以通过DriverManager类中的getConnection方法来实现与数据库的连接。

conn = DriverManager.getConnection(url, userNamew, password);

(3)建立连接后就可以使用SQL语句对数据库进行访问。这就需要创建Statement对象。通过该对象可以执行相应的SQL语句并将其操作于数据库

stmt = conn.createStatement();

(4)将SQL语句执行后的结果返回。执行的查询结果可以以ResultSet结果集的形式返回

ResultSet rs = stmt.executeQuery(sqlSelect);

(5)对结果集进进行处理。例如,我们可以通过使用一个while循序获得结果集中的所有记录

while (rs.next()) { String str1 = rs.getString(1);    String str2 = rs.getString(2);  }

(6)关闭数据库的连接。在执行完数据库的操作之后,需要将与数据库连接有关的对象关闭。主要包括Statement对象、Connection对象等。

stmt.close(); conn.close();

API详解

注册驱动(应用)Class.forName("com.mysql.jdbc.Driver");

获得连接对象(应用)getConnection("jdbc:mysql://localhost:3306/day07",root,root)

获得执行sql的statement对象(应用)

createStatement()返回的是Statement接口

Statement接口执行操作

* executeUpdate(sql)

* executeQuery(sql)





prepareStatement(sql),返回PreparedStatement接口,预编译SQL语句

PreparedStatement 是Statement的子接口

* 使用它可以解决sql注入问题

* 执行SQL方法:

executeQuery()

executeUpdate()

setInt(?的位置,值)





遍历结果集(应用)next()  ,  getInt()   ,  getString()

释放资源   调用close方法





PreparedStatement对象滚动结果集

可以将游标定位到任意位置

PrepareStatement pstmt = conn.prepareStatement(String sql, int resultSetType, int resultSetConcurrency)

ResultSet对象处理结果集

方法

ResultSetMetaData getMetaData()
检索此ResultSet对象的列的编号、类型和属性

boolean getBoolean(int columnIndex)
以Java编程语言中boolean的形式检索此ResultSet对象的当前行中指定列的值

float getFloat(int columnIndex)
以Java编程语言中float的形式检索

int getInt(int columnIndex)
以Java编程语言中int的形式检索此ResultSet对象的当前行中指定列的值

String getString(int columnIndex)
以Java编程语言中String的形式检索此ResultSet对象的当前行中指定列的值

boolean next()
将指针从当前位置下移一行

ResultSet接口中还提供了一些方法用于实现滚动结果集


boolean absolute(int row)
将游标移动到此ResultSet对象的指定参数row所对应的行。若游标位于有效行则返回true

boolean relative(int rows)
按相对行数移动游标到参数rows指定的行。若游标位于有效行上则返回true

boolean first()
将游标移动到第一行。若游标位于有效行则返回true,若结果集中没有数据行则返回false

boolean last()
将游标移动到最后一行。若游标位于有效行则返回true,若结果集中没有数据行则返回false

boolean next()
将游标移动到当前位置的下一行。若新当前行有效,则返回true;若不存在,则返回false

boolean previous()
将游标移动到ResultSet对象的上一行。若该行有效则返回true,若不在结果集中则返回false

boolean isFirst()
判断游标是否在此ResultSet对象的第一行。如果是则返回true

boolean isLast()
判断游标是否在此ResultSet对象的最后一行。如果是则返回true

boolean isBeforeFirst()
判断游标是否在此ResultSet对象的第一行之前,如果是则返回true

boolean isAfterLast()
判断游标是否在此ResultSet对象的最后一行之后,如果是则返回true

void beforeFirst()
将游标移动到此ResultSet对象第一行之前

void afterLast()
将游标移动到此ResultSet对象的最后一行之后

更新结果集


当将创建Statement和PreparedStatement对象中的参数resultSetConcurrency设置为ResultSet.CONCUR_UPDATABLE时,则表明该结果集是可更新的。这时我们就可以直接在结果集中对数据库进行修改了。





方法

void insertRow()
将插入行的内容插入到此 ResultSet 对象和数据库中。当指针位于插入时才可以调用该方法

void updateRow()
用此 ResultSet 对象的当前行的新内容更新底层数据库

void deleteRow()
将当前行从此 ResultSet 对象和底层数据库中删除

void cancelRowUpdates()
取消对 ResultSet对象中的当前行所作的更新。此方法在调用更新方法之后,调用updateRow方法之前调用才可以实现对行所作的更新。如果在updateRow方法之后调用该方法,则不能取消对行所做的更新

void moveToCurrentRow()
将游标移动到当前行。只有游标位于插入行上时,调用此方法才有效

void moveToInsertRow()
将游标移动到ResultSet 对象中插入行

核心API


DriverManager

Driver

Connection

Statement

    PreparedStatement

    CallableStatement

ResultSet

RowSet

DatabaseMetaData

ResultSetMetaData

Types

SQLException

JDBC批处理


在实际开发中,经常需要向数据库发送多条SQL语句,这时,如果逐条执行这些SQL语句,效率会很低。为此,JDBC提供了批处理机制,即同时执行多条SQL语句。Statement和PreparedStatement都实现了批处理。





Statement批处理

PreparedStatement批处理

大数据处理


大数据处理主要指的是对CLOB和BLOB类型数据的操作。在应用程序中,要想操作这两种数据类型,必须使用PreparedStatement 完成,并且所有的操作都要以IO流的形式进行存放和读取。

处理CLOB数据

处理BLOB数据

JDBC处理事务与数据库连接池


JDBC处理事务


在数据库操作中,一项事务是由一条或多条操作数据库的SQL语句组成的一个不可分割的工作单元

只有当事务中的所有操作都正常完成,整个事务才能被提交到数据库中,如果有一项操作没有完成,则整个事务会被撤销。





针对JDBC处理事务的操作,在Connection接口中,提供了三个相关的方法

setAutoCommit(boolean autoCommit)

commit()

rollback()

数据库连接池


什么是数据库连接池



在JDBC编程中,每次创建和断开Connection对象都会消耗一定的时间和IO资源。频繁地创建、断开数据库连接势必会影响数据库的访问效率,甚至导致数据库崩溃。

为了避免频繁的创建数据库连接,工程师们提出了数据库连接池技术。





为了避免频繁的创建数据库连接,工程师们提出了数据库连接池技术。

DataSource接口



为了获取数据库连接对象(Connection),JDBC提供了javax.sql.DataSource接口,它负责与数据库建立连接,并定义了返回值为Connection对象的方法:

Connection getConnection() 

Connection getConnection(String username, String password)





我们习惯性的把实现了javax.sql.DataSource接口的类称为数据源,顾名思义,数据源即数据的来源。在数据源中存储了所有建立数据库连接的信息。

DBCP数据源



DBCP是数据库连接池(DataBase Connection Pool)的简称,是Apache组织下的开源连接池实现,也是Tomcat服务器使用的连接池组件。单独使用DBCP数据源时,需要在应用程序中导入两个jar包。

commons-pool.jar包

commons-dbcp.jar包

 commons-dbcp.jar包中包含两个核心类,分别是BasicDataSourceFactory和BasicDataSource,它们都包含获取DBCP数据源对象的方法。





编写配置文件

配置文件 xx.properties中有命名格式要求

driverClassName

url

username

password





BasicDataSource是DataSource接口的实现类,主要包括设置数据源对象的方法。

方法

void?setDriverClassName(String?driverClassName)
设置连接数据库的驱动名称

void?setUrl(String?url)
设置连接数据库的路径

void?setUsername(String?username)
设置数据库的登陆账号

void?setPassword(String?password)
设置数据库的登录密码

void setInitialSize(int?initialSize)
设置数据库连接池初始化的连接数目

void setMaxActive (int?maxIdle) 设置数据库连接池最大活跃的连接数目

void setMinIdle(int?minIdle) 设置数据库连接池最小闲置的连接数目

Connection getConnection()
从连接池中获取一个数据库连接





 当使用DBCP数据源时,首先得创建数据源对象,数据源对象的创建方式有两种

1.通过BasicDataSource类直接创建数据源对象

使用BasicDataSource类创建一个数据源对象,手动给数据源对象设置属性值,然后获取数据库连接对象。





2.通过读取配置文件创建数据源对象

使用BasicDataSourceFactory工厂类读取配置文件,创建数据源对象,然后获取数据库连接对象。

C3P0数据源



C3P0是目前最流行的开源数据库连接池之一,它实现了DataSource数据源接口,支持JDBC2和JDBC3的标准规范,易于扩展并且性能优越,著名的开源框架Hibernate和 Spring使用的都是该数据源。





我们在使用C3P0数据源开发时,需要了解C3P0中DataSource接口的实现类ComboPooledDataSource,它是C3P0的核心类,提供了数据源对象的相关方法。

方法

void setDriverClass()
设置连接数据库的驱动名称

void setJdbcUrl()
设置连接数据库的路径

void setUser()
设置数据库的登陆账号

void setPassword()
设置数据库的登录密码

void setMaxPoolSize()
设置数据库连接池最大的连接数目

void setMinPoolSize()
设置数据库连接池最小的连接数目

void setInitialPoolSize()
设置数据库连接池初始化的连接数目

Connection getConnection()
从数据库连接池中获取一个连接





当使用C3P0数据源时,首先得创建数据源对象,创建数据源对象可以使用ComboPooledDataSource类,该类有两个构造方法,分别是ComboPooledDataSource()和ComboPooledDataSource(String configName)

1.通过ComboPooledDataSource类直接创建数据源对象

 使用ComboPooledDataSource类直接创建一个数据源对象,手动给数据源对象设置属性值,然后获取数据库连接对象



2.通过读取配置文件创建数据源对象

通过ComboPooledDataSource (String configName)构造方法读取c3p0-config.xml配置文件,创建数据源对象,然后获取数据库连接对象。

Java精选笔记_JDBC的更多相关文章

  1. Java精选笔记_国际化

    国际化 什么是国际化 指软件在开发时就应该具备支持多种语言和地区的功能,当应对不同国家和地区的用户访问,针对不同国家和地区的用户,提供相应的.符合来访者阅读习惯的页面和数据. 由于国际化interna ...

  2. Java精选笔记_自定义标签

    自定义标签 自定义标签入门 什么是自定义标签 自定义标签可以有效地将HTML代码与Java代码分离,从而使不懂Java编程的HTML设计人员也可以编写出功能强大的JSP页面 JSP规范中定义了多个用于 ...

  3. Java精选笔记_JSTL(JSP标准标签库)

    JSTL(JSP标准标签库) JSTL入门 JavaServer Pages Standard Tag Library:JSP标准标签库 在JSP中可以通过Java代码来获取信息,但是过多的Java代 ...

  4. Java精选笔记_EL表达式

    EL表达式 初始EL EL是一种可以简化JSP页面的表达式,EL表达式的语法非常简单都是以"${"符号开始,以"}"符号结束的 EL表达式是一种简单的数据&qu ...

  5. Java精选笔记_文件上传与下载

    文件上传与下载 如何实现文件上传 在Web应用中,由于大多数文件的上传都是通过表单的形式提交给服务器的,因此,要想在程序中实现文件上传的功能,首先得创建一个用于提交上传文件的表单页面. 为了使Serv ...

  6. Java精选笔记_Servlet事件监听器

    Servlet事件监听器 概述 在程序开发中,经常需要对某些事件进行监听,如监听鼠标点击事件.监听键盘按下事件等,此时就需要使用事件监听器. 事件监听器用于对程序中发生的事件进行监听,在监听的过程中会 ...

  7. Java精选笔记_DBUtils工具

    DBUtils工具 API介绍 为了更加简单地使用JDBC,Apache组织提供了一个工具类库commons-dbutils组件. 该组件实现了对JDBC的简单封装,可以在不影响性能的情况下极大简化J ...

  8. Java精选笔记_Tomcat开发Web站点

    Tomcat开发Web站点 Web开发的相关知识 B/S架构和C/S架构 C/S架构是Client/Server的简写,也就是客户机/服务器端的交互.常见应用 : QQ. 迅雷. 360. 旺旺等 B ...

  9. Java精选笔记_XML基础

    XML基础 XML概述 W3C组织简介 W3C是World Wide Web Consortium(万维网联盟)的缩写,它是对网络标准定制的一个非赢利组织,如HTML.XHTML.CSS.XML的标准 ...

随机推荐

  1. Python 里 and、or 的计算规则

    引子: >>> print '' or 5 or 05>>> print 5 and 44>>> print '' or 5 or 0 and 4 ...

  2. feginclient demo

    1.pom.xml <?xml version="1.0" encoding="UTF-8"?> <project xmlns="h ...

  3. java jsp失效问题--待解决

    打印jps错误信息jps -J-Djps.debug=true -J-Djps.printStackTrace=true 未完待续...

  4. C#中调用PowerShell代码

    在C#中调用PowerShell代码,很多时候Add是不好使的!要用AddScript!记录一下! using (Runspace runspace = RunspaceFactory.CreateR ...

  5. Linu 修改maven的setting保护文件

    查找目录 find / -name .m2 -d 查看文件: cat settings.xml 修改文件 vi settings.xml 修改后发现保存会出问题,报错W10: Warning: Cha ...

  6. SpringMVC之学习(2)值得接收和传递

    springmvc中 @Controller 来标识一个控制器 @RequestMapping来标识请求路径,可以写在类名上,也可以写在方法名上.写在类,表示所有的方法都在此路径下. package ...

  7. linux支持的内存根文件系统

    linux支持两种内存根文件系统:ramdisk和initramfs. ---------------------------------------------------------------- ...

  8. 记录日志框架:log4net使用

    一.log4net简介 Log4net是Apache下一个开放源码的项目,我们可以控制日志信息的输出目的地.Log4net中定义了多种日志信息输出模式.在做项目的时候最头疼的是在程序发布到正式环境之后 ...

  9. ★ java删除代码注释

    package com.witwicky.util; import java.io.BufferedReader; import java.io.BufferedWriter; import java ...

  10. CodeIgniter(3.1.4)框架使用静态文件(js,css)

    调整目录结构: 可以在控制器中这样加载视图: * 加载url辅助类. views视图中可以这样引用静态文件: 则最终的静态文件url会生成这样: