SQL学习笔记之数据库专题(四):浅谈JDBC用法(四)

2015-01-21 11:12:30 · 作者: · 浏览: 31
tat, conn); } } /** * @Title: find * @Description: 查询 * @throws */ @Test public void find() { Connection conn = null; Statement stat = null; ResultSet rs = null; try { conn = JDBCUtils.getConn(); stat = conn.createStatement(); rs = stat.executeQuery("select * from user where name='freedom'"); while (rs.next()) { String name = rs.getString("name"); String password = rs.getString("password"); System.out.println(name + ":" + password); } } catch (Exception e) { e.printStackTrace(); } finally { JDBCUtils.close(rs, stat, conn); } } }

SQL注入攻击:
由于dao中执行的SQL语句是拼接出来的,其中有一部分内容是由用户从客户端传入,所以当用户传入的数据中包含sql关键字时,就有可能通过这些关键字改变sql语句的语义,从而执行一些特殊的操作,这样的攻击方式就叫做sql注入攻击

PreparedStatement利用预编译的机制将sql语句的主干和参数分别传输给数据库服务器,从而使数据库分辨的出哪些是sql语句的主干哪些是参数,这样一来即使参数中带了sql的关键字,数据库服务器也仅仅将他当作参数值使用,关键字不会起作用,从而从原理上防止了sql注入的问题


PreparedStatement主要有如下的三个优点:
~1.可以防止sql注入
~2.由于使用了预编译机制,执行的效率要高于Statement
~3.sql语句使用?形式替代参数,然后再用方法设置?的值,比起拼接字符串,代码更加优雅.

看使用代码:

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

import com.itheima.util.JDBCUtils;

public class JDBCDemo3 {
	public static void main(String[] args) {
		Connection conn = null;
		PreparedStatement ps = null;
		ResultSet rs = null;
		try {
			conn = JDBCUtils.getConn();
			ps = conn
					.prepareStatement("select * from user where name=? and password=?");
			ps.setString(1, "freedom");
			ps.setString(2, "666");

			rs = ps.executeQuery();
			while (rs.next()) {
				System.out.println(rs.getString("email"));
			}

		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			JDBCUtils.close(rs, ps, conn);
		}
	}
}

JDBC其实还支持大文本和大二进制的处理,但是实际开发中我们很少使用到,一般情况下,处理这些大数据可能还需要修改 虚拟机的启动内存大小。这里就讲讲大二进制数据组的存储和读取吧。

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

import org.junit.Test;

import com.itheima.util.JDBCUtils;

/*
 * 数据库中创建一个表
 create table blobdemo(
 id int primary key auto_increment,
 name varchar(100),
 content MEDIUMBLOB
 );
 */
public class BlobDemo1 {

	@Test
	public void addBlob() {
		Connection conn = null;
		PreparedStatement ps = null;
		ResultSet rs = null;
		try {
			conn = JDBCUtils.getConn();
			ps = conn
					.prepareStatement("insert into blobdemo values (null,?,?)");
			ps.setString(1, "高达.mp3");
			File file = new File("1.mp3");
			ps.setBinaryStream(2, new FileInputStream(file), (int) file
					.length());
			ps.executeUpdate();
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			JDBCUtils.close(rs, ps, conn);
		}
	}

	@Test
	public void findBlob() {
		Connection conn = null;
		PreparedStatement ps = null;
		ResultSet rs = null;
		try {
			conn = JDBCUtils.getConn();
			ps = conn.prepareStatement("select * from blobdemo");
			rs = ps.executeQuery();
			while (rs.next()) {
				String name = rs.getString("name");
				InputStream in = rs.getBinaryStream("content");
				OutputStream out = new FileOutputStream(name);

				byte[] bs = new byte[1024];
				int i = 0;
				while ((i = in.read(bs)) != -1) {
					out.write(bs, 0, i);
				}
				i