版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u014565127/article/details/89058475
为什么要使用?Statement的安全问题
由于statement的执行,是对SQL语句的拼接。不管你在填写的时候输入了什么,它都把他看成是SQL语句的一部分,这里就存在SQL语句注入漏洞,如果你传入的字符串包括“1=1”这条恒等语句,就会发生意料之外的事情。为了解决这个问题,我们可以使用preparedStatement。
PreparedStatement
我们使用PreparedStatement替换前面的Statement对象。
相比以前的statement,预先处理给定的SQL语句,对其执行语法检查,在SQL语句里面使用 ?
占位符来替代后续要传递的值。后面进来的变量值,将会被看成是字符串,不会产生任何的关键字。
String sql = "insert into t_user values(null, ?, ?)";
// 预先对SQL语句执行语法的校验,
// ? 对应的内容,后面不管传递什么进来,都当作是字符串处理
ps = conn.prepareStatement(sql);
// ? 对应的索引从1开始。
ps.setString(1, username);
ps.setString(2, password);
1. 对login()的代码进行改写。
@Override
public void login(String username, String password) {
// TODO Auto-generated method stub
Connection conn = null;
Statement st = null;
ResultSet rs = null;
try {
// 1. 获取连接对象
conn = JDBCUtil.getConn();
String sql = "select * from t_user where username= ? and password = ?";
// 预先对SQL语句执行语法的校验, ? 对应的内容,后面不管传递什么进来,都当作是字符串处理
PreparedStatement ps = conn.prepareStatement(sql);
// ? 对应的索引从1开始。
ps.setString(1, username);
ps.setString(2, password);
rs = ps.executeQuery();
if (rs.next()) {
System.out.println("登录成功!");
} else {
System.out.println("登陆失败!");
}
} catch (Exception e) {
e.printStackTrace();
} finally {
JDBCUtil.release(conn, st, rs);
}
}
2. 对insert()方法进行改写。
@Override
public void insert(String username, String password) {
Connection conn = null;
PreparedStatement ps = null;
try {
conn = JDBCUtil.getConn();
String sql = "insert into t_user values(null, ?, ?)";
// 预先对SQL语句执行语法的校验,
// ? 对应的内容,后面不管传递什么进来,都当作是字符串处理
ps = conn.prepareStatement(sql);
// ? 对应的索引从1开始。
ps.setString(1, username);
ps.setString(2, password);
int result = ps.executeUpdate();
if (result > 0) {
System.out.println("添加成功!");
} else {
System.out.println("添加失败!");
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
JDBCUtil.release(conn, ps);
}
}
3. 对delete()的两种方法进行改写。
@Override
//根据id进行删除
public void delete(int id) {
Connection conn = null;
PreparedStatement ps = null;
try {
conn = JDBCUtil.getConn();
String sql = "delete from t_user where id = ?";
// 预先对SQL语句执行语法的校验,
// ? 对应的内容,后面不管传递什么进来,都当作是字符串处理
ps = conn.prepareStatement(sql);
// ? 对应的索引从1开始。
ps.setInt(1, id);
int result = ps.executeUpdate();
if (result > 0) {
System.out.println("删除成功!");
} else {
System.out.println("删除失败!");
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
JDBCUtil.release(conn, ps);
}
}
@Override
//根据名字进行删除
public void delete(String name) {
Connection conn = null;
PreparedStatement ps = null;
try {
conn = JDBCUtil.getConn();
String sql = "delete from t_user where username = ?";
// 预先对SQL语句执行语法的校验,
// ? 对应的内容,后面不管传递什么进来,都当作是字符串处理
ps = conn.prepareStatement(sql);
// ? 对应的索引从1开始。
ps.setString(1, name);
int result = ps.executeUpdate();
if (result > 0) {
System.out.println("删除成功!");
} else {
System.out.println("删除失败!");
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
JDBCUtil.release(conn, ps);
}
}
4. 对update()方法进行改写。
@Override
public void update(String username, String password) {
Connection conn = null;
PreparedStatement ps = null;
try {
conn = JDBCUtil.getConn();
String sql = "update t_user set password = ? where username = ?";
// 预先对SQL语句执行语法的校验,
// ? 对应的内容,后面不管传递什么进来,都当作是字符串处理
ps = conn.prepareStatement(sql);
// ? 对应的索引从1开始。
ps.setString(1, password);
ps.setString(2, username);
int result = ps.executeUpdate();
if (result > 0) {
System.out.println("修改成功!");
} else {
System.out.println("修改失败!");
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
JDBCUtil.release(conn, ps);
}
}
在单元测试中调用即可
@Test
public void testUpdate() {
UserDao dao= new UserDaoImpl();
dao.update("admin", "521521521521");
}
@Test
public void testDeleteById() {
UserDao dao = new UserDaoImpl();
dao.delete(4);
}
@Test
public void testDeleteByName() {
UserDao dao = new UserDaoImpl();
dao.delete("aobama");
}
@Test
public void testInsert() {
UserDao dao = new UserDaoImpl();
dao.insert("aobama", "911");
}
@Test
public void testFindAll() {
UserDao dao = new UserDaoImpl();
dao.findAll();
}
@Test
public void testLogin() {
UserDao dao = new UserDaoImpl();
dao.login("zhangsan", "10010");
}
end.