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位偏移量。

  • 相关阅读:
    android listview 圆角的实现方案,模仿Iphone的UITableView
    在android编程中插入背景图片
    iOS开发UI篇—UIPickerView控件简单介绍
    iOS开发UI篇章 15-项目中的常见文件
    iOS开发UI篇章之通知中心(NSNotificationCenter)
    iOS开发UI篇章之应用管理的九宫格坐标计算
    iOS开发UI篇章之-Button基础
    Xcode-Run和快捷键
    Css基础-介绍及语法
    CSDN首页> 移动开发 直接拿来用!最火的Android开源项目(完结篇)
  • 原文地址:https://www.cnblogs.com/yadongliang/p/8643931.html
Copyright © 2011-2022 走看看