JAVA

servlet:

负责解决接收和响应客户请求,逻辑是:请求经过web.xml解析以后去往servlet类,可以是java文件,由servlet类及相关参数和方法解决该请求对应的应用或功能。
实例:基于tomcat 8.0.39、eclipse mars 2、jdk1.8
屏幕快照 2017-01-18 16.10.14

web.xml
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
  <display-name>day08_servlet</display-name>
  
  <servlet>
    <servlet-name>servletDemo1</servlet-name>
    <servlet-class>com.jjd.servlet.ServletDemo1</servlet-class>
  </servlet>
  
  <servlet-mapping>
    <servlet-name>servletDemo1</servlet-name>
    <url-pattern>/demo1</url-pattern>
  </servlet-mapping>
  
</web-app>
servletDemo1.java

import java.io.IOException;

import javax.servlet.Servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

public class ServletDemo1 implements Servlet{
    @Override
    public void service(ServletRequest arg0, ServletResponse arg1) throws ServletException, IOException {
        // TODO Auto-generated method stub
        System.out.println("hello servlet");
        
    }

页面打开http://localhos:8080/day08_servlet/demo1,既可以在跌看到执行输出结果:hello servlet

servlet主要方法:
1. service:服务,servlet类被调用时service就执行一次
2. destory:销毁,当应用被卸载时,该方法被调用并执行输出
3. init:初始化,servlet类被调用时就执行一次,直到下次被销毁后重新加载才会再次执行
4. getServletConfig:获取servlet设置信息
servlet内部方法顺序:实例化>>初始化init>>处理响应service>>销毁destory

servlet在服务器启动时就启动,开启实例化,并对多个servlet进行排序:load-on-startup;序号越大优先级越小,1是tomcat自己的servlet,优先级最高
    <servlet-name>servletDemo1</servlet-name>
    <servlet-class>com.jjd.servlet.ServletDemo1</servlet-class>
<load-on-startup>2</load-on-startup>
</servlet>
<servlet-mapping>
    <servlet-name>servletDemo1</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>
servlet三种创建方式

1、javax.servlet.Servlet接口
2、适配器模式:继承方法
javax.servlet.GenericServlet类;
GenericServlet继承了servlet方法和类,可以需要哪个调取哪个.
3、模版方式:模版方法(最常用)
javax.servlet.http.HttpServlet类
模版方式主要继承流程:用户实例>>HttpServlet>>DenericService>>Servlet

url-pattern通配符的方法:
url-pattern: *.do
url-pattern: /*
url-pattern: /abc/*

通配符优先级顺序:绝对匹配 > / > 后缀名
如果url-pattern使用/,表示执行默认映射,所有资源都是servlet

servlet线程运行安全方法:多用局部变量,少用局部变量

ServletConfig 获取配置信息

1、web.xml内的init-param信息,如下:

  <servlet>
    <servlet-name>servletConfigDemo1</servlet-name>
    <servlet-class>com.jjd.servletConfig.ServletConfigDemo1</servlet-class>
    <init-param>
        <param-name>nameID</param-name>
        <param-value>yangshun test</param-value>
    </init-param>
  </servlet>
  <servlet-mapping>
    <servlet-name>servletConfigDemo1</servlet-name>
    <url-pattern>/</url-pattern>
  </servlet-mapping>

2、在代码中获取init-param中的nameID信息方法:

package com.jjd.servletConfig;

import java.io.IOException;

import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class ServletConfigDemo1 extends HttpServlet {

        private ServletConfig config;

    public void init(ServletConfig config) throws ServletException {
        this.config = config;
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String nameID = config.getInitParameter("nameID");
        System.out.println(nameID);
    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    }

}
        //第一种方法:
        String nameID = config.getInitParameter("nameID");
        System.out.println(nameID);
//      第二种方法:
        String nameID = this.getInitParameter("nameID");
        System.out.println(nameID);
//      第三种方法:
        String nameID = this.getServletConfig().getInitParameter("nameID");
        System.out.println(nameID);
ServletContext :代表的是整个应用。一个应用只有一个ServletContext对象。单实例。

域对象、资源路径、资源信息

获取域对象:getAttribute()

ServletContext运行逻辑:servlet1向ServletContext写入key:value值(方法:setAttribute("string key","object value")),然后由servlet2从ServletContext中调取key,输出value值(方法:getAttribute("key"))

获取全局配置信息:getInitParameter()

在web.xml中设置以下参数:

  <context-param>
    <param-name>keyContext</param-name>
    <param-value>yangshunContext</param-value>
  </context-param>

调取文件代码如下:

package com.jjd.servlet;

import java.io.IOException;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class ServletContextDemo3 extends HttpServlet {

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String keycontext = this.getServletContext().getInitParameter("keyContext");
        System.out.println(keycontext);
    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    }

}
获取资源路径 getRealPath():可以获取当前应用的任何路径下的任何资源
    private void test1() {
        String path = this.getServletContext().getRealPath("/wtpwebapps/day08_servletContext/WEB-INF/a.properties");
        System.out.println(path);
        Properties pro = new Properties();
        pro.load(new FileInputStream(path));
        System.out.println(pro.getServletContext("key"));
    }
servlet转发 getRequestDispatcher()

servlet1转发给servlet2处理
servlet1代码:

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("demo5帮我");
        System.out.println("我帮不了,转给demo6");
        ServletContext app = this.getServletContext();
//      RequestDispatcher rd = app.getRequestDispatcher("/demo6");
//      app.getRequestDispatcher("/demo6").forward(request, response);
        app.getRequestDispatcher("/demo6").forward(request, response);
        
        System.out.println("事情办好了");
    }

servlet2代码:

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("我是demo6");
    }

执行结果:

我帮不了,转给demo6
我是demo6
事情办好了

mysql数据库

mysql安装、配置;DDL数据库定义(create、drop、alter);DML表内数据操作(update、insert、delete);DQL数据查询(简单查询、复杂查询)(select);DCL数据控制;数据完整性;多表设计;事务;备份、恢复。

DBMS:DataBase Management System;就是各家的数据库管理软件,比如mysql、orcal、mariaDB、DB2

java与mysql对应的关系:java的一个实体类(针对数据库编写的对象)对应一个mysql的行

mysql5.5以上版本改密码:
# wget http://dev.mysql.com/get/mysql-community-release-el7-5.noarch.rpm
# rpm -ivh mysql-community-release-el7-5.noarch.rpm
# yum install mysql-community-server

修改数据库密码:

# mysql -uroot -p  //默认没有密码
mysql> set password for ‘root’@‘localhost’ = password('mypasswd');
mysql> exit
搞定!

远程授权连接数据库:

GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'mypassword' WITH GRANT OPTION;
FLUSH   PRIVILEGES;
DDL操作:

mysql: database>tables>desc(字段)

mysql>show create database mydb1; //显示数据库的属性
mysql> show character set; //显示表的字符集
mysql> create database mydb1 character set utf8 collate utf8_general_ci //创建新数据库并指定字符集
mysql>alter database mydb1 character set utf8 collate utf8_general_ci; //修改指定数据库的字符集
mysql>select databses(); //显示当前在用数据库名

java字符类型:四类八种

给指定的表创建内部字段(列)
create table 表名(
字段名1 字段类型,
字段名2 字段类型,

字段名n 字段类型
);

屏幕快照 2017-01-19 12.53.48

mysql>SHOW TABLES; //显示表名
mysql>show create table 表名\G; //格式化显示表内字段属性
mysql>DESC 表名; //显示表内列名
alter table 表名 add image blob; //向表内添加列
mysql>alter table 表名 modify job varchar(60); //修改表内列长度
mysql>alter table 表名 drop 列名; //删除表内一列,一次只能删除一列
mysql>rename table 原表名 to 新表名; //修改表名
mysql>alter table 表名 change 老列名 新列名 (字符集(长度)) //修改指定列名为新列名,并设定字符集和长度

DML操作:

mysql>insert into 表名(列名1,列名2….) values(列名1值,列名2值,…….)
mysql>update 表名 set 列名1=value1,列名2=value2 where 列名=value;
delete from 表名 where 列名=value;

-- 查询
SELECT * FROM emp;

-- 向emp插入数据
INSERT INTO emp(id,name,gender,birthday,salary,entry_date,resume)
VALUES(1,'tom','m','2015-09-24',10000,'2015-09-25','good bay');

INSERT INTO emp(id,name,gender,birthday,salary,entry_date,resume)
VALUES(2,'jertty','f','2015-09-24',10000,'2015-09-25','good girl');

INSERT INTO emp(id,name,gender,birthday,salary,entry_date,resume)
VALUES(3,'张三','m','2015-09-24',10000,'2015-09-25','good boy');

INSERT INTO emp(id,name,gender,birthday,salary,job,entry_date,resume)
VALUES(4,'张三','m','2015-09-24',10000,'hhh','2015-09-25','good boy');


-- 修改单元格数据
UPDATE emp SET salary=5000;

UPDATE emp SET salary=15000 WHERE NAME='张三';

UPDATE emp SET salary=6000 WHERE job='hhh';

UPDATE emp SET salary=9000,job='kkk' WHERE NAME='jertty';

-- 删除固定行
DELETE FROM emp WHERE NAME='张三';

-- 删除表
DELETE FROM emp;
TRUNCATE TABLE emp;

DQL操作:

selete 列名 from 表名
【where–>group by–>having–>order by】
屏幕快照 2017-01-19 16.19.10

查询操作:
基本条件查询
SELECT dname,loc FROM dept;  //查询dept的dname和loc列数据
SELECT * FROM dept;

实例:

DELETE FROM dept WHERE dname='ACCOUNTING';

SELECT * FROM dept;

insert into `mydb1`.`stu` ( `sid`, `sname`, `age`, `gender`) values ( 's_1003', 'chenb', '25', 'male');

SELECT dname,loc FROM dept;

SELECT * FROM emp2 WHERE ename IN ('SCOTT','KING');

SELECT * FROM emp2 WHERE ename NOT IN ('SCOTT','KING');

SELECT * FROM emp2 WHERE ename IS NULL;

SELECT * FROM emp2 WHERE ename IS NOT NULL;

SELECT * FROM emp2 WHERE age BETWEEN 20 AND 50;

SELECT * FROM stu WHERE gender!='male';
模糊查询
通配符:
    _ 任意一个字符
    % 任意0~n个字符

当想查询姓名中包含a字母的学生时就需要使用模糊查询了。模糊查询需要使用关键字LIKE。
3.1 查询姓名由5个字母构成的学生记录
SELECT *
FROM stu
WHERE sname LIKE '_____';
模糊查询必须使用LIKE关键字。其中 “_”匹配任意一个字母,5个“_”表示5个任意字母。

3.2 查询姓名由5个字母构成,并且第5个字母为“i”的学生记录
SELECT *
FROM stu
WHERE sname LIKE '____i';

3.3 查询姓名以“z”开头的学生记录
SELECT *
FROM stu
WHERE sname LIKE 'z%';
其中“%”匹配0~n个任何字母。

3.4 查询姓名中第2个字母为“i”的学生记录
SELECT *
FROM stu
WHERE sname LIKE '_i%';

3.5 查询姓名中包含“a”字母的学生记录
SELECT *
FROM stu
WHERE sname LIKE '%a%';

字段控制查询

4.1 去除重复记录
去除重复记录(两行或两行以上记录中系列的上的数据都相同),例如emp表中sal字段就存在相同的记录。当只查询emp表的sal字段时,那么会出现重复记录,那么想去除重复记录,需要使用DISTINCT:
SELECT DISTINCT sal FROM emp;

4.2 查看雇员的月薪与佣金之和
  因为sal和comm两列的类型都是数值类型,所以可以做加运算。如果sal或comm中有一个字段不是数值类型,那么会出错。
SELECT *,sal+comm FROM emp;

comm列有很多记录的值为NULL,因为任何东西与NULL相加结果还是NULL,所以结算结果可能会出现NULL。下面使用了把NULL转换成数值0的函数IFNULL:
SELECT *,sal+IFNULL(comm,0) FROM emp;

4.3 给列名添加别名
在上面查询中出现列名为sal+IFNULL(comm,0),这很不美观,现在我们给这一列给出一个别名,为total:
SELECT *, sal+IFNULL(comm,0) AS total FROM emp;
给列起别名时,是可以省略AS关键字的:
SELECT *,sal+IFNULL(comm,0) total FROM emp;

排序

查询所有学生记录,按年龄升序排序
SELECT *
FROM stu
ORDER BY sage ASC;
或者
SELECT *
FROM stu
ORDER BY sage;

查询所有学生记录,按年龄降序排序
SELECT *
FROM stu
ORDER BY age DESC;

查询所有雇员,按月薪降序排序,如果月薪相同时,按编号升序排序
SELECT * FROM emp
ORDER BY sal DESC,empno ASC;

聚合函数

聚合函数是用来做纵向运算的函数:
COUNT():统计指定列不为NULL的记录行数;
MAX():计算指定列的最大值,如果指定列是字符串类型,那么使用字符串排序运算;
MIN():计算指定列的最小值,如果指定列是字符串类型,那么使用字符串排序运算;
SUM():计算指定列的数值和,如果指定列类型不是数值类型,那么计算结果为0;
AVG():计算指定列的平均值,如果指定列类型不是数值类型,那么计算结果为0;

COUNT
当需要纵向统计时可以使用COUNT()。
查询emp表中记录数:
SELECT COUNT(*) AS cnt FROM emp;

查询emp表中有佣金的人数:
SELECT COUNT(comm) cnt FROM emp;
注意,因为count()函数中给出的是comm列,那么只统计comm列非NULL的行数。

查询emp表中月薪大于2500的人数:
SELECT COUNT(*) FROM emp
WHERE sal > 2500;

统计月薪与佣金之和大于2500元的人数:
SELECT COUNT(*) AS cnt FROM emp WHERE sal+IFNULL(comm,0) > 2500;

查询有佣金的人数,以及有领导的人数:
SELECT COUNT(comm), COUNT(mgr) FROM emp;

SUM和AVG
当需要纵向求和时使用sum()函数。
查询所有雇员月薪和:
SELECT SUM(sal) FROM emp;

查询所有雇员月薪和,以及所有雇员佣金和:
SELECT SUM(sal), SUM(comm) FROM emp;

查询所有雇员月薪+佣金和:
SELECT SUM(sal+IFNULL(comm,0)) FROM emp;

统计所有员工平均工资:
SELECT SUM(sal), COUNT(sal) FROM emp;
或者
SELECT AVG(sal) FROM emp;

MAX和MIN
查询最高工资和最低工资:
SELECT MAX(sal), MIN(sal) FROM emp;

查询管关键字的顺序
分组查询

当需要分组查询时需要使用GROUP BY子句,例如查询每个部门的工资和,这说明要使用部分来分组。

分组查询
查询每个部门的部门编号和每个部门的工资和:
SELECT deptno, SUM(sal)
FROM emp
GROUP BY deptno;

查询每个部门的部门编号以及每个部门的人数:

SELECT deptno,COUNT(*)
FROM emp
GROUP BY deptno;

查询每个部门的部门编号以及每个部门工资大于1500的人数:

SELECT deptno,COUNT(*)
FROM emp
WHERE sal>1500
GROUP BY deptno;

HAVING子句
查询工资总和大于9000的部门编号以及工资和:
SELECT deptno, SUM(sal)
FROM emp
GROUP BY deptno
HAVING SUM(sal) > 9000;
  
注:having与where的区别:
1.having是在分组后对数据进行过滤.
where是在分组前对数据进行过滤

having后面可以使用分组函数(统计函数)
where后面不可以使用分组函数。
WHERE是对分组前记录的条件,如果某行记录没有满足WHERE子句的条件,那么这行记录不会参加分组;而HAVING是对分组后数据的约束。

LIMIT:分页

LIMIT用来限定查询结果的起始行,以及总行数。

查询5行记录,起始行从0开始
SELECT * FROM emp LIMIT 0, 5;

注意,起始行从0开始,即第一行开始!

查询10行记录,起始行从3开始
SELECT * FROM emp LIMIT 3, 10;

分页查询
如果一页记录为10条,希望查看第3页记录应该怎么查呢?
第一页记录起始行为0,一共查询10行;
第二页记录起始行为10,一共查询10行;
第三页记录起始行为20,一共查询10行;
分页查询
查询语句书写顺序:select – from- where- group by- having- order by-limit
查询语句执行顺序:from – where -group by – having – select – order by-limit

数据完整性:

作用:保证用户输入的数据保存到数据库中是正确的。
确保数据的完整性 = 在创建表时给表中添加约束
完整性的分类:
实体完整性:
域完整性:
引用完整性:

1、实体完整性
实体:即表中的一行(一条记录)代表一个实体(entity)
实体完整性的作用:标识每一行数据不重复。
约束类型: 主键约束(primary key) 唯一约束(unique) 自动增长列(auto_increment)

1.1主键约束(primary key)
注:每个表中要有一个主键。
特点:数据唯一,且不能为null
例:
第一种添加方式:
CREATE TABLE student(
id int primary key,
name varchar(50)
);
第二种添加方式:此种方式优势在于,可以创建联合主键
CREATE TABLE student(
id int,
name varchar(50),
primary key(id)
);
CREATE TABLE student(
classid int,
stuid int,
name varchar(50),
primary key(classid,stuid)
);
第三种添加方式:
CREATE TABLE student(
id int,
name varchar(50)
);
ALTER TABLE student ADD PRIMARY KEY (id);
1.2唯一约束(unique):
特点:数据不能重复。
CREATE TABLE student(
Id int primary key,
Name varchar(50) unique
);

1.3自动增长列(auto_increment)

sqlserver数据库 (identity) oracle数据库( sequence)

给主键添加自动增长的数值,列只能是整数类型
CREATE TABLE student(
Id int primary key auto_increment,
Name varchar(50)
);

INSERT INTO student(name) values(‘tom’);

2﹜ 域完整性
域完整性的作用:限制此单元格的数据正确,不对照此列的其它单元格比较
域代表当前单元格
域完整性约束:数据类型 非空约束(not null) 默认值约束(default)

check约束(mysql不支持)check(sex='男' or sex='女')
1.1 数据类型:(数值类型、日期类型、字符串类型)
1.2 非空约束:not null
CREATE TABLE student(
Id int pirmary key,
Name varchar(50) not null,
Sex varchar(10)
);

INSERT INTO student values(1,’tom’,null);

1.3 默认值约束 default
CREATE TABLE student(
Id int pirmary key,
Name varchar(50) not null,
Sex varchar(10) default ‘男’
);

insert into student1 values(1,'tom','女');
insert into student1 values(2,'jerry',default);
3﹜ 引用完整性(参照完整性)
外键约束:FOREIGN KEY
例:
CREATE TABLE student(
sid int pirmary key,
name varchar(50) not null,
sex varchar(10) default ‘男’
);

create table score(
id int,
score int,
sid int , — 外键列的数据类型一定要与主键的类型一致
CONSTRAINT fk_score_sid foreign key (sid) references student(id)
);
第二种添加外键方式。
ALTER TABLE score1 ADD CONSTRAINT fk_stu_score FOREIGN KEY(sid) REFERENCES stu(id);
4、 表与表之间的关系
λ 一对一:例如t_person表和t_card表,即人和身份证。这种情况需要找出主从关系,即谁是主表,谁是从表。人可以没有身份证,但身份证必须要有人才行,所以人是主表,而身份证是从表。设计从表可以有两种方案:
¬ 在t_card表中添加外键列(相对t_user表),并且给外键添加唯一约束;
¬ 给t_card表的主键添加外键约束(相对t_user表),即t_card表的主键也是外键。
λ 一对多(多对一):最为常见的就是一对多!一对多和多对一,这是从哪个角度去看得出来的。t_user和t_p的关系,从t_user来看就是一对多,而从t_p的角度来看就是多对一!这种情况都是在多方创建外键!
λ 多对多:例如t_stu和t_teacher表,即一个学生可以有多个老师,而一个老师也可以有多个学生。这种情况通常需要创建中间表来处理多对多关系。例如再创建一张表t_stu_tea表,给出两个外键,一个相对t_stu表的外键,另一个相对t_teacher表的外键。

JDBC:

四个核心对象:
DriverManager:用于注册驱动
Connection:与数据库创建链接
Statement:操作数据库sql语句对象
ResultSet:结果集或一张虚拟表的封装

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值