[学习笔记] JDBC的简单使用_03

预编译语句对象PreparedStatement

之前的代码存在的问题

观察之前写的JDBC代码

	//保存操作
	@Override
	public void save(Student student) {
		String sql = "INSERT INTO t_student (sname, age)" + "VALUES ('" + student.getSname() + "', " + student.getAge() + ")";
        ...
    }
    
    //删除操作
	@Override
	public void delete(Long id) {
		String sql = "DELETE FROM t_student WHERE id=" + id;
        ...
    }

	//更改数据
	@Override
	public void update(Long id, Student student) {
		String sql = "UPDATE t_student SET sname='" + student.getSname() + "', age=" + student.getAge() + " WHERE id=" + id;
        ...
    }

	//查询操作
	@Override
	public Student get(Long id) {
		String sql = "SELECT * FROM t_student WHERE id=" + id;
        ...
    }

存在的问题: 拼接SQL语句太麻烦, 传递参数不方便

解决: 使用预编译语句对象, 即PreparedStatement

PreparedStatement

  • 以前的JDBC步骤

    • 加载注册驱动
    • 获取连接对象
    • 创建语句对象
    • 执行SQL语句
    • 释放资源
  • 使用预编译语句对象

    • 加载注册驱动
    • 获取连接对象
    • 创建预编译语句对象(或者说"准备语句对象")
    • 执行SQL语句
    • 释放资源

也就是说, 与之前相比, 只有创建语句对象这一步有不同

  1. 编写SQL语句, 需要传递的参数用"?"表示, "?"表示一个占位符参数

  2. 创建预编译语句对象(准备语句对象), 以第一步的sql为参数.

    • 创建Statement对象时是不需要参数的, 这个很好理解:
    • 使用Statement对象时, SQL语句被写死, 只用在执行的时候再传入SQL
    • PreparedStatement对象的SQL语句中, 参数可能会变化, 所以需要预先传入SQL语句, 然后给占位符参数设置具体的值
  3. 通过setXxx(arg0, arg1)给占位符参数设置具体的值

    • Xxx表示参数的基本数据类型(一切情况下均可以使用setObject())
    • arg0表示是第几个占位符参数
    • arg1表示具体的值

上面的步骤没看懂就算了, 下面这段代码可以很容易看懂StatementPrepareStatement的区别

/**
 *向user表中插入"Superman"和"Batman"两条数据
 */
public class PreparedStatementTest {

	//使用Statement
	@Test
	public void saveByStatement() throws Exception{
    	//获取连接对象
		Connection conn = JdbcUtil.getConnection();
        //编写Superman的SQL, 此时SQL是被写死的
		String sql_s = "INSERT INTO `user` (sname, age) VALUES ('Superman', 27)";
        //编写Batman的SQL, 此时SQL是被写死的
		String sql_b = "INSERT INTO `user` (sname, age) VALUES ('Batman', 35)";
        //创建语句对象
		Statement st = conn.createStatement();
        //执行SQL
		st.execute(sql_s);
		st.execute(sql_b);
        //释放资源
		JdbcUtil.close(conn, st, null);
	}

	//使用PreparedStatement
	@Test
	public void saveByPreparedStatement() throws SQLException{
    	//获取连接对象
		Connection conn = JdbcUtil.getConnection();
        //编写SQL, 此时SQL中的参数由?占位
		String sql = "INSERT INTO `user` (sname, age) VALUES (?, ?)";
        //创建PreparedStatement对象
        //注意是conn.prepareStatement(sql), 而不是conn.preparedStatement(sql);
		PreparedStatement ps = conn.prepareStatement(sql);
        //给第1个?设置值"Superman"
		ps.setString(1, "superman");
        //给第2个?设置值27
		ps.setInt(2, 27);
        //执行SQL, 此时不需要传递参数
		ps.executeUpdate();
        //-------------------------------------
        //给第1个?设置值"Batman"
		ps.setString(1, "Batman");
        //给第2个?设置值35
		ps.setInt(2, 35);
        //执行SQL, 此时不需要传递参数
		ps.executeUpdate();
		
        //释放资源
		JdbcUtil.close(conn, ps, null);
	}
}

PreparedStatementStatement区别简而言之:

  • Statement
    1. 加载注册驱动 --> Class.forName("")
    2. 获取连接对象 --> ManagerDriver.getConncetion("", “”, “”);
    3. 创建语句对象 --> conn.createStatement();
    4. 执行SQL语句 --> statement.execute(String sql);
    5. 释放资源
  • PreparedStatement
    1. 加载注册驱动 --> Class.forName("")
    2. 获取连接对象 --> ManagerDriver.getConncetion("", “”, “”);
    3. 创建语句对象 --> conn.prepareStatement(String sql);
    4. 执行SQL语句 --> statement.execute();
    5. 释放资源

获取自动生成的主键

Statement

	Statement st = conn.createStatement();
    //除了传入SQL语句, 还需要传入Statement.RETURN_GENERATED_KEYS
	st.executeUpdate(String sql, Statement.RETURN_GENERATED_KEYS);
    //使用getGeneratedKeys()方法获取自动生成的主键
	ResultSet rs = st.getGeneratedKeys();

PreparedStatement

    //除了传入SQL语句, 还需要传入Statement.RETURN_GENERATED_KEYS
	PreparedStatement ps = conn.prepareStatement(String sql, Statement.RETURN_GENERATED_KEYS);
	ps.executeUpdate();
    //使用getGeneratedKeys()方法获取自动生成的主键
	ResultSet rs = ps.getGeneratedKeys();

总结: 什么时候传入SQL语句, 就什么时候传入Statement.RETURN_GENERATED_KEYS, 最后通过getGeneratedKeys()方法获取自动生成的主键

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
编译原理是计算机专业的一门核心课程,旨在介绍编译程序构造的一般原理和基本方法。编译原理不仅是计算机科学理论的重要组成部分,也是实现高效、可靠的计算机程序设计的关键。本文将对编译原理的基本概念、发展历程、主要内容和实际应用进行详细介绍编译原理是计算机专业的一门核心课程,旨在介绍编译程序构造的一般原理和基本方法。编译原理不仅是计算机科学理论的重要组成部分,也是实现高效、可靠的计算机程序设计的关键。本文将对编译原理的基本概念、发展历程、主要内容和实际应用进行详细介绍编译原理是计算机专业的一门核心课程,旨在介绍编译程序构造的一般原理和基本方法。编译原理不仅是计算机科学理论的重要组成部分,也是实现高效、可靠的计算机程序设计的关键。本文将对编译原理的基本概念、发展历程、主要内容和实际应用进行详细介绍编译原理是计算机专业的一门核心课程,旨在介绍编译程序构造的一般原理和基本方法。编译原理不仅是计算机科学理论的重要组成部分,也是实现高效、可靠的计算机程序设计的关键。本文将对编译原理的基本概念、发展历程、主要内容和实际应用进行详细介绍编译原理是计算机专业的一门核心课程,旨在介绍编译程序构造的一般原理和基本

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值