JDBC

来源:互联网 发布:苹果ps软件 编辑:程序博客网 时间:2024/04/30 01:43
一、JDBC
1.数据库驱动、jdbc
数据库驱动:数据库厂商提供的jar包,其中提供了操作对应数据库的api,我们只要导入数据库驱动就可以利用其中的api操作对应数据库
jdbc:sun公司提供的数据库驱动的标准,本质是一大堆的接口,要求所有数据库驱动都实现这套接口,统一了数据库驱动的api,使开发人员只需要学习jdbc接口就可以操作所有数据库驱动


2.六个步骤实现JDBC
0.导入数据库驱动

Connection conn = null;
Statement stat = null;
ResultSet rs = null;
try{
//1.注册数据库驱动
//--根据观察Driver类的源代码,我们发现这个驱动被注册了两次
//--由于new的是具体的数据库的驱动,导致程序和具体的数据库绑死在了一起,发生了耦合
//DriverManager.registerDriver(new Driver());
Class.forName("com.mysql.jdbc.Driver");
//2.获取数据库连接
conn = DriverManager.getConnection("jdbc:mysql:///day14?user=root&password=root");
//3.获取传输器对象
stat = conn.createStatement();
//4.利用传输器将sql语句传输到数据库执行,获取结果集对象
rs = stat.executeQuery("select * from user");
//5.遍历结果集获取数据
while(rs.next()){
String name = rs.getString("name");
System.out.println(name);
}
}catch (Exception e) {
e.printStackTrace();
}finally{
//6.释放资源
if(rs!=null){
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}finally{
rs = null;
}
}
if(stat!=null){
try {
stat.close();
} catch (SQLException e) {
e.printStackTrace();
}finally{
stat = null;
}
}
if(conn!=null){
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
} finally{
conn = null;
}
}
}







create table users (
id int primary key auto_increment,
username varchar(20),
password varchar(40),
nickname varchar(50),
email varchar(50)
);


insert into users values (null,'admin','123','admin','admin@qq.com');





3.改造user案例,演示sql注入攻击:
由于dao中操作数据用的sql语句中的参数是由前台用户输入的信息,于是用户就可以输入一些sql的关键字从而改变最终sql的语义,执行一些意外的操作,这样的过程叫做sql注入攻击


刘备'#


select * from users where username = '刘备'#' and password=''


刘备' or '1 = 1


select * from users where username = '刘备' or '1 = 1' and password=''


4.PreparedStatement解决sql注入攻击问题
PreparedStatement要求将sql语句的主干和参数分别进行传输,将主干先进行预编译的操作后再接受参数最终执行,由于参数是分开传输的,数据库直到它只是参数而已,即使其中包含sql的关键字也不会被执行,所以可以防止sql注入问题
PreparedStatement使用预编译的机制,效率要更高
PreparedStatement 使用问号占位符,省去了sql拼接的操作,从而是代码更加的优雅


真正的开发中PreparedStatement要更常用一些



JDBC实现大文本 大二进制存储 (了解即可)
java.lang.AbstractMethodError: com.mysql.jdbc.PreparedStatement.setCharacterStream(ILjava/io/Reader;J)V

java.lang.OutOfMemoryError: Java heap space

com.mysql.jdbc.PacketTooBigException: Packet for query is too large (10886473 > 1048576). You can change this value on the server by setting the max_allowed_packet' variable.


=======================================================================================================================
JDBC 实现批处理 -- 非常重要,要求大家掌握

Statement方式实现批处理
优点:
可以将多条结构不同的sql语句存入批后执行
缺点:
如果要执行多条sql语句主干相同只有参数不同的sql时需要写多次sql的主干
没有经过预编译效率比较低
不能防止sql注入

PreparedStatement方式实现批处理
优点:
执行多条主干相同参数不同的sql时,主干只需写一次,每次只需传入不同的参数即可
有预编译,效率要高
防止sql注入
缺点:
不能在一个批中加入多个主干不同的sql
=======================================================================================================================