Prepared看到这个单词,准备的意思,PreparedStatement实则是预编译。那末与Statement又有甚么区分呢?
PreparedStatemen有这样的好处:
1.避免重复编写多个结构类似的sql语句
2.没有拼接字符串的烦恼
3.避免sql注入(拼接字符串 会带来sql注入问题)
4.sql语句预编译在PreparedStatement对象中,性能好
曾在学习《牛腩新闻发布系统》的时候,牛老师讲过“sql语句注入”这样的知识,其实到了java还是会存在这样的问题,PreparedStatement就完善的解决了这样的问题。
这样我就添加1个DRP中的实例,来共同学习1下吧。
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
/**
* 添加用户
* @param user
*/
public void addUser(User user) {
String sql = "insert into t_user (user_id, user_name, password, contact_tel, email, create_date) " +
" values (?, ?, ?, ?, ?, ?)"; //插入新用户
Connection conn = null; //实例化PreparedStatement和结果集
PreparedStatement pstmt = null; //实例化PreparedStatement和结果集
try {
conn = DbUtil.getConnection(); //得到sql语句
pstmt = conn.prepareStatement(sql); //预编译的作用在这体现出来了。
pstmt.setString(1, user.getUserId()); //用户Id
pstmt.setString(2, user.getUserName()); //用户姓名
pstmt.setString(3, user.getPassword()); //用户密码
pstmt.setString(4, user.getContactTel()); //用户电话号码
pstmt.setString(5, user.getEmail()); //用户邮箱
//pstmt.setTimestamp(6, new Timestamp(System.currentTimeMillis()));
pstmt.setTimestamp(6, new Timestamp(new Date().getTime()));
pstmt.executeUpdate();
}catch(SQLException e) {
e.printStackTrace(); //截取异常的处理
}finally {
DbUtil.close(pstmt);
DbUtil.close(conn);
}
}
这只是1部份代码,但是很详细的体现了PreparedStatement的用法。关于底层的利用应当就是固定的知识,当自己见很多了,也就没有之前的那种心慌了。