JDBC基础篇(MYSQL)——PreparedStatement执行DML、DQL等

微笑注意:其中的JdbcUtil是我自定义的连接工具类:代码例子链接:

package day03.prepare;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

import util.JdbcUtil;

/**
 * 关于preparedStatement的案例
 * 		因为PreparedStatement是继承自statement的;
 * 		同样preparedStatement也可以执行statement中的方法,那些直接拼接,或者直接输入值的
 * 		但是这样预编译就没有作用了
 * 
 * 
 * @author mzy
 *
 */
public class Demo01 {
	public static void main(String[] args) {
		// insert();
		
		// update();
		
		// delete();
		
		select();
	}

	private static void select() {
		PreparedStatement pstmt = null;
		Connection conn = null;
		ResultSet rs = null;
		// 准备sql
		String sql = "select * from student where id = ?";
		try {
			// 获取连接
			conn = JdbcUtil.getConnection();
			
			pstmt = conn.prepareStatement(sql); // 预编译的作用就是权限和sql语法的检查
			
			pstmt.setInt(1, 10); // id
			
			 rs = pstmt.executeQuery();
			
			while(rs.next()) {
				int id = rs.getInt("id");
				String name = rs.getString("name");
				int age = rs.getInt("age");
				System.out.println(id+", "+name+", "+age);
			}
			
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			JdbcUtil.close(rs, pstmt, conn); // 关闭Statement的,也支持关闭PreparedStatement
		}
	}

	private static void delete() {
		// 同 update、insert
	}

	private static void update() {
		PreparedStatement pstmt = null;
		Connection conn = null;
		// 准备sql
		/*
		 *  MySQLSyntaxErrorException
		 *  String sql = "update ? set name = '乘成' where id = ?";
		 *  
		 *  注意:在预编译的时候,只允许用 ? 占位的地方为参数值(即:等号后面的内容等)
		 *  不能是表名或者其他关键字,不然就会出现:MySQLSyntaxErrorException异常
		 *  此异常就是代表sql语句有错,在预编译的时候抛出(预编译的作用就是检测语法和权限)
		 *  理解了预编译的检测语法作用,就知道该传入什么样的参数了。 
		 */
		String sql = "update student set name = '乘成' where id = ?";
		try {
			// 获取连接
			conn = JdbcUtil.getConnection();
			// 是connection去prepare一个Statement 给我们的PreparedStatement
			// 和我们的statement不同,这个prepare的时候是预编译,就要把sql传进去了
			// 其中的? 作为占位符
			pstmt = conn.prepareStatement(sql); // 预编译的作用就是权限和sql语法的检查
			// 在预编译之后,需要执行之前给参数赋值,放在pstmt中
			/*
			 * 参数一:位置(从1开始)
			 * 参数二:具体的参数值
			 */
			pstmt.setInt(1, 2); // id
			
			// 传入参数之后,再进行执行
			int count = pstmt.executeUpdate();
			System.out.println(count+"行受影响");
			
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			JdbcUtil.close(pstmt, conn); // 关闭Statement的,也支持关闭PreparedStatement
			// 因为 Statement是  PreparedStatement的子类
		}
	}

	private static void insert() {
		PreparedStatement pstmt = null;
		Connection conn = null;
		// 准备sql
		String sql = "insert into student value(?, ?, ?)";
		try {
			// 获取连接
			conn = JdbcUtil.getConnection();
			// 是connection去prepare一个Statement 给我们的PreparedStatement
			// 和我们的statement不同,这个prepare的时候是预编译,就要把sql传进去了
			// 其中的? 作为占位符
			pstmt = conn.prepareStatement(sql); // 预编译的作用就是权限和sql语法的检查
			// 在预编译之后,需要执行之前给参数赋值,放在pstmt中
			/*
			 * 参数一:位置(从1开始)
			 * 参数二:具体的参数值
			 */
			pstmt.setInt(1, 10); // id
			pstmt.setString(2, "陈六"); // name
			pstmt.setInt(3, 20); // age
			
			// 传入参数之后,再进行执行
			int count = pstmt.executeUpdate();
			System.out.println(count+"行受影响");
			
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			JdbcUtil.close(pstmt, conn); // 关闭Statement的,也支持关闭PreparedStatement
			// 因为 Statement是  PreparedStatement的子类
		}
	}
}


原文地址:https://www.cnblogs.com/mzywucai/p/11053479.html