JavaWeb学习--JDBC简介与API详解

JDBC简介

  • JDBC概念

JDBC就是使用Java语言操作关系型数据库的一套API

全称:(Java DataBase Connectivity ) Java数据库连接

 

  • JDBC本质

官方(sun公司)定义的一套操作所有关系型数据库的规则,即接口。各个数据库厂商去实现这套接口,提供数据库驱动jar包

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

  • JDBC优点

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

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

 

JDBC七步入门

API详解

 

 

 

  • DirverManager

1.注册驱动

//注册驱动
Class.forName("com.mysql.jdbc.Driver");

//查看Driver类源码
static {
    try {
        DriverManager.registerDriver(new Driver());
    }catch (SQLException var1) {
        throw new RuntimeException( "Can't register driver ! ");
    }
}


注意:

MySQL 5之后的驱动包,可以省略注册驱动的步骤

自动加载jar包中META-INF/services/java.sql.Driver文件中的驱动类

 

2.获取连接

static Connection    getconnection (String url,String user,String password)

参数

1. url:连接路径

语法:jdbc:mysql:/lip地址(域名):端口号/数据库名称?参数键值对1&参数键值对2...

示例:jdbc:mysql://127.0.0.1:3306/db1

细节:

如果连接的是本机mysq服务器,并且mysql服务默认端口是3306,则uri可以简写为: jdbc:mysql:/数据库名称?参数键值对

配置useSSL=false参数,禁用安全连接方式,解决警告提示

2. user:用户名

3. password:密码

 

  • Connection

1.获取执行SQL的对象

  • 普通执行SQL对象

Statement   createStatement()

 

  • 预编译SQL的执行SQL对象:防止SQL注入

PreparedStatement   prepareStatement (sql)

 

  • 执行存储过程的对象

CallableStatement   prepareCall (sql)

 

2.事务管理

  • MySQL事务管理

开启事务:BEGIN; /START TRANSACTION;

提交事务:COMMIT;

回滚事务:ROLLBACK;

MySQL默认自动提交事务

 

  • JDBC事务管理:Connection接口中定义了3个对应的方法

开启事务: setAutoCommit(boolean autoCommit): true为自动提交事务;false为手动提交事务,即为开启事务

提交事务: commit()

回滚事务:rollback()

 

 

  • Statement

1.执行SQL语句

  • 执行SQL语句

int    executeUpdate(sql);  //执行DML、DDL语句

返回值:

(1)DML语句影响的行数

(2)DDL语句执行后,执行成功也可能返回0

 

 

  • ResultSet

ResultSet是Statement的另一个执行SQL语句方式,主要用于执行DQL语句,返回查询结果对象

执行DQL语句

ResultSet    executeQuery(sql);  //执行DQL语句

返回值

(1)ResultSet对象

 

  • PreparedStatement

1.预编译SQL语句并执行:

预防SQL注入问题

SQL注入是通过操作输入来修改事先定义好的SQL语句,用以达到执行代码对服务器进行攻击的方法。

 

简单SQL注入案例:

//获取连接.....

//接收用户输入用户名和密码
String name = "hfkjsfhskj";
String pwd = "' or '1= '1";

String sql = "select * from tb_user where username = ' "+name+"' and password = '"+pwd+"'";
System.out.println(sql);

//获取stmt对象
Statement stmt .= conn.createStatement();

//执行sql
ResultSet rs = stmt.executeQuery(sql);

//判断登录是否成功
if(rs.next()){
    system.out.println("登录成功~");
}else{
    system.out. println("登录失败~" );
}

//7.释放资源
rs.close();
stmt.close();
conn.close();

为什么会直接登录呢?打印sql语句可以得到如下语句,前面username 为false,password为空也为false这部分都为false,接下来1=1恒等式为true,中间or连接所有where结果为true,登录成功.

select * from tb_user where username = 'hfkjsfhskj' and password = '' or 'l' = '1'

 

PreparedStatement解决SQL注入原理:

通过使用?占位符来替代,所有传值时传入到?位置,防止非法字符串拼接

使用案例:

//获取连接.....

//接收用户输入用户名和密码
String name = "hfkjsfhskj";
String pwd = "' or '1= '1";

/定义sql
String sql = "select * from tb_user where username = ? and password = ?";

//获取pstmt对象
PreparedStatement pstmt = conn.prepareStatement(sql);

//设置?的值
pstmt.setString(1,name);//第一个?
pstmt.setString(2,pwd);//第二个?

//执行sql
pstmt.executeQuery();


//判断登录是否成功
if(rs.next()){
    system.out.println("登录成功~");
}else{
    system.out. println("登录失败~" );
}

//7.释放资源
rs.close();
pstmt.close();
conn.close();

 这时这里的sql语句就会对逗号进行转义,所有就不会非法注入了

select * from tb_user where username = 'hfkjsfhskj' and password = '\' or \'l\' = \'1'

 

2.PreparedStatement原理

具体原理详解见视频连接:https://www.bilibili.com/video/BV1Qf4y1T7Hx?p=37&share_source=copy_web

posted @   Makondo  阅读(179)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· winform 绘制太阳,地球,月球 运作规律
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示
主题色彩