JDBC取得自增长的主键值、sql注入的方式、占位符的使用

JDBC取得自增长的主键值

在实际开发中很多时候都需要取得自增长主键值,但是这种情况下必须保证数据表中的主键值是自动增长。在Oracle中使用序列实现主键的自动增长,mysql中如果要让主键数据自动增长可以在创建数据表的时候指定,也可以使用工具修改。在指定主键自增长的时候需要保证自增长的字段必须是主键和数字类型。

取得自增长的主键值示例代码如下:

public class AutoIncrementDemo {

	public static void main(String[] args) {
		
		try {
			System.out.println(insertEmp());
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}
	/**
	 * 
	 * @return
	 * @throws SQLException
	 */
	public static boolean insertEmp() throws SQLException {
		// 取得连接对象
		Connection conn = ConnectionUtils.getConnection();

		// 定义sql语句
		String sql = "INSERT INTO emp(ename,job,mgr,hiredate,sal,comm,deptno)"
				+ "VALUES('王五','总经理',7789,NOW(),13000.00,5000.00,10)";

		// 取得预编译对象
		PreparedStatement pst = conn.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);

		// 执行sql语句
		int row = pst.executeUpdate();

		// 取得自增长的主键值
		ResultSet rst = pst.getGeneratedKeys();

		if (rst.next()) {
			System.out.println(rst.getInt(1));

		}

		// 关闭连接
		ConnectionUtils.close(conn);
		return row > 0;

	}

}

sql注入的方式

实现无密码的登录操作示例代码如下:

public class SelectLoginDemo {

	public static void main(String[] args) {
		selectLogin("'smith'", "'abcd' OR 1=1");
	}
	/**
	 * 实现登录
	 * @param name  用户名
	 * @param password  密码
	 * @throws SQLException
	 */
	public static void selectLogin(String name, String password) {
		// 取得连接对象
		Connection conn = ConnectionUtils.getConnection();

		// 定义sql语句
		String sql = "SELECT * FROM myuser WHERE userid=" + name + " AND password=" + password;

		try {

			// 取得发送sql语句对象
			Statement st = conn.createStatement();

			// 发送sql语句
			ResultSet rst = st.executeQuery(sql);
			if (rst.next()) {
				System.out.println("登录成功!!!");
			} else {
				System.out.println("用户密码不正确");
			}
		} catch (Exception e) {
			
			e.printStackTrace();
		
		} finally {
			ConnectionUtils.close(conn);
		}

	}

}

使用”Statement“接口发送sql语句缺点如下:

  • 使用Statement接口对象发送的sql语句需要在数据库中进行一次编译之后成为指令才能执行,每条sql语句都需要编译一次,这样程序运行的效率会很慢。
  • 使用Statement接口操作的sql语句只能使用字符串拼接的方式实现,这样的方式可能存在sql注入的安全风险并且拼接字符串比较麻烦。

JDBC占位符的使用

使用PreparedStatement接口操作的sql语句会先预编译成指令再发送给数据库,数据库就执行指令即可,这样就提高了程序运行时一定速度,而且使用该接口可以避开sql需要使用字符串拼接的方式,从而没有了sql注入的安全风险,而是使用占位符(?)来替代原来的字符串拼接。

使用占位符来实现无密码登录测试示例代码如下:

public class SelectLoginDemo01 {

	public static void main(String[] args) {
		selectLogin1("smith", "1234");
	}

	/**
	 * 实现登录
	 * 
	 * @param name     用户名
	 * @param password 密码
	 * @throws SQLException
	 */
	public static void selectLogin1(String name, String password) {
		
		// 取得连接对象
		Connection conn = ConnectionUtils.getConnection();

		// 定义sql语句
		String sql = "SELECT * FROM myuser WHERE userid=? AND password=?";

		try {

			// 取得预编译对象
			PreparedStatement pst = conn.prepareStatement(sql);

			// 为占位符设置指定内容,即是赋值
			pst.setString(1, name);
			pst.setString(2, password);

			// 发送sql语句
			ResultSet rst = pst.executeQuery();

			if (rst.next()) {
				System.out.println("登录成功!!!");
			} else {
				System.out.println("用户密码不正确");
			}
		} catch (Exception e) {

			e.printStackTrace();

		} finally {
			ConnectionUtils.close(conn);
		}

	}

}

使用占位符的好处:

  • 避开sql语句的注入风险
  • 会为字符串自动增加上单引号
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值