Java学习——处理SQL命令的Statement和PreparedStatement

一杯茶,一包烟,一段代码歇一天……
大家好,我是找一个bug找半天的代码小白呀。

亲爱的大家,我又来分享最近新学的知识了,不得说初学者每天做学生管理系统,不断完善,不断优化,但是还是弄不完美。 今天的内容是我在拿java学习做学生管理系统的时候,用到数据库,连接数据库的时候就花了好长的时间,在对数据库增加,查询,修改,删除这一块儿又花了好长时间,在这儿分享一下,希望初学者们能学的能轻松一点,不要浪费太多的时间。

言归正传,来看看两个Statement有啥区别。
首先我们要知道,在oracle的黑框框(代码小白:嗯?黑框框是什么鬼?)不对,叫控制台,对,在那里面我们需要输入SQL语句才能对数据库的数据进行操作。
那么在java编译器怎么在连接数据库之后,执行SQL语句呢?

那么就到了Statement表现的时候了,这个类就是来处理SQL语句的。
Statement有两个处理SQL语句的方法,分别是:
1、executeUpdate()方法用来执行增加、删除、修改等操作
2、executeQuery()方法用来执行查询的SQL语句,基本返回的表都用ResultSet来进行接收。

先看怎么向数据库添加一条数据:

public void AddInfro(String sno,String name,String gender
			,String dept,int age) {
	try {
		Connection conn = DriverManager.getConnection(url,user,password);
		out.println("数据库连接成功");
		Statement s = conn.createStatement();
		sql = String.format("insert into s values(%s,%s,%s,%s,%d)"
				, sno,name,gender,dept,age);
		s.executeUpdate(sql);
		conn.close();
		s.close();
	} catch (SQLException ex) {
		out.println("数据库连接失败!");
		out.println("或者关闭资源失败!");
	}
}

可以使用**String.formate()方法可以来将SQL语句格式化,之后使用executeUpdate()**方法处理SQL语句。

那再看看对于相同的操作,PreparedStatement是怎么操作的。
先看代码:

public void AddInfro(String sno,String name,String gender
			,String dept,int age) {
		try {
			Connection conn=DriverManager.getConnection(url,user,password);
			out.println("数据库连接成功!");
		} catch (SQLException ex) {
			out.println("数据库连接失败!");
		}
		try {
			String sql = "INSERT INTO s VALUES(?,?,?,?,?)";
			PreparedStatement ps = conn.prepareStatement(sql);
			ps.setString(1, sno);
			ps.setString(2, name);
			ps.setString(3, gender);
			ps.setString(4, dept);
			ps.setInt(5, age);
			ps.executeUpdate();
			out.println("数据更新成功!");
		} catch (SQLException ex) {
			out.println("更新失败!");
			out.println("检查数据是否已存在!");
		}
	}

实现PrepareStatement的时候,可以先设定有占位符“?”的SQL语句,
之后再对占位符进行赋值。仿照上面的代码,可以尝试其他的操作,比如说删除数据。
看上面的情况,好像是Statement是比较简单的。但是,看看之后的这种情况。

修改数据中两种Statement的比较:
使用Statement来处理查询的SQL语句是很麻烦的,一个字符串的设计需要很多次的连接。

public void AlterInfor(String sno,String name,String gender
			,String dept,int age) {
		sql = "update s set sno='"+sno+"',sname='"+name+"',sex='" +gender
				+"',dept='"+dept+"',age="+age+" where sno='801'";
//		sql = String.format("UPDATE s SET SNO='%s',SNAME='%s',"
//				+ "SEX='%s',DEPT='%s',AGE='%d' WHERE SNO='%s'"
//				, sno,name,gender,dept,age,sno);
		out.println(sql);
		try {
			conn = DriverManager.getConnection(url,user,password);
			System.out.println("数据库连接成功!");
			s = conn.createStatement();
			int num = 0;
			try {
//				num = ps.executeUpdate();
				num = s.executeUpdate(sql);
				out.println("");
			} catch (SQLException e) {
				out.println("修改失败!");
			}
			out.println("num = " + num);
			if(num == 1) {
				out.println("修改成功!");
			} else {
				out.println("修改失败!检查正确性!");
			}
			conn.close();
//			ps.close();
			s.close();
		} catch (SQLException ex) {
			out.println("数据库连接失败!");
			out.println("或者修改关闭资源失败!");
		}
	}

除了前三个注释,剩下的请自动忽略
前面SQL语句的设计需要很多次的连接,对于String字符串的连接,我们都是希望越少越好,因为使用字符串追加的话,每次都要新建一个空间,之后把两个字符串连起来,返回新的字符串。这样是很浪费时间和空间的。

下面有注释的那个SQL语句,好像也不太麻烦,但是思考一下,假如说我要改变一个参数,那么是不是就需要重新写一个SQL语句?这样是不提倡的。

那么,就是PreparedStatement施展拳脚的时候了。
我先写一段:

public void AlterInfor(String sno,String name,String gender
			,String dept,int age) {
	try {
		conn = DriverManager.getConnection(url,user,password);
		System.out.println("数据库连接成功!");
		sql = "update s set sno=?,sname=?,sex=?,dept=?,age=? where sno=?";
		ps = conn.prepareStatement(sql);
		ps.setString(1, sno);
		ps.setString(2, name);
		ps.setString(3, gender);
		ps.setString(4, dept);
		ps.setInt(5, age);
		ps.setString(6, sno);
//			s = conn.createStatement();
		int num = 0;
		try {
			num = ps.executeUpdate();
//				num = s.executeUpdate(sql);
			out.println("");
		} catch (SQLException e) {
			out.println("修改失败!");
		}
		out.println("num = " + num);
		if(num == 1) {
			out.println("修改成功!");
		} else {
			out.println("修改失败!检查正确性!");
		}
		conn.close();
		ps.close();
//			s.close();
	} catch (SQLException ex) {
		out.println("数据库连接失败!");
		out.println("或者修改关闭资源失败!");
	}
}

要是修改任何一个参数,只要在PreparedStatement的set的方法内修改参数即可,是不是就不用创建SQL语句了呢?

那么我们来详细的介绍一下PreparedStatement接口吧。

1、PreparedStatement是什么呢?
他是一个属于java.sql包下面的接口,特点就是能参数化处理SQL语句。

2、那么相对Statement他有什么优点呢?
(1)当创建PreparedStatement对象的时候,数据库系统对SQL语句进行预编译处理,之后可以调用setInt、setString等方法对参数进行赋值,达到一个SQL语句重复使用的目的。
(2)相比于Statement,PrepareStatement更快
因为SQL语句已经提前预编译处理过了,所以数据库处理的信息就少了很多(毕竟直接使用之前预编译的SQL语句,相比每次分析、编译、优化SQL语句更快)
(3)可以防止SQL的注入式攻击
这个点我不太懂,等我明白了再来写吧。

好了,今天写了两个小时,希望对大家有帮助。
别忘了,多多点赞,会变好看,多多留言,会变有钱呐。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值