JDBC系列:(3)使用PreparedStatement执行sql语句

执行sql语句的接口
接口 作用
Statement接口 用于执行静态的sql语句
PreparedStatement接口 用于执行预编译sql语句
CallableStatement接口 用于执行存储过程的sql语句(call xxx)
PreparedStatement Vs Statement
序号 不同 描述
1 语法不同 PreparedStatement可以使用预编译的sql,而Statment只能使用静态的sql
2 效率不同 PreparedStatement可以使用sql缓存区,效率比Statment高
3 安全性不同 PreparedStatement可以有效防止sql注入,而Statment不能防止sql注入。

1、建立db.properties文件

url=jdbc:mysql://localhost:3306/testdb
user=root
password=root
driverClass=com.mysql.jdbc.Driver

2、JDBC工具类:JDBCUtil.java

package com.rk.db.utils;

import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

/**
 * JDBC的工具类
 * @author RK
 *
 */
public class JDBCUtil
{
	private static final String url;
	private static final String user;
	private static final String password;
	private static final String driverClass;

	/**
	 * 静态代码块中(只加载一次)
	 */
	static
	{
		try
		{
			//读取db.properties文件
			InputStream inStream = JDBCUtil.class.getClassLoader().getResourceAsStream("db.properties");

			Properties props = new Properties();
			//加载文件
			props.load(inStream);
			//读取信息
			url = props.getProperty("url");
			user = props.getProperty("user");
			password = props.getProperty("password");
			driverClass = props.getProperty("driverClass");

			//注册驱动程序
			Class.forName(driverClass);
		}
		catch (IOException e)
		{
			System.out.println("读取数据库配置文件出错");
			throw new RuntimeException(e);
		}
		catch (ClassNotFoundException e)
		{
			System.out.println("数据库驱程程序注册出错");
			throw new RuntimeException(e);
		}
	}

	/**
	 * 获取数据库的连接
	 * @return 数据库连接
	 */
	public static Connection getConnection()
	{
		try
		{
			return DriverManager.getConnection(url,user,password);
		}
		catch (SQLException e)
		{
			System.out.println("获取数据库连接出错");
			throw new RuntimeException(e);
		}
	}

	/**
	 * 关闭Connection、Statement和ResultSet
	 * @param conn 数据库连接
	 * @param stmt	执行SQL语句的命令
	 * @param rs 结果集
	 */
	public static void close(Connection conn,Statement stmt,ResultSet rs)
	{
		closeQuietly(rs);
		closeQuietly(stmt);
		closeQuietly(conn);
	}

	/**
	 * 安静的关闭数据库资源
	 * @param ac 实现了AutoCloseable接口的对象
	 */
	public static void closeQuietly(AutoCloseable ac)
	{
		if(ac != null)
		{
			try
			{
				ac.close();
			}
			catch (Exception e)
			{
				e.printStackTrace();
			}
		}
	}
}

3、执行Insert语句

package com.rk.db.c_prepared;

import java.sql.Connection;
import java.sql.SQLException;
import java.sql.PreparedStatement;
import com.rk.db.utils.JDBCUtil;

/**
 * 使用PreparedStatement执行Insert语句
 * @author RK
 */
public class Demo01
{
	public static void main(String[] args)
	{
		Connection conn = null;
		PreparedStatement pstmt = null;
		try
		{
			//1.获取连接
			conn = JDBCUtil.getConnection();

			//2.准备预编译的sql
			String sql = "INSERT INTO T_Persons(UserName,Pwd) VALUES(?,?)";

			//3.执行预编译sql语句(检查语法)
			pstmt = conn.prepareStatement(sql);

			//4.设置参数值: 参数位置  从1开始
			pstmt.setString(1, "地球人");
			pstmt.setString(2, "987");

			//5.发送参数,执行sql
			int count = pstmt.executeUpdate();
			System.out.println("影响了"+count+"行!");
		}
		catch (SQLException e)
		{
			e.printStackTrace();
		}
		finally
		{
			//关闭资源
			JDBCUtil.close(conn, pstmt, null);
		}
	}
}

4、执行Update语句

package com.rk.db.c_prepared;

import java.sql.Connection;
import java.sql.SQLException;
import java.sql.PreparedStatement;
import com.rk.db.utils.JDBCUtil;

/**
 * 使用PreparedStatement执行Update语句
 * @author RK
 */
public class Demo02
{
	public static void main(String[] args)
	{
		Connection conn = null;
		PreparedStatement pstmt = null;
		try
		{
			//1.获取连接
			conn = JDBCUtil.getConnection();

			//2.准备预编译的sql
			String sql = "UPDATE T_Persons SET UserName=?, Pwd=? WHERE Id=?";

			//3.执行预编译sql语句(检查语法)
			pstmt = conn.prepareStatement(sql);

			//4.设置参数值: 参数位置  从1开始
			pstmt.setString(1, "火星人");
			pstmt.setString(2, "456");
			pstmt.setInt(3, 5);

			//5.发送参数,执行sql
			int count = pstmt.executeUpdate();
			System.out.println("影响了"+count+"行!");
		}
		catch (SQLException e)
		{
			e.printStackTrace();
		}
		finally
		{
			//关闭资源
			JDBCUtil.close(conn, pstmt, null);
		}
	}
}

5、执行Delete语句

package com.rk.db.c_prepared;

import java.sql.Connection;
import java.sql.SQLException;
import java.sql.PreparedStatement;
import com.rk.db.utils.JDBCUtil;

/**
 * 使用PreparedStatement执行Delete语句
 * @author RK
 */
public class Demo03
{
	public static void main(String[] args)
	{
		Connection conn = null;
		PreparedStatement pstmt = null;
		try
		{
			//1.获取连接
			conn = JDBCUtil.getConnection();

			//2.准备预编译的sql
			String sql = "DELETE FROM T_Persons WHERE Id=?";

			//3.执行预编译sql语句(检查语法)
			pstmt = conn.prepareStatement(sql);

			//4.设置参数值: 参数位置  从1开始
			pstmt.setInt(1, 5);

			//5.发送参数,执行sql
			int count = pstmt.executeUpdate();
			System.out.println("影响了"+count+"行!");
		}
		catch (SQLException e)
		{
			e.printStackTrace();
		}
		finally
		{
			//关闭资源
			JDBCUtil.close(conn, pstmt, null);
		}
	}
}

6、执行Select语句

package com.rk.db.c_prepared;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.PreparedStatement;
import com.rk.db.utils.JDBCUtil;

/**
 * 使用PreparedStatement执行Select语句
 * @author RK
 */
public class Demo04
{
	public static void main(String[] args)
	{
		Connection conn = null;
		PreparedStatement pstmt = null;
		ResultSet rs = null;
		try
		{
			//1.获取连接
			conn = JDBCUtil.getConnection();

			//2.准备预编译的sql
			String sql = "SELECT * FROM T_Persons";

			//3.执行预编译sql语句(检查语法)
			pstmt = conn.prepareStatement(sql);

			//4.执行sql语句,得到返回结果
			rs = pstmt.executeQuery();

			//5.输出
			while(rs.next())
			{
				int id = rs.getInt("Id");
				String userName = rs.getString("UserName");
				String pwd = rs.getString("Pwd");
				System.out.println(id + "\t" + userName + "\t" + pwd);
			}
		}
		catch (SQLException e)
		{
			e.printStackTrace();
		}
		finally
		{
			//关闭资源
			JDBCUtil.close(conn, pstmt, rs);
		}
	}
}

7、思维导图

时间: 2024-10-10 18:15:59

JDBC系列:(3)使用PreparedStatement执行sql语句的相关文章

JDBC进阶之PreparedStatement执行SQL语句(MySQL)

一.什么是PreparedStatement 参阅Java API文档,我们可以知道,PreparedStatement是Statement的子接口(如图所示),表示预编译的 SQL 语句的对象,SQL 语句被预编译并存储在PreparedStatement 对象中.然后可以使用此对象多次高效地执行该语句. 二.通过PreparedStatement获取在运行命令行中执行的参数,将参数插入到某张数据表中 相关的实验过程,包括在预先创建程序所需数据库.创建所需数据表格.在开发环境中加载驱动程序包等

使用预处理PreparedStatement执行Sql语句

/** * 使用预处理的方式执行Sql * @param sql Sql语句 * @param obj 变量值数组 * @return 查询结果 * @throws SQLException */ public List<Map<String, Object>> query(String sql, Object[] obj) throws SQLException { List<Map<String, Object>> ret = null; Prepare

JDBC系列:(2)使用Statement执行sql语句

执行sql语句的接口 接口 作用 Statement接口 用于执行静态的sql语句 PreparedStatement接口 用于执行预编译sql语句 CallableStatement接口 用于执行存储过程的sql语句(call xxx) 1.执行DDL语句 package com.rk.db.b_statement; import java.sql.DriverManager; import java.sql.Connection; import java.sql.SQLException;

执行sql语句为什么?用PreparedStatement要比Statement好用

PreparedStatement public interface PreparedStatement extends Statement;可以看到PreparedStatement是Statement的子接口,我们在执行查询或者更新数据表数据的时候,拼写SQL语句是一个很费力并且容易出错的事情,PreparedStatement可以简化这样的一个过程. PreParedStatement1).why?我们为什么要使用它使用Statement需要进行拼写SQl语句,辛苦并且容易出错,之前使用S

JDBC连接MYSQL,批量执行SQL语句或在执行一个SQL语句之前执行一个SQL语句

conn = MysqlJdbcUtils.getConnection(); Statement ps=conn.createStatement(); ps.addBatch("truncate QB_ShowCount_Asite_copy"); ps.executeBatch(); String SrcSql = "select convert(unhex(hex(convert(Community using latin1))) using utf8) as Commu

在mybatis执行SQL语句之前进行拦击处理

比较适用于在分页时候进行拦截.对分页的SQL语句通过封装处理,处理成不同的分页sql. 实用性比较强. import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.util.List; import java.util.Properties; import org.apache.ibatis.e

linux程序设计——执行SQL语句(第八章)

8.3    使用C语言访问MySQL数据 8.3.3 执行SQL语句 执行SQL语句的主要API函数被恰当的命名为: int mysql_query(MYSQL *connection, const char *query); 这个例程接受连接结构指针和文本字符串形式的有效SQL语句,如果成功,它返回0. 1.不返回数据的SQL语句 为简单起见,先看一些不返回任何数据的SQL语句:UPDATE,DELETE和INSERT. 下面的函数用于检查受查询影响的行数: my_ulonglong mys

让你提前认识软件开发(20):如何在C语言里面执行SQL语句?

[文章摘要] 在通信类软件中,程序经常需要与数据库打交道.为了实现诸如从数据库中获取数据.更新数据库表某字段.插入或删除某条数据等功能,就需要在C语言程序中构造一些SQL语句,并用函数来执行这些SQL语句. 本文介绍如何在C语言程序中构造并执行SQL语句,为相关软件开发工作的开展提供了参考. [关键词] SQL语句  C语言  程序  流程  开发 一.为什么要在C语言程序中执行SQL语句? 在C语言程序中执行SQL语句的原因有以下几个: (1) 程序需要获取数据库中某数据表的字段值,并对这些字

maven执行SQL语句

前言 之所以要用maven来执行sql语句或者文件,是因为在日常开发或者测试过程中保证每次构建完之后是一个"干净"的项目呈现在面前. 怎么用 使用maven执行sql语句需要依赖sql-maven-plugin这个插件,下面就直接从项目pom文件的配置入手进行简要介绍:     <build>         <finalName>buglife-data-access</finalName>         <plugins>