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.
* 大文件读写:(了解)
* 批处理
jdbc mysql crud dao模型 sql注入漏洞 jdbc 操作大文件的更多相关文章
- Youke365_2_4 一处Sql注入漏洞以及一处任意文件删除
本文作者:X_Al3r Prat 0 自白 每一天都是新的一天.没啥吐槽的,步入正题 /system/category.php 文件一处Sql注入## 80-87行代码 $root_i ...
- 10年前,我就用 SQL注入漏洞黑了学校网站
我是风筝,公众号「古时的风筝」,一个兼具深度与广度的程序员鼓励师,一个本打算写诗却写起了代码的田园码农! 文章会收录在 JavaNewBee 中,更有 Java 后端知识图谱,从小白到大牛要走的路都在 ...
- MySql(四)SQL注入
MySql(四)SQL注入 一.SQL注入简介 1.1 SQL注入流程 1.2 SQL注入的产生过程 1.2.1 构造动态字符串 转义字符处理不当 类型处理不当 查询语句组装不当 错误处理不当 多个提 ...
- 利用SQL注入漏洞登录后台的实现方法
利用SQL注入漏洞登录后台的实现方法 作者: 字体:[增加 减小] 类型:转载 时间:2012-01-12我要评论 工作需要,得好好补习下关于WEB安全方面的相关知识,故撰此文,权当总结,别无它意.读 ...
- 预处理prepareStatement是怎么防止sql注入漏洞的?
序,目前在对数据库进行操作之前,使用prepareStatement预编译,然后再根据通配符进行数据填值,是比较常见的做法,好处是提高执行效率,而且保证排除SQL注入漏洞. 一.prepareStat ...
- 利用SQL注入漏洞登录后台的实现方法 。。。。转载
一.SQL注入的步骤 a) 寻找注入点(如:登录界面.留言板等) b) 用户自己构造SQL语句(如:' or 1=1#,后面会讲解) c) 将sql语句发送给数据库管理系统(DBMS) d) DBMS ...
- sqlmap查找SQL注入漏洞入门
1.安装sqlmap sqlmap是一款非常强大的开源sql自动化注入工具,可以用来检测和利用sql注入漏洞.注意:sqlmap只是用来检测和利用sql注入点的,使用前请先使用扫描工具扫出sql注入点 ...
- Cacti 'graph_xport.php' SQL注入漏洞
漏洞版本: Cacti < 0.8.8b 漏洞描述: Bugtraq ID:66555 Cacti是一套基于PHP,MySQL,SNMP及RRDTool开发的网络流量监测图形分析工具. Cact ...
- 《sql注入攻击与防御 第2版》的总结 之 如何确定有sql注入漏洞
看完<sql注入攻击与防御 第2版>后,发现原来自己也能黑网站了,就一个字:太爽了. 简单总结一下入侵步骤: 1.确定是否有sql注入漏洞 2.确定数据库类型 3.组合sql语句,实施渗透 ...
随机推荐
- Xshell中文版使用说明/下载
个人本来一直用SecureCRT的这几天朋友推荐用xshell就尝试下载了一个结果发现这个比SecureCRT和puttytel好使多了切更能更完善强大特此推荐附带注册码一枚可装999台机器 1309 ...
- [Asp.net]SignalR实现实时日志监控
摘要 昨天吃饭的时候,突然想起来一个好玩的事,如果能有个页面可以实时的监控网站或者其他类型的程序的日志,其实也不错.当然,网上也有很多成熟的类似的监控系统.就想着如果通过.net该如何实现?所以就在想 ...
- java调用存储过程
在做java调用sqlserver存储过程时遇到了各种各样的问题,不过在不懈的努力之下这些问题还是得以解决了.今天总结一下遇到的问题以及解决的方法. 首先调用存储过程的方法大家都很清楚: String ...
- 常见的几个angular.js的问题
来源于网络收集 一.ng-show/ng-hide 与 ng-if的区别? 我们都知道ng-show/ng-hide实际上是通过display来进行隐藏和显示的.而ng-if实际上控制dom节点的增删 ...
- CSS浮动属性Float介绍
#cnblogs_post_body h6 {font-size: 16px;font-weight: bold;} 什么是CSS Float? float 是 css 的定位属性.在传统的印刷布局中 ...
- informatica通用命令方式启动workflow
#传mapping参数时#调用执行workflow,-sv informatica服务,-d 域 -u 用户,-p 密码 -folder知识库下的workflow所在文件夹,-wait wf_test ...
- 关于网页控件设置成disabled以后,提交不到后台的问题
在开发的时候经常遇到这样的问题,就是需要设置某个控件不可编辑,这个控件可能是一个input文本框,可能是一个select下拉列表 遇到这样的问题,一般有两种处理方法 第一种是将input 控件添加 d ...
- ios 客户端定位的3种方法
1.客户端通过IP地址定位 http://int.dpool.sina.com.cn/iplookup/iplookup.php 输出:城市 1 -1 -1 中国 广东 深圳 2.客户端获取经纬度,调 ...
- php远程连接http方式
以下这三者是通过GET方式来获取数据 1.socket 方式 一般是指定网址.端口号.超时时间. 再对报头进行修改以及传递参数,包括:header.method.content, 返回的内容包括hea ...
- Knockout.Js案例三单页面应用程序
<ul data-bind="foreach: folders"> <li data-bind="text: $data">& ...