zoukankan      html  css  js  c++  java
  • java2小结(草稿)

    Struts2

    Servlet

    小的Java程序,运行在服务器端,接收和响应从客户端发送过来的请求

    流程分析:

    Servlet生命周期?

    Servlet配置自动加载?(理解)

    1.服务器在启动的时候,Servlet实例不会被创建的!第一次访问的时候才会创建Servlet的实例对象。

    2.通过一种配置文件,让Tomcat服务器在启动的时候就创建Servlet的实例对象

        * 在<servlet>标签的中间添加一段配置

        * <load-on-startup>0或者值是正整数</load-on-startup>

    3.值越小,优先级越高!

    Action访问Servlet API有哪几种方式,简单的介绍一下?

    1.在Action类中也可以获取到Servlet一些常用的API,有如下三种方式获取

        * 完全解耦合的方式

        * 使用接口注入的方式

        * 使用ServletActionContext中静态方法直接访问Servlet的API

        * 需求:提供JSP的表单页面的数据,在Action中使用Servlet的API接收到,然后保存到三个域对象中,最后再显示到JSP的页面上。

            * 提供JSP注册的页面,演示下面这三种方式:

                <h3>注册页面</h3>

                <form action="${ pageContext.request.contextPath }/xxx.action" method="post">

                    姓名:<input type="text" name="username" /><br/>

                    密码:<input type="password" name="password" /><br/>

                    <input type="submit" value="注册" />

                </form>

    2.完全解耦合的方式

        * 如果使用该种方式,Struts2框架中提供了一个类,ActionContext类,该类中提供一些方法,通过方法获取Servlet的API

        * 一些常用的方法如下:

            * static ActionContext getContext()                                         -- 获取ActionContext对象实例

            * java.util.Map<java.lang.String,java.lang.Object> getParameters()          -- 获取请求参数,相当于request.getParameterMap();

            * java.util.Map<java.lang.String,java.lang.Object> getSession()             -- 获取的代表session域的Map集合,就相当于操作session域。

            * java.util.Map<java.lang.String,java.lang.Object> getApplication()         -- 获取代表application域的Map集合

            * void put(java.lang.String key, java.lang.Object value)                    -- 注意:向request域中存入值。

    3.使用接口注入的方式

        * Struts2框架中提供了一些接口,编写的Action类可以是去实现这些接口,然后实现这些接口中的方法,这些方法都是把一些Servlet的常用对象通过参数的方式传递进来。

        * 常用的接口如下:

            * ServletRequestAware       -- 注入request

            * ServletContextAware       -- 注入ServletContext

            * ServletResponseAware      -- 注入response.

    4.使用ServletActionContext中静态方法直接访问Servlet的API

        * Struts2框架提供了一个类,ServletActionContext,该类中提供了一些静态的方法

        * 具体的方法如下

            * getPageContext();

            * getRequest()

            * getResponse();

            * getServletContext();

    ①.方式一:使用ActionContext对象(在Action中解耦合方式间接访问Servlet API)

    在struts2中Action API已经与Servlet API 解耦合(没有依赖关系),开发简单,便于测试。

    Servlet API 常见操作 : 表单提交请求参数获取,向request、session、application三个范围存取数据

    ②.方式二:使用接口注入的方式操作Servlet API(藕合)

    通过Aware接口,在构造Action时,自动注入需要操作Servlet对象(需要哪个对象就实现哪个Aware接口)

    ③.方式三:在Action中直接通过 ServletActionContext 获得Servlet API

    静态方法返回request,不会有线程问题(使用了ThreadLocal来实现的)

    总结:理论来说,第一种方式最好,实现了解耦和,但是第三种我们使用最为简单,企业中没有很大的限制,自己熟悉哪种就使用哪种。

    Struts2详细运行流程

     

     

    从图15可以看出,一个请求在Struts2框架中的处理大概分为以下几个步骤:

      1、客户端初始化一个指向Servlet容器(例如Tomcat)的请求;

      2、这个请求经过一系列的过滤器(Filter)(这些过滤器中有一个叫做ActionContextCleanUp的可选过滤器,这个过滤器对于Struts2和其他框架的集成很有帮助,例如:SiteMesh Plugin);

      3、接着FilterDispatcher被调用,FilterDispatcher询问ActionMapper来决定这个请求是否需要调用某个Action;

      4、如果ActionMapper决定需要调用某个Action,FilterDispatcher把请求的处理交给ActionProxy;

      5、ActionProxy通过Configuration Manager询问框架的配置文件,找到需要调用的Action类;

      6、ActionProxy创建一个ActionInvocation的实例。

      7、ActionInvocation实例使用命名模式来调用,在调用Action的过程前后,涉及到相关拦截器(Intercepter)的调用。

      8、一旦Action执行完毕,ActionInvocation负责根据struts.xml中的配置找到对应的返回结果。返回结果通常是(但不总是,也可能是另外的一个Action链)一个需要被表示的JSP或者FreeMarker的模版。在表示的过程中可以使用Struts2 框架中继承的标签。在这个过程中需要涉及到ActionMapper。

     

    请求首先通过Filter chain,Filter主要包括ActionContextCleanUp,它主要清理当前线程的ActionContext和Dispatcher;FilterDispatcher主要通过AcionMapper来决定需要调用哪个Action。

    ActionMapper取得了ActionMapping后,在Dispatcher的serviceAction方法里创建ActionProxy,ActionProxy创建ActionInvocation,然后ActionInvocation调用Interceptors,执行Action本身,创建Result并返回,当然,如果要在返回之前做些什么,可以实现PreResultListener。

     

    部分类介绍

    ①ActionMapper

    ActionMapper其实是HttpServletRequest和Action调用请求的一个映射,它屏蔽了Action对于Request等java Servlet类的依赖。Struts2中它的默认实现类是DefaultActionMapper,ActionMapper很大的用处可以根据自己的需要来设计url格式,它自己也有Restful的实现,具体可以参考文档的docsactionmapper.html。

    ②ActionProxy&ActionInvocation

    Action的一个代理,由ActionProxyFactory创建,它本身不包括Action实例,默认实现DefaultActionProxy是由ActionInvocation持有Action实例。ActionProxy作用是如何取得Action,无论是本地还是远程。而ActionInvocation的作用是如何执行Action,拦截器的功能就是在ActionInvocation中实现的。

    ③ConfigurationProvider&Configuration

    ConfigurationProvider就是Struts2中配置文件的解析器,Struts2中的配置文件主要是尤其实现类XmlConfigurationProvider及其子类StrutsXmlConfigurationProvider来解析。

     

    Struts2请求流程

    1、客户端发送请求

    2、请求先通过ActionContextCleanUp-->FilterDispatcher

    ActionContextCleanUp:主要清理当前线程的ActionContext和Dispatcher

    3、FilterDispatcher通过ActionMapper来决定这个Request需要调用哪个Action

    4、如果ActionMapper决定调用某个Action,FilterDispatcher把请求的处理交给ActionProxy,这儿已经转到它的Delegate--Dispatcher来执行

    5、ActionProxy根据ActionMapping和ConfigurationManager找到需要调用的Action类

    6、ActionProxy创建一个ActionInvocation的实例

    7、ActionInvocation调用真正的Action,当然这涉及到相关拦截器的调用

    8、Action执行完毕,ActionInvocation创建Result并返回,当然,如果要在返回之前做些什么,可以实现PreResultListener。添加PreResultListener可以在Interceptor中实现。

    源代码分析

    ①启动服务器(tomcat)将会自动加载配置文件,加载过程如下:

    服务器启动,init()方法被执行

     

    ②客户端初始化一个指向Servlet容器(WEB容器)的请求;

     

    ③这个请求经过一系列的过滤器(Filter)(这些过滤器中有一个叫做ActionContextCleanUp的可选过滤器,这个过滤器对于Struts2和其他框架的集成很有帮助,例如:(SiteMesh Plugin)。

     

    ④接着StrutsPrepareAndExecuteFilter被调用,StrutsPrepareAndExecuteFilter询问ActionMapper来决定这个请求是否需要调用某个Action。

     

     

    ⑤如果ActionMapper决定需要调用某个Action,FilterDispatcher把请求的处理交给ActionProxy。ActionProxy通过Configuration Manager询问框架的配置文件,找到需要调用的Action类

     

    ⑥ActionProxy创建一个ActionInvocation的实例。ActionInvocation实例使用命名模式来调用,在调用Action的过程前后,涉及到相关拦截器(Intercepter)的调用。拦截器默认执行<default-interceptor-ref name="defaultStack"/>defaultStack里面有一系列的interceptor。

     

    ⑦一旦Action执行完毕,ActionInvocation负责根据struts.xml中的配置找到对应的返回结果。返回结果通常是(但不总是,也可能是另外的一个Action链)一个需要被表示的JSP或者FreeMarker的模版。在表示的过程中可以使用Struts2框架中继承的标签。在这个过程中需要涉及到ActionMapper,响应的返回是通过我们在web.xml中配置的过滤器

     

    ⑧如果ActionContextCleanUp是当前使用的,则FilterDispatecher将不会清理threadlocal ActionContext;如果ActionContextCleanUp不使用,则将会去清理threadlocals。

     

     

     

    Jquery easyui

    UI框架采用jquery easyui

    优点:

    使用方法:

    1.在jsp或html中加入css、js。

    2.定义布局。

    组件介绍:

    Layout组件:实现页面布局。

    Accordion组件:实现菜单折叠效果。

    其中调用accordion的add方法实现动态添加折叠菜单。

    一级菜单使用accordion的title。

    二级菜单使用自定义的html。

    Tabs组件:实现打开多个标签窗口。

    Tab必须使用js去渲染组件,渲染div。

    效果:

    注意:

    在tab标签中显示iframe,iframe要比frameset灵活,可以放在body中任意位置!!

    实现欢迎页面:

    进入first.jsp,自动添加一个tab。tab的内容就是一个欢迎页面。

    Datagrid组件:实现数据列表。

    效果:

    弹出窗口:window

    消息提示:messager

    数据库(MySQL)

    概述

    1.数据库:数据仓库,保存数据的。是一个文件系统,也是使用文件的方式来保存数据的,但是访问数据(添加数据据、查询、修改数数据)必须要使用标准SQL语句来访问,操作。
    2.开发任何的应用会有数据库。
    3.学习的都是关系型的数据库,存储都是实体与实体之间的关系。
        * 实体:User对象代表就是一个实体。
    4.常见的数据库
        * Oracle        -- 大型的应用,收费的。
        * MySQL         -- 小型的数据库,免费开源的!被Oracle收购了,现在学习都是5.x的版本,但是从6.x版本开始收费了。
        * Oracle (SUN 服务器 Oracle MySQL)
        * SQLServer     -- 微软
        * DB2           -- IBM的公司,银行的企业。
        * SyBASE        -- 应用的比较小,PowerDigener数据库建模的软件。

    数据库的SQL语句(CURD)

    创建数据库

    1.语法
        * create database 数据库名称;(掌握)
        * create database 数据库名称 character set 编码;(默认是utf8)
        * create database 数据库名称 character set 编码 collate 校对规则;(校对规范也有默认值)
    2.校对规则
        * 和编码成对出现的。
        * 使用默认的校对就可以了。
    3.练习
        * 创建一个名称为mydb1的数据库。
            * create database mydb1;
        * 创建一个使用utf8字符集的mydb2数据库。
            * create database mydb2 character set 'utf8';
        * 创建一个使用utf8字符集,并带校对规则的mydb3数据库。
            * create database mydb3 character set 'utf8' collate 'utf8_bin';       

    删除数据库

    1.删除数据库
        * drop database 数据库名称;
    2.练习
        * 查看当前数据库服务器中的所有数据库
            * show databases;
        * 查看前面创建的mydb2数据库的定义信息
            * show create database mydb2;
        * 删除前面创建的mydb1数据库
            * drop database mydb1;

    修改数据库

    1.修改数据库
        * alter database 数据库名称 character set '编码' collate 校对规则;

    查看数据库

    1.显示所有的数据库(掌握)
        * show databases;
    2.显示数据库的定义的信息
        * show create database 数据库名称;
    3.切换(使用)数据库(掌握)
        * use 数据库名称;
    4.查看当前正在使用的数据库
        * select database();

    表结构的SQL语句(CURD)

    创建表结构

    1.创建表的语法
        create table 表名(
            字段1 字段类型(长度),
            字段2 字段类型(长度),
            字段3 字段类型(长度)
        );
    2.MySQL常用的数据类型(掌握)
        * 字符串型(掌握)
            * VARCHAR       -- 代表数据的长度是可变的。假如把username长度设置8,传入一个hello,把字段的长度自动变成5.
            * CHAR          -- 代表数据的长度是不可变的。假如把username使用char(8),传入一个hello,剩余位置使用空格补全。
            * 创建表结构
                create table table1(
                    username varchar(20),
                    password char(15)
                );
        * 大数据类型(了解)
            * BLOB          -- 字节(mp3  电影 图片)
            * TEXT          -- 字符(文本txt)
        * 数值型(掌握)
            * TINYINT 
            * SMALLINT
            * INT           -- 代表int
            * BIGINT        -- 代表long类型
            * FLOAT
            * DOUBLE
            create table table1(
                uid int, -- 如果省略不写了,默认的长度是11
                username varchar(20),
                password char(15)
            );
        * 逻辑性(了解)
            * BIT   是1或者0
        * 日期型(掌握)
            * DATE          -- 只有日期(年月日)
            * TIME          -- 只有时间(时分秒)
            * DATETIME      -- 有年月日和时分秒,如果传入的null,值就是null
            * TIMESTAMP     -- 有年月日和时分秒(如果传入的值是null,数据库默认获取当前的系统时间,作为值)
    3.创建表结构的练习
        create database day05;
        use day05;
        create table employee(
            id int,
            name varchar(20),
            gender char(5),
            birthday date,
            entryDate date,
            job varchar(30),
            sal double,
            resume text
        );

    删除表结构

    1.删除表结构
        * drop table 表名称;

    修改表结构

    1.添加一个新的字段
        * alter table 表名称 add 字段名称 数据类型(长度) 约束;
    2.修改字段的数据类型、长度或者约束
        * alter table 表名称 modify 字段名称 数据类型(长度) 约束;
    3.删除某一个字段
        * alter table 表名称 drop 字段名称;
    4.修改字段的名称
        * alter table 表名称 change 旧字段 新字段 数据类型(长度) 约束;
    5.修改表的名称
        * rename table 旧表名 to 新表名;
    6.练习 
        * 在上面员工表的基本上增加一个image列。
            * alter table employee add image varchar(30);
        * 修改job列,使其长度为60。
            * alter table employee modify job varchar(60);          
        * 删除gender列。
            * alter table employee drop gender;
        * 表名改为user。
            * rename table employee to user;
        * 列名name修改为username 
            * alter table user change name username varchar(30);

    查看表结构

    1.查询所有的表结构,前提条件,先切换到数据库中。
        * show tables;
    2.查询表结构的详细的信息
        * desc 表名称;
    3.查看表结构定义的信息
        * show create table 表名称;

    总结:表结构的增删改查

    1.创建表结构
        * 语句
            create table 表名称(
                字段 类型(长度),
                字段 类型(长度)
            );  
    2.查看表
        * show tables;
        * desc 表名称;         -- 查看表的详细的信息
    3.删除表
        * drop table 表名称;
    4.修改
        * alter table 表名称
            * add           -- 添加列
            * modify        -- 修改某列的类型或者长度或者约束
            * drop          -- 删除某列
            * change        -- 修改字段的名称
        * rename table 旧表名 to 新的表名;

    数据的SQL语句(CURD)

    插入数据(insert)

    1.添加数据,使用insert关键字来添加数据
        * insert into 表 (字段1,字段2,字段3) values (值1,值2,值3);        -- 向表中的指定的字段中添加值
        * insert into 表 values (值1,值2,值3,值4...);                    -- 向表中的所有的字段添加值
    2.注意实现
        * 插入的数据与字段数据的类型相同
        * 数据的大小应该在规定的范围内
        * 数据中的数据的列的位置和字段位置的相同的
        * 字符串和日期类型的数据,必须要使用单引号括起来
    3.向员工表中添加数据 v 
        * insert into user (username,job) values ('tom','it');
        * insert into user values (2,'tom2','2011-12-31','2015-4-10','it',8000,'haha','hehe');
        * insert into user values (3,'美美','2011-12-31','2015-4-10','it',8000,'haha','hehe');
        * insert into user values (4,'小风','2001-12-31','2015-4-10','it',5000,'haha','hehe');
        * insert into user values (5,'芙蓉','1983-12-31','2015-4-10','it',15000,'haha','hehe');
        * insert into user values (6,'熊大','2001-12-31','2015-4-10','it',7000,'haha','hehe');
        * insert into user values (7,'熊二','2001-12-31','2015-4-10','it',500,'haha','hehe');

    插入中文数据乱码

    1.插入中文,会产生乱码的问题。
    2.怎么产生?怎么解决?
        * 解决的方案,修改MySQL客户端的编码就可以了。改成GBK
    3.修改MySQL客户端的编码
        * 先把MySQL服务器停止
        * 找到MySQL安装的路径,找到my.ini的配置文件
        * 修改客户端的编码,改成gbk
            [client]
            port=3306
            [mysql]
            default-character-set=gbk
        * 重启动MySQL的服务

    删除数据(delete)

    1.删除语句的语法
        * delete from 表 where 条件;
            * 如果不加where ,默认删除所有的数据
            * 如果添加where条件,删除符合条件的数据
    2.删除所有的数据
        * delete from 表;
            * 一行一行的数据。
            * 支持事务的操作。事务是数据库中的特性。
        * truncate 表;
            * 先把整个表删除掉(数据也删除了),创建一个与原来一模一样的表。
    3.练习
        * 删除表中名称为'tom'的记录。
            * delete from user where username = 'tom';      
        * 删除表中所有记录。
            * 添加事务
                * start transaction;
                * delete from user where username = 'tom2';
                * rollback;
        * 使用truncate删除表中记录。
            * truncate user;

    修改数据(update)

    1.修改数据,使用update关键字来完成修改数据
        * update 表名称 set 字段1=值1,字段2=值2 where 条件;
        * 修改字段1和字段2的值
            * 如果没有where的关键字,说明修改的默认所有的记录
            * 如果有where的关键字,修改的是符合条件的记录
    2.注意
        * 如果要是没有where的条件子句,默认是修改所有的数据。
        * 如果有where的条件子句,修改的符合条件的数据。
    3.练习
        * 将所有员工薪水修改为5000元。
            * update user set sal = 5000;
        * 将姓名为'熊大'的员工薪水修改为3000元。
            * update user set sal = 3000 where username = '熊大';     
        * 将姓名为'熊二'的员工薪水修改为4000元,job改为ccc。
            * update user set sal = 4000,job='ccc' where username = '熊二';
        * 将小凤的薪水在原有基础上增加1000元。  
            * update user set sal = sal + 1000 where username = '小风';

    查询数据(select)

    语法:
        * select * from 表;                      -- 默认查询所有的字段的数据
        * select 字段1,字段2,字段3 from 表;     -- 查询指定的字段的数据
        * DISTINCT                                 -- 去除掉重复的关键字
        * 可以对查询的列进行运算
        * 查询语句中可以使用as的关键字,起别名。
            * 别名的真正的用法,采用的多表的查询,为了区分每张表,表起个别名。
            * as的关键字可以省略不写。中间需要使用空格
            * 一般都是给表来起别名
                * select s.username,s.math from stu s;
                * select s.username,u.username from stu s,user u
        * 使用where的条件语句,进行查询条件的过滤

    练习1:

    创建表,做练习
        create table stu(
            id int,
            username varchar(20),
            math int,
            english int,
            chinese int
        );
        insert into stu values (1,'美美',18,97,35);
        insert into stu values (2,'小凤',98,97,95);
        insert into stu values (3,'小花',88,90,77);
        insert into stu values (4,'熊大',79,89,95);
        insert into stu values (5,'熊二',15,11,89);

    练习2:

     * 查询表中所有学生的信息。
            * select * from stu;
            * select username,math,english,chinese from stu;
        * 查询表中所有学生的姓名和对应的英语成绩。
            * select username,english from stu;
        * 过滤表中重复数据。
            * select DISTINCT english from stu;
        * 在所有学生分数上加10分特长分
            * select username,math+10,english+10,chinese+10 from stu;
        * 统计每个学生的总分。
            * select username,(math+english+chinese) from stu;
    * 使用别名表示学生分数。
            * select username,(math+english+chinese) as t from stu;
        * 查询姓名为美美的学生成绩
            * select * from stu where username = '美美';
        * 查询英语成绩大于90分的同学
            * select username,english from stu where english > 90;
        * 查询总分大于200分的所有同学
            * select username,(math+english+chinese) from stu where (math+english+chinese) > 150;
            * select username,(math+english+chinese) as t from stu where t > 150;   -- 错误的

    where子句后可以使用的符号

    1.常用的符号
        *   >   <   <=   >=   =    <>(不等于)
        * in    -- 代表的范围。
            * select * from stu where math = 88;                -- 查询一条数据,条件是数学=88
            * select * from stu where math in (18,88,90);       -- 查询的结果可能是多条数据,数学的成绩需要在in值的范围内
        * like  -- 模糊查询
            * like关键字的值的写法
                * select * from stu where username like '张_';   -- 使用_占位符,结果:张飞 张三 张X   张翼德(不符合)
                * select * from stu where username like '张%';   -- 使用%占位符,结果是姓张的,张飞 张三 张翼德 只要姓张的都可以。
                * like '%张';        -- 结果:以张结尾的。飞张 医德张 解放路时间分离张
                * like '%张%';       -- 结果:只要包含张就可以  张  张飞 医德张 司法局水利局张是浪费加适量
            * 总结like的关键字
                * 条件需要使用单引号
                * 需要使用占位符
                    * _     -- 代表的一个位置
                    * %     -- 代表的多个位置
        * and       -- 
        * or        -- 
        * not       -- 
        * between … and 
    2.练习
        * 查询英语分数在 60-90之间的同学。
            * select username,english from stu where english > 60 and english < 90;
            * select username,english from stu where english between 60 and 90;
        * 查询数学分数为89,90,91的同学。
            * select username,math from stu where math in (88,90,91);       
        * 查询所有姓小的学生成绩。
            * select * from stu where username like '小%';       
        * 查询数学分>80,语文分>80的同学。
            * select * from stu where math > 80 and chinese > 80;
            * select * from stu where math > 80 or chinese > 80;
    3.总结查询的语句 
        * select 字段1,字段2 | *  from 表 where 条件的过滤;

    使用order by对结果进行排序

    1.语法
        * order by 字段 asc | desc;
            * asc       -- 代表升序(默认值)
            * desc      -- 代表降序
    2.注意
        * order by自己放在select的语句末尾。
        * select * from xx where xx order by xx;
    3.练习
        * 对数学成绩排序后输出。
            * select username,math from stu order by math asc;          -- 默认是升序
            * select username,math from stu order by math desc;
        * 对总分排序按从高到低的顺序输出
            * select username,(math+english+chinese) from stu order by (math+english+chinese) desc;     
            * select username,(math+english+chinese) as t from stu order by t desc;
        * 对学生成绩按照英语进行降序排序,英语相同学员按照数学降序
            * select username,english,math from stu order by english desc,math desc;
            * select username,english,math from stu order by english desc,math asc;
        * 对姓小的学生语文成绩升序排序输出
            * select username,chinese from stu where username like '小%' order by chinese asc;

    聚集函数

    1.什么是聚集函数:Excel表格。求数量,求和,平均值,最大值,最小值。
    2.聚集函数操作的都是某一列的数据。
    3.聚集函数
        * count()   -- 求数量
            * select count(*) | count(列名) from 表;       -- 某一列数据行的总数
            * 练习
                * 统计一个班级共有多少学生?
                    * select count(*) from stu;     
                    * select count(id) from stu;            
                * 统计数学成绩大于90的学生有多少个?
                    * select count(math) from stu where math > 60;
                    * select username,count(math) from stu where math > 60;     -- 不会这样查询
                * 统计总分大于220的人数有多少?
                    * select count(*) from stu where (math+english+chinese) > 220;
        * sum()     -- 求某一列数据的和
            * sum   注意:没有sum(*),求的某一列,sum对数值类型起作用。
            * 练习
                * 统计一个班级数学总成绩?
                    * select sum(math) from stu;                
                * 统计一个班级语文、英语、数学各科的总成绩
                    * select sum(chinese),sum(english),sum(math) from stu;              
                * 统计一个班级语文、英语、数学的成绩总和
                    * select sum(chinese)+sum(english)+sum(math) from stu;
                    * select sum(chinese+english+math) from stu;
                * 统计一个班级语文成绩平均分
                    * select sum(chinese)/count(*) from stu;
            * 注意的地方
                * sum函数可以忽略null值。
                * 编写一条修改语句
                    * update stu set math = null where username = '小花';
        * avg()     -- 求平均分
            * select avg(字段) from stu;
            * 练习
                * 求一个班级语文平均分?
                    * select avg(chinese) from stu;             
                * 求一个班级总分平均分
                    * select avg(math+english+chinese) from stu;
        * 最大值和最小值
            * max()     min()
            * 练习
                * 求班级最高分和最低分
                    * select max(math+english+chinese) from stu;
                    * select min(math+english+chinese) from stu;
    4.总结
        * 聚集函数,是函数,不要忘记编写()
        * 计算都是某一列的数据
        * 聚集函数
            * count()       -- 求数量
            * sum()         -- 求和
            * avg()         -- 平均值
            * max()         -- 最大值
            * min()         -- 最小值      

    分组查询

    1.分组产生效果?聚集函数与分组效果。
    2.select * from stu;        -- 查询所有的数据。默认是一组。
    3.可以使用关键字 group by sex 根据字段进行分组。    
    4.练习
        create table orders(
            id int,
            product varchar(20),
            price float
        );
        insert into orders(id,product,price) values(1,'电视',900);
        insert into orders(id,product,price) values(2,'洗衣机',100);
        insert into orders(id,product,price) values(3,'洗衣粉',90);
        insert into orders(id,product,price) values(4,'电视',900);
        insert into orders(id,product,price) values(5,'洗衣粉',90);
        insert into orders(id,product,price) values(6,'洗衣粉',90);
    5.练习 
        * 对订单表中商品归类后,显示每一类商品的总价?
            * select product,sum(price) from orders group by product;       -- 已经把原来的一组的数据,现在分成了三组。在统计数据的时候,以组为单位
        * 查询购买了几类商品,并且每类总价大于100的商品?
            * select product,sum(price) from orders group by product having sum(price) > 100;
        * 查询购买了几类商品,并且商品的价格需要大于100,每类总价大于100的商品?
            * select product,sum(price) from orders where price > 100 group by product having sum(price) > 100;
        * 注意
            * 使用where的条件,如果有分组,where的条件是分组之前的条件。
            * 新的关键字,having关键字进行分组的条件过滤。
    6.总结
    * where关键字后不能使用聚集函数,而having可以使用聚集函数!!

    总结:查询语句

    1.查询的语句
        * select ... from ... where ... group by ... having ... order by

    单表的约束

    主键

    1.可以把某一列字段声明主键,这一列的数据有如下特点
        * 非空
        * 唯一
        * 被引用   -- 当前主键的列,作为一条记录的标识。
    2.声明主键
        * 使用关键字 primary key 声明某一个字段为主键。
    3.测试主键
        * 创建新的数据
            create database day06;
            use day06;
            create table person(
                id int primary key,
                username varchar(20)
            );
        * 添加数据
            * insert into person values (1,'美美');
            * insert into person values (2,'小风');
    4.主键的自动增长
        * 主键的值特点,可以把主键的值交给数据库去维护。
        * 自动增长只能使用int 和 bigint 类型
        * 通过关键字 auto_increment
        * 演示自动增长
            drop table person;
            create table person(
                id int primary key auto_increment,
                username varchar(20)
            );
        * 添加数据的时候
            * insert into person values (null,'美美');
            * insert into person values (null,'小风');
            * insert into person values (2,'小花');
        * 如果删除了一条记录
            * delete from person where id = 2;      
    5.总结
        * 开发中,主键基本上是必须要设置的。

    唯一和非空

    1.唯一的约束
        * 可以把某个字段声明成唯一的值。
        * 使用该关键字 unique  
    2.非空
        * 可以把某个字段声明成非空的
        * 值是不能为空值。
        * 使用关键字 not null    
    3.练习
        create table person(
            id int primary key auto_increment,
            username varchar(30) unique,
            email varchar(30) not null
        );      
        create table orders();  

    多表的约束

     外键

    0.外键的约束:目的保证表结构中的数据的完整性!!
    1.模拟的过程
    2.有一个部门表,还有一个员工表。一个部门下有多个个员工。
    3.创建表结构
        create table dept(
            did int primary key auto_increment,
            dname varchar(30)
        );
        create table emp(
            eid int primary key auto_increment,
            ename varchar(30),
            sal double,
            dno int
        );
        create table emp(
            eid int primary key auto_increment,
            ename varchar(30),
            sal double,
            dno int,
            foreign key (dno) references dept (did);
        );
        * 向部门表中添加一些数据       
            * insert into dept values (1,'研发部');
            * insert into dept values (2,'人事部');
        * 想添加几个员工?员工属于哪一个部门?
            * insert into emp values (1,'美美',5000,2);       -- 美美员工属于人事部
            * insert into emp values (2,'小凤',6000,2);
            * insert into emp values (3,'熊大',16000,1);  
            * insert into emp values (4,'熊二',16005,1);  
        * 想直接删除掉部门?
            * delete from dept where did = 1;
            * 部门可以被删除,需要使用外键对两张表做约束!!
        * 直接删除掉部门,程序是可以删除的,但是不合理。通过设置外键的约束来避免这一类的问题的发生。
        * 保证数据的完整性!!
        * 外键多表的关系
            * 使用关键字 foreign key (dno) references dept (did);
            * 相当于 dno字段作为emp表的外键,值是从dept表中did取值。
        * 演示
            * 修改emp表的信息
            * alter table emp add foreign key (dno) references dept (did);
            * 再删除某个部门,如果该部门下有员工,删除是不成功!如果没有员工,可以删除部门的。
            * delete from dept where did = 1;

    多表的设计

    1.多表的设计存在3种方式
        * 一对多
            * 在多方表中,创建一个新的字段,作为当前表的外键,指向一方表的主键。
        * 多对多
            * 先创建一张中间表,中间表中至少包含2个字段,两个字段作为当前中间表的外键,指向原来多对多表的主键。
        * 一对一
            * 一对一,一般不处理,放在同一张表中就可以。
    2.学习:理论,怎么样来创建表结构(建表原则)。  

    多表设计练习

    多表的查询(去掉重复的数据)

    1.笛卡尔积
        * 两个结果的乘积
    2.编写SQL语句
        * select * from emp,dept;       -- 产生的结果就是笛卡尔积。

    内联接

    1.内连接分成两种方式
        * 普通内连接
            * 关键字是 select * from 表1 inner join 表2 on 条件
            * select * from dept inner join emp on dept.did = emp.dno;
        * 隐式内链接(使用的比较多)
            * 使用select * from 表1,表2 where 条件
            * select * from dept,emp where dept.did = emp.dno;
            * select * from dept as d,emp as e where d.did = e.dno;
            * select * from dept d,emp e where d.did = e.dno;
            * select d.*,e.ename,e.sal from dept d,emp e where d.did = e.dno;

    外联接

    1.外链接又分成左外链接和右外链接
        * 左外链接
            * 使用关键字 select * from 表1 left outer join 表2 on 条件
            * outer关键字省略不写
            * select * from dept left outer join emp on dept.did = emp.dno;
            * select * from dept left join emp on dept.did = emp.dno;
        * 右外链接
            * 使用关键字 select * from 表1 right outer join 表2 on 条件
            * outer关键字省略不写
            * select * from dept right outer join emp on dept.did = emp.dno;

    总结

    1.笛卡尔积
        * 两个结果的乘积,数据是重复,目的:去除掉重复的数据
    2.需要使用多表的查询
        * 内连接
            * 普通内连接
                * 表1 inner join 表2 on 主键和关键关联
            * 隐式内连接
                * select * from 表1,表2 where 条件;
        * 外连接
            * 左外连接
                * 表1 left outer join 表2 on          
            * 右外连接
                * 表1 right outer join 表2 on

    内联接和外联接的区别

    0.如果数据正常的话,不管是内连接和外连接,查询的结果都是一样的。   
    1.先向部门的表中添加一些数据
        * insert into dept values (3,'行政部');
        * insert into dept values (4,'销售部');    
    2.员工表中添加一些数据
        * insert into emp values (5,'冠希',4500,null);
        * insert into emp values (6,'柏芝',6500,null);
    3.查询的测试
        * 内链接
            * select * from dept d,emp e where d.did = e.dno;
            * 查询的结果都是主外键关联的数据
        * 左链接
            * select * from dept left outer join emp on dept.did = emp.dno;
            * 把左表中所有的数据全部都查询出来和有关联的数据
        * 右链接
            * select * from dept right outer join emp on dept.did = emp.dno;
            * 把右表中所有的数据全部都查询出来和有关联的数据
    4.总结
        * 内连接查询的结果都是有关系的数据
        * 左链接,先看SQL语句中哪个表是左表,把左表中的所有的数据全部都查询出来,和有关系的数据也会查询出来。
        * 右链接,先SQL语句中哪个表是右表,把右表中所有的数据全部查询出来,和有关系数据查询出来。

    子查询

    1.子查询,嵌套查询,一个select语句不能查询出结果的,可以通过多个select语句来查询结果。
    2.例子:查询出英语成绩大于英语平均分的同学?
        * 先计算出英语的平均分(select avg(english) from stu;)
        * 再编写select语句
            * select username,english from stu where english > (select avg(english) from stu);
    3.运算的符号
        * > < >= <= <>
        * >any      select * from stu where english >any 子查询的结果可能是 4, 5, 6      >any结果大于最小的就满足条件
        * >all      select * from stu where english >all 子查询的结果可能是 4, 5, 6      >all结果大于最大的就满足条件

    练习

    1.根据上午的部门表和员工的表来练习的。
        * 查看小凤所属的部门名称和员工名称?
            * 查询                -- 部门名称和员工名称
            * 几张表           -- 目标名称是从部门表查询,员工名称是员工查询。2张表
            * 条件                -- 笛卡尔积(去除掉笛卡尔积),ename='小风'
            * 编写SQL语句
                * select d.dname,e.ename from dept d,emp e where d.did = e.dno and e.ename = '小凤';
        * 统计每个部门的人数(按照部门名称统计)
            * 查询                -- 部门的人数,部门的名称
            * 几张表           -- 两张表
            * 条件                -- 笛卡尔积(去除掉笛卡尔积),按部门分组
            * SQL语句
                * select d.dname,count(*) from dept d,emp e where d.did = e.dno group by d.dname;   
        * 统计部门的平均工资(按部门名称统计)
            * select d.dname,avg(e.sal) from dept d,emp e where d.did = e.dno group by d.dname;
        * 统计部门的平均工资大于公司平均工资的部门
            * 查询                -- 查询部门
            * 两张表           
            * 条件                -- 笛卡尔积(去除掉笛卡尔积),要大于公司的平均工资(先计算出来),说明子查询
            * SQL语句
                * select d.dname,avg(e.sal) from dept d,emp e where d.did = e.dno group by d.dname having avg(e.sal) > (select avg(sal) from emp);

    项目

    数据列表加载流程:

    统一使用pojo转json输出给datagrid:

    用户列表查询:

    需求:

    功能描述及功能操作流程。

    操作流程:

    1、用户点击菜单,进入用户查询页面

    2、进入用户查询页面,默认查询到所有用户,默认显示了第一页的内容

    3、用户输入查询条件,查询用户信息

    datagrid执行流程

    Rownum的使用?

    分别说说MySQL和oracle的分页?

    oracle使用rownum加上嵌套子查询完成分页功能

    SELECT * FROM

    (

    SELECT A.*, ROWNUM RN

    FROM (SELECT * FROM TABLE_NAME) A

    WHERE ROWNUM <= 40

    )

    WHERE RN >= 21

    MySQL使用的是limit函数

    SELECT * FROM table LIMIT 5,10; //查询的是第6条到第15条数据,注意,10位偏移量。

  • 相关阅读:
    BZOJ5212 ZJOI2018历史(LCT)
    BZOJ5127 数据校验
    253. Meeting Rooms II
    311. Sparse Matrix Multiplication
    254. Factor Combinations
    250. Count Univalue Subtrees
    259. 3Sum Smaller
    156. Binary Tree Upside Down
    360. Sort Transformed Array
    348. Design Tic-Tac-Toe
  • 原文地址:https://www.cnblogs.com/yadongliang/p/8643931.html
Copyright © 2011-2022 走看看