杂七杂八的总结---Java基础知识(三)
目录
JDBC技术
原生 jdbc 操作数据库流程
1、Class.forName()加载数据库连接驱动
2、DriverManager.getConnection()获取数据连接对象
3、根据 SQL 获取 sql 会话对象,有 2 种方式 Statement、 PreparedStatement
4、执行 SQL 处理结果集,执行 SQL 前如果有参数值就设置参数值 setXXX()
5、关闭结果集、关闭会话、关闭连接
public static void main(String[] args) {
String url1 = "jdbc:mysql://localhost:3306/Animal?user=root&password=root&useUnicode=true&charactorEncoding=UTF8";
String url2 = "jdbc:mysql://localhost:3306/Animal?useUnicode=true&charactorEncoding=UTF8";
String url3 = "jdbc:mysql://localhost:3306/Animal";
String user = "root";
String password = "root";
Connection conn3 = null;
try {
Class.forName("com.mysql.jdbc.Driver");
Properties properties = new Properties();
properties.put("user", "root");
properties.put("password", "root");
properties.put("useUnicode", "true");
properties.put("charactorEncoding", "UTF8");
conn3 = DriverManager.getConnection(url1);
/* 或者
conn3 = DriverManager.getConnection(url2, user, password);
conn3 = DriverManager.getConnection(url3, properties);*/
String sql_insert = "insert into t_user(id, name, sex) value(?,?,?)";
String sql_select = "select * from t_user where id > 2";
PreparedStatement ps_insert = conn3.prepareStatement(sql_insert);
PreparedStatement ps_select = conn3.prepareStatement(sql_select);
ps_insert.setInt(1, 10);
ps_insert.setString(2, "zhangsan");
ps_insert.setString(3, "nv");
ps_insert.executeUpdate();
ResultSet rs = ps_select.executeQuery();
while(rs.next()){
System.out.println(rs.getInt(1) + rs.getString(2));
System.out.println(rs.getInt("id") + rs.getString("name"));
}
rs.close();
ps_select.close();
ps_insert.close();
conn3.close();
} catch (Exception e) {
e.printStackTrace();
}
}
PreparedStatement
1、PreparedStatement 接口继承 Statement, PreparedStatement 实例包含已编译的 SQL 语句,所以其执行速度要快于 Statement 对象。
2、作 为 Statement 的 子 类 , PreparedStatement 继 承 了 Statement 的 所 有 功 能 。 三 种 方法 execute、 executeQuery 和 executeUpdate 已被更改以使之不再需要参数。
总之,PreparedStatement 代码的可读性和可维护性比Statement 更高,性能也更高,而且安全性更高(Statement 容易被 SQL 注入)。
连接池
为数据库连接建立一个缓冲池。
1:从连接池获取或创建可用连接
2:使用完毕之后,把连接返回给连接池
3:在系统关闭前,断开所有连接并释放连接占用的系统资源
4:能够处理无效连接,限制连接池中的连接总数不低于或者不超过某个限定值。
数据库池连接数量一直保持一个不少于最小连接数的数量,当数量不够时,数据库会创建一些连接,直到一个最大连接数,之后连接数据库就会等待。
HTTP协议
HTTP长连接和短连接
HTTP1.1 默认保持长连接,数据传输完成保持 TCP 连接不断开(不发 RST 包、不四次握手),等待在同域名下继续用这个
通道传输数据。
HTTP/1.0 中,默认使用的是短连接,浏览器和服务器每进行一次 HTTP 操作,就建立一次连接,任务结束就中断连接。 从 HTTP1.1 起,默认使用的是长连接, 用以保持连接特性
常见状态码
200 OK //客户端请求成功
301 Moved Permanently(永久移除),请求的 URL 已移走。 Response 中应该包含一个 Location URL, 说明资源现在所处的位置
302 found 重定向
400 Bad Request //客户端请求有语法错误, 不能被服务器所理解
401 Unauthorized //请求未经授权,这个状态代码必须和 WWW-Authenticate 报头域一起使用
403 Forbidden //服务器收到请求,但是拒绝提供服务
404 Not Found //请求资源不存在, eg:输入了错误的 URL
500 Internal Server Error //服务器发生不可预期的错误
503 Server Unavailable //服务器当前不能处理客户端的请求,一段时间后可能恢复正常
GET和POST
GET 请求的数据会附在 URL 之后,POST 把提交的数据则放置在是 HTTP 包的包体中。
POST的安全性更高。
GET是向服务器发索取数据的一种请求,POST是向服务器提交数据的一种请求。
重定向和请求转发
本质区别: 转发是服务器行为,重定向是客户端行为。
重定向特点:两次请求,浏览器地址发生变化,可以访问自己 web 之外的资源,传输的数据会丢失。
请求转发特点:一次强求,浏览器地址不变,访问的是自己本身的 web 资源,传输的数据不会丢失
Cookie和Session
Cookie 是 web 服务器发送给浏览器的一块信息,浏览器会在本地一个文件中给每个 web 服务器存储 cookie。以后浏览器再给特定的 web 服务器发送请求时,同时会发送所有为该服务器存储的 cookie。
Session 是存储在 web 服务器端的一块信息。 session 对象存储特定用户会话所需的属性及配置信息。当用户在
应用程序的 Web 页之间跳转时,存储在 Session 对象中的变量将不会丢失,而是在整个用户会话中一直存在下去。
区别
无论客户端做怎样的设置, session 都能够正常工作。当客户端禁用 cookie 时将无法使用 cookie。在存储的数据量方面: session 能够存储任意的 java 对象, cookie 只能存储 String 类型的对象。
Session共享
1、服务器实现的 session 复制或 session 共享-----不好扩展和移植,比如我们更换服务器,那么就要修改服务器配置。
2、利用成熟的技术做session复制,比如12306使用的gemfire,比如常见的内存数据库如redis------严重依赖于第三方,这样当第三方服务器出现问题的时候,那么将是应用的灾难。
3、将 session 维护在客户端,很容易想到就是利用 cookie,但是客户端存在风险,数据不安全,而且可以存放的数据量比较小,所以将 session 维护在客户端还要对 session 中的信息加密。
所以,采用第二种方案和第三种方案的合体,利用 gemfire 实现 session 复制共享,还可以将session 维护在 redis 中实现 session 共享,同时可以将 session 维护在客户端的 cookie 中,但是前提是数据要加密。这三种方式可以迅速切换,而不影响应用正常执行。我们在实践中,首选 gemfire 或者 redis 作为 session 共享的载体,一旦 session 不稳定出现问题的时候,可以紧急切换 cookie 维护 session 作为备用,不影响应用提供服务。
单点登录,cookie被禁用
单点登录的原理是后端生成一个 session ID,然后设置到 cookie,后面的所有请求浏览器都会带上 cookie,然后服务端从 cookie 里获取 session ID,再查询到用户信息。所以,保持登录的关键不是 cookie,而是通过cookie 保存和传输的 session ID,其本质是能获取用户信息的数据。除了 cookie,还通常使用 HTTP 请求头来传输。但是这个请求头浏览器不会像 cookie 一样自动携带,需要手工处理。
JSP
jsp和servlet
jsp 本质上就是一个 Servlet,它是 Servlet 的一种特殊形式,每个 jsp 页面都是一个 servlet实例。Servlet 是由 Java 提供用于开发 web 服务器应用程序的一个组件,运行在服务端,由 servlet 容器管理,用来生成动态内容。一个 servlet 实例是实现了特殊接口 Servlet 的 Java 类,所有自定义的 servlet 均必须实现 Servlet 接口。
区别:jsp 是 html 页面中内嵌的 Java 代码,侧重页面显示;Servlet 是 html 代码和 Java 代码分离,侧重逻辑控制, mvc 设计思想中 jsp 位于视图层, servlet 位于控制层
运行机制
JVM 只能识别 Java 类,并不能识别 jsp 代码! web 容器收到以.jsp 为扩展名的 url 请求时,会将访问请求交给tomcat 中 jsp 引擎处理,每个 jsp 页面第一次被访问时, jsp 引擎将 jsp 代码解释为一个 servlet 源程序,接着编译servlet 源程序生成.class 文件,再有 web 容器 servlet 引擎去装载执行 servlet 程序,实现页面交互。
XML
xml 是一种可扩展性标记语言,支持自定义标签(使用前必须预定义)使用 DTD 和 XML Schema 标准化 XML 结构。
优点:用于配置文件,格式统一,符合标准;用于在互不兼容的系统间交互数据,共享数据方便;
缺点:xml 文件格式复杂,数据传输占流量,服务端和客户端解析 xml 文件占用大量资源且不易维护。
xml 常用解析器有 2 种,分别是: DOM 和 SAX;
AJAX
Ajax 是一种创建交互式网页应用的的网页开发技术;
优势:通过异步模式,提升了用户体验;优化了浏览器和服务器之间的传输,减少不必要的数据往返,减少了带宽占用。Ajax 引擎在客户端运行,承担了一部分本来由服务器承担的工作,从而减少了大用户量下的服务器负载。
最大特点:实现局部刷新,在不更新整个页面的前提下维护数据,提升用户体验度。
前端框架
EasyuI:是一种基于 jQuery 的用户界面插件集合,开源免费
MiniUI:基于 jquery 的框架,收费没源码
jQueryUI:一套 jQuery 的页面 UI 插件
Vue.js:自底向上增量开发的一套构建用户界面的渐进式框架
AngularJS:由 JavaScript 编写的一个 JS 框架
数据库
SQL注入
通过在 Web 表单中输入(恶意) SQL 语句得到一个存在安全漏洞的网站上的数据库,而不是按照设计者意图去执行 SQL 语句。
如何防止
预编译语句,sql 语句中变量用?表示,将传递的参数当做整体的字符串去查询
Mybatis 框架中的 mapper 方式中的 # 也能很大程度的防止 sql 注入($无法防止 sql 注入)。
MySQL性能优化
当只要一行数据时使用 limit 1
择正确的数据库引擎:Mysql 中有两个引擎 MyISAM 和 InnoDB,MyISAM 适用于一些大量查询的应用,InnoDB在写操作比较多的时候会比较优秀。
用 not exists 代替 not in。Not exists 用到了连接能够发挥已经建立好的索引的作用, not in 不能使用索引。
对操作符的优化,尽量不采用不利于索引的操作符。如in, not in, is null, is not null ,<>等
存储引擎
MyISAM 存储引擎:不支持事务、表锁和全文索引,对于一些 OLAP(联机分析处理)系统,操作速度快。MyISAM 不缓存数据文件,只缓存索引文件。
InnoDB 存储引擎:支持事务,主要面向 OLTP(联机事务处理过程)方面的应用,其特点是行锁设置、支持外键,并支持类似于 Oracle 的非锁定读,即默认情况下读不产生锁。
MySQL架构器
连接管理与安全验证
每个客户端都会建立一个与服务器连接的线程,服务器会有一个线程池来管理这些连接;如果客户端需要连接到 MYSQL 数据库还需要进行验证,包括用户名、密码、 主机信息等
解析器
主要是分析查询语句,最终生成解析树;首先解析器会对查询语句的语法进行分析,分析语法是否有问题。还有解析器会查询缓存,如果在缓存中有对应的语句,就返回查询结果不进行接下来的优化执行操作。前提是缓存中的数据没有被修改,当然如果被修改了也会被清出缓存。
优化器
主要是对查询语句进行优化操作,包括选择合适的索引,数据的读取方式,包括获取查询的开销信息,统计信息等,这也是为什么图中会有优化器指向存储引擎的箭头。优化器需要通过存储引擎获取查询的大致数据和统计信息。
执行器
执行查询语句,返回查询结果,生成执行计划,包括与存储引擎的一些处理操作。
事务
MySQL事务由存储引擎决定,事务就是为了解决一组查询要么全部执行成功,要么全部执行失败。
特性
原子性(Atomicity):整个事务中的所有操作,要么全部完成,要么全部不完成
一致性(Correspondence):在事务开始之前和事务结束以后,数据库的完整性约束没有被破坏
隔离性(Isolation):隔离状态执行事务,使它们好像是系统在给定时间内执行的唯一操作。在同一时间仅有一个请求用于同一数据
持久性(Durability):在事务完成以后,该事务对数据库所作的更改会持久的保存在数据库之中,并不会被回滚
隔离级别
读未提交(READ UNCOMMITTED) :未提交读隔离级别也叫读脏,就是事务可以读取其它事务未提交的数据。
读已提交(READ COMMITTED) :在其它数据库系统比如 SQL Server 默认的隔离级别就是提交读,已提交读
隔离级别就是在事务未提交之前所做的修改其它事务是不可见的。
可重复读(REPEATABLE READ) :保证同一个事务中的多次相同的查询的结果是一致的,比如一个事务一开始
查询了一条记录然后过了几秒钟又执行了相同的查询,保证两次查询的结果是相同的,可重复读也是 mysql 的默认隔
离级别。
可串行化(SERIALIZABLE) :可串行化就是保证读取的范围内没有新的数据插入,比如事务第一次查询得到某个
范围的数据,第二次查询也同样得到了相同范围的数据,中间没有新的数据插入到该范围中。
本文地址:https://blog.****.net/qq_39493274/article/details/107299864