JDBC——(6)PreparedStatement的使用
发布日期:2021-05-07 02:35:21 浏览次数:15 分类:精选文章

本文共 2690 字,大约阅读时间需要 8 分钟。

一, PreparedStatement

1.1 PreparedStatement介绍

  • 可以通过调用 Connection 对象的 preparedStatement(String sql) 方法获取 PreparedStatement 对象
Connection conn = null;PreparedStatement ps = null;String sql="select * from car";conn = JDBCUtils.getConnection();ps = conn.prepareStatement(sql);
  • PreparedStatement 接口是 Statement 的子接口,它表示一条预编译过的 SQL 语句

  • PreparedStatement 对象所代表的 SQL 语句中的参数用问号(?)来表示,调用 PreparedStatement 对象的 setXxx() 方法来设置这些参数. setXxx() 方法有两个参数,第一个参数是要设置的 SQL 语句中的参数的索引(从 1 开始),第二个是设置的 SQL 语句中的参数的值

1.1 PreparedStatement的测试

PreparedStatement除了解决Statement的拼串、sql问题之外PreparedStatement还有哪些好处呢?

  • 1.PreparedStatement操作Blob的数据,而Statement做不到。
  • 2.PreparedStatement可以实现更高效的批量操作。
package com.atguigu2.statement.crud;import java.lang.reflect.Field;import java.sql.Connection;import java.sql.PreparedStatement;import java.sql.ResultSet;import java.sql.ResultSetMetaData;import java.util.Scanner;import org.junit.Test;import com.atguigu3.util.JDBCUtils;public class PreparedStatementTest {   	@Test	public void testLogin() {   		Scanner scanner = new Scanner(System.in);				System.out.print("请输入用户名:");		String user = scanner.nextLine();		System.out.print("请输入密码:");		String password = scanner.nextLine();		//SELECT user,password FROM user_table WHERE user = '1' or ' AND password = '=1 or '1' = '1'		String sql = "SELECT user,password FROM user_table WHERE user = ? and password = ?";		User returnUser = getInstance(User.class,sql,user,password);		if(returnUser != null){   			System.out.println("登录成功");		}else{   			System.out.println("用户名不存在或密码错误");		}	}	public 
T getInstance(Class
clazz,String sql, Object... args) { Connection conn = null; PreparedStatement ps = null; ResultSet rs = null; try { conn = JDBCUtils.getConnection(); ps = conn.prepareStatement(sql); for (int i = 0; i < args.length; i++) { ps.setObject(i + 1, args[i]); } rs = ps.executeQuery(); // 获取结果集的元数据 :ResultSetMetaData ResultSetMetaData rsmd = rs.getMetaData(); // 通过ResultSetMetaData获取结果集中的列数 int columnCount = rsmd.getColumnCount(); if (rs.next()) { T t = clazz.newInstance(); // 处理结果集一行数据中的每一个列 for (int i = 0; i < columnCount; i++) { // 获取列值 Object columValue = rs.getObject(i + 1); // 获取每个列的列名 // String columnName = rsmd.getColumnName(i + 1); String columnLabel = rsmd.getColumnLabel(i + 1); // 给t对象指定的columnName属性,赋值为columValue:通过反射 Field field = clazz.getDeclaredField(columnLabel); field.setAccessible(true); field.set(t, columValue); } return t; } } catch (Exception e) { e.printStackTrace(); } finally { JDBCUtils.closeResource(conn, ps, rs); } return null; }}

在这里插入图片描述)

使用PreparedStatement成功 防止 SQL 注入

上一篇:JDBC——(6)PreparedStatement的使用——实现通用的增删改操作
下一篇:JDBC——(5)使用Statement操作数据表的弊端

发表评论

最新留言

留言是一种美德,欢迎回访!
[***.207.175.100]2025年04月16日 02时32分35秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章