【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注入。!

  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Day1–JDBC概述+JDBC完成CRUD+DAO设计 1.JDBC概述 1.1 什么是持久化(persistence): 持久化(persistence):把数据保存到可掉电式存储设备以供之后使用。 ​ 保存数据: ​ 内存: 掉电之后,数据就没了. ​ 磁盘: 掉电之后,数据依然存在. 大多数情况下,特别是企业级应用,数据持久化意味着将内存的数据保存到硬盘上加以”固化”,而持久化的实现过程大多通过各种关系数据库来完成。 持久化的主要应用是将内存的数据存储在 关系型数据库,当然也可以存储在磁盘文件、XML数据文件。 JPA:JavaEE的规范,Java persistence api: Java的持久化API. Hibernate实现了该规范.(xml/注解) -------------------------------------------------------------------------------------------------------------------- 在Java,数据库存取技术 只能通过JDBC 访问数据库: JDBC访问数据库的形式主要有两种: ​ 1).直接使用JDBC的API去访问数据库服务器(MySQL/Oracle). ​ 2).间接地使用JDBC的API去访问数据库服务器. ​ 第三方O/R Mapping工具,如Hibernate, MyBatis等.(底层依然是JDBC) ​ JDBC是java访问数据库的基石,其他技术都是对jdbc的封装. 1.2 JDBC(Java DataBase Connectivity): 是一种用于执行SQL语句的Java API(接口,类,方法),可以为多种关系数据库提供统一访问, 它由一组用Java语言编写的类和接口组成。 JDBC提供了一种基准,据此可以构建更高级的工具和接口,使数据库开发人员能够编写数据库应用程序. ​ JDBC为访问不同的数据库提供了一种统一的途径,为开发者屏蔽了一些细节问题。 JDBC的目标是使Java程序员使用JDBC可以连接任何提供了JDBC驱动程序的数据库系统, 这样就使得程序员无需对特定的数据库系统的特点有过多的了解,从而大大简化和加快了开发过程。 ​ 总结: JDBC本身是java连接数据库的一个标准,是进行数据库连接的抽象层,由java编写的一组类和接口组成,接口的实现由各个数据库厂商来完成. --------------------- 作者:故事我忘了i 来源:CSDN

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值