JavaWeb学习--JDBC简介与API详解
JDBC简介
- JDBC概念
JDBC就是使用Java语言操作关系型数据库的一套API
全称:(Java DataBase Connectivity ) Java数据库连接
- JDBC本质
官方(sun公司)定义的一套操作所有关系型数据库的规则,即接口。各个数据库厂商去实现这套接口,提供数据库驱动jar包
我们可以使用这套接口(JDBC)编程,真正执行的代码是驱动jar包中的实现类
- JDBC优点
各数据库厂商使用相同的接口,Java代码不需要针对不同数据库分别开发
可随时替换底层数据库,访问数据库的Java代码基本不变
JDBC七步入门
API详解
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:密码
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()
1.执行SQL语句
- 执行SQL语句
int executeUpdate(sql); //执行DML、DDL语句
返回值:
(1)DML语句影响的行数
(2)DDL语句执行后,执行成功也可能返回0
ResultSet是Statement的另一个执行SQL语句方式,主要用于执行DQL语句,返回查询结果对象
执行DQL语句
ResultSet executeQuery(sql); //执行DQL语句
返回值
(1)ResultSet对象
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
作者:Makondo
出处:https://www.cnblogs.com/Makondo/p/15810357.html
版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· winform 绘制太阳,地球,月球 运作规律
· 上周热点回顾(3.3-3.9)