Java DataBase Connectivity
* JDBC是java官方提供的一套结构,用于连接DBMS并进行相关操作。
* 核心的接口:
* Connection 表示数据库连接
* Statement 用来执行SQL语句的语句对象
* PreparedStatement 用来执行预编译SQL语句的语句对象
* ResultSet 用来表示查询结果集
* 不同的DBMS提供上都会提供一套具体的实现类,并打包为jar。那么这个jar包被我们称为是连接该DBMS的驱动(Driver)
一.Statement提供了多种执行SQL的方法
1. boolean execute(String sql)
用于向数据库执行SQL语句。该方法可以执行任何种类的SQL
但是实际上执行DML,DQL都有专门的方法,因此通常只用来执行DDL
该方法返回一个boolean值,执行该SQL后是否产生了查询结果集。
专门用于执行DML语句的,返回值表达执行该DML后影响了表中多少条记录
让结果集向下移动一行,返回值表示是否存在下一行。
如果存在下一行则返回true否则返回false。
try (
Connection connection = DBUtil.getConnection();
){
Statement statement = connection.createStatement();
String sql = "SELECT id,name,salary,title " +"FROM teacher ";
ResultSet resultSet = statement.executeQuery(sql);
while(resultSet.next()){//结果集向下移动一行,并判断改行是否存在
int id = resultSet.getInt("id");
String name = resultSet.getString("name");
int salary = resultSet.getInt("salary");
String title = resultSet.getString("title");
System.out.println(id+","+name+","+salary+","+title);
}
} catch (SQLException e) {
e.printStackTrace();
}
二.预编译SQL语句的写法,将原本需要拼接的"值"先用"?"代替
SELECT id,username,password,nickname,age
FROM userinfo
WHERE username='拼接' AND password='拼接'
缺陷:登录验证
* 若密码为:a' OR '1'='1
* 会出现拼接SQL导致语义发生改变,这就是SQL注入攻击
* SELECT * FROM userinfo
* WHERE username='hajkdshfkj' AND password='a' OR '1'='1'
预编译SQL:
SELECT id,username,password,nickname,age
FROM userinfo
WHERE username=? AND password=?
String sql = "SELECT id,username,password,nickname,age " +
"FROM userinfo " +"WHERE username=? AND password=?";
try (Connection connection = DBUtil.getConnection();){
//创建预编译SQL语句执行时将预编译SQL发送给数据库要求其理解语义
PreparedStatement ps = connection.prepareStatement(sql);
//执行该sql前要指明预编译SQL中"?"的值是什么
/* ?是什么类型的值,这里就应当调用对应的set方法
例如
?表示整数时,调用ps.setInt(...)
?表示字符串时,调用ps.setString(...)
方法第一个参数表示预编译SQL中第几个"?"."?"从左往右,从上往下,并且
?"从1开始,1表示第一个"?"。 */
ps.setString(1,"范传奇");//第一个?值
ps.setString(2,"123456");//第二个?值
//将值传给数据库执行该SQL
ResultSet rs = ps.executeQuery();
if(rs.next()){
String nickname = rs.getString("nickname");
System.out.println("登录成功,欢迎你:"+nickname);
}else{
System.out.println("登录失败,用户名或密码不正确");
}
} catch (SQLException throwables) {
throwables.printStackTrace();
}