码迷,mamicode.com
首页 > 数据库 > 详细

javaWeb_JDBC_PreparedStatemment的使用

时间:2019-02-03 23:51:16      阅读:275      评论:0      收藏:0      [点我收藏+]

标签:而在   static   catch   意义   for   stp   ***   pre   nal   


JDBC基础_PreparedStatement


1.使用PreparedStatement的好处(why)

(1).PreparedStatement是Statement的子接口,可以传入带占位符的sql语句,并提供补充占位符变量的方法。

(2).在使用Statement的时候需要进行sql的拼写,容易出错,而且很麻烦,使用PreparedStatement的时候可以避免拼写。

(3).可以防止sql注入
SQL 注入是利用某些系统没有对用户输入的数据进行充分的检查,而在用户输入数据中注入非法的 SQL 语句段或命令,
从而利用系统的 SQL 引擎完成恶意行为的做法对于 Java 而言,要防范 SQL 注入,只要用 PreparedStatement 取代 Statement 就可以了

(4).PreparedStatement 能最大可能提高性能
DBServer会对预编译语句提供性能优化。因为预编译语句有可能被重复调用,所以语句在被DBServer的编译器编译后的执行代码被缓存下来,
那么下次调用时只要是相同的预编译语句就不需要编译,只要将参数直接传入编译过的语句执行代码中就会得到执行。
在statement语句中,即使是相同操作但因为数据内容不一样,所以整个语句本身不能匹配,没有缓存语句的意义.事实是没有数据库会对普通语句
编译后的执行代码缓存.这样每执行一次都要对传入的语句编译一次


2.如何使用PreparedStatement(how)

(1).创建PreParedStatement对象

(2).改变sql以及传入sql的参数,并调用PreparedStatement(sql)方法
如:
String sql = "insert student values(?,?,?,?,?,?)";
PreparedStatement ps = conn.PreparedStatement(sql);

(3).调用PreparedStatement的setXxx(int index,Object values);对sql中的参数赋值(也即是占位符)
注意:index索引值从1开始

(4).执行sql语句,调用相应的executeQuery()或者是executeUpdate()方法,注意这俩个方法中不需要再传入sql语句。


3.代码测试

(1).一个基本的sql代码测试

/**
* PreParedStatement使用测试
*
*/
public static void testPreparedStatement(){
Connection connection = null;
PreparedStatement preparedStatement = null;

try {
connection = JDBCTools.getConnection();
String sql = "INSERT INTO teacher (name, email, birth) VALUES(?,?,?)";

preparedStatement = connection.prepareStatement(sql);
preparedStatement.setString(1, "张三");
preparedStatement.setString(2, "282317284@qq.com");
//注意这里面对Date的处理sql-Date包装一个util-Date
preparedStatement.setDate(3,new Date(new java.util.Date().getTime()));

preparedStatement.executeUpdate();
} catch (Exception e) {
e.printStackTrace();
} finally {
JDBCTools.releaseDB(null, preparedStatement, connection);
}
}

//省略JDBCTools

(2).PreParedStatement操作对象测试(可变参数的使用)[*****]

//添加的方法

/**
* 执行 SQL 语句, 使用 PreparedStatement
* @param sql
* @param args: 填写 SQL 占位符的可变参数
*/
public static void update(String sql, Object ... args){
Connection connection = null;
PreparedStatement preparedStatement = null;

try {
connection = JDBCTools.getConnection();
preparedStatement = connection.prepareStatement(sql);

for(int i = 0; i < args.length; i++){
preparedStatement.setObject(i + 1, args[i]);
}

preparedStatement.executeUpdate();

} catch (Exception e) {
e.printStackTrace();
} finally{
JDBCTools.releaseDB(null, preparedStatement, connection);
}
}

//测试代码
public static void addNewStudent2(Student student) {
String sql = "INSERT INTO student(studentName, age, nativePlace) VALUES(?,?,?)";

JDBCTools.update(sql, student.getStudentName(), student.getAge(),
student.getNativePlace());
}

//调用
public static void main(String[] args) {
Student student = new Student();
student.setStudentName("王五");
student.setAge(18);
student.setNativePlace("中国云南");
JDBCTest.addNewStudent2(student);

}

 

javaWeb_JDBC_PreparedStatemment的使用

标签:而在   static   catch   意义   for   stp   ***   pre   nal   

原文地址:https://www.cnblogs.com/nwxayyf/p/10351142.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!