SQL注入攻击:
由于dao中执行的SQL语句是拼接出来的,其中有一部分内容是由用户从客户端传入,所以当用户传入的数据中包含sql关键字时,就有可能通过这些关键字改变sql语句的语义,从而执行一些特殊的操作,这样的攻击方式就叫做sql注入攻击
PreparedStatement利用预编译的机制将sql语句的主干和参数分别传输给数据库服务器,从而使数据库分辨的出哪些是sql语句的主干哪些是参数,这样一来即使参数中带了sql的关键字,数据库服务器也仅仅将他当作参数值使用,关键字不会起作用,从而从原理上防止了sql注入的问题
PreparedStatement主要有如下的三个优点:
~1.可以防止sql注入
~2.由于使用了预编译机制,执行的效率要高于Statement
~3.sql语句使用?形式替代参数,然后再用方法设置?的值,比起拼接字符串,代码更加优雅.
看使用代码:
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import com.itheima.util.JDBCUtils;
public class JDBCDemo3 {
public static void main(String[] args) {
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
try {
conn = JDBCUtils.getConn();
ps = conn
.prepareStatement("select * from user where name=? and password=?");
ps.setString(1, "freedom");
ps.setString(2, "666");
rs = ps.executeQuery();
while (rs.next()) {
System.out.println(rs.getString("email"));
}
} catch (Exception e) {
e.printStackTrace();
} finally {
JDBCUtils.close(rs, ps, conn);
}
}
}
JDBC其实还支持大文本和大二进制的处理,但是实际开发中我们很少使用到,一般情况下,处理这些大数据可能还需要修改 虚拟机的启动内存大小。这里就讲讲大二进制数据组的存储和读取吧。
import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.InputStream; import java.io.OutputStream; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import org.junit.Test; import com.itheima.util.JDBCUtils; /* * 数据库中创建一个表 create table blobdemo( id int primary key auto_increment, name varchar(100), content MEDIUMBLOB ); */ public class BlobDemo1 { @Test public void addBlob() { Connection conn = null; PreparedStatement ps = null; ResultSet rs = null; try { conn = JDBCUtils.getConn(); ps = conn .prepareStatement("insert into blobdemo values (null,?,?)"); ps.setString(1, "高达.mp3"); File file = new File("1.mp3"); ps.setBinaryStream(2, new FileInputStream(file), (int) file .length()); ps.executeUpdate(); } catch (Exception e) { e.printStackTrace(); } finally { JDBCUtils.close(rs, ps, conn); } } @Test public void findBlob() { Connection conn = null; PreparedStatement ps = null; ResultSet rs = null; try { conn = JDBCUtils.getConn(); ps = conn.prepareStatement("select * from blobdemo"); rs = ps.executeQuery(); while (rs.next()) { String name = rs.getString("name"); InputStream in = rs.getBinaryStream("content"); OutputStream out = new FileOutputStream(name); byte[] bs = new byte[1024]; int i = 0; while ((i = in.read(bs)) != -1) { out.write(bs, 0, i); } i