黑马程序员技术交流社区
标题: 【石家庄校区】学习笔记 [打印本页]
作者: 、呵呵呵 时间: 2018-5-27 16:11
标题: 【石家庄校区】学习笔记
笔记
多表约束 外键约束,用来保证数据完整性 ( 多表之间 ) [ 表与表之间的连系 ]
foreign key ()
alter table 表名称 add foreigh key (列名称) references did () ;
设置外键[一个表指向另一个表]alter bable 表名 add foreigh key (列名) references key dept(列名);
表与表之间的关系一对多的关系 例如 : 一个部门下可以有多个员工,一个员工只能属于某一个部门
建表原则 : 在多的一方创建外键指向一的一方的主键 [ 多的外键指向一的主键 ]
多对多的关系 例如 : 一个学生可以选择多门课程,一门课程可以被多个学生选择
建表原则 : 需要创建第三种表 ( 中间表 ) , 在中间表中至少两个字段分别作为作为外键 , 指向多对多双发的主键
一对一的关系 例如 : 一个公司可以有一个注册地址,一个注册地址只能对应一个公司
建表原则 :
假设一对一是一个一对多的关系,需要在多的一方创建外键指向一的一方的主键,将外键设置为唯一 ( unique )
班级,学生,课程
多表查询的分类连接查询交叉连接[cross join]查询到的是连哥哥表的笛卡尔积
select * from 表1 cross join 表2;
select * from 表1,表2;
内连接[inner join]inner 是可以省略的
显示内连接 在SQL中显示的调用 inner join 关键字
select * from 表1 别名 inner join 表2 别名 on 关联条件;
隐式内连接 在SQL中没有调用 inner join 关键字
外连接[outer join]outer 可以省略
左外连接 以左表为基准,根据关联条件去右表查询,如果匹配上了则返回匹配上的数据,如果匹配不是则返回null
右外连接子查询 一个查询语句条件需要依赖另一个查询结果
带in的子查询 意思 : 范围
例如查询学生生日在91年之后的班级信息
select * from classes where cid in ( 把下面的语句放进来 ) ;
select * from student where birthday > '1991-01-01' ;
带exists的子查询 意思 : 存在 [ 相当于 if ]
例如查询学生生日大于91年,如果记录存在,前面的SQL语句就会执行
select * from classes where exists ( 把下面的语句放进来 ) ;
select * from student where birthday > '1991-01-01' ;
带any的组查询 意思 : 任意一个
例如
select * from classes where cid > any ( select cno from student ) ;
带all的子查询 意思 : 所有
例如
select * from classes where cid > all ( select cno from student ) ;
事务管理[ 在财务上 , 比如支付宝转账 , A转账给B , B接收到才算成功 , 要不然就没有转过去 ]
指的是逻辑上的一组操作,组成这组操作的各个逻辑单元,要么全成功,要么全失败
开启事务 start transaction ;
提交事务 commit ;
回滚事务 rollback ;
重要!!!!!事务的特性ACID原子性 事务的不可分割 , 组成事务的各个逻辑单元不可分割 [ 每一个步骤都不可分割 ]
一致性 事务执行的前后 , 数据完整性保持一致
隔离性 必须要做的 , 控制并发
事务执行不应该受到数据库中其他事务的干扰
持久性 事务一旦提交 ( 结束或者回滚) , 数据就持久化到数据库中 [ 硬盘中 ]
ACID [原子性 ,一致性 ,隔离性 ,持久性 ]
隔离级别出现的安全问题脏读 一个事务读到了另一个事务未提交的数据 , 导致查询结果不一致
不可重复读 一个事务读到了另一个事务已经提交到update的数据 , 导致多次查询结果不一致
虚度/幻读 一个事务读到了另一个事务已经提交到insert的数据 , 导致多次查询结果不一致
解决这些安全性问题 read uncommitted : 脏读 , 不可重复读 ,虚度都有可能发生 [ 读到未提交的]
read committed : 避免脏读 , 但是不可重复读和虚读是有可能发生 [ 读到提交的]
repeatable read : 避免脏读和不可重复读 ,但是虚读有可能发生 [ 读到了insert的]
serializable : 避免脏读,不可重复读 ,虚读 [ 排队来就会都避免了]串行化
【 一般采取中间两个级别 , 两端太极端 】
设置事务的隔离级别
set session transaction isolation level 隔离级别 ;
查看当前的隔离级别
select @@tx_isolation ;
//这是关闭自动提交,在数据业务逻辑层写
Connection conn = nu;
try{
conn = JDBCUtils.getConnection(); -----获得一个连接
conn.setAutoCommit(false); ----关闭自动提交
}ThreadLocal : 当前线程
反射 一个Java类加载到内存,只有一个class文件
构造方法:Constructor
成员属性:Field
方法:Method【重要,反射操作方法,让方法执行】
==:比的是地址
执行方法:invoke();
获得无参构造 前提有一个类对象,里面有一个run()方法,而且获得了这个类的字节码对象,
【Class clazz=Class.forName(类的全路径)】
Person person = (Person)clazz.newInstance();
person.run();获得有参构造
前提有一个类对象,而且获得了这个类的字节码对象
【Class clazz=Class.forName(类的全路径)】
Constructor c = clazz.getConstructor(String.class,Integer.class);
Person p =(Person) c.newInstance("哈哈",23);获得类中属性
【Class clazz=Class.forName(类的全路径)】
Field field = clazz.getDeclaredField("类的属性名称"比如name); -----获得属性
field.setAccessible(true); ----设置
Field field = clazz.getDeclaredField("类的属性名称"比如age); -----获得属性
field.setAccessible(true); ----设置
Person p =(Person) c.newInstance("哈哈",23); ---
String name = (String)field.get(p);
Integer age = (Integer)field.get(p);重要!!!!!获得方法并执行
//无参方法
前提有一个类对象,而且获得了这个类的字节码对象
【Class clazz = Class.forName(类的全路径)】
Method method = clazz.getDeclaredMethod("方法名");
method.setAccessible(true);
method.invoke(clazz.newInstance()); ---执行
//有参方法
Method method2 = clazz.getDeclaredMethod("方法名",传的方法参数,String.class);
String s = (String) method2.invoke(clazz.newInstance(),"哈哈"); ---执行Serclet执行过程【Web.xml】里面的执行过程
Clazz clazz = Class.forName(全路径);
Method method = clazz.getMethod("service",HttpServletRequest.class,HttpServletResponse.class);
method.invoke(clazz.newInstance(),request,response);内省 用来获得JavaBean的属性及属性的get 或set 方法
JavcBean:就是一个满足了特定格式的Java类:私有属性,无参构造,有参构造,get/set
获得Bean
//获得Bean的信息
BeanInfo beanInfo = Introspector.getBeanInfo(User.class);
//获得Bean的属性描述
PropertyDescriptor [] pds = beanInfo.getPropertyDescriptor();
//遍历 pds
for(PropertyDescriptor pd: pds){
Method get = pd.getReadMethod(); //获得get方法
Method set = pd.getWriteMethod(); //获得set方法
}DbUtils
商品添加重复提交问题的解决办法:【令牌机制叫:token】
令牌机制(一次性) 生成随机的令牌保存在 session 中
在表单的提交的时候,将随机的令牌放入到表单的隐藏字段中
在 Servlet 中获得 session 中和表单中的令牌是否一致
如果一致执行插入操作,不一致跳转到其他页面,将令牌销毁
商品的信息修改 在列表页面点击【修改】
商品信息删除页面写跳转Servlet
在Servlet
1,接收pid
2,调用业务层,方法delete(pid);
在Service
1,调用Dao
在Dao
1,连接
2,sql语句
3,
批量删除 1,在;页面加入一列复选框,实现全选全不选
2,
分页 分页功能的实现
【推荐】物理分页:一次只查10条记录,点击下一页,再去查询后10页使用SQL语句进行控制的分页
缺点:经常需要和数据库交互,
优点:如果数据量特别大,不会导致内存溢出
逻辑分页:一次性将所有数据全部查询出来,根据需要进行截取,List集合进行控制subList();
缺点:数据量如果特别大,容易导致内存溢出
优点:与数据库交互次数少
不同的数据库对分页的语句也不是一样的
MYSQL进行分页:使用limit关键字
select * from xxx where ... Group by ... Having ...Order by ... Limit a , b;
a:代表从哪儿开始 b:代表查询的记录数
根据页数计算limit后面的两个参数:a和b
当前页数 a条数 b显示的个数
1 0 10
2 10 20
a条数 = (页数 - 1)* b显示个数
参数的传递:
前台 ----> 后台 : 当前页数
后台 ----> 前台 : 当前页数,总共页数,总记录数,显示个数,数据
使用JavaBean封装参数:
后台 ----->前台 :传递一个JavaBean就可以
Oracle进行分页:使用SQL语句嵌套
SQL Server数据库进行分页,使用top关键字
AJAX 响应的数据:
文本,一段HTML的数据,XML,JSON
使用工具生成XML的文件:
通常使用xStream工具,将集合,数组,对象转成XML
XStream修改标签名
xstream.alias("city",City.class); 把后面的换成前面的
将类中属性作为标签的属性
xstream.useAttributeFor(City.class,"cid"); 把前面的换成后面的属性标签
xstream.useAttributeFor(City.class,"cname");
xstream.useAttributeFor(City.class,"pid");
JSON 轻量级的数据交换格式,
JSON的数据格式: 对象表示为键值对
数据由逗号分割
字符串(在双引号中)
逻辑值(true或false)
花括号保存对象 { }
方括号保存数组 [ ]
null
{"id":1,"name":aaa} ---单个值
{"id":1,"name":aaa},{"id":2,"name":bbb} ---多个值
{
“city”:{"cid":1,"cname":"xxx"}
}JSON的生成工具 JSONlib:
JSONArray :将数组或List集合转成JSON
JSONArray.fromObject(list集合名称);
JsONObject :将对象或Map集合转成JSON
fastjson:
JSON 的 JS里面写法
$(function(){
$("#province").change(function(){ ---绑定事件
var pid = $(this).val(); ---获取pid的值
$.post("/day22/cityServlet",{"pid":pid},function(data){
----提交方式和JSON方式
var $city = $("#city"); ---获取市的列表
$city.html("<option>-请选择-</option>"); ----覆盖原有option的内容
$(data).each(function(i,n){ ----遍历
// ---- 往option里面填写 value值和 内容
$city.append("<option value='"+n.cid+"'>"+n.cname+"</option>");
});
},"json"); ----json方式
});
});监听器(Listener) 就是一个Java类,用来监听其他的Java的状态的变化
都是实现相应的类
配置监听器
< listener >
< listener-class >监听器的全路径< /listener-class >
< /listener >用途 用来监听其他的对象的变化的
主要应用在图形化界面中比较多
GUI,Android
监听器的术语 事件源 :指的是被监听的对象(汽车)
监听器 :指的是监听的对象(报警器)
事件源与监听器的绑定 :就是在汽车上安装报警器
事件 :指的是事件源的改变(踹汽车一脚) ---主要的功能获得事件源对象
web中的监听器 Web中的Listener和Filter是属于Servlet规范中的高级的技术
Web中监听器共有三类八种(监听三个域对象)
事件源:Servlet中三个域对象:ServletContext,HttpSession,ServletRequest
监听器:自定义类实现 8 个接口
事件源和监听器的绑定:配置
三类八种第一类创建销毁 需要配置
一类:监听三个域对象的创建和销毁的监听器
ServletContextListener -----监听ServletContext的创建和销毁【重点】
HttpSessionListener -----监听HttpSession的创建和销毁
ServletRequestListener ------监听ServletRequest的创建和销毁
二类:监听三个域对象的属性变更的监听器(属性添加,移除,替换)
ServletContextAttributeListener -----监听ServletContext对象的属性变更
HttpSessionAttributeListener -----监听HttpSession对象的属性变更
ServletRequestAttributeListener -----监听ServletRequest对象的属性变更
三类:监听HttpSession中的JavaBean的状态改变(绑定,解除绑定,钝化,活化)
HttpSessionBindingListener -----监听HttpSession中的JavaBean的绑定和解除绑定
HttpSessionActivationListener -----监听HttpSession中的JavaBean的钝化和活化
ServletContextListener【重点】 程序优化,写到这里面,在服务器启动时就创建
创建:服务器启动的时候,服务器为每个web应用都创建一个
销毁:服务器关闭的时候或者从项目中移除的时候
监听ServletContext的创建和销毁【重点】
方法:
contextInitialized ---创建
contextDestroyed ---销毁
【企业中的应用】
1 . 加载框架的配置文件:Spring框架 ContextLoaderListener
2 . 定时任务调度 -----比如qq生日发邮件,定时的
Timer
schedule(任务,日期,延时)
schedule(任务,延时,)
TimerTask
HttpSessionListener【了解】 创建:调用geiSession
销毁:非正常关闭。。。。
访问Servlet不会被创建Session
访问JSP会创建Session
访问html不会创建
ServletRequestListener【了解】 创建:客户端向服务器发送一次请求,服务器就会创建request对象
销毁:服务器对这次请求做出响应后就会销毁request对象
访问Servlet会创建request对象
访问JSP会创建request对象
访问HTML会创建request对象
第二类属性变更 需要配置
监听三个域的属性的添加,移除,替换
三个一样,方法名都一样
第三类JavaBean对象状态改变 不需要配置
钝化:序列化到硬盘 sessionWillPassivate()
活化:反序列化 sessionDidActivate()
优化Session 通过配置 < Context > 标签配置定时 session 序列化
在 tomcat / conf / context.xml 中配置 < Context >
在tomcat中所有的虚拟主机和虚拟路径都会按照这个配置执行
在tomcat / conf / Catalina / localhost / context.xml 配置 < Context >
在tomcat中的localhost虚拟主机中的所有虚拟路径按照这个配置执行
在当前工程下的META-INF / context.xml 配置 < Context >
在当前这个工程按照配置执行
过滤器
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) |
黑马程序员IT技术论坛 X3.2 |