概述
文章目录
- 前言
- JDBC
- JDBC是什么
- JDBC的本质
- JDBC编程六步
- SQL注入
- Statement和PrepareStatement
前言
虽然现在已经不在使用JDBC了,一般都是Mybatis或者Spring Data JPA,但是不管使用什么ORM框架,都是在JDBC上封装了一层或几层,再者技多不压身,学习JDBC还是很有必要的。
JDBC
在web开发中,不可避免的要使用数据库来存储和管理数据。为了在java语言中提供数据库访问的支持,Sun公司在1996年提供了一套访问数据的标准Java类库,也称JDBC。
JDBC是什么
JDBC的全称为Java DataBase Connectivity(Java语言连接数据库),它是一套用于执行SQL语句的JavaAPI,也就是使用Java语言来操作数据库的一种API。
JDBC的本质
JDBC的本质是Sun公司提供的一套接口,有调用者和使用者,面向接口调用、面向接口写实现类,这都属于面向接口编程。
为什么要面向接口编程:降低程序之间的耦合度,避免修改一处代码而牵动别处代码的改动,提高程序的扩展力,多态就是一种面向接口编程的思想
//推荐使用
Animal c = new Cat();
Animal d = new Dog();
//不推荐使用
Cat c = new Cat();
Dog d = new Dog();
JDBC编程六步
- 注册驱动(告诉Java程序需要连接的数据库是MySQL、Oracle…)
- 获取连接(JVM和数据库之间进程的通道打开)
- 获取数据库操作对象(专门执行SQL语句的对象)
- 执行SQL语句(crud语句)
- 处理查询结果集(收集执行完SQL语句的结果)
- 释放资源(将Java和数据库之间进程的通道关闭)
package com.bjpowernode.jdbc;
import java.sql.*;
public class JDBC {
public static void main(String[] args) throws SQLException {
Statement stmt = null;
Connection conn = null;
ResultSet rs = null;
try {
//1.注册驱动
Class.forName("com.mysql.cj.jdbc.Driver");
//2.获取连接
//数据库中表的位置,数据库名,数据库密码
conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/bjpowernode", "root", "111");
//3.获取数据库操作对象
stmt = conn.createStatement();
//4.执行sql语句
String sql = "update dept1 set dname = 'RENSHIBU',loc = 'SHANGHAI' where deptno = 20";
String sql1 = "select * from dept1";
int count = stmt.executeUpdate(sql);//count 表示被影响的行数
rs = stmt.executeQuery(sql1);// stmt.executeQuery()方法返回的是一个集合
//5.处理查询结果集
System.out.println(count == 2 ? "修改成功" : "修改失败");
//rs.next()方法返回的是一个boolean值
while (rs.next()) {
int deptno = rs.getInt("deptno");
String dname = rs.getString("dname");
String loc = rs.getString("loc");
System.out.println(deptno + " " + dname + " " + loc);
}
} catch (ClassNotFoundException | SQLException e) {
e.printStackTrace();
} finally {
//6.释放资源
rs.close();
stmt.close();
conn.close();
}
}
}
SQL注入
所谓的SQL注入就是通过某种方式将恶意的SQL代码添加到输入参数中,传递到SQL服务器使其解析并执行的一种攻击方法
解决SQL注入问题
使用java.sql.PreparedStatement,PreparedStatement接口继承了java.sql.Statement,属于预编译数据库操作对象,预先对SQL语句进行编译,然后再给SQL语句传值
package com.bjpowernode.jdbc;
import java.sql.*;
public class JDBC {
public static void main(String[] args) throws SQLException {
String loginName = "zhangsan";
String loginPwd = "123456";
boolean flag = false;
Statement stmt = null;
Connection conn = null;
ResultSet rs = null;
try {
//1.注册驱动
Class.forName("com.mysql.cj.jdbc.Driver");
//2.获取连接
//数据库中表的位置,数据库名,数据库密码
conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/bjpowernode", "root", "111");
//3.获取预编译的数据库操作对象
//sql语句的框架.其中一个?表示一个占位符.一个?将来接收一个"值", 占位符不能使用单引号括起来
String sql = "select * from t_user where username =? and password=?";
//程序执行到此处,会发送SQL语句框子给DBMS.然后DBMS进行sql语句的预先编译.
ps = conn.prepareStatement(sql);
//给占位符?传值(第一个问号下标是1,第二个下标是2,JDBC中所有下标从1开始)
//setString(xxx,yyy)方法会自动给yyy添加单引号
ps.setString(1,loginName);
ps.setString(2,loginPwd);
//4.执行sql
rs = ps.executeQuery();
//5.处理结果集
if (rs.next()) {
flag = true;
}
} catch (ClassNotFoundException | SQLException e) {
e.printStackTrace();
} finally {
//6.释放资源
rs.close();
stmt.close();
conn.close();
}
}
}
Statement和PrepareStatement
- Statement的使用存在SQL注入问题,而PrepareStatement解决了SQL注入的问题
- Statement是编译一次执行一次,PrepareStatement是编译一次,可执行多次,后者的效率更高一些
- PrepareStatement更常用一些,但有些情况也会使用Statement
最后
以上就是大力芒果为你收集整理的一文带你了解JDBC前言JDBC的全部内容,希望文章能够帮你解决一文带你了解JDBC前言JDBC所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复