JAVA / MySql 编程——第七章 JDBC
1、JDBC:JDBA是Java数据库连接(Java DataBase Connectivity)技术的简称,提供连接各种常用数据库的能力;
●Java是通过JDBC技术实现对各种数据库访问的,
●JDBA是Java数据库连接(Java DataBase Connectivity)技术的简称,他充当了Java应用程序与各种不同数据库之间进行对话的媒介。
他可以把数据持久性保存,这就是一种持久化机制。持久化:持久化是将程序中的数据在瞬时状态和持久状态见转换的机制。
2、工作原理:
JDBC API:JDBC API由Sun公司提供,其中提供了Java应用程序与各种不同数据库交互的标准解救, 如Connection(连接)接口、Statement接口、ResultSet(结果集)接口、PrepardStatement接口等。 开发者使用这些JDBC接口进行各类数据库操作。 |
JDBC Driver Manager:JDBC Driver Manager(驱动程序管理)有Sun公司提供,他是JDBC体系结构的支柱, 负责管理各种不同的JDBC驱动,把Java应程序连接到相应的JDBC驱动程序上,位于JDK的java.sql包中。 |
JDBC驱动:JDBC驱动有各个数据库厂商或第三方中间件厂商提供,负责连接各种不同的数据库。 |
3、JDBC API:JDBC API主要做三件事:与数据库建立连接、发送SQL语句、处理结果。
(1)DriverManager类:装载驱动程序,并为创建新的数据库连接提供支持。
(2)Connection接口:负责连接数据库并担任传送数据的任务。
(3)Statement接口:由Connection产生,负责执行SQL语句。
(4)ResultSet接口:负责保存和处理Statement执行后所产生的查询结果。
(5)PreparedStatement接口:Statement的子接口,也由Connection产生,同样负责执行SQL语句。
Statement接口相比,PrepardStatement接口具有高安全性、高性能、高可读性和高可维护性的优点。
4、JDBC访问数据库的步骤:
1)加载JDBC驱动 使用Class.forName( )方法将给定的JDBC驱动类加载到Java虚拟机中。若系统中不存在给定的类,则会引发异常,异常类型:ClassNotFoundExecption。 Class.forName(“JDBC驱动类的名称”); |
2)与数据库建立连接 DriverManager类是JDBC的管理层,作用于用户和驱动程序之间。 Connection con=DriverManager.getConnection(数据连接字符串,数据库用户名,密码); |
3)发送SQL语句,并得到返回结果 一旦建立连接,就使用该连接创建Statement接口的对象,并将SQL语句传递给它所连接的是数据库。 如果是查询操作,将返回类型为resultSet的结果集,它包含执行SQL查询的结果, 如果是其他操作,将根据调用的方法的不同返回布尔值或操作影响记录数目; Statement stmt = con.createStatement(); ResultSet rs = stmt.executeQuery("SELECT a, b, c FROM table1;"); |
4)处理返回结果 处理返回结果主要是针对查询操作的结果集,通过循环取出结果集中每条记录并做相应处理。 while (rs.next()) { int x = rs.getInt("a"); String s = rs.getString("b"); float f = rs.getFloat("c"); } |
5、释放资源 |
5、连接数据库:
●两种常用的驱动方式:第一种是JDBC-ODBC桥连方式,适用于个人开发与测试,他通过ODBC与数据库进行连接。
另一种是纯Java驱动方式,它直接同数据库进行连接,在生产型开发中,推荐使用纯Java驱动方式。
◆使用JDBC-ODBC桥连方式连接数据库:JDBC-ODBC桥连就是将对JDBC API的调用转换为对另一组数据库连接(即ODBC)API的调用。
将对JDBC API的调用,转换为对另一组数据库连接API的调用 优点:可以访问所有ODBC可以访问的数据库 缺点:执行效率低、功能不够强大(只能运用于windows平台服务,可移植性不好) 注意:ERROR - java.lang.ClassNotFoundException: sun.jdbc.odbc.JdbcOdbcDriver 这个问题的原因是类找不到,JDK 1.6中运行上面的代码是正常的,JDK1.6以后的版本,oracle已经取消了odbc的连接方式,故会报上面的错误 解决这个问题也比较简单,下载数据库对应的jdbc版本,添加进工程即可 SQL SERVER: 驱动类:com.microsoft.sqlserver.jdbc.SQLServerDriver 连接串:jdbc:sqlserver://localhost:1433;DatabaseName=test ORACLE: 驱动类:com.mysql.jdbc.Driver |
||
Eg: 右侧的代码注意的问题: (警告:不建议在没有服务器身份验证的情况下建立SSL连接。根据MySQL 5.5.45+, 5.6.26+和5.7.6+的要求,如果没有设置显式选项,则必须默认建立SSL连接。您需要通过设置useSSL=false显式地禁用SSL,或者设置useSSL=true并为服务器证书验证提供信任存储。)
解决方法: 这只是一个警告,更改如下: "jdbc:mysql://localhost:3306/test"; 更改后: "jdbc:mysql://localhost:3306/test?useSSL=false"; |
Eg: package import import import import /** * 使用JDBC-ODBC桥方式建立数据库连接并关闭 */ public class Test { private static Logger logger = Logger.getLogger(Test.class.getName()); public static void main(String[] args) { Connection conn = null; // 1.加载驱动 try { Class.forName("com.mysql.jdbc.Driver"); } catch (ClassNotFoundException e) { logger.error(e); } // 2.建立连接 try { conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/epet?useSSL=false", "QINGG", "1234"); System.out.println("建立连接成功!"); } catch (SQLException e) { logger.error(e); } finally { // 3.关闭连接 try { if (null != conn) { conn.close(); System.out.println("关闭连接成功!"); } } catch (SQLException e) { logger.error(e); } } } } |
|
附加: 本地的两种表现方式: 1、localhost 2、127.0.0.1 |
◆使用纯Java方式连接数据库
:由JDBC驱动直接访问数据库;
优点:驱动程序完全用Java语言编写,运行速度快、跨平台;
缺点:访问不同的数据库需要下载专用的JDBC驱动;
常见的错误: ●JDBC驱动类的名称书写错误,出现ClassNotFoundExexption异常; ●数据连接字符串,数据库名、密码书写错误、出现SQLException异常; ●数据库操作结束后,没有关闭数据库连接,导致仍占有系统资源; ●关闭数据库连接语句没有放到finally语句块中,导致语句可能没有被执行; |
|
在实际项目如果使用MySQL数据库,为了避免可能出现乱码问题,将指定数据库连接的编码集为UTF8 上面的示例数据库连接URL如下: url= jdbc:mysql://27.0.0.1:3306/epet?useUnicode=true&characterEncoding=utf-8; |
6、Statement接口和ResultSet接口:
获取Connection对象后就可以进行各种数据库操作了,此时需要使用Connection对象创建Statement对象。
●Connection接口常用方法
方法名称 |
作用 |
void close() |
立即释放此Connection对象的数据库和JDBC资源 |
Statement createStatement() |
创建一个Statement对象将SQL语句发送到数据库 |
PreparedStatement preparedStatement(String sql) |
创建一个PreparedStatement对象来将参数化的SQL语句发送到数据 |
boolean isClosed() |
查询此Connection对象是否已经被关闭 |
●Statement接口常用方法
方法名称 |
作用 |
ResuultSet executeQuery(String sql) |
可执行SQL查询获取ResulSet对象 |
int executeUpdate(String sql) |
可执行插入、删除、更新的操作,返回值是执行该操作所影响的行数 |
boolean exeute(String sql) |
可执行任意SQL语句,若结果为ResultSet对象,则返回true; 若其为更新计数或者不存在任何结果,则返回false |
●ResuoltSet接口常用方法及作用
方法名称 |
作用 |
boolean next() |
将光标从当前位置向下移动一行 |
boolean previous() |
将光标从当前位置上移动一行 |
void close() |
关闭ResultSet对象 |
int getInt(int columnIndex) |
以int的形式获取结果集的那个钱行指定列号的值 |
int getInt(String columnLable) |
以int的形式获取结果集的那个钱行指定列名的值 |
float getFloat(int columnIndex) |
以float的形式获取结果集的那个钱行指定列号的值 |
float getFloat(String columnIndex) |
以float的形式获取结果集的那个钱行指定列名的值 |
String getString(int columnIdex) |
以String的形式获取结果集的那个钱行指定列号的值 |
String getString(String columnLable) |
以String的形式获取结果集的那个钱行指定列名的值 |
int getRow() |
得到光标当前所指行的行号 |
boolean absolute(int row) |
光标移动到row指定的行 |
●作为一种好的编程风格,应该在不需要ResultSet对象、Statement对象和Connection对象时显示的关闭他们; 语法:public void close() throws SQLExecption ●要先按ResultSet结果集,后Statement,最后Connection的顺序关闭,因为ResultSet是通过Statement执行SQL命令得到的, 而Statement是需要在创建连接后才可以使用的,所以三者之间存在相互依赖的关系,关闭时也必须按照依存关系进行。 ●用户如果不关闭ResultSet,当Statement关闭,重新执行或用于从多结果序列中获取下一个结果时,该ResultSet将被自动关闭 |
7、PreparedStatement
接口:继承自 Statement接口,比Statement对象使用起来更加灵活,更有效率
●PreparedStatement接口 预编译的 SQL 语句):
★提高了代码的可读性和可维护性
★提高了SQL语句执行的性能
★提高了安全性
方法名称 |
作用 |
boolean |
在此PreParedStatement对象中执行SQL语句,该语句可以是任何SQL语句 如结果是Result对象,则返回true,如果结果是更新计数或者没结果,则返回false |
ResultSet executeQuery() |
在此PreParedStatement对象中执行SQL查询,并返回该查询生成的ResultSet对象 |
int |
在此PreParedStatement对象执行SQL语句,该语句必须是DML语句, 如Insert,update或delete语句, 或是无返回内容的sql语句,如DDL语句,返回值是执行该操作所影响的行数。 |
void |
将指定参数设置为给定Java int值,设置其他类型参数的方法与此类型。 如setFloat(int |
void |
使用给定对象设置指定参数的值。 |
◆使用PreParedStatement操作数据库的基本步骤:
1、创建PreParedStatement对象:
★通过Connection接口的PreParedStatement(String sql)方法来创建PreParedStatement对象,SQL语句可具有一个或多个输入参数。
这些参数的值在SQL语句创建时未被指定,而是为每个输入参数保留一个问好(“?“)作为占位符;
PreParedStatement pstmt=conn.PreParedStatement("UPDATE dog
SET health=? ,love=? Where=?");
2、设置每个输入参数的值:通过调用setXXX()方法来完成,其中XXX是与该参数相应的类型;
setXXX(要设置参数的序数位置(从一开始计数),设置给参数的值);
3、执行SQL语句:
★在设置了各个输入参数的值后,就可以调用PreParedStatement接口的三个执行方法
(ResultSet executeQuery()、int executeUpdate()、Boolean execute())之一来执行SQL语句;
★注意这三个执行方法和Statement接口中三个方法名称相同、作用相同但是不需要SQL语句做参数,SQL语句已经在创建对象PreParedStatement时指定了;
Eg:
pst.executeUpdate();
★创建PreParedStatement对象时会对SQL语句进行预编译,所以执行速度要快于Statement对象,因此,如果在程序中需要多次执行SQL语句时,
应该使用PreParedStatement对象来执行数据库操作,以提高效率;
JAVA / MySql 编程——第七章 JDBC的更多相关文章
- java面向对象编程— —第七章 继承
7.1继承的起源 继承(Inheritance),即在面向对象编程中,可以通过扩展(extends)一个已有的类,并继承该类的属性的行为,来创建一个新的类. 已有的类称为父类(也可以称为基类,超类), ...
- JAVA / MySql 编程—— 第三章 高级查询(一)
1. 修改表: (1)修改表名语法: ALTER TABLE <旧表名> RENAME [ TO ] <新表名>: 注意:其中[TO]为可选参数,使用与否不影响结 ...
- <<java 并发编程>>第七章:取消和关闭
Java没有提供任何机制来安全地终止线程,虽然Thread.stop和suspend等方法提供了这样的机制,但是存在严重的缺陷,应该避免使用这些方法.但是Java提供了中断Interruption机制 ...
- JAVA / MySql 编程——第六章 Mysql 创建账户的相关命令
1. 创建普通用户: 语法: CREATE USER `user`@`host` [IDENTIFIED 'password']; //user:用户名,host:主机名,passw ...
- JAVA / MySql 编程——第五章 事务、视图、索引、备份和恢复
1.事务(Transaction): 事务是将一系列数据操作绑成一个整体进行统一管理. 如果一事务执行成功,则咋子该事务中进行的所有数据更改均会提交,称为数据库中的永久成部分. 如果事务执行是遇到错误 ...
- JAVA / MySql 编程—— 第四章 高级查询(二)
1. EXISTS和NOT EXISTS子查询:EXISTS关键字用来检测数数据库对象是否存在. ★EXISTS和NOT EXISTS的结果只取决于是否 ...
- “全栈2019”Java第一百零七章:匿名内部类与构造方法注意事项
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...
- 《深入理解java虚拟机》 第七章虚拟机类加载机制
第七章 虚拟机类加载机制 7.1概述 虚拟机把描述类的数据从Class文件加载到内存,并对数据进行检验.转换解析和初始化,最终形成可以被虚拟机直接使用的java类型,这就是虚拟机的类加载机制. 在 ...
- Java笔记(第七篇 JDBC操作数据库)
JDBC是连接数据库和java程序的桥梁,通过JDBC API可以方便地实现对各种主流数据库的操作.学习java语言,必须学习JDBC技术,因为JDBC技术实在java语言中被广泛使用的一种操作数据库 ...
随机推荐
- java学习第十三天
1:StringBuffer(掌握) (1)用字符串做拼接,比较耗时并且也耗内存,而这种拼接操作又是比较常见的,为了解决这个问题,Java就提供了 一个字符串缓冲区类.StringBuffer供我们使 ...
- [转]Java内存溢出详解及解决方案
原文地址:http://blog.csdn.net/xianmiao2009/article/details/49254391 内存溢出与数据库锁表的问题,可以说是开发人员的噩梦,一般的程序异常,总是 ...
- jeecg3.8在子表页面中使用WebUploader组件
bcAbout-update.jsp改动如下: 因为默认子表的上传组件不能回显,所以改造成WebUploader 1.在更新页面注销掉生成代码 <%--<script type=" ...
- JNA简单使用
近期使用Java开发有关于摄像机接收到数据的上传,因为摄像机处理图像是用C语言实现的,所以开发需要用到JNA,实现JAVA对C语言的回调,因为具体的开发方式官方文档里面有示例,所以本文只是简单的把需要 ...
- Vim中根据正则对选中文本对齐(比如ini文件的=号对齐)
vimrc增加如下内容即可: vnoremap <M-=> :call Duiqi('\v(^\s*\S+)\s+(.*)')<CR> "reg匹配的第2段文字对齐 ...
- 西门子(SIEMENS)软件安装时需要重启的解决方法,regedit restart
打开注册表(regedit) 删除注册表项 HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manage\PendingFile ...
- GL格式一览表
- Open XML的上传、下载 、删除 ......文件路径
/// <summary> /// Get download site, if download tempfolder not existed, create it first /// & ...
- python title() upper() lower() 以首字母大写的方式显示每个单词/将字符串改为全部大写或全部小写
以首字母大写的方式显示每个单词 [root@chenbj python]# cat name.py #!/usr/bin/env python # _*_ coding:utf-8 _*_ name ...
- 剑指offer 35 第一个只出现一次的字符
错误写法 class Solution { public: int FirstNotRepeatingChar(string str) { int length = str.size(); ) ; ] ...