jdbc mysql crud dao模型 sql注入漏洞 jdbc 操作大文件

day17总结

今日内容

l JDBC

1.1 上次课内容总结

SQL语句:

1.外键约束:foreign key

* 维护多个表关系!

* 用来保证数据完整性!

2.三种关系:

* 一对多:

* 一个客户可以对应多个订单,一个订单只属于一个客户!

* 建表原则:

* 在多的一方创建一个字段,作为外键指向一的一方的主键!!!

* 多对多:

* 一个学生可以选择多个课程,一个课程也可以被多个学生选择!

* 建表原则:

* 创建第三张表,第三张表中放入两个字段,作为外键分别指向多对多双方的主键!

* 一对一:

* 一:主键对应方式:

* 两个表的主键进行关联!

* 二:唯一外键关联:

* 假设一对一的关系是一个多的关系!需要在多的一方创建一个外键指向一的一方主键!将这个外键设置为唯一.

3.多表查询:

* 内连接:

* inner join

* select * from A inner join B on 条件;

* select * form A,B where 条件;

* 外连接:

* 左外连接

* left outer join

* 右外连接

* right outer join

* 子查询:

* select中嵌入其他的select语句.

* any:任意一个

* all:所有

1.2 JDBC:

1.2.1 什么是JDBC

JDBC:JDBC(Java Data Base Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成

JDBC是SUN公司提供的一套连接数据库标准!!!

* 驱动:Java语言和数据库相当于两个不同设备!Java访问数据库!需要进行通信,通信需要驱动!

* 数据库驱动一般都是jar文件!

* 假设Java程序员要连接MYSQL数据库,对MYSQL数据库驱动了解.如果程序员要连接Oracle数据库,了解Oracle的驱动!

* SUN公司与各个数据库生产商讨论.SUN公司提供一套接口.各个数据库生产商提供这套接口实现类!

1.2.2 JDBC中的常见对象:

DriverManager:

Connection:

Statement:

* PreparedStatement

* CallableStatement

ResultSet:

1.2.3 JDBC的入门案例:

开发步骤:

1.注册驱动.

2.获得连接.

3.执行SQL语句.

4.释放资源.

创建数据库day17:

Create database day17;

Use day17;

Create table user(

Id int primary key auto_increment,

Username varchar(20),

Password varchar(20)

);

Insert into user values (null,‘aaa‘,‘aaa‘);

Insert into user values (null,‘bbb‘,‘bbb‘);

Insert into user values (null,‘ccc‘,‘ccc‘);

1.2.4 JDBC的API详解:
DriverManager:管理驱动

作用:

一、注册驱动

* registerDriver(Driver driver) ---完成对驱动的注册.

* 以后的开发中不会使用该方法!这个方法有两个问题!!!

* 1.应用依赖了具体驱动程序!

* 2.这个方法还会导致驱动注册两次!

* 查看com.mysql.jdbc.Driver类的源码:

static {

try {

java.sql.DriverManager.registerDriver(new Driver());

} catch (SQLException E) {

throw new RuntimeException("Can‘t register driver!");

}

}

***** 静态代码块在类加载的时候就执行了!

*****解决这两个问题?

Class.forName("com.mysql.jdbc.Driver");---将字节码加载到内存,只要加载到内存的时候,静态代码块就会执行!而且应用中不需要依赖具体驱动!

二、获得连接

* getConnection(String url, String user, String password)

* 参数:

* url :连接数据库url

* jdbc:mysql://localhost:3306/day17

* jdbc :协议

* mysql :是JDBC的子协议

* localhost:主机名

* 3306 :端口号

* day17 :数据库名称

* url简写:连接是本地mysql数据库.

* jdbc:mysql:///day17

* user :连接数据库用户名

* password :连接数据库密码

Connection:代表的连接

作用:

一、创建执行sql语句的对象

* Statement createStatement() --- 执行SQL语句

* PreparedStatement prepareStatement(String sql) --- 对SQL进行预编译,解决SQL注入漏洞.

* CallableStatement prepareCall(String sql) ---调用数据库存储过程.

二、管理事务

* void setAutoCommit(boolean autoCommit) --- 设置事务是否自动提交.

* void commit(); --- 事务提交

* void rollback(); --- 事务回滚

Statement:执行SQL

作用:

一、执行sql.

* ResultSet executeQuery(String sql); --- 执行select语句.

* int executeUpdate(String sql); --- 执行update、insert、delete语句,int代表的是sql语句影响的行数.

* boolean execute(String sql); --- 如果执行sql有结果集,返回true.如果没有结果集返回false.

二、执行批处理.

* void addBatch(String sql) ; --- 将SQL添加到批处理中.

* int[] executeBatch() ; --- 执行批处理

* void clearBatch() ; --- 清除批处理

ResultSet:结果集对象.指的是查询语句返回结果.

结果集内部维护了一个游标:开始指向第一行之前.调用next()才会指向具体行.

结果集获得数据:

* getXXX(int idx)---getXXX(String name);

* int idx:列号.

* String name:列名(推荐)

滚动结果集:(了解)

* 使用滚动结果集需要设置Statement对象.

* 使用Statement的时候如何创建的?

* Statement stmt = conn.createStatement();

* 在Connection对象中有这样一个方法

* createStatement(int resultSetType, int resultSetConcurrency)

* 参数:

* resultSetType :结果集类型

* TYPE_FORWARD_ONLY :结果集只能向下

* TYPE_SCROLL_INSENSITIVE :结果集可以滚动,但是不可以修改.

* TYPE_SCROLL_SENSITIVE :结果集可以滚动,可以修改记录.

* resultSetConcurrency :结果集并发策略

* CONCUR_READ_ONLY :只读的

* CONCUR_UPDATABLE :可以修改的

* 组合:

* TYPE_FORWARD_ONLY CONCUR_READ_ONLY:结果集只能向下,而且不可以修改.(默认的)

* TYPE_SCROLL_INSENSITIV CONCUR_READ_ONLY:结果集可以滚动,但是不能修改.

* TYPE_SCROLL_SENSITIVE CONCUR_UPDATABLE:结果集可以滚动,可以修改.

1.2.5 资源释放

Jdbc程序运行完后,切记要释放程序在运行过程中,创建的那些与数据库进行交互的对象,这些对象通常是ResultSet, Statement和Connection对象。

特别是Connection对象,它是非常稀有的资源,用完后必须马上释放,如果Connection不能及时、正确的关闭,极易导致系统宕机。Connection的使用原则是尽量晚创建,尽量早的释放。

为确保资源释放代码能运行,资源释放代码也一定要放在finally语句中。

查看MYSQL文档:

标准的资源释放的代码:

if (rs != null) {

try {

rs.close();

} catch (SQLException sqlEx) {

}

rs = null;

}

if (stmt != null) {

try {

stmt.close();

} catch (SQLException sqlEx) {

}

stmt = null;

}

if (conn!= null) {

try {

conn.close();

} catch (SQLException sqlEx) {

}

conn= null;

}

1.2.6 CRUD的操作

参见代码

1.2.7 工具类的抽取
1.2.8 JavaEE开发模式DAO模式:
1.2.9 DAO的登录的案例:

1.搭建开发环境:

* 导入jar包.

* 导入工具类和配置文件.

2.设计页面:

3.建包

SQL注入漏洞:

已知用户名,密码不知道!使用账号登录!!

* 输入:

1、用户名:张三’ or ‘1=1 密码随意.

2、用户名:张三’ -- 密码随意.

* 问题产生的原因:

* SQL的拼接:

* select * from user where username = ‘变量’ and password = ‘变量’;

* 演示问题:

* select * from user where username = ‘张三’ or ‘1=1’ and password = ‘随意’;

* select * from user where username = ‘张三’ -- ’ and password = ‘变量’;

* 避免该问题:

* 使用JS在前端进行校验:控制文本框不能输入特殊字符!!!

* JS校验不是必须的!为了提高用户的体验!JS的校验可以被绕行!

* 后台校验是必须的!

* 彻底解决SQL注入漏洞 :

* PreparedStatement :可以对sql进行预编译.SQL变量使用?作为占位符.

* select * from user where username = ? and password = ?; ---?号代表是一个变量.PreparedStatement将sql提前编译.编译后的SQL的格式就固定了.

1.2.10 JDBC的大数据类型的读写.

MYSQL的数据库中有两个类型:TEXT、BLOB. TEXT用于存文本 BLOB用于存二进制文件.(图片、MP3)

* Oracle数据库中CLOB、BLOB

* 使用JDBC操作数据库中大文件类型.

* TINYTEXT(255)、TEXT(64k)、MEDIUMTEXT(16M)和LONGTEXT(4G)

* 创建一个表:

Create table mytext(

Id int primary key auto_increment,

Data MEDIUMTEXT

);

Create table myblob(

Id int primary key auto_increment,

Data MEDIUMBLOB

);

1.2.11 执行批处理

批处理:将一批SQL一起执行.

MYSQL数据库中插入10000条记录大致4分钟.

* 100000:40多秒. 10000:4秒.

Oracle:

* 100000:4秒. 10000:瞬间.

今天的内容总结:

JDBC:

* JDBC概念:Java数据库连接.SUN公司提供一套操作数据库API.

* API:

* DriverManager:管理驱动

* 1.注册驱动

* Class.forName(“com.mysql.jdbc.Driver”);

* 2.获得连接

* getConnection(String url,String username,String password);

* Connection:连接对象

* 1.创建执行sql的对象.

* Statement:

* PreparedStatment:

* CallableStatment:

* 2.管理事务:

* setAutoCommit(boolean flag);

* commit();

* rollback();

* Statement:

* 1.执行sql

* executeQuery(sql);

* executeUpdate(sql);

* execute(sql);

* 2.执行批处理:

* addBatch(sql);

* executeBatch(sql);

* clearBatch();

* ResultSet:

* 默认情况下只能向下不能修改:

* 遍历结果集:

* 获取结果集值:

* 滚动结果集(了解)

* 释放资源:

* JDBC的CRUD的操作:

* 提取出工具类:

* 使用工具类CRUD:

* DAO模式:

* DAO数据访问对象.封装对数据源的单个操作,提供一组接口供业务层调用.调用的过程中传递一个对象!

* 使用DAO模型编写登录案例:

* SQL注入的漏洞:

* 解决使用PreparedStatement.

* 大文件读写:(了解)

* 批处理

时间: 2024-10-05 23:50:21

jdbc mysql crud dao模型 sql注入漏洞 jdbc 操作大文件的相关文章

JDBC的SQL注入漏洞分析和解决

1.1.1 SQL注入漏洞分析 1.1.2 SQL注入漏洞解决 需要采用PreparedStatement对象解决SQL注入漏洞.这个对象将SQL预先进行编译,使用?作为占位符.?所代表内容是SQL所固定.再次传入变量(包含SQL的关键字).这个时候也不会识别这些关键字. public class UserDao { ????????? ????????public boolean login(String username,String password){ ????????????????C

利用SQL注入漏洞登录后台的实现方法 。。。。转载

一.SQL注入的步骤 a) 寻找注入点(如:登录界面.留言板等) b) 用户自己构造SQL语句(如:' or 1=1#,后面会讲解) c) 将sql语句发送给数据库管理系统(DBMS) d) DBMS接收请求,并将该请求解释成机器代码指令,执行必要的存取操作 e) DBMS接受返回的结果,并处理,返回给用户 因为用户构造了特殊的SQL语句,必定返回特殊的结果(只要你的SQL语句够灵活的话). 下面,我通过一个实例具体来演示下SQL注入 二.SQL注入实例详解(以上测试均假设服务器未开启magic

预处理prepareStatement是怎么防止sql注入漏洞的?

序,目前在对数据库进行操作之前,使用prepareStatement预编译,然后再根据通配符进行数据填值,是比较常见的做法,好处是提高执行效率,而且保证排除SQL注入漏洞. 一.prepareStatement的预编译和防止SQL注入功能 大家都知道,java中JDBC中,有个预处理功能,这个功能一大优势就是能提高执行速度尤其是多次操作数据库的情况,再一个优势就是预防SQL注入,严格的说,应该是预防绝大多数的SQL注入. 用法就是如下边所示: String sql="update cz_zj_d

利用SQL注入漏洞登录后台的实现方法

利用SQL注入漏洞登录后台的实现方法 作者: 字体:[增加 减小] 类型:转载 时间:2012-01-12我要评论 工作需要,得好好补习下关于WEB安全方面的相关知识,故撰此文,权当总结,别无它意.读这篇文章,我假设读者有过写SQL语句的经历,或者能看得懂SQL语句 早在02年,国外关于SQL注入漏洞的技术文章已经很多,而国内在05年左右才开始的.  如今,谈SQL注入漏洞是否已是明日黄花,国内大大小小的网站都已经补上漏洞.但,百密必有一疏,入侵是偶然的,但安全绝对不是必然的.  前些天,网上传

[转]SQL注入漏洞及绑定变量浅谈

1.一个问题引发的思考 大家在群里讨论了一个问题,奉文帅之命写篇作文,且看: String user_web = "user_web"String sql = "update user set user_web="+user_web+" where userid=2343"; 大家看看这条sql有没有问题,会将user_web字段 更新成什么? 问题的结论是:执行后的记录结果跟执行前一样,(执行时的sql语句为 update user set u

linux之mysql数据库搭建及sql注入和防御

mysql中文手册下载地址:http://down.51cto.com/data/2244392 sql注入各种姿势:http://wt7315.blog.51cto.com/10319657/1828167 sqlmap注入神器详解:http://wt7315.blog.51cto.com/10319657/1841241 数据库分为三种基本形式 : (其实这些都是众所周知的,只是为了知识的完整性,简单的带过) 关系型数据库 层次型数据库 网状型数据库 运行在Linux系统上的关系型数据库管理

《sql注入攻击与防御 第2版》的总结 之 如何确定有sql注入漏洞

看完<sql注入攻击与防御 第2版>后,发现原来自己也能黑网站了,就一个字:太爽了. 简单总结一下入侵步骤: 1.确定是否有sql注入漏洞 2.确定数据库类型 3.组合sql语句,实施渗透 4.获取最高权限后,想怎么玩就怎么玩 学习sql注入漏洞,需要的材料: 浏览器           X1 wamp集成包  X1 php脚本一个  X1 数据库一个     X1 php脚本内容: 1 <?php 2 //获取数据 3 $id= empty($_GET['id'])?"NUL

利用SQL注入漏洞登录后台

题记:工作需要,得好好补习下关于WEB安全方面的相关知识,故撰此文,权当总结,别无它意.读这篇文章,我假设读者有过写SQL语句的经历,或者能看得懂SQL语句 早在02年,国外关于SQL注入漏洞的技术文章已经很多,而国内在05年左右才开始的. 如今,谈SQL注入漏洞是否已是明日黄花,国内大大小小的网站都已经补上漏洞.但,百密必有一疏,入侵是偶然的,但安全绝对不是必然的. 前些天,网上传得沸沸扬扬的“拖库”事件给我们敲响了安全警钟. 在开发网站的时候,出于安全考虑,需要过滤从页面传递过来的字符.通常

Discuz!7.2 faq.php文件SQL注入漏洞分析及利用实战

[antian365.com] simeon 最近网上公开了Discuz!7.2版本faq.php文件SQL注入0day,通过对文件漏洞分析以及实战测试,效果不错,公开利用exp的利用需要对SQL语句以及数据库等相当了解,在某些情况下需要多种技术配合才能最终攻克目标,下面就漏洞代码以及实战利用等进行探讨,对获取管理员密码的利用,uc_key获取webshell,插件导入获取Webshell等进行探讨. 1. faq.php文件SQL注入漏洞代码分析 本次存在漏洞的文件为faq.php,打开该文件