【JDBC学习总结】2.Statement和PreparedStatement

一、环境设置

工程与数据库同上一节:http://blog.csdn.net/u011179993/article/details/47294875

新建下图中红色方框内两个类



二、Statement实现增删改查

package com.jazz.study2;

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

import org.junit.*;

public class TestSta {
	Connection conn = null;
	Statement sta = null;
	ResultSet rs = null;

	@Before
	public void before() throws Exception {

		String diverName = "com.mysql.jdbc.Driver";
		String url = "jdbc:mysql://localhost:3306/jdbcstudy";
		String user = "root";
		String password = "123456";
		Class.forName(diverName);
		conn = DriverManager.getConnection(url, user, password);
		sta = conn.createStatement();

	}

	@Test
	public void testInsert() throws SQLException {
		int num = sta.executeUpdate("insert into user(id,name,password,phone) values(3,'小精灵','qwer','145677')");
		if (num > 0)
			System.out.print("插入成功!");
		else
			System.out.print("插入失败!");
	}
	@Test
	public void testUpdate() throws SQLException {
		int num = sta.executeUpdate("update user set name='剑圣' where id=3");
		if (num > 0)
			System.out.print("更新成功!");
		else
			System.out.print("更新失败!");
	}
	@Test
	public void testDel() throws SQLException {
		int num = sta.executeUpdate("delete from user where id=3");
		if (num > 0)
			System.out.print("删除成功!");
		else
			System.out.print("删除失败!");
	}
	
	

	@After
	public void after() throws Exception {

		if (rs != null)
			rs.close();
		if (sta != null)
			sta.close();
		if (conn != null)
			conn.close();

	}
}


三、PreparedStatement实现增删改查

package com.jazz.study2;

import java.sql.*;
import org.junit.*;

public class TestPreparedSta {
	Connection conn = null;
	PreparedStatement psta = null;
	ResultSet rs = null;

	@Before
	public void before() throws Exception {

		String diverName = "com.mysql.jdbc.Driver";
		String url = "jdbc:mysql://localhost:3306/jdbcstudy";
		String user = "root";
		String password = "123456";
		Class.forName(diverName);
		conn = DriverManager.getConnection(url, user, password);
	}

	@Test
	public void testInsert() throws Exception {
		psta=conn.prepareStatement("insert into user(id,name,password,phone) values(3,?,?,'13244441414')");
		psta.setString(1, "死亡先知");
		psta.setString(2, "44444");
		int num = psta.executeUpdate();
		if (num > 0)
			System.out.print("插入成功!");
	}
	@Test
	public void testUpdate() throws SQLException {
		psta=conn.prepareStatement("update user set name=? where id=3");
		psta.setString(1, "巫医");
		//psta.setInt(2, 3);
		int num = psta.executeUpdate();
		if (num > 0)
			System.out.print("更新成功!");
	}
	@Test
	public void testDel() throws SQLException {
		psta=conn.prepareStatement("delete from user where id=?");
		psta.setInt(1, 3);
		int num=psta.executeUpdate();
		if (num > 0)
			System.out.print("删除成功!");
	
	}
	@Test
	public void testSelect() throws SQLException {
		psta=conn.prepareStatement("select name from user where id<?");
		psta.setInt(1, 4);
		rs=psta.executeQuery();
		while(rs.next()){
			System.out.println(rs.getString("name"));
		}
	
	}
	

	@After
	public void after() throws Exception {

		if (rs != null)
			rs.close();
		if (psta != null)
			psta.close();
		if (conn != null)
			conn.close();

	}
}

四、比较Statement和PreparedStatement

1.代码的可读性和可维护性.
虽然用PreparedStatement来代替Statement会使代码多出几行,但这样的代码无论从可读性还是可维护性上来说.都比直接用Statement的代码高很多档次。

第一种:
stmt=con.createStatement
stmt.executeUpdate("insert into tb_name (col1,col2,col2,col4) values ('"+var1+"','"+var2+"',"+var3+",'"+var4+"')");

第二种:
perstmt = con.prepareStatement("insert into tb_name (col1,col2,col2,col4) values (?,?,?,?)");
perstmt.setString(1,var1);
perstmt.setString(2,var2);
perstmt.setString(3,var3);
perstmt.setString(4,var4);
perstmt.executeUpdate();

不用我多说,对于第一种方法.别说其他人去读你的代码,就是你自己过一段时间再去读,都会觉得伤心.


2.PreparedStatement尽最大可能提高性能.
每一种数据库都会尽最大努力对预编译语句提供最大的性能优化.因为预编译语句有可能被重复调用.所以语句在被DB的编译器编译后的执行代码被缓存下来,那么下次调用时只要是相同的预编译语句就不需要编译,只要将参数直接传入编译过的语句执行代码中(相当于一个涵数)就会得到执行.

3.最重要的一点是极大地提高了安全性.
String sql = "select * from tb_name where name= '"+varname+"' and passwd='"+varpasswd+"'";
如果我们把[' or '1' = '1]作为varpasswd传入进来.用户名随意,看看会成为什么?
select * from tb_name = '随意' and passwd = '' or '1' = '1';
因为'1'='1'肯定成立,所以可以任何通过验证.更有甚者:
把[';drop table tb_name;]作为varpasswd传入进来,则:
select * from tb_name = '随意' and passwd = '';drop table tb_name;有些数据库是不会让你成功的,但也有很多数据库就可以使这些语句得到执行.
而如果你使用预编译语句.你传入的任何内容就不会和原来的语句发生任何匹配的关系.(前提是数据库本身支持预编译,但上前可能没有什么服务端数据库不支持编译了,只有少数的桌面数据库,就是直接文件访问的那些)只要全使用预编译语句,你就用不着对传入的数据做任何过虑.而如果使用普通的statement,有可能要对drop,;等做费尽心机的判断和过虑.

你可能感兴趣的:(【JDBC学习总结】2.Statement和PreparedStatement)