JDBC笔记

JDBC笔记

一、JDBC

1、概述

JDBC(java Database Connectivity)是一个独立于特定数据库管理系统,通用的SQL数据库存取和操作的公共接口(一组API)定义了用来访问数据库的标准java类库使用这个类库可以以一种标准的方法,方便的访问数据库资源。

JDBC的目标是使java程序员使用JDBC可以连接任何提供了JDBC驱动程序的数据库系统,这样可以是程序员无需对特定的数据库系统的特点有过多的了解加快开发过程。

Java DataBase Connectivity (Java 数据库连接)

使用Java代码操作数据库

JDBC其实就是一套操作数据库的规范(接口)

2、对JDBC本质的理解

官方(sun公司)定义的一套操作所有关系型数据库的规则,即接口。

各个数据库厂商去实现这套接口,提供数据库驱动jar包

我们可以使用这套接口(JDBC)编程,真正执行的代码是驱动jar包中的实现类

在这里插入图片描述

3、JDBC好处

1.各数据库厂商使用相同的接口,Java代码不需要针对不同数据库分别开发

2.可随时替换底层数据库,访问数据库的Java代码基本不变

3、步骤

1.导入驱动jar包

2.注册驱动

Class.forName(“com.mysql.jdbc.Driver”);

3.创建连接对象 Connection

Connection conn = DriverManager.getConnection(url, user, password);

4.定义SQL语句

String sql = “insert into other values(3,‘Hello’,‘Y’)”;

5.获取执行SQL的对象 Statement

Statement statement = conn.createStatement();

6.执行SQL

7.处理结果

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 驱动程序的基本服务。

1.1.功能1(注册驱动)

在Driver类中有静态代码块,随着类的加载而执行。

static {
	try {
			java.sql.DriverManager.registerDriver(new Driver());//注册驱动
		} catch (SQLException E) {
			throw new RuntimeException("Can't register driver!");
	}
}
拓展:mysql5之后的驱动jar包,注册驱动这行代码可以省略
1.2.功能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

2.1.方法(创建执行SQL的对象):
i.createStatement() throws SQLException
创建一个 Statement 对象来将 SQL 语句发送到数据库。

ii.prepareStatement(String sql) throws SQLException
创建一个 PreparedStatement 对象来将参数化的 SQL 语句发送到数据库。
    
iii.prepareCall(String sql)throws SQLException
创建一个 CallableStatement 对象来调用数据库存储过程
    

2.2.管理事务

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

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 语句并返回它所生成结果的对象。

1.方法:
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
表示数据库结果集的数据表,通常通过执行查询数据库的语句生成。
1.方法:

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

5.PrepareStatement

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

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

三、SQL注入

@Test
public void testLogin() throws  Exception {
    //获取连接:如果连接的是本机mysql并且端口是默认的 3306 可以简化书写
    String url = "jdbc:mysql:///db1?useSSL=false";
    String username = "root";
    String password = "1234";
    Connection conn = DriverManager.getConnection(url, username, password);
 
    // 接收用户输入 用户名和密码
    String name = "sjdljfld";     //用户名随便输入
    String pwd = "' or '1' = '1";
    String sql = "select * from tb_user where username = '"+name+"' and password = '"+pwd+"'";
    // 获取stmt对象
    Statement stmt = conn.createStatement();
    // 执行sql
    ResultSet rs = stmt.executeQuery(sql);
    // 判断登录是否成功
    if(rs.next()){
        System.out.println("登录成功~");
    }else{
        System.out.println("登录失败~");
    }
 
    //释放资源
    rs.close();
    stmt.close();
    conn.close();
}

/*
上面代码是将用户名和密码拼接到sql语句中,拼接后的sql语句如下
select * from tb_user where username = 'sjdljfld' and password = ''or '1' = '1'
从上面语句可以看出条件 username = ‘sjdljfld’ and password = ‘’ 不管是否满足,而 or 后面的 ‘1’ = ‘1’ 是始终满足的,最终条件是成立的,就可以正常的进行登陆了。
这是Statement存在的问题,而PreparedStatement对象就预防了SQL注入.
*/

将用户名和密码拼接到sql语句中,拼接后的sql语句如下
select * from tb_user where username = ‘sjdljfld’ and password = ''or ‘1’ = ‘1’
从上面语句可以看出条件 username = ‘sjdljfld’ and password = ‘’ 不管是否满足,而 or 后面的 ‘1’ = ‘1’ 是始终满足的,最终条件是成立的,就可以正常的进行登陆了。
这是Statement存在的问题,而PreparedStatement对象就预防了SQL注入.
*/


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值