jdbc
Java语言数据库连接技术
类型1
JDBC-ODBC桥
这种类型的驱动把所有JDBC的调用传递给ODBC,再让后者调用数据库本地驱动代码(也就是数据库厂商提供的数据库操作二进制代码库,例如Oracle中的oci.dll)。
类型2
本地API驱动
这种类型的驱动通过客户端加载数据库厂商提供的本地代码库(C/C++等来访问数据库,而在驱动程序中则包含了Java代码。
类型3
网络协议驱动
这种类型的驱动给客户端提供了一个网络API,客户端上的JDBC[驱动程序使用套接字(Socket)来调用服务器上的中间件程序,后者在将其请求转化为所需的具体API调用。
类型4
本地协议驱动
这种类型的驱动使用Socket,直接在客户端和数据库间通信。
JDBC API位于JDK中 java.sql 包下,扩展内容位于 javax.sql 下,主要包括:
DriverManager:负责加载各种不同驱动程序(Driver),并根据不同的请求,向调用者返回相应的数据库连接(Connection)。
Driver:驱动程序,会将自身加载到DriverManager中去,并处理相应的请求并返回相应的数据库连接(Connection)
Connection:数据库连接,负责与进行数据库间通讯,SQL执行以及事务处理都是在某个特Connection环境中进行的。可以产生用以执行SQL的Statement。
Statement:用以执行SQL查询和更新(针对静态SQL语句和单次执行)。
PreparedStatement:用以执行包含动态参数的SQL查询和更新(在服务器端编译,允许重复执行以提高效率)。
本地的API驱动方式:
步骤分析:
1、使用DriverManager加载数据库驱动Driver
2、通过Driver驱动加载,获得Collection连接对象
3、通过Collection连接对象获取到 Statement
4、利用Statement对象进行sql查询或更新操作
5、查询执行完,一定会得到一个结果
6、关闭流(保证资源安全)
DriverManager ---------类,主要负责驱动的加载和管理,以及获取连接
Driver 接口,具体实现由数据库厂商提供
Collection接口,负责Java与数据库的链接
package com.day01.exer1;/*
* 作用:jdbc测试
*
*@author hby_gd@163.com
*@date 1/7/2020 下午4:35
*/
//
import java.sql.*;
public class test1 {
// 1、使用DriverManager加载数据库驱动Driver
// 2、通过Driver驱动加载,获得Collection连接对象
// 3、通过Collection连接对象获取到 Statement
// 4、利用Statement对象进行sql查询或更新操作
// 5、查询执行完,一定会得到一个结果
// 6、关闭流(保证资源安全)
public static void main(String[] args) throws ClassNotFoundException, SQLException {
//1、加载数据库驱动
Class.forName("com.mysql.jdbc.Driver");
//2、通过驱动获取 collection 连接对象
Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/demo1", "root", "9999");
//3、获取 statement 对象
Statement statement = connection.createStatement();
//4、进行查询
ResultSet resultSet = statement.executeQuery("select * from tb1");
//5、输出结果
while (resultSet.next()){
//System.out.println(resultSet.getString(1)+":"+ resultSet.getString(2)+":"+ resultSet.getString(3));
System.out.println(resultSet.getString("username")+":"+ resultSet.getString("age")+":"+ resultSet.getString("salary"));
}
//6、关闭资源
resultSet.close();
statement.close();
connection.close();
}
}
JDBCUtils初步封装
package com.openlab.utils;/*
* 作用:JDBCUtils封装
*
*@author hby_gd@163.com
*@date 22/7/2020 下午12:56
*/
import java.sql.*;
import java.util.List;
public abstract class JDBCUtius {
//加载数据库驱动
private String driver = "com.mysql.jdbc.Driver";
//数据库路径
private static String url = "jdbc:mysql://localhost:3306/demo1";
private static String userName = "root";
private static String password = "9999";
private Connection conn = null;
private Statement statement = null;
private ResultSet resultSet = null;
//加载驱动要在程序启动时被加载,且只执行一次
//所以选择使用静态代码块,或静态方法
static {
try {
Class.forName("com.mysql.jdbc.Driver");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
/**
* 获取连接对象
* @return
* @throws SQLException
*/
public static Connection getConection() throws SQLException {
return DriverManager.getConnection(url,userName,password);
}
/**
* 查询一条记录
* @param sql
*/
public Object queryOne(String sql){
Object obj = null;
try {
conn = getConection();
statement = conn.createStatement();
ResultSet resultSet = statement.executeQuery(sql);
obj = toObj(resultSet);
} catch (SQLException e) {
e.printStackTrace();
}finally {
jdbcClose(conn,statement);
}
return obj;
}
/**
* 查询多条记录
* @param sql
* @return
*/
public List queryAll(String sql){
List list = null;
try {
conn = getConection();
statement = conn.createStatement();
ResultSet resultSet = statement.executeQuery(sql);
list = toList(resultSet);
} catch (SQLException e) {
e.printStackTrace();
}finally {
jdbcClose(conn,statement);
}
return list;
}
/**
* 添加、修改、删除
*/
public void update(String sql){
try {
conn = getConection();
statement = conn.createStatement();
int i = statement.executeUpdate(sql);
System.out.println(i);
} catch (SQLException e) {
e.printStackTrace();
}finally {
jdbcClose(conn,statement);
}
}
/**
* 关闭流
* mysql的连接资源是比较珍惜的资源
* 尽晚地获取链接,尽早地释放资源,减少对资源地占用时间
* @param conn
* @param statement
* @param resultSet
*/
public static void jdbcClose(Connection conn,Statement statement,ResultSet resultSet){
try {
resultSet.close();
if(resultSet != null){
resultSet = null;
}
} catch (SQLException e) {
e.printStackTrace();
}finally {
jdbcClose(conn,statement);
}
}
/**
* JDBC更新 关闭资源
* @param conn
* @param statement
*/
public static void jdbcClose(Connection conn,Statement statement){
try {
statement.close();
if(statement != null){
statement = null;
}
} catch (SQLException e) {
e.printStackTrace();
}finally {
try {
conn.close();
if(conn!=null){
conn = null;
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
public abstract Object toObj(ResultSet resultSet);
public abstract List toList(ResultSet resultSet);
}
封装后测试:
package com.day01.exer1;/*
* 作用:JDBCUtils封装测试
*
*@author hby_gd@163.com
*@date 22/7/2020 下午2:46
*/
import com.openlab.utils.JDBCUtius;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class JDBCUtilTest {
public static void main(String[] args) {
Connection conection = null;
Statement st = null;
ResultSet resultSet = null;
try {
conection = JDBCUtius.getConection();
st = conection.createStatement();
resultSet = st.executeQuery("SELECT * FROM tb1");
while (resultSet.next()){
System.out.println(resultSet.getString("user_name")+":"+ resultSet.getString("age")+":"+ resultSet.getString("salary"));
}
} catch (SQLException e) {
e.printStackTrace();
}finally {
JDBCUtius.jdbcClose(conection,st,resultSet);
}
String sql3 = "alter table tb1 drop password";
new JDBCUtius().update(sql3);
}
}