JDBC+MySQL 之 PreparedStatement

版权声明:本文为博主原创文章,未经博主允许不得转载。 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.

猜你喜欢

转载自blog.csdn.net/u014565127/article/details/89058475