026_jdbc-mysql-PrepareStatement解决sql注入

1. 新建一个JDBCPrepareStatement工程, 使用我们之前的JDBCUtil.java和jdbc.properties属性文件

2. PreparedStatement对象相比较以前的Statement对象, 预先处理给定的sql语句, 对其执行语法检查。 在sql语句里面使用?占位符来替代后续要传递进来的变量。后面不管传递什么进来, 都把它看成是字符串, 不会产生任何的关键字。

3. 使用PreparedStatement对象编写程序

4. 输入任意用户名和密码, 并且sql注入, 登录失败

5. 使用正确的用户名和密码, 登录成功

6. 使用PreparedStatement对象进行插入操作

7. 使用PreparedStatement对象进行更新操作

8. 使用PreparedStatement对象进行删除操作

9. 使用PreparedStatement对象查找所有用户

10. UserDao.java接口代码

package com.lywgames.dao;

public interface UserDao {
	/**
	 * 用户登录方法
	 * @param username
	 * @param password
	 */
	public void login(String username, String password);
	/**
	 * 注册新用户
	 * @param username
	 * @param password
	 * @param registertime
	 */
	public void register(String username, String password, long registertime);
	/**
	 * 修改密码
	 * @param username
	 * @param password
	 */
	public void modifyPassword(String username, String password);
	/**
	 * 删除用户
	 * @param username
	 */
	public void deleteUser(String username);
	/**
	 * 查找所有用户
	 */
	public void findAll();
}

11. UserDaoImpl.java完整代码

package com.lywgames.dao.impl;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Timestamp;
import com.lywgames.dao.UserDao;
import com.lywgames.util.JDBCUtil;

public class UserDaoImpl implements UserDao {
	public void login(String username, String password) {
		Connection conn = null; 
//		Statement st = null;
		PreparedStatement ps = null;
		ResultSet rs = null;
		
		try {
			// 1.获取连接对象
			conn = JDBCUtil.getConn(); 
			/**
			 *	// 2.创建statement, 跟数据库打交道, 一定需要这个对象
			 *	st = conn.createStatement();
			 *	// 3.执行查询sql, 获取ResultSet结果集
			 *	rs = st.executeQuery("select * from user where username='"+ username  +"' and password='"+ password +"'");
			 **/
			// 2.PreparedStatement对象相比较以前的Statement对象, 预先处理给定的sql语句, 对其执行语法检查。 在sql语句里面使用?占位符来替代后续要传递进来的变量。
			// 后面不管传递什么进来, 都把它看成是字符串, 不会产生任何的关键字。
			ps = conn.prepareStatement("select * from user where username=?and password=?");
			// 给占位符赋值, 位置从1开始
			ps.setString(1, username);
			ps.setString(2, password);
			// 3.执行查询
			rs = ps.executeQuery();
			// 4.使用ResultSet结果集遍历
			if(rs.next()){
				System.out.println("登录成功");
			}else{
				System.out.println("登录失败");
			}
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			// 5.释放资源
			JDBCUtil.release(conn, ps, rs);
		}
	}

	@Override
	public void register(String username, String password, long registertime) {
		Connection conn = null; 
		PreparedStatement ps = null;
		
		try {
			// 1.获取连接对象
			conn = JDBCUtil.getConn(); 
			// 2.PreparedStatement对象相比较以前的Statement对象, 预先处理给定的sql语句, 对其执行语法检查。 在sql语句里面使用?占位符来替代后续要传递进来的变量。
			// 后面不管传递什么进来, 都把它看成是字符串, 不会产生任何的关键字。
			ps = conn.prepareStatement("insert into user (username,password,registertime) values (?,?,?)");
			// 给占位符赋值, 位置从1开始
			ps.setString(1, username);
			ps.setString(2, password);
			ps.setTimestamp(3, new Timestamp(registertime));
			// 3.执行更新
			ps.executeUpdate();
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			// 4.释放资源
			JDBCUtil.release(conn, ps);
		}
	}

	@Override
	public void modifyPassword(String username, String password) {
		Connection conn = null; 
		PreparedStatement ps = null;
		
		try {
			// 1.获取连接对象
			conn = JDBCUtil.getConn(); 
			// 2.PreparedStatement对象相比较以前的Statement对象, 预先处理给定的sql语句, 对其执行语法检查。 在sql语句里面使用?占位符来替代后续要传递进来的变量。
			// 后面不管传递什么进来, 都把它看成是字符串, 不会产生任何的关键字。
			ps = conn.prepareStatement("update user set password=? where username=?");
			// 给占位符赋值, 位置从1开始
			ps.setString(1, password);
			ps.setString(2, username);
			// 3.执行更新
			ps.executeUpdate();
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			// 4.释放资源
			JDBCUtil.release(conn, ps);
		}
	}

	@Override
	public void deleteUser(String username) {
		Connection conn = null; 
		PreparedStatement ps = null;
		
		try {
			// 1.获取连接对象
			conn = JDBCUtil.getConn(); 
			// 2.PreparedStatement对象相比较以前的Statement对象, 预先处理给定的sql语句, 对其执行语法检查。 在sql语句里面使用?占位符来替代后续要传递进来的变量。
			// 后面不管传递什么进来, 都把它看成是字符串, 不会产生任何的关键字。
			ps = conn.prepareStatement("delete from user where username=?");
			// 给占位符赋值, 位置从1开始
			ps.setString(1, username);
			// 3.执行更新
			ps.executeUpdate();
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			// 4.释放资源
			JDBCUtil.release(conn, ps);
		}
	}

	@Override
	public void findAll() {
		Connection conn = null; 
		PreparedStatement ps = null;
		ResultSet rs = null;
		
		try {
			// 1.获取连接对象
			conn = JDBCUtil.getConn(); 
			// 2.PreparedStatement对象相比较以前的Statement对象, 预先处理给定的sql语句, 对其执行语法检查。 在sql语句里面使用?占位符来替代后续要传递进来的变量。
			// 后面不管传递什么进来, 都把它看成是字符串, 不会产生任何的关键字。
			ps = conn.prepareStatement("select * from user");
			// 3.执行查询
			rs = ps.executeQuery();
			// 4.使用ResultSet结果集遍历
			while(rs.next()){
				System.out.println(rs.getInt(1) + " " + rs.getString(2) + " " + rs.getString(3) + " " + rs.getTimestamp(4));
			}
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			// 5.释放资源
			JDBCUtil.release(conn, ps, rs);
		}
	}
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值