【JDBC笔记】JDBC基础知识

JDBC

一.JDBC

1.概述:

Java DataBase Connectivity (Java 数据库连接)
使用Java代码操作数据库
JDBC其实就是一套操作数据库的规范(接口)

2.步骤:

a.导入驱动jar包
b.注册驱动
c.创建连接对象 Connection
d.定义SQL语句
e.获取执行SQL的对象 Statement
f.执行SQL
g.处理结果
h.释放资源
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
import java.sql.Connection;

public class JDBC_Bulid {
	public static void main(String[] args) throws ClassNotFoundException, SQLException {
		// 1.导入数据数据库 jar包 右键add--->builderpath

		// 2.加载驱动jar包
		Class.forName("com.mysql.jdbc.Driver");
		// 3.获取一个数据库链接对象
		//参数1:数据库的路径 参数2,3 数据库的用户名和密码
		String url = "jdbc:mysql://localhost:3306/demo01";
		String user = "root";
		String password = "root";
		Connection conn = DriverManager.getConnection(url, user, password);
		// 4.获取操作对象 是同过连接对象去获取的
		Statement statement = conn.createStatement();
		// 5.定义sql语句
		String sql = "insert into other values(3,'Hello','Y')";
		// 6.执行语句
		int i = statement.executeUpdate(sql);
		if(i!=0){
			System.out.println("添加成功");
		}else{
			System.out.println("添加失败");
		}
		// 7.释放资源
		statement.close();
		conn.close();
	}
}

二.类的介绍

1.DriverManager(驱动管理类)

管理一组 JDBC 驱动程序的基本服务。

a.功能1(注册驱动)

在Driver类中有静态代码块,随着类的加载而执行。
static {
try {
java.sql.DriverManager.registerDriver(new Driver());//注册驱动
} catch (SQLException E) {
throw new RuntimeException("Can't register driver!");
}
}

拓展:mysql5之后的驱动jar包,注册驱动这行代码可以省略


b.功能2(获取Connection对象)

public static ConnectiongetConnection(String url,String user,String password) throws SQLException
试图建立到给定数据库 URL 的连接。DriverManager 试图从已注册的 JDBC 驱动程序集中选择一个适当的驱动程序。
参数:
url- jdbc:subprotocol:subname 形式的数据库 url
user - 数据库用户,连接是为该用户建立的
password - 用户的密码

注意:如果连接是本地数据库,则ip和端口号可以省略。

2.Connection(数据库连接对象)

java.sql
接口 Connection

a.方法(创建执行SQL的对象):

i.createStatement() throws SQLException

创建一个 Statement 对象来将 SQL 语句发送到数据库。


ii.prepareStatement(String sql) throws SQLException
创建一个 PreparedStatement 对象来将参数化的 SQL 语句发送到数据库。

iii.prepareCall(String sql)throws SQLException
创建一个 CallableStatement 对象来调用数据库存储过程

b.管理事务:

事务指一件事,这一件事包含多个步骤,这些步骤要么同时成功,要么同时失败。


i.void setAutoCommit(boolean autoCommit) throws SQLException
将此连接的自动提交模式设置为给定状态。如果连接处于自动提交模式下,则它的所有 SQL 语句将被执行并作为单个事务提交。否则,它的 SQL 语句将聚集到事务中,直到调用 commit 方法或 rollback 方法为止。默认情况下,新连接处于自动提交模式。

参数:autoCommit :

为 true 表示启用自动提交模式;

为 false 表示禁用自动提交模式

ii.voidcommit() throws SQLException
提交事务
使所有上一次提交/回滚后进行的更改成为持久更改,并释放此 Connection 对象当前持有的所有数据库锁。此方法只应该在已禁用自动提交模式时使用。

iii.voidrollback() throws SQLException
取消在当前事务中进行的所有更改,并释放此 Connection 对象当前持有的所有数据库锁。此方法只应该在已禁用自动提交模式时使用。

3.Statement(执行sql的对象)

java.sql
接口 Statement
用于执行静态 SQL 语句并返回它所生成结果的对象。

a.方法:

i.ResultSetexecuteQuery(String sql) throws SQLException
执行给定的 SQL 语句,该语句返回单个 ResultSet 对象。
返回值:
包含给定查询所生成数据的 ResultSet 对象;永远不能为 null

ii.intexecuteUpdate(String sql) throws SQLException
执行给定 SQL 语句,该语句可能为 INSERT、UPDATE 或 DELETE 语句,或者不返回任何内容的 SQL 语句(如 SQL DDL 语句)。
返回值:
对于SQL数据操作语言(DML)语句,返回行计数(影响的行数)
对于什么都不返回的SQL语句,返回 0

iii.booleanexecute(String sql) throws SQLException

执行给定的 SQL 语句,该语句返回执行的成功与否


4.ResultSet(结果集对象)

java.sql
接口 ResultSet
public interface ResultSet extends Wrapper
表示数据库结果集的数据表,通常通过执行查询数据库的语句生成。

a.方法:

i.booleannext() throws SQLException
将光标从当前位置向前移一行。ResultSet 光标最初位于第一行之前;第一次调用 next 方法使第一行成为当前行;第二次调用使第二行成为当前行,依此类推
ii.参数类型 getXxx(参数):获取数据
参数类型:
String:列的名称

int:列的序号 从1开始


5.PreparedStatement

public interface PreparedStatement extends Statement
表示预编译的 SQL 语句的对象。
SQL 语句被预编译并存储在 PreparedStatement 对象中。然后可以使用此对象多次高效地执行该语句。

a.应用

登陆:
如果使用statement,可能发生sql注入。
功能:
预防sql注入
使用方式:
i.定义sql时,所有的参数位置 需要 使用 ? 作为占位符
ii.Connection对象获取执行sql 对象 prepareStatement(sql)
iii.给占位符 ? 赋值
setXxx(参数1,参数2):
    • 参数1:?出现的位置 从1开始
    • 参数2:?对应的值
iv.执行sql时,使用不带参数的方法

注意:一般都采用该对象来执行sql

SQL注入演示:

此时的数据库:

此时的用户表:

在java代码中,把用户名和密码赋值成以下:

 String name="1' or '1'='1";

 String password="1' or '1'='1";

运行如下Java代码:

package login;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class JDBCLogin {
	public static void main(String[] args) throws SQLException {
		// sql注入 通过一些特殊的拼字符串 绕过数据库的校验
		String name = "1' or '1'='1";
		String password = "1' or '1'='1";
		
		Connection c = DriverManager.getConnection("jdbc:mysql:///day37", "root", "root");// 为了简洁这里抛出异常
		// 获取SQL操作对象
		Statement s = c.createStatement();
		//定义SQL
		String sql = "select * from users where name='" + name + "' and password='" + password + "' ";//这里注意 单引号 和双引号的匹配问题
		//执行
		ResultSet resultSet = s.executeQuery(sql);
		//处理结果
		if(resultSet.next()){
			System.out.println("登陆成功");
		}else{
			System.out.println("登陆失败");
		}
		
		//释放资源
		c.close();
		s.close();
		resultSet.close();
	
	}
}
此时得到结果:

可以看出利用特殊的字符串的账号和密码组合绕过数据库进入

那么要防止这种情况发生,就得使用prepareStatement(sql)

防止SQL注入:

数据库和表还是上面的,不改变。

运行Java代码如下:

package login;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

public class JDBCLogin_SQLBuZhuRu {
	public static void main(String[] args) throws SQLException {
		String name="1' or '1'='1";
		String password="1' or '1'='1";
		// SQL 注入 通过一些特殊的拼字符串 绕过数据库的校验
		Connection c = DriverManager.getConnection("jdbc:mysql:///day37", "root", "root");
		// 获取预编译操作对象
		String sql = "select * from users where name=? and password=?";//这里注意 账号 密码 用 ?代替 下面会赋值
		PreparedStatement ps = c.prepareStatement(sql);
		//给?赋值
		ps.setString(1, name);
		ps.setString(2, password);
		
		ResultSet resultSet = ps.executeQuery();
		
		//执行查询
		if(resultSet.next()){
			System.out.println("登陆成功");
		}else{
			System.out.println("登陆失败");
		}
		
		//释放资源
		c.close();
		ps.close();
		resultSet.close();
	}
}


此时得到结果:


由此看出利用 Connection对象获取执行sql 对象 prepareStatement(sql),可以有效防止SQL注入。!

一、概述: JDBC从物理结构上说就是Java语言访问数据库的一套接口集合。从本质上来说就是调用者(程序员)和实现者(数据库厂商)之间的协议。JDBC的实现由数据库厂商以驱动程序的形式提供。JDBC API 使得开发人员可以使用纯Java的方式来连接数据库,并进行操作。 ODBC:基于C语言的数据库访问接口。 JDBC也就是Java版的ODBC。 JDBC的特性:高度的一致性、简单性(常用的接口只有4、5个)。 1.在JDBC中包括了两个包:java.sql和javax.sql。 ① java.sql 基本功能。这个包中的类和接口主要针对基本的数据库编程服务,如生成连接、执行语句以及准备语句和运行批处理查询等。同时也有一些高级的处理,比如批处理更新、事务隔离和可滚动结果集等。 ② javax.sql 扩展功能。它主要为数据库方面的高级操作提供了接口和类。如为连接管理、分布式事务和旧有的连接提供了更好的抽象,它引入了容器管理的连接池、分布式事务和行集等。 注:除了标出的Class,其它均为接口。 API 说明 java.sql.Connection 与特定数据库的连接(会话)。能够通过getMetaData方法获得数据库提供的信息、所支持的SQL语法、存储过程和此连接的功能等信息。代表了数据库。 java.sql.Driver 每个驱动程序类必需实现的接口,同时,每个数据库驱动程序都应该提供一个实现Driver接口的类。 java.sql.DriverManager (Class) 管理一组JDBC驱动程序的基本服务。作为初始化的一部分,此接口会尝试加载在”jdbc.drivers”系统属性中引用的驱动程序。只是一个辅助类,是工具。 java.sql.Statement 用于执行静态SQL语句并返回其生成结果的对象。 java.sql.PreparedStatement 继承Statement接口,表示预编译的SQL语句的对象,SQL语句被预编译并且存储在PreparedStatement对象中。然后可以使用此对象高效地多次执行该语句。 java.sql.CallableStatement 用来访问数据库中的存储过程。它提供了一些方法来指定语句所使用的输入/输出参数。 java.sql.ResultSet 指的是查询返回的数据库结果集。 java.sql.ResultSetMetaData 可用于获取关于ResultSet对象中列的类型和属性信息的对象。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值