事务管理 核心思想:使用同一个Connection对象
业务层:事务管理需在业务层
方式一:向下传递Connection
业务层获得Connection对象,将同一个Connection对象传递给DAO层
方式二:使用当前线程ThreadLocal<T>
DBUtils就是这种方式
MySQL中事务默认自动提交,一条SQL语句就是一个事务
Oracle中事务默认需手动提交
ACID特性
- 原子性(Atomicity):事务的不可分割。事务中的操作单元不可切割,要么全部成功,要么全部失败
- 一致性(Consistency):事务执行前后,数据完整性保持一致。业务状态和其他业务状态保持一致
- 隔离性(Isolation):一个事务执行,不应该受到其他事务的干扰
- 持久性(Durability):事务一旦结束(提交/回滚),数据就会持久化到数据库中
如果不考虑事务的隔离性引发的安全问题
- 读问题:
- 脏读:一个事务读到另一个事务未提交的数据,导致查询结果跟实际数据不一致
- 不可重复读:一个事务读到另一个事务已经提交的update数据,导致多次查询结果不一致
- 虚读/幻读:一个事务读到另一个事务已经提交的insert数据,导致多次查询结果不一致
- 写问题:引发两类丢失更新
事务隔离级别
read uncommitted(未提交读)--脏读、不可重复读、虚读都有可能发生
read committed (已提交读)--避免脏读。(Oracle默认)
repeatable read (可重复读)--避免脏读、不可重复读(MySql默认)
serializable (串行化)--避免脏读、不可重复读、虚读。一个事务结束后才可执行另一个事务
安全性越高,性能越低。
MySQL5.5之后设置隔离级别
SELECT @@tx_isolation; --查看当前事务隔离级别
SET SESSION TRANSACTION ISOLATION LEVEL 隔离级别 --设置事务隔离级别
AJAX JQ对象.load(url, [data], [callback]) //将相应的内容加载到当前标签中
$.getJSON(url, [data], [callback]) //get请求直接返回jsonDATA
$.get(url, [data], [callback], [type])
$.post(url, [data], [callback], [type])
url:路径
data: Key/value 参数。JSON格式{key,"value",...},
callback: 响应成功时执行的回调函数。function(data){} data为响应内容
type:返回内容格式,xml, html, script, json, text, _default。(默认为字符串格式)
JQform表单.serialize() //将当前表单可提交的参数序列化成JSON格式的参数
JQform表单.serializeArray() //序列化成json数组
$.parseJSON(data) //data转换成json
//应对复杂业务逻辑写法
$.ajax({
type:..., //请求类型,默认"GET"
cache:false, //是否缓存该页面
data:{}, //参数
dataType:..., //返回内容数据格式
contentType:(默认: "application/x-www-form-urlencoded")) //发送信息至服务器时内容编码类型
success:function(){} //成功执行方法
error:function(){} //错误执行函数
complete:function(){} //成功失败都执行此方法
});
JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。
对象表示为键值对
数据由逗号分隔
花括号保存对象
方括号保存数组
如:
{"id":1,"name":aaa} //一个对象
[{"id":1,"name":aaa},{"id":2,"name":aaa}] //对象数组
{
"person":{"id":1,"name":aaa}
}
分页技术 分类:
- 物理分页:一次只去数据库中查询当前页需要的数据(常用)
缺点:经常和数据库交互
优点:数据量特别大时,不会导致内存溢出
- 逻辑分页:一次性将所有数据查询出来,放入内存(集合),每次查询只需去内存中截取
一般会将分页信息封装成一个JavaBean(PageBean<T>)。称为BO(Busines Object,附有业务含义的BavaBean)
private int currPage; //当前页码。页面请求参数
private int pageSize; //每页显示条数。自定义
private int totalCount; //总记录数。数据库查询
private int totalPage; //总页数:(int) Math.ceil(totalCount*1.0/pageSize)
private List<T> list; //当前页内容。数据库查询
数据库分页查询语句:
MySQL中:
select ... limit m,n; --从索引m开始,查找n条数据(就是从第m+1条,到m+n条)
select ... limit n; --查询前n条记录
每页显示n条数据
第i页: limit (i-1)*n,n
(currPage-1)*pageSize
Oracle中:rownum,使用SQL语句嵌套
SQLserver中:top
Listener 概述
监听器:监听器就是一个Java类用来监听其他的Java类的变化
主要应用:Swing编程;Android应用。
监听器的术语:
- 事件源:被监听的对象(如:汽车)
- 监听器对象:监听的对象(如:汽车上报警器)
- 事件源与监听器绑定:配置(如:汽车上安装报警器)
- 事件:指的是事件源的改变(如:踹汽车一脚)
功能: 获得事件源对象.
Servlet的监听器(都是接口,需定义类实现):
监听ServletContext,HttpSession,ServletRequest三个域对象,共有3类8种
事件源和监听器绑定:通过web.xml配置完成
一类:监听三个域对象的创建和销毁的监听器(3个)
ServletContextListener:监听ServletContext对象
contextDestroyed(ServletContextEvent sce) //对象销毁时执行
contextInitialized(ServletContextEvent sce) //对象创建时执行
作用:优化程序思想,将加载资源大的内容放到对象创建的时候加载
HttpSessionListener:监听HttpSession对象
sessionCreated(HttpSessionEvent se)
sessionDestroyed(HttpSessionEvent se)
ServletRequestListener:监听ServletRequest对象
requestInitialized(ServletRequestEvent sre)
requestDestroyed(ServletRequestEvent sre)
二类:监听三个域对象的属性变更的监听器(3个.属性添加,属性移除,属性替换)
ServletContextAttributeListener:监听ServletContext对象
attributeAdded(ServletContextAttributeEvent scab)
attributeRemoved(ServletContextAttributeEvent scab)
attributeReplaced(ServletContextAttributeEvent scab)
HttpSessionAttributeListener:监听HttpSession对象
xxx(HttpSessionBindingEvent se)
ServletRequestAttributeListener:监听ServletRequest对象
xxx(ServletRequestAttributeEvent srac)
三类:监听HttpSession对象中的JavaBean的状态的改变.(2个,绑定,解除绑定,钝化和活化)
JavaBean实现监听器类,自动检测与Session的变化,所以无需再配置文件中绑定
HttpSessionBindingListener:监听HttpSession中的JavaBean的绑定解除绑定的状态.
valueBound(HttpSessionBindingEvent event) //绑定
valueUnbound(HttpSessionBindingEvent event)
HttpSessionActivationListener:监听HttpSession中的JavaBean的钝化和活化的状态(JavaBean需实现序列化接口)
sessionDidActivate(HttpSessionEvent se) //活化(反序列化到内存)
SessionWillPassivate(HttpSessionEvent se) //钝化(序列化到硬盘)
配置序列化Session的时机:
方式一:tomcat/conf/context.xml :对tomcat中的所有虚拟主机和虚拟路径生效.
方式二:tomcat/conf/Catalina/localhost/context.xml :对tomcat下的localhost虚拟主机中的所有路径生效.
方式三:工程的META-INF/context.xml :对当前的工程生效
添加内容:
<!--
maxIdleSwap :1分钟 如果session不使用就会序列化到硬盘.
directory :itheima 序列化到硬盘的文件存放的位置.
-->
<?xml version="1.0" encoding="UTF-8"?>
<Context>
<Manager className="org.apache.catalina.session.PersistentManager" maxIdleSwap="1">
<Store className="org.apache.catalina.session.FileStore" directory="itheima"/>
</Manager>
</Context>
|
|