目录
1、JDBC
2、JDBC的常用接口
1.Driver接口
2.Connection接口
3.Statement接口
4.ResultSet接口
3、JDBC的基本使用
1)、简单的增删查改
Ⅰ、查
Ⅱ、增
Ⅲ、改
Ⅳ、删
2)简单封装
1、JDBC
我们先了解JDBC是什么,JDBC的全称是Java数据库连接(Java Database connect),它是一套用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成。JDBC 可帮助我们编写管理以下三种编程活动的 Java 应用程序:
- 连接到数据源,如数据库
- 将查询和更新语句发送到数据库
- 检索和处理从数据库接收的结果以回答查询
我们可以通过JDBC进行简单增删查改。但是JDBC使用的前提,下载jdbc各数据库的驱动包 ,我这里用Mysql为例子,我们找到对应版本的驱动包。
JDBCMysql的驱动包下载地址
下载完成之后,我们可以新建一个包把它放在里面,然后再进行找到File中的Project Structure进行下面操作,将包加载完毕。
我们在使用之前先要去了解JDBC的常用方法。
2、JDBC的常用接口
1.Driver接口
Driver接口由数据库厂家提供,作为java开发人员,只需要使用Driver接口就可以了。在编程中要连接数据库,必须先装载特定厂商的数据库驱动程序,不同的数据库有不同的装载方法。如:
- 装载MySql驱动:Class.forName("com.mysql.jdbc.Driver");
- 装载Oracle驱动:Class.forName("oracle.jdbc.driver.OracleDriver");
2.Connection接口
Connection与特定数据库的连接(会话),在连接上下文中执行sql语句并返回结果。DriverManager.getConnection(url, user, password)方法建立在JDBC URL中定义的数据库Connection连接上。
使用DriverManager建立连接,需要三个参数
1)url:数据库连接的url(mysql端口号为306)
格式如下: jdbc:mysql://数据库的ip地址:数据库的端口/数据库?参数名=参数值
注意:一般有多个参数名=参数值,如果使用8.x数据库,则需要额外加一个参数:allowPublicKeyRetrieval=true
2)user:数据库的用户名
3)password:数据库的密码
连接MySql数据库:
Connection conn= DriverManager.getConnection("jdbc:mysql://localhost:3306/数据库名/参数名=参数值", "user", "password");
常用方法:
- createStatement():创建向数据库发送sql的statement对象。
- prepareStatement(sql) :创建向数据库发送预编译sql的PrepareSatement对象。
- prepareCall(sql):创建执行存储过程的callableStatement对象。
- setAutoCommit(boolean autoCommit):设置事务是否自动提交。
- commit() :在链接上提交事务。
- rollback() :在此链接上回滚事务。
3.Statement接口
用于执行静态SQL语句并返回它所生成结果的对象。
三种Statement类:
- Statement:由createStatement创建,用于发送简单的SQL语句(不带参数)。
- PreparedStatement :继承自Statement接口,由preparedStatement创建,用于发送含有一个或多个参数的SQL语句。PreparedStatement对象比Statement对象的效率更高,并且可以防止SQL注入,所以我们一般都使用PreparedStatement。
- CallableStatement:继承自PreparedStatement接口,由方法prepareCall创建,用于调用存储过程。
常用Statement方法(2,3方法特别重要):
- execute(String sql):运行语句,返回是否有结果集
- executeQuery(String sql):运行select语句,返回ResultSet结果集。
- executeUpdate(String sql):运行insert/update/delete操作,返回的是int类型的结果,代表受影响的行数,如果为0,表示没有任何操作
- addBatch(String sql) :把多条sql语句放到一个批处理中。
- executeBatch():向数据库发送一批sql语句执行。
4.ResultSet接口
ResultSet提供检索不同类型字段的方法,常用的有:
- getString(int index)、getString(String columnName):获得在数据库里是varchar、char等类型的数据对象。
- getFloat(int index)、getFloat(String columnName):获得在数据库里是Float类型的数据对象。
- getDate(int index)、getDate(String columnName):获得在数据库里是Date类型的数据。
- getBoolean(int index)、getBoolean(String columnName):获得在数据库里是Boolean类型的数据。
- getObject(int index)、getObject(String columnName):获取在数据库里任意类型的数据。
ResultSet还提供了对结果集进行滚动的方法:
- next():移动到下一行
- Previous():移动到前一行
- absolute(int row):移动到指定行
- beforeFirst():移动resultSet的最前面。
- afterLast() :移动到resultSet的最后面。
使用后依次关闭对象及连接:ResultSet → Statement → Connection。这是因为在程序用完后要及时关闭数据库连接资源,以释放内存,避免资源耗尽。
3、JDBC的基本使用
1)、简单的增删查改
Ⅰ、查
package com.hk.sky;
import java.sql.*;
public class Jdbc {
public static void main(String[] args) throws SQLException {
// 1、使用DriverManager建立连接
Connection conn = DriverManager.getConnection(
"jdbc:mysql://localhost:3306/ku2022?useSSL=false&characterEncoding=utf8&serverTimezone=UTC&allowPublicKeyRetrieval=true",
"root",
"123456"
);
PreparedStatement pSta = conn.prepareStatement("select * from student");
// 3、执行查询,返回结果集
ResultSet rs = pSta.executeQuery();
// 4、遍历结果集,获取查询结果
//在获取查询结果之前,你需要了解表中各列的数据类型,以便用不同的数据类型的变量来进行接收
// 通过字段名称去获取各字段对应的值,格式为: 值 = rs.get数据类型("字段名称")
while (rs.next()) {
int id = rs.getInt("id");
String name = rs.getString("name");
System.out.println("id = " + id + ",name = " + name );
}
// 5、关闭连接,释放资源
pSta.close();
conn.close();
}
}
结果:
id = 1,name = 李四 id = 2,name = 王五 id = 3,name = 张三 id = 4,name = 小明
Ⅱ、增
package com.hk.sky;
import java.sql.*;
public class Main
{
public static void main(String[] args) throws SQLException {
Connection conn = DriverManager.getConnection(
"jdbc:mysql://localhost:3306/ku2022?useSSL=false&characterEncoding=utf8&serverTimezone=UTC&allowPublicKeyRetrieval=true",
"root",
"123456"
);
PreparedStatement pSta=conn.prepareStatement("insert into student(id,name) values(?,?)");
pSta.setInt(1,5);
pSta.setString(2,"小三");
int result=pSta.executeUpdate();
if (result>0)
System.out.println("添加成功");
pSta.close();
conn.close();
}
}
结果:添加成功
Ⅲ、改
package com.hk.sky;
import java.sql.*;
public class Main {
public static void main(String[] args) throws SQLException {
Connection conn = DriverManager.getConnection(
"jdbc:mysql://localhost:3306/ku2022?useSSL=false&characterEncoding=utf8&serverTimezone=UTC&allowPublicKeyRetrieval=true",
"root",
"123456"
);
PreparedStatement pSta=conn.prepareStatement("update student set id=?,name=?where id=?");
//?为占位符,这是用来设置参数值,其中?的开始位置从1开始。
pSta.setInt(1,6);
pSta.setString(2,"齐天大圣");
pSta.setInt(3,5);
int result=pSta.executeUpdate();
if (result>0)
System.out.println("修改成功");
pSta.close();
conn.close();
}
}
结果:修改成功
Ⅳ、删
package com.hk.sky;
import java.sql.*;
public class Main {
public static void main(String[] args) throws SQLException {
Connection conn = DriverManager.getConnection(
"jdbc:mysql://localhost:3306/ku2022?useSSL=false&characterEncoding=utf8&serverTimezone=UTC&allowPublicKeyRetrieval=true",
"root",
"123456"
);
PreparedStatement pSta= conn.prepareStatement("delete from student where id = ?");
//?为占位符,这是用来设置参数值,其中?的开始位置从1开始。
pSta.setInt(1,6);
int result=pSta.executeUpdate();
if (result>0)
System.out.println("删除成功");
pSta.close();
conn.close();
}
}
结果:删除成功
2)简单封装
我们可以发现上面的增删查改中的代码只有中间需要去变化,因此为避免代码的冗余,我们就需要去封装起来开头连接和结尾的关闭,这样每次写代码我们只需要去写中间的部分代码
我们先把url,用户名和密码放在一个resources文件夹,并设置为资源文件夹,创建db.properties;
资源文件夹如下图所示:
jdbc.url=jdbc:mysql://localhost:3306/ku2022?useSSL=false&characterEncoding=utf8&serverTimezone=UTC&allowPublicKeyRetrieval=true
jdbc.username=root
jdbc.password=123456
然后再建一个utils包进行封装开头和结尾
package utils;
import java.io.IOException;
import java.sql.*;
import java.util.Properties;
/**
* 封装
*/
public class DBUtils {
private static String url;
private static String username;
private static String password;
// 读取配置文件
static {
Properties prop = new Properties();
try {
// DBUtils.class.getClassLoader().getResourceAsStream()方法可以从类路径中读取资源文件
prop.load(DBUtils.class.getClassLoader().getResourceAsStream("db.properties"));
// 通过key获取value
url = prop.getProperty("jdbc.url");
username = prop.getProperty("jdbc.username");
password = prop.getProperty("jdbc.password");
} catch (IOException e) {
throw new RuntimeException(e);
}
}
// 将创建连接的方法封装成静态方法,方便调用
// 将url、username、password放到配置文件当中,然后读取出来
public static Connection getConnection() {
Connection conn = null;
try {
conn = DriverManager.getConnection(
url,
username,
password
);
} catch (SQLException e) {
e.printStackTrace();
}
return conn;
}
// 将关闭连接的方法封装成静态方法,方便调用
public static void close(ResultSet rs, PreparedStatement pStmt, Connection conn) {
if (rs != null) {
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (pStmt != null) {
try {
pStmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (conn != null) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
下面我们来看看封装之后的如何去更新吧!
package com.hk.sky;
import utils.DBUtils;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
public class Main {
public static void main(String[] args) throws SQLException {
Connection conn = DBUtils.getConnection();
PreparedStatement pstmt = conn.prepareStatement("update student set id = ?, name = ? where id = ?");
//?为占位符,这是用来设置参数值,其中?的开始位置从1开始。
pstmt.setInt(1, 1);
pstmt.setString(2, "小四");
pstmt.setInt(3, 1);
//提醒:
// pstmt.executeQuery()实现查询,返回查询的结果(结果集)
// pstmt.executeUpdate()实现增、删、改,返回的是int类型的结果,代表受影响的行数,如果为0,表示没有任何操作
int result = pstmt.executeUpdate();
if (result > 0) {
System.out.println("更新成功");
}
// 查询才会有ResultSet,因此此处第一个参数为null
DBUtils.close(null, pstmt, conn);
}
}
结果:小四
还有剩下的查找,删除,更新也是类似的去修改之间部分,这就交给你们去实现。博主知识有限,望有错误请大佬指出!谢谢😀