(本文代码实现共需导入mysqlJDBC jar包,阿里巴巴druid jar包,Spring框架jar包,junit-4.12.jar包,hamcrest-core-1.3.jar包文末可下载(待审核后))
首先说下Statement被它的儿子Preparedstatement取代的原因:
即sql注入问题,如:
Statement所需的sql语句:
例:
String sql = "select * from user where username = '"+username+"' and password = '"+password+"' ";
问题存在:因St的sql语句中要传的参数是使用字符串拼接而成,若上式是登录操作,用户可以不论数据库中的数据,通过在password中构造恒等式例如: 142018728 or 1 = 1 来使得整个sql语句变为恒等式,或者直接在username结尾添加 -- 或# 来达到注释后面所有语句来实现只要 username 在数据库中存在即可登录;
Preparesdstatement则很好的解决了这个问题,不但运行效率提升,最重要的是解决了sql注入问题 如下例:
//2.定义sql
String sql = "select * from user where username = ? and password = ?";
//3.获取执行sql的对象
pstmt = conn.prepareStatement(sql);
//给?赋值
pstmt.setString(1,username);
pstmt.setString(2,password);
//4.执行查询,不需要传递sql
rs = pstmt.executeQuery();
所有statement存在的问题全部被它儿子preparestatement解决了;
此为最最最基础的JDBC,没写工具类且没使用连接池的代码实现:
import java.sql.*;
/**
* account表 添加一条记录 insert 语句
*/
public class JDBCDemo2 {
public static void main(String[