JDBC学习第一站之Statement与PreparedStatement

Statement:

通过类的名字,把类(元数据对象)加载到内存中,加载驱动,由于是对数据流做操作,一定要加异常处理,后面也是

<span style="white-space:pre">	</span>// 通过类的名字,把类(元数据对象)加载到内存中
<span style="white-space:pre">	</span>Class.forName("com.mysql.jdbc.Driver");

创建一个数据库链接,getConnection方法中的第一个参数是指数据库类型和所操作数据库的名称,第二个参数是指用户名,第三个参数是指password<密码>

<span style="white-space:pre">	</span>Connection conn = DriverManager.getConnection(
	<span style="white-space:pre">	</span>"jdbc:mysql://localhost:3306/score", "root", "123456");

然后创建一个Statement对象

<span style="white-space:pre">	</span>Statement stm = conn.createStatement();

一般执行SQL语句就是用,如果是查询则返回的是一张二维关系表,所以用ResultSet对象收集

<span style="white-space:pre">	</span>//执行增、删、改语句,返回int型,受影响的行数
	stm.executeUpdate(strSql);
	//返回一个ResultSet对象,其实就是一个表或者视图
	rst = stm.executeQuery(strSql);

ResultSet对象集,然后输出结果,如下

<span style="white-space:pre">	</span>//输出结果
	while(rst.next()) {// 游标下移一行
		System.out.println(rst.getString("Sid") + "\t" + rst.getString("Sname"));
	}	

如果对数据库的操作完成了,则需要在finally里面关闭前面创建的对象,对象销毁按照创建的栈来进行

<span style="white-space:pre">			</span><pre name="code" class="java"><span style="white-space:pre">		</span>finally {
			//打开是先打开Connection,再打开ResultSet
			//关闭是反的关闭
			if(rst != null) {
				try {
					rst.close();
				} catch (SQLException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
			if(stm != null) {
				try {
					stm.close();
				} catch (SQLException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
			if(conn != null) {
				try {
					conn.close();
				} catch (SQLException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		}

PreparedStatement:

package JDBC_Study;

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

public class PreparedStatementDemo {

	public static void main(String[] args) {

		Connection conn = null;
		PreparedStatement stmt = null;
		ResultSet rst = null ;	

		String strSql = "select * from student where sid = ?";

		try {
			// 通过类的名字,把类(元数据对象)加载到内存中
			Class.forName("com.mysql.jdbc.Driver");
			//
			conn = DriverManager.getConnection(
					"jdbc:mysql://localhost:3306/score", "root", "123456");

			//执行增、删、改语句,返回int型,受影响的行数
//			pStm.executeUpdate();
			//返回一个ResultSet对象,其实就是一个表或者视图
			stmt = conn.prepareStatement(strSql);
			stmt.setString(1, "100081");
			rst = stmt.executeQuery();
			//输出结果
			while(rst.next()) {// 游标下移一行
				System.out.println(rst.getString("Sid") + "\t" + rst.getString("Sname"));
			}			

		} catch (ClassNotFoundException | SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} finally {
			//打开是先打开Connection,再打开ResultSet
			//关闭是反的关闭
			if(rst != null) {
				try {
					rst.close();

				} catch (SQLException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
			if(stmt != null) {
				try {
					stmt.close();
				} catch (SQLException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
			if(conn != null) {
				try {
					conn.close();
				} catch (SQLException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		}
	}
}

Statement 与 PreparedStatement 的优点和缺点:

PreparedStatement接口继承Statement接口

PreparedStatement比普通的Statement对象使用起来更加灵活,更有效率 

提高了代码的可读性和可维护性

提高了SQL语句执行的性能

提高了安全性

JDBC学习第一站之Statement与PreparedStatement

时间: 2024-08-06 01:10:19

JDBC学习第一站之Statement与PreparedStatement的相关文章

JDBC中的Statement和PreparedStatement的区别

以Oracle为例吧 Statement为一条Sql语句生成执行计划, 如果要执行两条sql语句 select colume from table where colume=1; select colume from table where colume=2; 会生成两个执行计划 一千个查询就生成一千个执行计划! PreparedStatement用于使用绑定变量重用执行计划 select colume from table where colume=:x; 通过set不同数据只需要生成一次执行

[转] JDBC中的Statement和PreparedStatement的区别

以Oracle为例吧 Statement为一条Sql语句生成执行计划,如果要执行两条sql语句select colume from table where colume=1;select colume from table where colume=2;会生成两个执行计划一千个查询就生成一千个执行计划! PreparedStatement用于使用绑定变量重用执行计划select colume from table where colume=:x;通过set不同数据只需要生成一次执行计划,可以重用

Java JDBC中的Statement和PreparedStatement

以Oracle为例吧 Statement为一条Sql语句生成执行计划, 如果要执行两条sql语句 select colume from table where colume=1; select colume from table where colume=2; 会生成两个执行计划 一千个查询就生成一千个执行计划! PreparedStatement用于使用绑定变量重用执行计划 select colume from table where colume=:x; 通过set不同数据只需要生成一次执行

【转】JDBC学习笔记(2)——Statement和ResultSet

转自:http://www.cnblogs.com/ysw-go/ Statement执行更新操作 Statement:Statement 是 Java 执行数据库操作的一个重要方法,用于在已经建立数据库连接的基础上,向数据库发送要执行的SQL语句.Statement对象,用于执行不带参数的简单SQL语句. 通过JDBC向指定的数据表中插入一条记录,需要注意下面的几点: * 1.Statement:用于执行SQL语句的对象 * 1).通过COnnection的createStatement()方

【Java编程】JDBC注入攻击-Statement 与 PreparedStatement

在上一篇[Java编程]建立一个简单的JDBC连接-Drivers, Connection, Statement and PreparedStatement我们介绍了如何使用JDBC驱动建立一个简单的连接,并实现使用Statement和PreparedStatement进行数据库查询,本篇blog将接着上篇blog通过SQL注入攻击比较Statement和PreparedStatement.当然这两者还有很多其他方面的不同,在之后的blog中会继续更新. [Statement查询] 1.在DBH

【Java编程】建立一个简单的JDBC连接-Drivers, Connection, Statement and PreparedStatement

本blog提供了一个简单的通过JDBC驱动建立JDBC连接例程,并分别通过Statement和PreparedStatement实现对数据库的查询.在下一篇blog中将重点比较Statement与PreparedStatement的差异. 1.为项目添加JDBC驱动 1)JDBC驱动下载 官方下载地址:mysql-connector-java-5.0.8.zip CSDN资料下载地址:mysql-connector-java-5.0.8.zip 2)为项目添加JDBC驱动 建立项目Java项目J

使用JDBC分别利用Statement和PreparedStatement来对MySQL数据库进行简单的增删改查以及SQL注入的原理

一.MySQL数据库的下载及安装 https://www.mysql.com/ 点击DOWNLOADS,拉到页面底部,找到MySQL Community(GPL)Downloads,点击 选择下图中的MySQL Community Server 选择想要的版本进行下载 之后的步骤,因为本人已经安装过MySQL数据库,而卸载重装会比较麻烦,卸载不干净会导致新的装不上,所以可以参考下面的博客,因为官网的改动,前面的部分已经与该博客不符,按照本人在上面的介绍寻找即可 https://blog.csdn

Mybatis学习第一天

Mybatis第一天 2      MyBatis介绍 MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation迁移到了google code,并且改名为MyBatis .2013年11月迁移到Github. MyBatis是一个优秀的持久层框架,它对jdbc的操作数据库的过程进行封装,使开发者只需要关注 SQL 本身,而不需要花费精力去处理例如注册驱动.创建connection.创建statement.手动设置参数.

JDBC学习小结

一.JDBC基础 连接数据的步骤: 1.注册驱动 :Class.forName(“com.mysql.jdbc.Driver”) 推荐这种方式,不会对具体的驱动类产生依赖:DriverManager.registerDriver(com.mysql.jdbc.Driver) 会造成DriverManager中产生两个一样的驱动,并会对具体的驱动类产生依赖:System.setProperty(“jdbc.drivers”, “driver1:driver2”) 虽然不会对具体的驱动类产生依赖:但