A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 、呵呵呵 初级黑马   /  2018-5-27 16:11  /  739 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

笔记

多表约束
​        外键约束,用来保证数据完整性 ( 多表之间 ) [ 表与表之间的连系 ]
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 >
​                        在当前这个工程按照配置执行
过滤器



0 个回复

您需要登录后才可以回帖 登录 | 加入黑马