一、概念
JDBC是java数据库连接技术的字母缩写(Java DataBase Connectivity)。
JDBC就是使用JAVA程序连接数据库,操作数据库中的数据库,使用数据库存储程序中运行的各种数据。
可以这样理解:JDBC就是一座桥梁,用来连接数据库和Java程序的。
二、工作原理
JDBC有一系列的接口和类,都集成在java.sql和javax.sql中。
其中有一个类DriverManager,是用来管理各种不同的驱动。因为数据库有很多种,各种数据库之间的SQL语句有些差别,所以要连接不同的数据库,就需要使用到各自数据库的驱动,DriverManager就是用来做驱动管理的。
JDBC驱动负责连接不同类型的数据库,JAVA连接不同的数据库,需要导入对应数据库的驱动。
三、JDBC连接数据库步骤
①DriverManager加载驱动
②获取Connection连接
③创建Statement执行SQL语句
④返回ResultSet查询结果
四、JDBC查询数据库
查询需要三个对象:
Ⅰ.Connection负责连接数据库
Ⅱ.Statement负责执行SQL
Ⅲ.ResultSet查询的结果集
下面我们来进行代码实例展示:
展示使用的MySql,表名为students,SQL语句:
CREATE TABLE `students` (
`sid` varchar(8) NOT NULL,
`sname` varchar(255) DEFAULT NULL,
`gender` varchar(255) DEFAULT NULL,
`birthday` date DEFAULT NULL,
`address` varchar(255) DEFAULT NULL,
PRIMARY KEY (`sid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
①使用JDBC查询数据库
需要使用到的方法:executeQuery(String sql)执行SQL语句
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class SelectTest {
public static void main(String[] args) {
//连接对象
Connection conn = null;
//执行SQL语句对象
Statement st = null;
//查询的结果集
ResultSet rs = null;
try {
//加载驱动
Class.forName("com.mysql.jdbc.Driver");
//获取连接
conn = DriverManager.getConnection("jdbc:mysql:///test", "root", "1234");
//获取执行SQL对象
st = conn.createStatement();
//SQL语句
String sql = "select * from students";
//获取执行SQL的结果
rs = st.executeQuery(sql);
//输出结果
while(rs.next()){
System.out.print(rs.getString(1));
System.out.print(rs.getString(2));
System.out.print(rs.getString(3));
System.out.print(rs.getDate(4));
System.out.println(rs.getString(5));
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
try {
if(rs != null){
rs.close();
}
if(st != null){
st.close();
}
if(conn != null){
conn.close();
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
②使用JDBC对数据库进行增删改
需要使用到的方法executeUpdate(String sql)可以执行插入、删除、更新等操作,返回值是执行该操作所影响的行数
下面代码只演示增加的操作
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
public class UpdateTset {
public static void main(String[] args) {
Connection conn = null;
Statement st = null;
try {
Class.forName("com.mysql.jdbc.Driver");
conn = DriverManager.getConnection("jdbc:mysql:///test", "root", "1234");
st = conn.createStatement();
String sql = "insert into students values('S0000005','小明','男','2018-01-01','银川')";
int count = st.executeUpdate(sql);
if(count > 0){
System.out.println("新增成功!");
}else{
System.out.println("新增失败!");
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
try {
if(st != null){
st.close();
}
if(conn != null){
conn.close();
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
③JDBC实现登录
我们登录的时候,将用户名和密码放入SQL语句中,然后在数据库中查找,找到就表示能登录,找不到就不允许登录,这里使用的SQL语句是拼接的方式,写完代码再来说拼接方式的不好之处。
首先建立一张用户表:
CREATE TABLE `users` (
`uid` int(11) NOT NULL AUTO_INCREMENT,
`username` varchar(255) DEFAULT NULL,
`password` varchar(255) DEFAULT NULL,
PRIMARY KEY (`uid`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8
下面代码实现登录:
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.Scanner;
public class LoginTest {
public static void main(String[] args) {
Scanner input=new Scanner(System.in);
System.out.println("请输入您的账号:");
String name=input.next();
System.out.println("请输入密码:");
String pass=input.next();
Connection conn=null;
Statement stmt=null;
ResultSet rs=null; //查询结果集
try {
Class.forName("com.mysql.jdbc.Driver");
conn = DriverManager.getConnection("jdbc:mysql:///test", "root", "1234");
String sql="select * from users where username='"+name+"' and password='"+pass+"'"; //登陆sql
stmt = conn.createStatement();
rs=stmt.executeQuery(sql);
if(rs.next()){
System.out.println("欢迎您:"+name+",登陆成功~!");
}else{
System.out.println("账号或者密码错误!");
}
} catch (Exception e) {
e.printStackTrace();
}finally{
try {
//关闭资源
if(rs!=null){
rs.close();
}
if(stmt!=null){
stmt.close();
}
if(conn!=null){
conn.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
我先输入正确密码:
再输入错误的用户或密码:
下面使用SQL注入来破解:
tom在我们的数据库users表里面是没有的,那怎么会登录成功呢?只要我们在密码处输入类似于100'or'1'='1这样的符号,就能登录成功,下面通过图来讲解:
当我们输入100'or'1'='1这个的时候,SQL语句拼接成:select * from users where username='tom' and password='100'or'1'='1';
我们使用or把SQL语句分成两部分,一部分是false,后面部分是true,false or true 的结果是true,所以这个等式是恒成立的,所以能够登录成功,即破解密码。
使用这种方式也可以,#的作用是注释掉后面的SQL语句,原理同上面类似。
我会在接下来的博客中给出如何解决SQL注入破解的方法:https://blog.csdn.net/qq_41061437/article/details/82664612