JDBC学习笔记一
JDBC学习笔记一
JDBC全称 Java Database Connectivity,即数据库连接,它是一种可以执行SQL语句的Java API。
ODBC全称 Open Database Connectivity,即开放数据库连接,其允许应用程序可以通过一组通用的API访问不同的数据库管理系统。
这两个都需要数据库厂商提供相应的数据库驱动
1.JDBC驱动
数据库驱动程序是JDBC程序和数据库之间的转换层,数据库驱动负责将JDBC调用映射成特定的数据库调用。
四种类型JDBC驱动:
- JDBC-ODBC桥,最早实现的JDBC驱动程序,将JDBC API映射为ODBC API(单线程)。
- 直接将JDBC API映射成数据库特定的客户端API
- 支持三层结构的JDBC访问方式,主要用于Applet阶段,通过Applet访问数据库
- 纯JAVA的,直接与数据库实例交互,这种驱动是职能的,他知道数据库的底层协议,目前最常用
2.JDBC常用接口类
2.1.DriverManeger
用于管理JDBC驱动的服务类,程序中该类的主要功能是获取Connection对象
以下方法获得url对应的数据库连接
public static synchronized Connection getConnection(String url, String user, String pass)
throws SQLException{
...
}
2.2.Connection
代表数据库连接对象,每个Connection代表一个物理连接对话,要想访问数据库,必须先获得数据库连接。
该接口常用方法:
//返回一个Statement对象
Statement createStatement() throws SQLException
//返回预编译的Statement对象
PreparedStatement prepareStatement(String sql) throws SQLException
//返回存储过程CallableStatement对象
CallableStatement prepareCall(String sql) throws SQLException
//控制事务的方法:
Savepoint setSavePoint() //创建一个保存点
Savepoint setSavePoint(String name) //以指定名字创建一个保存点
void setTransactionIsolation(int level) //设置事务隔离级别
void rollback() //回滚事务
void rollback(Savepoint savepoint) //将事务回滚到指定的保存点
void setAutoCommit(boolean autoCommit) //关闭自动提交,打开事务
void commit() //提交事务
2.3.Statement
用于执行SQL语句的工具接口。可以执行DDL,DCL,DML和DQL语句
常用方法:
//执行sql查询语句,并将查询结果返回到ResultSet对象,该方法只能执行查询语句
ResultSet executeQuery(String sql) throws SQLException
//执行DML语句,并返回受影响行数,也可以执行DDL语句,返回值为0
int executeUpdate(String sql) throws SQLException
//执行任何sql语句,如果执行后第一个结果为Result对象,则返回true
//如果返回的是受影响的行数或者没有任何结果则返回false
boolean execute(String sql) throws SQLException
2.4.PreparedStatement
预编译的Statement对象,是Statement的子接口,它允许数据库预编译SQL语句,以后每次只改变SQL命令的参数,避免数据库每次都需要编译SQL语句
给占位符赋值的方法:
void setXXX(int parameterIndex, XXX value) //XXX为赋值的数据类型
2.5.ResultSet
结果集对象。该对象包含访问查询结果的方法,ResultSet可以通过列索引或列名获得列数据。
常用方法:
//释放ResultSet对象
void close() throws SQLException
//将结果集移动到第row行, 如果是负数则移动到倒数第low行,如果移动后的记录指针指向一条有效记录,则返回true
boolean absolute(int row)
//将记录指针定位到首行之前,这是记录指针的初始状态
void beforeFisrt()
//将记录指针定位到首行,如果移动后的记录指针指向一条有效记录,则返回true
boolean first()
//将记录指针定位到上一行,如果移动后的记录指针指向一条有效记录,则返回true
boolean previous()
//将记录指针定位到下一行,如果移动后的记录指针指向一条有效记录,则返回true
boolean next()
////将记录指针定位到最后一行,如果移动后的记录指针指向一条有效记录,则返回true
boolean last()
//将记录指针定位到最后一行以后
void afterLast()
3.JDBC使用步骤
3.1.加载驱动
通常使用Class.for(driverClass)来加载驱动
Class.forName(DriverClass);
//加载Mysql驱动:
Class.forname("com.mysql.jdbc.Driver");
//加载Oracle驱动:
Class.forname("oracle.jdbc.driver.OracleDriver");
3.2.获取数据库连接
Connection connection = DriverManager.getConnection(String url, String user, String pass)
其中user是数据库用户名,pass是数据库密码
url遵循以下写写法:
jdbc:subprotocol:other stuff
其中jdbc是固定的,subprotocol指定连接到特定数据库的驱动程序,后面的other和stuff也不是固定的,不同的url写法也不同,下面是mysql和oracle的写法:
jdbc:mysql://hostname:port/databasename
jdbc:oracle:thin:@hostname:prot:databasename
3.3.获得Statement对象
Connection创建Statement的方法:
createStatement() //创建基本的Statement对象
prepareStatement(String sql) //根据传入的SQL语句创建预编译的Statement对象
prepareStatement(String sql) //根据传入的SQL语句创建CallableStatement对象
3.4.使用Statement执行SQL语句
execute
: 可以执行任何SQL语句,但比较麻烦
executeUpdate
: 主要用于执行DML和DDL语句,执行DML语句返回收SQL语句影响的行数
executeQuery
: 只能执行查询语句,执行后返回代表查询结果的ResultSet对象
3.5.操作结果集
主要包含两类方法:
移动指针记录的方法
主要包含next, previous, first, last, beforeFirst, afterLast, absolute等
获取记录指针指向行,列特定的值。
主要是getXxx方法,该方法既可以用列索引作为参数,也可以用列名作为参数,前者性能好,后者可读性好
3.6.回收数据库资源
ResultSet rs;
Statement stmt;
Connection conn;
//以上获取对象过程省略,关闭时是按照栈的原则进行关闭
if(rs != null)
rs.close();
if(stmt != null)
stmt.close();
if(conn != null)
conn.close();
3.7.简单示例
数据库:
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
public class JDBC {
public static void main(String[] args) throws Exception{
//加载驱动
Class.forName("com.mysql.jdbc.Driver");
//使用DriverManager获取数据库连接
Connection conn = DriverManager
.getConnection("jdbc:mysql://localhost:3306/jdbc",
"root", "root");
//使用Connection来创建Statement对象
Statement stmt = conn.createStatement();
//执行SQL语句,这里只展示三种方法中的查询
ResultSet rs = stmt.executeQuery("select * from test");
//操作结果集
while(rs.next()){
System.out.println(rs.getInt(1)+ " "
+ rs.getString(2) + " "
+ rs.getString(3));
}
//关闭数据库连接
if(rs != null)
rs.close();
if(stmt != null)
stmt.close();
if(conn != null)
conn.close();
}
}
出现警告的原因:
public class Driver extends com.mysql.cj.jdbc.Driver {
public Driver() throws SQLException {
}
static {
System.err.println("Loading class `com.mysql.jdbc.Driver'. This is deprecated. The new driver class is `com.mysql.cj.jdbc.Driver'. The driver is automatically registered via the SPI and manual loading of the driver class is generally unnecessary.");
}
}
这个是加载驱动时静态代码块中的内容,百度翻译过之后意思是:
这已被弃用。新的驱动程序类是'com.mysql.cj.jdbc.driver'。驱动程序通过SPI自动注册,通常不需要手动加载 驱动程序类。
也就是说当使用较新的mysql-connector
jar包时,可以不再加载驱动
改进封装版
import java.io.FileInputStream;
import java.io.IOException;
import java.sql.*;
import java.util.Properties;
public class JDBC2 {
//获得连接对象
public static Connection getConnection(){
Properties prop = new Properties();
Connection conn = null;
try {
//加载配置文件
prop.load(new FileInputStream("src/main/resources/datasource.properties"));
//低版本jar包需要下面这句话来加载驱动
//Class.forName(prop.getProperty("driver"));
//通过DriverManager获取Connection连接
conn = DriverManager
.getConnection(prop.getProperty("url"), prop.getProperty("username"),
prop.getProperty("password"));
} catch (IOException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
return conn;
}
//关闭连接
public static void close(Connection conn, Statement stmt, ResultSet rs){
try{
if(rs != null)
rs.close();
if(stmt != null)
stmt.close();
if(conn != null)
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
//测试类
class Test{
public static void main(String[] args) {
Connection conn = JDBC2.getConnection();
try {
//通过Connection创建Statement对象
Statement stmt = conn.createStatement();
//执行SQL语句
ResultSet rs = stmt.executeQuery("select * from test");
while (rs.next()){
System.out.println(rs.getInt(1) + " "
+ rs.getString(2) + " " + rs.getString(3));
}
//关闭连接
JDBC2.close(conn, stmt, rs);
} catch (SQLException e) {
e.printStackTrace();
}
}
}
配置文件:
driver=com.mysql.jdbc.driver
url=jdbc:mysql://localhost:3306/jdbc
username=root
password=root
JDBC学习笔记一的更多相关文章
- JDBC 学习笔记(十一)—— JDBC 的事务支持
1. 事务 在关系型数据库中,有一个很重要的概念,叫做事务(Transaction).它具有 ACID 四个特性: A(Atomicity):原子性,一个事务是一个不可分割的工作单位,事务中包括的诸操 ...
- JDBC 学习笔记(十)—— 使用 JDBC 搭建一个简易的 ORM 框架
1. 数据映射 当我们获取到 ResultSet 之后,显然这个不是我们想要的数据结构. 数据库中的每一个表,在 Java 代码中,一定会有一个类与之对应,例如: package com.gerrar ...
- JDBC 学习笔记(六)—— PreparedStatement
1. 引入 PreparedStatement PreparedStatement 通过 Connection.createPreparedStatement(String sql) 方法创建,主要用 ...
- JDBC学习笔记二
JDBC学习笔记二 4.execute()方法执行SQL语句 execute几乎可以执行任何SQL语句,当execute执行过SQL语句之后会返回一个布尔类型的值,代表是否返回了ResultSet对象 ...
- JDBC学习笔记(2)——Statement和ResultSet
Statement执行更新操作 Statement:Statement 是 Java 执行数据库操作的一个重要方法,用于在已经建立数据库连接的基础上,向数据库发送要执行的SQL语句.Statement ...
- JDBC学习笔记(1)——JDBC概述
JDBC JDBC API是一个Java API,可以访问任何类型表列数据,特别是存储在关系数据库中的数据.JDBC代表Java数据库连接. JDBC库中所包含的API任务通常与数据库使用: 连接到数 ...
- 【转】JDBC学习笔记(2)——Statement和ResultSet
转自:http://www.cnblogs.com/ysw-go/ Statement执行更新操作 Statement:Statement 是 Java 执行数据库操作的一个重要方法,用于在已经建立数 ...
- 【转】JDBC学习笔记(1)——JDBC概述
转自:http://www.cnblogs.com/ysw-go/ JDBC JDBC API是一个Java API,可以访问任何类型表列数据,特别是存储在关系数据库中的数据.JDBC代表Java数据 ...
- JDBC学习笔记(1)
说明:本系列学习笔记主要是学习传智播客的李勇老师的教学课程和一本英文电子书<JDBC Recipes A Problem-Solution Approach>所作的笔记. 1,什么是JDB ...
随机推荐
- JAVA框架中XML文件
其实在JAVA开发中servlet配置,映射注入配置等等都可以用xml来配置 在此处的department是实体类的名字,而不是对应的数据库表的名字 数据库表的字段名=#{实体类属性名} 逆向工程生成 ...
- golang数据结构和算法之StackLinkedList链表堆栈
会了上一个,这个就差不离了. StackLinkedList.go package StackLinkedList type Node struct { data int next *Node } t ...
- 借助meta影藏顶部菜单
1===>报错 Cannot find module 'webpack/lib/Chunk' 删除node_modules 然后重新下载 4==> 现在已进入页面,底部就有四个菜单,在点击 ...
- 【洛谷P4589】[TJOI2018]智力竞赛(二分+最小链覆盖)
洛谷 题意: 给出一个\(DAG\),现在要选出\(n+1\)条可相交的链来覆盖,最终使得未被覆盖的点集中,权值最小的点的权值最大. 思路: 显然最终的答案具有单调性,故直接二分答案来判断: 直接将小 ...
- 批量文件B中选出部分文件(与A文件夹数量相同),放到C中
import glob import os,sys import shutil fileDir = 'F:/project/Breast/InBreast/INBreast/outimgpatch/n ...
- TransportFireWall
1.shadow for python install on windows (1.) install python pip (2.) install openssl for windows (3.) ...
- 《LinuxTools》
https://zhuanlan.zhihu.com/p/37196870 Linux基础 Linux工具进阶 工具参考篇 1. gdb 调试利器 2. ldd 查看程序依赖库 3. lsof 一切皆 ...
- 史上最全的LaTeX特殊符号语法
史上最全的LaTeX特殊符号语法 运算符 语法 效果 语法 效果 语法 效果 + \(+\) - \(-\) \triangleleft \(\triangleleft\) \pm \(\pm\) \ ...
- gradle初学可能遇到的问题
gradle的脚本文件名称必须是build.gradle,如果自学的时候随便起的名字测试.如:test.gradle,脚本执行的时候是找不到相对于的任务的.会报错
- Deepin安装与配置
前言 今年参加CSP-S时仍不太习惯系统,深究其原因,我之前一直是一种应试的心态去学习Linux,学习的大多操作只是为了应试,而非为了"生存"下来,只有能完全摆脱Windows,在 ...