
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("用户名不存在或密码错误"); } } publicT 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 注入
发表评论
最新留言
留言是一种美德,欢迎回访!
[***.207.175.100]2025年04月16日 02时32分35秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
Volatile 原理和使用场景解析
2021-05-08
Linux 分区磁盘占满,导致 ssh 登陆闪退
2021-05-08
【并发编程】实现多线程的几种方式
2021-05-08
Spring系列.@EnableRedisHttpSession原理简析
2021-05-08
设计模式系列博客传送门
2021-05-08
设计模式——访问者模式
2021-05-08
同步锁 —— ReentrantReadWriteLock
2021-05-08
Nginx简介
2021-05-08
Nginx的Gzip功能
2021-05-08
当我们开发一个接口时需要注意些什么
2021-05-08