使用jdbc操作数据库时,如果对数据库进行了更换,只需要更换:驱动、具体驱动类、连接字符串、用户名、密码即可。
ResultSet结果集
用于承接executeQuery查询函数的结果
rs.next();
作用:
(1)下移一行
(2)判断下移之后的元素是否为空,如果空,返回false,反之。
rs.getXXX();(XXX:数据类型)
注意:ResultSet类型实例用完需要关闭rs.clsoe();
Connection产生对象
现在可知:
DriverManager->Connection->Statement->ResultSet
同理,PreparedStatement和CallableStatement也是由Connection产生的。
Connection产生操作数据库的对象:
connection.creatStatement();
connection.creatPrepareStatement();
connection.creatCallableStatement();
Statement操作数据库
增删改:executeUpdate();
查询:executeQuery();
ResultSet:承接结果集
next():光标下移,判断是否有下一条数据
previous():光标上移
getXXX(字段名/字段序号):获取字段
PreparedStatement操作数据库
public interface PreparedStatement extends Statement
PreparedStatement是Statement的子类
增删改:executeUpdate();
查询:executeQuery();
PreparedStatement的一般用法:
String sql="DELETE FROM student WHERE `id`='20180002'";
PreparedStatement pstmt=conn.prepareStatement(sql);
pstmt.execute();
PreparedStatement预编译
//预编译,?为占位符,可以使用PreparedStatement特有的setXXX()方法
String sql="INSERT INTO student VALUE(?,?,?,?,?);";
PreparedStatement pstmt=conn.prepareStatement(sql);
//set(序号,内容)
pstmt.setString(1, "20180002");
pstmt.setString(2,"吉吉");
pstmt.setInt(3, 1);
pstmt.setString(4, "12398199938");
pstmt.setString(5, "2000-10-8");
pstmt.execute();
PreparedStatement执行查询语句示例:
//预处理可以简化字符串单双引号的处理
String sql="SELECT `id`,`name`,`birthday` FROM student WHERE `name` LIKE ?";
PreparedStatement pstmt=conn.prepareStatement(sql);
pstmt.setString(1, "%川%");
ResultSet rs=pstmt.executeQuery();
while(rs.next()) {
String id=rs.getString(1);
String name=rs.getString(2);
Date birthday=rs.getDate(3);
System.out.println(id+"\t"+name+"\t"+birthday);
}
rs.close();
总结:PreparedStatement和Statement的用法相似,但是增加了预处理功能,并且在创建PreparedStatement对象的同时就要对其进行预编译,执行的时候就不需要sql了
Statement与PreparedStatement的区别
推荐使用PreparedStatement,原因如下:
1、PreparedStatement编码更加简便(Set函数)
2、PreparedStatement可以提高性能(预编译)
有以下两种处理sql语句的方法:
String sql="INSERT INT student VALUE('XXX','XXX')";
stmt.executeUpdate(sql);
String sql="INSERT INT student VALUE(?,?)";
pstmt=connection.prepareStatement(sql);//预编译SQL
pstmt.setString(1,"XXX");
pstmt.setString(2,"XXX");
假如要执行100句插入数据的语句,Statement要创建100句sql语句,PreparedStatement()则只需要改变占位符的值
3、安全(可以有效防止sql注入)
stmt:存在被sql注入的风险
(如:输入 用户名:任意值’or 1=1 – 密码:任意值)
分析:
SELECT COUNT(*)FROM LOGIN WHERE uname=‘任意值’ or 1=1 --’ AND upwd=‘任意值’;
在where条件判定后加了一个or逻辑结构,因此select总能查找到结果
pstmt:能够有效防止sql注入