Java PreparedStatement用法详解

网友投稿 654 2022-10-05


Java PreparedStatement用法详解

PreparedStatement介绍

可以通过调用 Connection 对象的 prepareStatement(String sql) 方法获取

PreparedStatement 对象PreparedStatement 接口是 Statement 的子接口,它表示一条预编译过的 SQL 语句

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

PreparedStatement vs Statement

代码的可读性和可维护性。

PreparedStatement 能最大可能提高性能:

DBServer会对预编译语句提供性能优化。因为预编译语句有可能被重复调用,所以语句在被DBServer的编译器编译后的执行代码被缓存下来,那么下次调用时只要是相同的预编译语句就不需要编译,只要将参数直接传入编译过的语句执行代码中就LQYFOKw会得到执行。

在statement语句中,即使是相同操作但因为数据内容不一样,所以整个语句本身不能匹配,没有缓存语句的意义.事实是没有数据库会对普通语句编译后的执行代码缓存。这样每执行一次都要对传入的语句编译一次。

(语法检查,语义检查,翻译成二进制命令,缓存)

PreparedStatement 可以防止 SQL 注入

插入案例

PreparedStatement常用的方法:

void setObject(int parameterIndex, Object x, int targetSqlType)

parameterIndex the first parameter is 1, the second is 2, …占位符参数索引是从1开始的

其余也是如此:

void setInt(int parameterIndex, int x)

void setLong(int parameterIndex, long x)

void setString(int parameterIndex, String x)

void setBlob (int parameterIndex, Blob x)

void setDate(int parameterIndex, java.sql.Date x, Calendar cal)

执行操作:

package com.atmf;

import java.io.IOException;

import java.io.InputStream;

import java.sql.Connection;

import java.sql.DriverManager;

import java.sql.PreparedStatement;

import java.sql.SQLException;

import java.text.SimpleDateFormat;

import java.util.Date;

import java.util.Properties;

import oLQYFOKwrg.junit.Test;

public class SumUP {

@Test

public void getConnection() {

Connection con = null;

PreparedStatement ps = null;

try {

//1,加载配置文件

InputStream is = ClassLoader.getSystemClassLoader().getResourceAsStream("jdbc.properties");

Properties pr = new Properties();

pr.load(is);

//2,读取配置信息

String user = pr.getProperty("user");

String password = pr.getProperty("password");

String url = pr.getProperty("url");

String driverClass = pr.getProperty("driverClass");

//3.加载驱动

Class.forName(driverClass);

//4,获取连接

con = DriverManager.getConnection(url, user,password);

String sql = "insert into customers(name,birth) value(?,?)";

//预编译sql语句,得到PreparedStatement对象

ps = con.prepareStatement(sql);

//5,填充占位符

ps.setString(1, "三明治");

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");

Date date = sdf.parse("2020-11-02");

ps.setDate(2, new java.sql.Date(date.getTime()));

//6,执行操作

ps.execute();

} catch (Exception e) {

// TODO Auto-generated catch block

e.printStackTrace();

} finally {

//7,关闭资源

try {

if(ps != null)

ps.close();

} catch (Exception e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

try {

if(con != null)

con.close();

} catch (Exception e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

}

}

配置信息:jdbc.properties文件

user=root

password=123456

url=jdbc:mysql://localhost:3306/students

driverClass=com.mysql.jdbc.Driver

执行结果:

PreparedStatement实现对表数据的增删改查操作


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:悬镜安全:DevSecOps竞争格局在于中外原创技术路线之争
下一篇:修改APK代码,绕过VIP限制,随意听音效换皮肤
相关文章

 发表评论

暂时没有评论,来抢沙发吧~