Java---PrepareStatement预编译的使用场景

在java中,执行数据库查询的过程是

1.建立连接 connection

2.建立statement

3.定义sql语句 sql="select * from link"

4.执行查询 statement.executeQuery(sql)

4.结果处理


每一次访问的时候,数据库都会对传输过来的sql语句,进行编译,编译成机器可理解执行的语句再执行。

预编译的原理就是,如果用户在某个场景下,需要重复执行类似语句,就把这个语句做成含有变量的,第一次编译后,以后执行的时候每次填入变量就行了。节省编译的时间


比如我想在数据库中插入数据,

我对一个文本做循环读取,每次读取一行,插入的时候就可以使用预编译。

str = “XXX”  从文本中读取的数据

sql = “insert into tab (name) values(?)”;

Connection cn = new Conection

PrepareStatement ps = new PrepareStatement(sql)

ps.setString(1,str);

ps.executeUpdate();


感觉上执行dml操作时,插入、删除、更新操作使用预编译效果很好。我在执行dql操作进行搜索时,效率提升不是很明显。

执行搜索操作时,使用预编译的目的,主要是为了防止sql注入攻击。

举个例子,如果用户登录时,输入用户名和密码,你去验证的话,不适用预编译每次验证的时候,

sql语句为:select * from user where username=用户输入的名字 and password=用户输入的密码。

攻击者在攻击时,可以修改这个sql语句,select * from user where (username=用户输入的名字 and password=用户输入的密码 ) or 1=1

因为这个sql语句的搜索条件永远为真,所以就欺骗了服务器。

我们使用预编译的话,把查询语句提前预设好

select * from user where username=? and password=?

每次使用时

ps.setString(1,username);

ps.setString(2,password);

ps.executeQuery();

就不会被修改的语句攻击到了。


所以如果查询的语句比较多,我是先使用sql语句,把数据从数据库中取出,放到map中,再从map中进行搜索,效率会高很多。

因为会先把所有数据都从数据库中取出,这个不会因为查询量的变化而改变。所以查询量越大这个效果越好,而查询量越小代价越大。

而是用预编译或者直接查询,查询量和时间是线性关系,查询量越小越快。



你可能感兴趣的:(Java---PrepareStatement预编译的使用场景)