Web学习笔记 - 第006天

项目开发流程

可行性分析 --- 做还是不做
需求分析 --- 做什么
概要设计
详细设计

UML --- ROSE / StarUML / EA(Enterprise Architect)
数据库设计 --- ER图 PowerDesigner

验证码

例子1:

public final class CommonUtil {
    private static final String CHARS = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
    private static final int MAX_LEN = CHARS.length();
    private static final int MAX_THETA_DEGREE = 25;
    
    private CommonUtil() {
        throw new AssertionError();
    }
    
    public static int randomInt(int min, int max) {
        return (int) (Math.random() * (max - min)) + min;
    }
    
    public static Color randomColor() {
        int r = randomInt(0, 256);
        int g = randomInt(0, 256);
        int b = randomInt(0, 256);
        return new Color(r, g, b);
    }
    
    public static String verifyCodeStr(int len) {
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < len; i++) {
            char ch = CHARS.charAt(randomInt(0, MAX_LEN));
            sb.append(ch);
        }
        return sb.toString();
    }
    
    public static BufferedImage codeStrToImage(String codeStr, int width ,int height) {
        BufferedImage image = new BufferedImage(width, height, 1);
        Graphics g = image.getGraphics();
        g.setColor(Color.WHITE);
        g.fillRect(0, 0, width, height);
                for (int i = 0; i < 10; i++) {
            g.setColor(randomColor());
            g.drawLine(randomInt(0, 80), randomInt(0, 30),
                    randomInt(0, 80), randomInt(0, 30));
        }
        int size = (width - 20) / codeStr.length();
        size = size < height ? size : height;
        g.setFont(new Font("Consolas", Font.BOLD, size));
        for (int i = 0; i < codeStr.length(); i++) {
            char ch = codeStr.charAt(i);
            double theta = Math.PI / 180 / (i + 1) * 
                    randomInt(-MAX_THETA_DEGREE, MAX_THETA_DEGREE);
            ((Graphics2D) g).rotate(theta);
            g.setColor(randomColor());
            g.drawString(String.valueOf(ch), 10 + i * size, height / 2 + randomInt(4, 10));
            ((Graphics2D) g).rotate(-theta);
        }
        return image;
    }
}

例子2:

public final class MyUtil {
    public static final String CHARS = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
    public static final int UNIT_CODE_SIZE = 45;
    public static final int MAX_THETA_DEGREE = 15;
    
    private MyUtil() {
        throw new AssertionError();
    }
    
    public static Image generateImageVC(int len) {
        int width = UNIT_CODE_SIZE * len + 20;
        int height = UNIT_CODE_SIZE;
        BufferedImage image = new BufferedImage(width, height, 1);
        Graphics graphics = image.getGraphics();
        graphics.setColor(Color.WHITE);
        graphics.fillRect(0, 0, width, height);
        String vc = generateVC(len);
        int size = (int) (UNIT_CODE_SIZE * 0.618);
        graphics.setFont(new Font("Arial", Font.PLAIN, size));
        for (int i = 0; i < len; i++) {
            // 旋转画布后再绘制验证码(歪曲文字增加OCR的难度)
            double theta = Math.PI / 180 / (i + 1) * 
                    randomInt(-MAX_THETA_DEGREE, MAX_THETA_DEGREE);
            ((Graphics2D) graphics).rotate(theta);
            // 将画笔设置为随机颜色
            graphics.setColor(randomColor());
            int x = 20 + i * UNIT_CODE_SIZE;
            int y = 10 + (int) (UNIT_CODE_SIZE *0.382);
            graphics.drawString(vc.substring(i, i + 1), x, y);
            // 旋转后要将画布转回去否则多次的旋转会产生叠加效果
            ((Graphics2D) graphics).rotate(-theta);
        }
        return image;
    }
    
    public static String generateVC(int len) {
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < len; i++) {
            int randomIndex = (int) (Math.random() * CHARS.length());
            char ch = CHARS.charAt(randomIndex);
            sb.append(ch);
        }
        return sb.toString();
    }
    
    public static Color randomColor() {
        return new Color(randomInt(0, 255), randomInt(0, 255), randomInt(0, 255));
    }
    
    public static int randomInt(int min, int max) {
        return (int) (Math.random() * (max - min + 1) + min);
    }
    
    public static double randomDouble(double min, double max) {
        return Math.random() * (max - min + 1) + min;
    }
}

数据库

图片 - blob

photo blob, -- Binary Large Object 二进制大对象
clob -- Character

如果有xxx表就先删除

drop table if exists tb_dept;

外键

  • 外键约束(参照完整性)
dno integer, 
/constraint fk_emp_dno/ foreign key(dno) references tb_dept(dno)
  • 添加外键约束
alter table tb_emp add constraint fk_emp_dno foreign key (dno) references tb_dept
(dno) on update cascade on delete set null;

查询

  • 查询所有行所有列
select * from tb_dept;
select * from tb_emp;
  • 投影
select ename, job, sal from tb_emp;
  • 别名 as 可以省略
select ename as 姓名, job as 职位, sal as 月薪 
from tb_emp;
select ename 姓名, job 职位, sal 月薪 
from tb_emp;
  • 筛选
select ename, job, sal from tb_emp
where sal>=5000;
select ename, job, sal from tb_emp
where sal>=5000 or sal<=2000;
select ename, job, sal from tb_emp
where sal>=3000 and sal<=5000;
select ename, job, sal from tb_emp
where sal between 3000 and 5000;
  • 模糊
select ename, job, sal from tb_emp
where ename like '张%'; -- %: 0个或任意多个字符
select ename, job, sal from tb_emp
where ename like '%张%';
select ename, job, sal from tb_emp
where ename like '张_'; -- _: 精确匹配一个字符
  • 排序
select ename, job, sal from tb_emp
where ename like '张%' order by sal; -- 默认升序asc
select ename, job, sal from tb_emp
where ename like '张%' order by sal desc;
  • 连接
  • 自然连接
select ename, job, sal, dname 
from tb_emp as t1, tb_dept as t2
where t1.dno=t2.dno and ename like '张%';
  • 内连接 先写连表条件,后写筛选条件
select ename, job, sal, dname 
from tb_emp as t1 inner join tb_dept as t2
on t1.dno=t2.dno;
  • 分组查询/聚合函数
select max(sal) as maxSal from tb_emp;
select min(sal) as minSal from tb_emp;
select avg(sal) as avgSal from tb_emp;
select sum(sal) as sumSal from tb_emp;
select count(sal) as total from tb_emp;
select dno, avg(sal) from tb_emp
group by dno;
  • 子查询 把一个查询的结果拿来作为另一个查询的条件和结果来使用
select dname, total from
(select dno, count(dno) as total from tb_emp
group by dno) as t1 inner join tb_dept as t2
on t1.dno=t2.dno;
select ename, job, sal from tb_emp
where sal=(select max(sal) from tb_emp);
  • 分页
select * from tb_emp 
order by sal desc limit 0,5;
select * from tb_emp
order by sal desc limit 5,5;
select * from tb_emp
order by sal desc limit 10,5;

作业

  • 4.求挣最高薪水的员工(BOSS除外)的姓名
select ename, max(sal) from tb_emp where job<>'总裁';
  • 5.查询薪水超过平均薪水的员工的姓名和工资
select ename, sal from tb_emp as t1,
(select avg(sal) as avgSal from tb_emp) as t2
where t1.sal>=t2.avgSal;
  • 6.查询薪水超过其所在部门平均薪水的员工的姓名和工资
select ename, sal, avgSal from
(select dno, avg(sal) as avgSal from tb_emp group by dno) as t1, 
tb_emp as t2 
where t1.dno=t2.dno and t2.sal>t1.avgSal;
  • 7.查询部门中薪水最高的人姓名、工资和所在部门名称
select ename, sal, dname from 
(select dname, maxSal from
(select dno, max(sal) as maxSal from tb_emp group by dno) as t1 inner join tb_dept as t2
on t1.dno=t2.dno) as t3, tb_emp as t4
where t3.maxSal=t4.sal;
  • 8.哪些人是主管
select ename from
(select mgr from tb_emp group by mgr) as t1, tb_emp as t2
where t1.mgr=t2.eno;
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,980评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,178评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,868评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,498评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,492评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,521评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,910评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,569评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,793评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,559评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,639评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,342评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,931评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,904评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,144评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,833评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,350评论 2 342

推荐阅读更多精彩内容

  • 昨日作业 4.求挣最高薪水的员工(BOSS除外)的姓名 5.查询薪水超过平均薪水的员工的姓名和工资 6.查询薪水超...
    迷茫o阅读 126评论 0 0
  • 1.简介 数据存储有哪些方式?电子表格,纸质文件,数据库。 那么究竟什么是关系型数据库? 目前对数据库的分类主要是...
    乔震阅读 1,695评论 0 2
  • 5.多表查询 多表查询 目的:从多张表获取数据 前提:进行连接的多张表中有共同的列 等连接 通过两个表具有相同意义...
    乔震阅读 1,192评论 0 0
  • SQL ==SQLPLUS== DML(Data Manipulation Language,数据操作语言)---...
    蝌蚪1573阅读 577评论 0 4
  • 查询是数据的一个重要操作。用户发送查询请求,经编译软件变异成二进制文件供服务器查询,后返回查询结果集给用户,查询会...
    产品小正阅读 1,358评论 0 2