JDBC数据库连接
准备
准备对应数据库版本的连接jar包,下载后进行导入
地址:https://dev.mysql.com/downloads/connector/j/
步骤
注册驱动
Class.forName("com.mysql.jdbc.Driver");//适用于mysql5.x版本
Class.forName("com.mysql.cj.jdbc.Driver");//适用于mysql8.x版本
创建连接
使用DriverManager.getConnection()
方法来创建一个Connection
对象,它代表一个数据库的物理连接,//协议名 //IP地址:端口号 //库名 //字符集 //时区
String url = "jdbc:mysql://localhost:3306/cgb2106?characterEncoding=utf8";
Connection c = DriverManager.getConnection(url, "root", "root");//三个参数分别为链接地址,用户名,密码
获取传输器
需要使用一个类型为Statement
或PreparedStatement
的对象,并提交一个SQL语句到数据库执行查询。Statement s = c.createStatement();
进行查询
执行SQL—-executeQuery()
执行查询的SQL
若要执行一个SQL语句:UPDATE
,INSERT
或DELETE
语句,那么需要下面的代码片段:ResultSet r = s.executeQuery("select * from dept");
stmt = conn.createStatement();
String sql;
sql = "DELETE FROM Employees";
ResultSet rs = stmt.executeUpdate(sql);
处理结果集
next()方法判断当前行有无数据,有数据就返回truewhile (r.next()){
String a = r.getString(1);//获取第一列的数据
String b = r.getString(2);//获取第二列的数据
String d = r.getString(3);//获取第三列的数据
// String dname = r.getString("dname");
// String deptno = r.getString("deptno");
// String loc = r.getString("loc");//获取指定字段的值
// System.out.println("deptno:" + deptno + ",dname:" + dname + ",loc:" + loc);
System.out.println(a + b + d);
}
清理环境资源
r.close();//关闭结果集
s.close();//关闭传输器
c.close();//关闭连接
示例代码
package cn.tedu.jdbc;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
public class TestJDBC {
public static void main(String[] args) throws Exception {
//1.注册驱动 Driver.class
Class.forName("com.mysql.jdbc.Driver");
//2.获取连接(用户名、密码、端口号、库名)
//协议名 //IP地址:端口号 //库名
String url = "jdbc:mysql://localhost:3306/cgb2106?characterEncoding=utf8";
Connection c = DriverManager.getConnection(url, "root", "root");
//3.获取传输器
Statement s = c.createStatement();
//4.执行SQL---executeQuery()执行查询的SQL
ResultSet r = s.executeQuery("select * from dept");
/*
5.处理结果集
next()方法判断当前行有无数据,有数据就返回true
*/
while (r.next()){
String a = r.getString(1);//获取第一列的数据
String b = r.getString(2);//获取第二列的数据
String d = r.getString(3);//获取第三列的数据
// String dname = r.getString("dname");
// String deptno = r.getString("deptno");
// String loc = r.getString("loc");//获取指定字段的值
// System.out.println("deptno:" + deptno + ",dname:" + dname + ",loc:" + loc);
System.out.println(a + b + d);
}
//6.释放资源
r.close();//关闭结果集
s.close();//关闭传输器
c.close();//关闭连接
}
}
SQL注入(SQL攻击)
用户输入非法字符“#”或者“—空格”导致后面的SQL语句失效
因为”#”与”—空格”在SQL语句中为注释,会使后面的SQL语句失效
示例代码
package cn.tedu.jdbc;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.Scanner;
public class JDBCAttack {
public static void main(String[] args) throws Exception {
//1.注册驱动 Driver.class
Class.forName("com.mysql.cj.jdbc.Driver");
String url = "jdbc:mysql://localhost:3306/cgb2106?characterEncoding=utf8";
Connection conn = DriverManager.getConnection(url, "root", "root");
Statement s = conn.createStatement();
String user = new Scanner(System.in).nextLine();
String pwd = new Scanner(System.in).nextLine();
String sql ="select name,password from user where name='"+user+"' and password='"+pwd+"'";
ResultSet r = s.executeQuery(sql);
if(r.next()){
System.out.println("登录成功~");
}else{
System.out.println("登录失败~");
}
//6.释放资源
r.close();//关闭结果集
s.close();//关闭传输器
conn.close();//关闭连接
}
}
SQL注入解决方案
使用prepareStatement()
对象来使用SQL语句进行数据操作,使用?作为占位符,将要查询的字段使用setString()
方法进行设置。
sql = "select * from teachers where tname=?";//参数使用问号
PreparedStatement stat = cn.prepareStatement(sql);//对象换掉
stat.setString(1, condition);//对应参数类型,第几个问号
ResultSet rs = stat.executeQuery();//去掉sql参数
示例代码
private static void toSolve() {
//1.注册驱动 Driver.class
try {
Class.forName("com.mysql.cj.jdbc.Driver");
String url = "jdbc:mysql://localhost:3306/cgb2106?characterEncoding=utf8";
Connection conn = DriverManager.getConnection(url, "root", "root");
Statement s = conn.createStatement();
String user = new Scanner(System.in).nextLine();
String pwd = new Scanner(System.in).nextLine();
//获取传输器
String sql = "select name,password from user where name = ? and password = ?";//?为占位符,sql骨架
PreparedStatement ps = conn.prepareStatement(sql);
ps.setString(1, user);
ps.setString(2, pwd);
ResultSet result = ps.executeQuery();
if (result.next()){
System.out.println("成功");
} else {
System.out.println("失败");
}
result.close();
ps.close();
conn.close();
} catch (Exception e) {
e.printStackTrace();
}
}