文章目录
- JavaWEB01:MySQL基础——数据库相关概念、MySQL安装和配置、基础的SQL语句
- JavaWEB02:MySQL高级——约束、数据库设计、多表查询、事务
- 2.1 简答题
- 2.2 Mysql查询加强
- JavaWEB03:JDBC
- 3.1 简单题
- 3.2 Mysql查询加强
- JavaWEB04:Maven Mysql查询练习day4
- 4.1 简答题
- 4.2 Mysql查询加强
- JavaWEB05:Mybatis
- JavaWEB06:Mybatis综合练习
- JavaWEB07:HTML、CSS
- 7.1 编写如下页面
- 7.2 使用mybatis框架完成。
- JavaWEB08:JavaScript
- 8.1 数据库开发 - Mybatis 单元作业
- 8.2 前端作业
JavaWEB01:MySQL基础——数据库相关概念、MySQL安装和配置、基础的SQL语句
问题一
通过数据库存储数据相较于文件存储数据好处是什么?
可以持久化存储数据,节约内存空间
问题二
SQL语句的分类有哪些?每一种分类的作用?
DDL(Data Definition Language) : 数据定义语言,用来定义数据库对象:数据库,表,列等
DML(Data Manipulation Language) 数据操作语言,用来对数据库中表的数据进行增删改
DQL(Data Query Language) 数据查询语言,用来查询数据库中表的记录(数据)
问题三
创建表的sql语句格式?
create table 表名;
问题四
添加多条数据有几种方式?每种方式对应的格式是什么?
给指定列添加数据
INSERT INTO 表名(列名1,列名2,…) VALUES(值1,值2,…);
给全部列添加数据
INSERT INTO 表名 VALUES(值1,值2,…);
批量添加数据
INSERT INTO 表名(列名1,列名2,…) VALUES(值1,值2,…),(值1,值2,…),(值1,值2,…)…;
INSERT INTO 表名 VALUES(值1,值2,…),(值1,值2,…),(值1,值2,…)…;
问题五
修改数据的sql语句格式?
UPDATE 表名 SET 列名1=值1,列名2=值2,… [WHERE 条件] ;
问题六
删除语句的格式?
DELETE FROM 表名 [WHERE 条件] ;
JavaWEB02:MySQL高级——约束、数据库设计、多表查询、事务
2.1 简答题
1.1 简答题目一
约束有哪些分类?各自的作用是什么?
答: 主键约束,primary key 一行数据的唯一标识,要求非空且唯一
非空约束,not null 保证列中所有的数据不能有null值
唯一约束,unique 保证列中所有数据各不相同。
检查约束,check 保证列中的值满足某一条件
默认约束,default 保存数据时,未指定值则采用默认值
外键约束,foreign key 外键用来让两个表的数据之间建立链接,保证数据的一致性和完整性
1.2 简答题目二
多表关系有哪些?每种关系的建表原则是什么?
答:
一对一,一对一关系多用于表拆分,将一个实体中经常使用的字段放一张表,不经常使用的字段放另一张表,用于提升查询性能
一对多,在多的一方建立外键,指向一的一方的主键
多对多,建立第三张中间表,中间表至少包含两个外键,分别关联两方主键
1.3 简答题目三
内连接查询的SQL格式是?
答:-- 隐式内连接
SELECT 字段列表 FROM 表1,表2… WHERE 条件;
-- 显示内连接
SELECT 字段列表 FROM 表1 [INNER] JOIN 表2 ON 条件;
1.4 简答题目四
外连接查询分类有哪些?SQL格式是?
答:
-- 左外连接
SELECT 字段列表 FROM 表1 LEFT [OUTER] JOIN 表2 ON 条件;
-- 右外连接
SELECT 字段列表 FROM 表1 RIGHT [OUTER] JOIN 表2 ON 条件;
2.2 Mysql查询加强
练习1:
CREATE TABLE product(
pid INT PRIMARY KEY,#主键ID
pname VARCHAR(20),#商品名称
price DOUBLE,#商品价格
category_name VARCHAR(32)#商品分类名称
);
#添加如下数据
(1,'联想电脑',5000,'电脑办公');
(2,'海尔电脑',3000,'电脑办公');
(3,'雷神电脑',5000,'电脑办公');
(4,'JACK JONES',800,'服装');
(5,'真维斯',200,'服装');
(6,'花花公子',440,'服装');
(7,'劲霸',2000,'服装');
(8,'香奈儿',800,'女士用品');
(9,'相宜本草',200,'女士用品');
(10,'面霸',5,'女士用品');
(11,'雪碧',56,'饮料饮品');
(12,'香飘飘奶茶',1,'饮料饮品');
(13,'iPhone9',8000,NULL);
需求:
#查询product表中所有记录
select * from product;
#查询product表中pid和pname字段
select pid,pname from product;
#查询product表中所有的电脑办公记录
select * from product where category_name='电脑办公';
#查询结果是表达式(运算查询):将所有商品的价格+10元进行显示.
select pname,price+10 as new_price from product group by pname;
#查询商品名称为“花花公子”的商品所有信息:
select * from product where pname='花花公子';
#查询价格为800商品
select * from product where price=800;
#查询价格不是800的所有商品
select * from product where price!=800;
#查询商品价格大于60元的所有商品信息
select * from product where price>60;
#查询商品价格在200到1000之间所有商品
select * from product where price between 200 and 1000;
#查询商品价格是200或800或者2000的所有商品
select * from product where price in(200,800,2000);
#查询含有'霸'字的所有商品
select * from where pname like '%霸%';
#查询以'香'开头的所有商品
select * from where pname like '香%';
#查询第二个字为'想'的所有商品
select * from where pname like '_香_';
#商品没有分类的商品
select * from product where category_name is null;
#查询有分类的商品
select * from product where category_name is not null;
练习2:
CREATE TABLE s (
sid CHAR(6),
sname VARCHAR(50),
age INT,
gender VARCHAR(50)
);
INSERT INTO s VALUES('S_1001', 'liuYi', 35, 'male');
INSERT INTO s VALUES('S_1002', 'chenEr', 15, 'female');
INSERT INTO s VALUES('S_1003', 'zhangSan', 95, 'male');
INSERT INTO s VALUES('S_1004', 'liSi', 65, 'female');
INSERT INTO s VALUES('S_1005', 'wangWu', 55, 'male');
INSERT INTO s VALUES('S_1006', 'zhaoLiu', 75, 'female');
INSERT INTO s VALUES('S_1007', 'sunQi', 25, 'male');
INSERT INTO s VALUES('S_1008', 'zhouBa', 45, 'female');
INSERT INTO s VALUES('S_1009', 'wuJiu', 85, 'male');
INSERT INTO s VALUES('S_1010', 'zhengShi', 5, 'female');
INSERT INTO s VALUES('S_1011', 'xxx', NULL, NULL);
-- 查询性别为女,并且年龄大于等于50的记录
select * from s where age>=50;
-- 查询学号为S_1001,或者姓名为liSi的记录
select * from s where sid='S_1001' or sname='lisi';
-- 查询学号为S_1001,S_1002,S_1003的记录
select * from s where sid in(S_1001,S_1002,S_1003);
-- 查询学号不是S_1001,S_1002,S_1003的记录
select * from s where sid!=S_1001 and sid!=S_1002 and sid!=S_1003;
-- 查询年龄为null的记录
select * from s where age is null;
-- 查询年龄在20到40之间的学生记录
select * from s where age between 20 and 40;
-- 查询性别非男的学生记录
select * from s where gender!='male';
-- 查询姓名不为null的学生记录
select * from s where sname is not null;
-- 查询姓名由5个字母构成的学生记录
select * from s where sname like '_____';
-- 查询姓名由5个字母构成,并且第5个字母为“i”的学生记录
select * from s where sname like '____i';
-- 查询姓名以“z”开头的学生记录
select * from s where sname like 'z%';
-- 查询姓名中第2个字母为“i”的学生记录
select * from s where sname like '_i%';
-- 查询姓名中包含“a”字母的学生记录
select * from s where sname like '%a%';
练习3:
##员工表
#DROP IF EXISTS TABLE EMP;
CREATE TABLE EMP(
EMPNO INT PRIMARY KEY, #员工编号
ENAME VARCHAR(10), #员工姓名
JOB VARCHAR(9), #员工工作
MGR INT, #员工直属领导编号
HIREDATE DATE, #入职时间
SAL DOUBLE, #工资
COMM DOUBLE, #奖金
DEPTNO VARCHAR(10) #部门名称
);
INSERT INTO EMP VALUES(7369,'SMITH','CLERK',7902,"1980-12-17",800,NULL,'开发');
INSERT INTO EMP VALUES(7499,'ALLEN','SALESMAN',7698,'1981-02-20',1600,300,'测试');
INSERT INTO EMP VALUES(7521,'WARD','SALESMAN',7698,'1981-02-22',1250,500,'测试');
INSERT INTO EMP VALUES(7566,'JONES','MANAGER',7839,'1981-04-02',2975,NULL,'开发');
INSERT INTO EMP VALUES(7654,'MARTIN','SALESMAN',7698,'1981-09-28',1250,1400,'前端');
INSERT INTO EMP VALUES(7698,'BLAKE','MANAGER',7839,'1981-05-01',2850,NULL,'开发');
INSERT INTO EMP VALUES(7782,'CLARK','MANAGER',7839,'1981-06-09',2450,NULL,'前端');
INSERT INTO EMP VALUES(7788,'SCOTT','ANALYST',7566,'1987-07-03',3000,NULL,'开发');
INSERT INTO EMP VALUES(7839,'KING','PRESIDENT',NULL,'1981-11-17',5000,NULL,'前端');
INSERT INTO EMP VALUES(7844,'TURNER','SALESMAN',7698,'1981-09-08',1500,0,'运维');
INSERT INTO EMP VALUES(7876,'ADAMS','CLERK',7788,'1987-07-13',1100,NULL,'开发');
INSERT INTO EMP VALUES(7900,'JAMES','CLERK',7698,'1981-12-03',950,NULL,'运维');
INSERT INTO EMP VALUES(7902,'FORD','ANALYST',7566,'1981-12-03',3000,NULL,'运维');
INSERT INTO EMP VALUES(7934,'MILLER','CLERK',7782,'1981-01-23',1300,NULL,'测试');
#1.查找部门是开发的员工详细信息。
select * from EMP where DEPTNO='开发';
#2.找出从事clerk工作的员工的编号、姓名、部门号。
select EMPNO,ENAME,DEPTNO from EMP where JOB='clerk';
#3.检索出奖金多于基本工资的员工信息。
select * from EMP where COMM>SAL;
#4.检索出奖金多于基本工资60%的员工信息。
select * from emp where COMM>(SAL*0.6);
#5.找出开发部部门的职员、测试部门的职员 的员工信息。
select * from emp where DEPTNO='开发' or DEPTNO='测试';
#7.找出获得奖金的员工的信息。
select * from emp where COMM is not null;
#8.找出奖金少于100或者没有获得奖金的员工的信息。
select * from emp where COMM is not null;
#9.找出姓名以A、B、S开始的员工信息。
select * from emp where ENAME like 'A%' or ENAME like 'B%' or ENAME like 'S%';
#10.找到名字长度为6个字符的员工信息。
select * from emp where ename like '______';
#11.名字中不包含R字符的员工信息。
select * from emp ename not like '%R%';
#12.返回员工的详细信息并按姓名排序。
select * from emp order by name asc;
#13.返回员工的信息并按工作降序工资升序排列。
select * from emp order by job asc,asl desc;
#14.计算员工的日薪(按30天)。
select ename,sal/30 as per_diem from emp group by ename;
#15.找出姓名中包含A的员工信息。
select * from emp where name like '%A%';
JavaWEB03:JDBC
3.1 简单题
1.1 简答题目一
如何理解JDBC?
答:
JDBC是使用Java语言操作关系型数据库的一套API。
JDBC是一套操作所有关系型数据库的规则,即接口。
我们可以使用这套接口,让驱动jar包中的实现类去执行。
1.2 简答题目二
使用JDBC的步骤是什么?
答:
1.注册驱动
2.获取连接
3.操作数据库
4.处理结果集
5.释放资源
1.3 简答题目三
DriverManager 对象有哪些作用?如何通过代码实现?
答:
获取数据库连接
DriverManager.getConnection(url,username,password);
1.4 简答题目四
DriverManager对象中的获取连接对象的方法【getConnection()】的第一个参数表示什么含义?如何书写?
答:
数据库的连接信息
jdbc:数据库名://IP地址:端口号/数据库名?useSSL=false
jdbc:mysql://127.0.0.1:3306/db1?useSSL=false
1.5 简答题目五
Connection对象有哪些作用?对应的API是什么?
答:
获取执行SQL的对象createStatement()和 prepareStatement(sql)
管理事务:
开始事务:setAutoCommit(false);
提交事务:commit();
回滚事务:rollback();
1.6 简答题目六
为什么以后使用PreparedStatement执行SQL语句而不用Statement了?
答:
因为PreparedStatement具有预防SQL注入的作用,使数据更安全
3.2 Mysql查询加强
练习1:
初始表和数据
-- 创建 stu 表:
CREATE TABLE `stu` (
`sid` int(11) DEFAULT NULL,
`sname` varchar(25) DEFAULT NULL,
`age` int(11) DEFAULT NULL,
`sex` char(6) DEFAULT NULL,
`score` int(11) DEFAULT NULL,
`cid` int(11) DEFAULT NULL,
`groupLeaderId` int(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- 往 stu 表中添加数据:
INSERT INTO `stu` VALUES ('1001', '张三', '20', '男', '72', '1', '1003');
INSERT INTO `stu` VALUES ('1002', '李四', '15', '女', '78', '1', '1003');
INSERT INTO `stu` VALUES ('1003', '王五', '95', '男', '99', '1', '1010');
INSERT INTO `stu` VALUES ('1004', '赵六张', '65', '女', '60', '1', '1007');
INSERT INTO `stu` VALUES ('1005', '周七', '55', '男', '78', '3', '1007');
INSERT INTO `stu` VALUES ('1006', '茅十八', '75', '女', '96', '3', '1007');
INSERT INTO `stu` VALUES ('1007', '张三丰', '40', '男', '85', '3', '1010');
INSERT INTO `stu` VALUES ('1008', '李四方', '45', '女', '90', '2', '1010');
INSERT INTO `stu` VALUES ('1009', '艾三弗森', '45', '', '35', '4', '1008');
INSERT INTO `stu` VALUES ('1010', '三欧文', '35', '女', '49', '2', '1008');
-- 创建 class 表:
CREATE TABLE `class` (
`cid` int(11) DEFAULT NULL,
`cname` varchar(255) COLLATE utf8_bin NOT NULL,
`caddress` varchar(255) COLLATE utf8_bin DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
-- 在 class 中添加数据:
INSERT INTO `class` VALUES ('1', 'BigData', '102');
INSERT INTO `class` VALUES ('2', 'HTML', '103');
INSERT INTO `class` VALUES ('3', 'VR', '104');
INSERT INTO `class` VALUES ('4', 'Java', '105');
需求
#查询 stu 表中记录数:
SELECT COUNT(*) FROM stu;
#将stu中sid为1001的score的值改为null:
UPDATE stu SET score=NULL WHERE sid=1001;
#计算stu中sex出现的次数:
SELECT sex,COUNT(sex) FROM stu GROUP BY sex;
#在列名后使用as给列取别名, as可以省略:
SELECT sex AS '性别',COUNT(sex) '出现次数' FROM stu GROUP BY sex;
#查询stu表中有成绩的人数:
SELECT COUNT(score) FROM stu ;
#查询stu表中成绩大于60的人数:
SELECT COUNT(score) FROM stu WHERE score>60;
#查询所有学生成绩和:
SELECT SUM(score) FROM stu;
#统计所有学生的平均成绩:
SELECT AVG(score) FROM stu;
#统计stu表中成绩大于60的平均分:
SELECT AVG(score) FROM stu WHERE score>60;
#查询最高成绩和最低成绩:
SELECT MAX(score),MIN(score) FROM stu;
#统计stu 表中成绩大于60的最高成绩和最低成绩:
SELECT MAX(score),MIN(score) FROM stu WHERE score>60;
#查询最高成绩,以及学生姓名:
SELECT score,sname FROM stu WHERE score=(SELECT MAX(score) FROM stu) ;
#与聚合函数一同出现的列名,必须出现在group by 后,反之,如果出现一个没有在group by 后出现的字段,那么查询结果不正常!
#查询年纪总和:
SELECT SUM(age) FROM stu;
#查询成绩总和:
SELECT SUM(score) FROM stu;
#计算总年龄与总成绩的和:
SELECT SUM(age)+SUM(score) FROM stu;
#查询年龄不重复的共有多少人
SELECT COUNT(t.age) FROM (SELECT * FROM stu GROUP BY age) t;
#查询男生多少人,女生多少人?
SELECT sex,COUNT(*) FROM stu GROUP BY sex;
#查询每个班级的班级编号和每个班级的成绩和:
SELECT cid,SUM(score) FROM stu GROUP BY cid;
#查询每个班级的班级编号以及每个班级的人数 .
SELECT cid,COUNT(cid) FROM stu GROUP BY cid;
#查询成绩总和大于200的班级编号以及成绩和 .
SELECT cid,SUM(score) sum FROM stu GROUP BY cid HAVING sum>200;
#查询成绩总和大于200的班级编号以及成绩和并根据成绩总和降序 .
SELECT cid,SUM(score) sum FROM stu GROUP BY cid HAVING sum>200 ORDER BY sum DESC ;
#输出前两条数据
SELECT * FROM stu LIMIT 0,2;
#从第四条开始,输出三条学生信息
SELECT * from stu LIMIT 4,3;
#分页: 每页3条数据
#第一页:
SELECT * FROM stu LIMIT 0,3;
#第二页:
SELECT * FROM stu LIMIT 3,3;
练习2:
-- 创建db6数据库
CREATE DATABASE db6;
-- 使用db6数据库
USE db6;
-- 创建user表
CREATE TABLE USER(
id INT PRIMARY KEY AUTO_INCREMENT, -- 用户id
NAME VARCHAR(20), -- 用户姓名
age INT -- 用户年龄
);
-- 添加数据
INSERT INTO USER VALUES (1,'张三',23);
INSERT INTO USER VALUES (2,'李四',24);
INSERT INTO USER VALUES (3,'王五',25);
INSERT INTO USER VALUES (4,'赵六',26);
-- 订单表
CREATE TABLE orderlist(
id INT PRIMARY KEY AUTO_INCREMENT, -- 订单id
number VARCHAR(30), -- 订单编号
uid INT, -- 外键字段
CONSTRAINT ou_fk1 FOREIGN KEY (uid) REFERENCES USER(id)
);
-- 添加数据
INSERT INTO orderlist VALUES (1,'hm001',1);
INSERT INTO orderlist VALUES (2,'hm002',1);
INSERT INTO orderlist VALUES (3,'hm003',2);
INSERT INTO orderlist VALUES (4,'hm004',2);
INSERT INTO orderlist VALUES (5,'hm005',3);
INSERT INTO orderlist VALUES (6,'hm006',3);
INSERT INTO orderlist VALUES (7,'hm007',NULL);
-- 商品分类表
CREATE TABLE category(
id INT PRIMARY KEY AUTO_INCREMENT, -- 商品分类id
NAME VARCHAR(10) -- 商品分类名称
);
-- 添加数据
INSERT INTO category VALUES (1,'手机数码');
INSERT INTO category VALUES (2,'电脑办公');
INSERT INTO category VALUES (3,'烟酒茶糖');
INSERT INTO category VALUES (4,'鞋靴箱包');
-- 商品表
CREATE TABLE product(
id INT PRIMARY KEY AUTO_INCREMENT, -- 商品id
NAME VARCHAR(30), -- 商品名称
cid INT, -- 外键字段
CONSTRAINT cp_fk1 FOREIGN KEY (cid) REFERENCES category(id)
);
-- 添加数据
INSERT INTO product VALUES (1,'华为手机',1);
INSERT INTO product VALUES (2,'小米手机',1);
INSERT INTO product VALUES (3,'联想电脑',2);
INSERT INTO product VALUES (4,'苹果电脑',2);
INSERT INTO product VALUES (5,'中华香烟',3);
INSERT INTO product VALUES (6,'玉溪香烟',3);
INSERT INTO product VALUES (7,'计生用品',NULL);
-- 中间表
CREATE TABLE us_pro(
upid INT PRIMARY KEY AUTO_INCREMENT, -- 中间表id
uid INT, -- 外键字段。需要和用户表的主键产生关联
pid INT, -- 外键字段。需要和商品表的主键产生关联
CONSTRAINT up_fk1 FOREIGN KEY (uid) REFERENCES USER(id),
CONSTRAINT up_fk2 FOREIGN KEY (pid) REFERENCES product(id)
);
-- 添加数据
INSERT INTO us_pro VALUES (NULL,1,1);
INSERT INTO us_pro VALUES (NULL,1,2);
INSERT INTO us_pro VALUES (NULL,1,3);
INSERT INTO us_pro VALUES (NULL,1,4);
INSERT INTO us_pro VALUES (NULL,1,5);
INSERT INTO us_pro VALUES (NULL,1,6);
INSERT INTO us_pro VALUES (NULL,1,7);
INSERT INTO us_pro VALUES (NULL,2,1);
INSERT INTO us_pro VALUES (NULL,2,2);
INSERT INTO us_pro VALUES (NULL,2,3);
INSERT INTO us_pro VALUES (NULL,2,4);
INSERT INTO us_pro VALUES (NULL,2,5);
INSERT INTO us_pro VALUES (NULL,2,6);
INSERT INTO us_pro VALUES (NULL,2,7);
INSERT INTO us_pro VALUES (NULL,3,1);
INSERT INTO us_pro VALUES (NULL,3,2);
INSERT INTO us_pro VALUES (NULL,3,3);
INSERT INTO us_pro VALUES (NULL,3,4);
INSERT INTO us_pro VALUES (NULL,3,5);
INSERT INTO us_pro VALUES (NULL,3,6);
INSERT INTO us_pro VALUES (NULL,3,7);
INSERT INTO us_pro VALUES (NULL,4,1);
INSERT INTO us_pro VALUES (NULL,4,2);
INSERT INTO us_pro VALUES (NULL,4,3);
INSERT INTO us_pro VALUES (NULL,4,4);
INSERT INTO us_pro VALUES (NULL,4,5);
INSERT INTO us_pro VALUES (NULL,4,6);
INSERT INTO us_pro VALUES (NULL,4,7);
-- 1.查询用户的编号、姓名、年龄、订单编号。
SELECT u.id,u.NAME,u.age,o.number FROM user u,orderlist o WHERE o.uid=u.id;
-- 2.查询所有的用户。用户的编号、姓名、年龄、订单编号
SELECT u.id,u.NAME,u.age,o.number FROM user u LEFT JOIN orderlist o ON o.uid=u.id;
-- 3.查询所有的订单。用户的编号、姓名、年龄、订单编号
SELECT u.id,u.NAME,u.age,o.number FROM user u RIGHT JOIN orderlist o ON o.uid=u.id;
-- 4.查询用户年龄大于23岁的信息。显示用户的编号、姓名、年龄、订单编号。
SELECT u.id,u.NAME,u.age,o.number FROM user u LEFT JOIN orderlist o ON o.uid=u.id WHERE u.age>23;
-- 5.查询张三和李四用户的信息。显示用户的编号、姓名、年龄、订单编号。
SELECT u.id,u.NAME,u.age,o.number FROM user u LEFT JOIN orderlist o ON o.uid=u.id WHERE u.NAME='张三' OR u.NAME='李四';
-- 6.查询商品分类的编号、分类名称、分类下的商品名称。
SELECT c.id,c.NAME,p.NAME FROM category c,product p WHERE c.id=p.cid;
-- 7.查询所有的商品分类。商品分类的编号、分类名称分类下的商品名称。
SELECT c.id,c.NAME,p.NAME FROM category c LEFT JOIN product p ON c.id=p.cid;
-- 8.查询所有的商品信息。商品分类的编号、分类名称分类下的商品名称
SELECT c.id,c.NAME,p.NAME FROM category c RIGHT JOIN product p ON c.id=p.cid;
-- 9.查询所有的用户和所有的商品。显示用户的编号、姓名、年龄、商品名称
SELECT u.id,u.NAME,u.age,p.NAME FROM user u,us_pro up,product p WHERE u.id=up.uid AND p.id=up.pid;
-- 10.查询张三和李四这两个用户可以看到的商品。显示用户的编号、姓名、年龄、商品名称。
SELECT u.id,u.NAME,u.age,p.NAME FROM user u,us_pro up,product p WHERE u.id=up.uid AND p.id=up.pid AND (u.NAME='张三' OR u.NAME='李四');
练习3:
数据
CREATE TABLE student (
id INT(10) NOT NULL UNIQUE PRIMARY KEY ,
name VARCHAR(20) NOT NULL ,
sex VARCHAR(4) ,
birth YEAR,
department VARCHAR(20) ,
address VARCHAR(50)
);
创建score表。SQL代码如下:
CREATE TABLE score (
id INT(10) NOT NULL UNIQUE PRIMARY KEY AUTO_INCREMENT ,
stu_id INT(10) NOT NULL ,
c_name VARCHAR(20) ,
grade INT(10)
);
-- 向student表插入记录的INSERT语句如下:
INSERT INTO student VALUES( 901,'张老大', '男',1985,'计算机系', '北京市海淀区');
INSERT INTO student VALUES( 902,'张老二', '男',1986,'中文系', '北京市昌平区');
INSERT INTO student VALUES( 903,'张三', '女',1990,'中文系', '湖南省永州市');
INSERT INTO student VALUES( 904,'李四', '男',1990,'英语系', '辽宁省阜新市');
INSERT INTO student VALUES( 905,'王五', '女',1991,'英语系', '福建省厦门市');
INSERT INTO student VALUES( 906,'王六', '男',1988,'计算机系', '湖南省衡阳市');
向score表插入记录的INSERT语句如下:
INSERT INTO score VALUES(NULL,901, '计算机',98);
INSERT INTO score VALUES(NULL,901, '英语', 80);
INSERT INTO score VALUES(NULL,902, '计算机',65);
INSERT INTO score VALUES(NULL,902, '中文',88);
INSERT INTO score VALUES(NULL,903, '中文',95);
INSERT INTO score VALUES(NULL,904, '计算机',70);
INSERT INTO score VALUES(NULL,904, '英语',92);
INSERT INTO score VALUES(NULL,905, '英语',94);
INSERT INTO score VALUES(NULL,906, '计算机',90);
INSERT INTO score VALUES(NULL,906, '英语',85);
-- 3.查询student表的所有记录
SELECT * FROM student;
-- 4.查询student表的第2条到4条记录
SELECT * FROM student LIMIT 2,4;
-- 5.从student表查询所有学生的学号(id)、姓名(name)和院系(department)的信息
SELECT s.id,s.name,s.department FROM student s;
-- 6.从student表中查询计算机系和英语系的学生的信息
SELECT * FROM student s WHERE s.department='计算机系' OR s.department='英语系';
-- 7.从student表中查询年龄18~22岁的学生信息
SELECT * FROM student WHERE birth BETWEEN '1998' AND '2000';
-- 8.从student表中查询每个院系有多少人
SELECT COUNT(department),department FROM student GROUP BY department;
-- 9.从score表中查询每个科目的最高分
SELECT MAX(grade),c_name FROM score GROUP BY c_name;
-- 10.查询李四的考试科目(c_name)和考试成绩(grade)
SELECT score.c_name,score.grade FROM student,score WHERE student.id=score.stu_id AND student.name='李四';
-- 11.用连接的方式查询所有学生的信息和考试信息
SELECT * FROM student,score WHERE student.id=score.stu_id;
-- 12.计算每个学生的总成绩
SELECT student.name,SUM(score.grade) FROM student,score WHERE student.id=score.stu_id GROUP BY stu_id;
-- 13.计算每个考试科目的平均成绩
SELECT c_name,AVG(grade) FROM score GROUP BY c_name;
-- 14.查询计算机成绩低于95的学生信息
SELECT * FROM student,score WHERE student.id=score.stu_id AND student.department='计算机系' AND score.grade<95;
-- 15.查询同时参加计算机和英语考试的学生的信息
SELECT * FROM student st,score s1,score s2 WHERE st.id=s1.stu_id AND st.id=s2.stu_id AND s1.c_name='计算机' AND s2.c_name='英语';
-- 16.将计算机考试成绩按从高到低进行排序
SELECT * FROM score WHERE c_name='计算机' ORDER BY c_name='计算机' DESC;
-- 17.从student表和score表中查询出学生的学号,然后合并查询结果
SELECT st.id,sc.stu_id FROM student st,score sc WHERE st.id=sc.stu_id;
-- 18.查询姓张或者姓王的同学的姓名、院系和考试科目及成绩
SELECT st.name,st.department,sc.c_name,sc.grade FROM student st,score sc WHERE st.id=sc.stu_id AND (st.name like '张%' OR st.name like '王%');
-- 19.查询都是湖南的学生的姓名、年龄、院系和考试科目及成绩
SELECT st.name,2022-st.birth,st.department,sc.c_name,sc.grade FROM student st,score sc WHERE st.id=sc.stu_id AND st.address like '湖南省%' ;
JavaWEB04:Maven Mysql查询练习day4
4.1 简答题
1.1 简答题目一
maven是什么?有哪些功能?
答:
Maven是专门用于管理和构建Java项目的工具,它基于项目对象模型(POM)的概念,通过一小段描述信息来管理项目的构建、报告和文档。
Maven功能:
提供了一套标准化的项目结构
提供了一套标准化的构建流程(编译,测试,打包,发布……)
提供了一套依赖管理机制(管理jar包)
1.2 简答题目二
maven仓库分为哪几类?
答:
本地仓库:自己计算机上的一个目录
中央仓库:由Maven团队维护的全球唯一的仓库
远程仓库(私服):一般由公司团队搭建的私有仓库
1.3 简答题目三
maven常用命令有哪些?分别作用是什么?
答:
compile :编译
clean:清理
test:测试
package:打包
install:安装
1.4 简答题目四
如何理解mybatis?mybatis解决了哪些原生JDBC代码的问题?
答:
MyBatis是一款优秀的持久层框架,用于简化JDBC开发。
mybatis作用:
1.硬编码可以配置到配置文件
2.操作繁琐的地方mybatis都自动完成
1.5 简答题目五
使用Mybatis代理方式需要满足哪些要求?
答:
第1点:定义与SQL映射文件同名的Mapper接口,并且将Mapper接口和SQL映射文件放置在同一目录下。
第2点:设置SQL映射文件的namespace属性为Mapper接口全限定名
第3点:在 Mapper 接口中定义方法,方法名就是SQL映射文件中sql语句的id,并保持参数类型和返回值类型一致
4.2 Mysql查询加强
商品表:goods
goods_id | goods_name | cat_id | brand_id | goods_sn | goods_number | shop_price | market_price | click_count |
主键 | 商品名称 | 栏目id | 品牌id | 货号 | 库存量 | 价格 | 市场价 | 点击量 |
栏目表:category
cat_id cat_id | cat_name | parent_id parent_id |
主键 | 栏目名称 | 栏目的父id 栏目的父id |
品牌表:brand
brand_id | brand_name |
品牌id | 品牌名称 |
建表语句及数据初始化
create table goods
(
goods_id mediumint unsigned auto_increment
primary key,
goods_name varchar(120) default '' not null,
cat_id smallint(5) unsigned default 0 not null,
brand_id smallint(5) unsigned default 0 not null,
goods_sn char(15) default '' not null,
goods_number smallint(5) unsigned default 0 not null,
shop_price decimal(10, 2) unsigned default 0.00 not null,
market_price decimal(10, 2) unsigned default 0.00 not null,
click_count int unsigned default 0 not null,
add_time datetime null
)
charset = utf8;
insert into `goods`
values (1, 'kd876', 4, 8, 'ecs000000', 1, 1388.00, 1665.60, 9, '2021-03-20 06:33:52'),
(4, '诺基亚n85原装充电器', 8, 1, 'ecs000004', 17, 58.00, 69.60, 0, '2021-03-20 06:33:52'),
(3, '诺基亚原装5800耳机', 8, 1, 'ecs000002', 24, 68.00, 81.60, 3, '2021-03-20 06:33:52'),
(5, '索爱原装m2卡读卡器', 11, 7, 'ecs000005', 8, 20.00, 24.00, 3, '2021-03-20 06:33:52'),
(6, '胜创kingmax内存卡', 11, 0, 'ecs000006', 15, 42.00, 50.40, 0, '2021-03-20 06:33:52'),
(7, '诺基亚n85原装立体声耳机hs-82', 8, 1, 'ecs000007', 20, 100.00, 120.00, 0, '2021-03-20 06:33:52'),
(8, '飞利浦9@9v', 3, 4, 'ecs000008', 1, 399.00, 478.79, 10, '2021-03-20 06:33:52'),
(9, '诺基亚e66', 3, 1, 'ecs000009', 4, 2298.00, 2757.60, 20, '2021-03-20 06:33:52'),
(10, '索爱c702c', 3, 7, 'ecs000010', 7, 1328.00, 1593.60, 11, '2021-03-20 06:33:52'),
(11, '索爱c702c', 3, 7, 'ecs000011', 1, 1300.00, 0.00, 0, '2021-03-20 06:33:52'),
(12, '摩托罗拉a810', 3, 2, 'ecs000012', 8, 983.00, 1179.60, 13, '2021-03-20 06:33:52'),
(13, '诺基亚5320 xpressmusic', 3, 1, 'ecs000013', 8, 1311.00, 1573.20, 13, '2021-03-20 06:33:52'),
(14, '诺基亚5800xm', 4, 1, 'ecs000014', 1, 2625.00, 3150.00, 6, '2021-03-20 06:33:52'),
(15, '摩托罗拉a810', 3, 2, 'ecs000015', 3, 788.00, 945.60, 8, '2021-03-20 06:33:52'),
(16, '恒基伟业g101', 2, 11, 'ecs000016', 0, 823.33, 988.00, 3, '2021-03-20 06:33:52'),
(17, '夏新n7', 3, 5, 'ecs000017', 1, 2300.00, 2760.00, 2, '2021-03-20 06:33:52'),
(18, '夏新t5', 4, 5, 'ecs000018', 1, 2878.00, 3453.60, 0, '2021-03-20 06:33:52'),
(19, '三星sgh-f258', 3, 6, 'ecs000019', 12, 858.00, 1029.60, 7, '2021-03-20 06:33:52'),
(20, '三星bc01', 3, 6, 'ecs000020', 12, 280.00, 336.00, 14, '2021-03-20 06:33:52'),
(21, '金立 a30', 3, 10, 'ecs000021', 40, 2000.00, 2400.00, 4, '2021-03-20 06:33:52'),
(22, '多普达touch hd', 3, 3, 'ecs000022', 1, 5999.00, 7198.80, 16, '2021-03-20 06:33:52'),
(23, '诺基亚n96', 5, 1, 'ecs000023', 8, 3700.00, 4440.00, 17, '2021-03-20 06:33:52'),
(24, 'p806', 3, 9, 'ecs000024', 100, 2000.00, 2400.00, 35, '2021-03-20 06:33:52'),
(25, '小灵通/固话50元充值卡', 13, 0, 'ecs000025', 2, 48.00, 57.59, 0, '2021-03-20 06:33:52'),
(26, '小灵通/固话20元充值卡', 13, 0, 'ecs000026', 2, 19.00, 22.80, 0, '2021-03-20 06:33:52'),
(27, '联通100元充值卡', 15, 0, 'ecs000027', 2, 95.00, 100.00, 0, '2021-03-20 06:33:52'),
(28, '联通50元充值卡', 15, 0, 'ecs000028', 0, 45.00, 50.00, 0, '2021-03-20 06:33:52'),
(29, '移动100元充值卡', 14, 0, 'ecs000029', 0, 90.00, 0.00, 0, '2021-03-20 06:33:52'),
(30, '移动20元充值卡', 14, 0, 'ecs000030', 9, 18.00, 21.00, 1, '2021-03-20 06:33:52'),
(31, '摩托罗拉e8 ', 3, 2, 'ecs000031', 1, 1337.00, 1604.39, 5, '2021-03-20 06:33:52'),
(32, '诺基亚n85', 3, 1, 'ecs000032', 4, 3010.00, 3612.00, 9, '2021-03-20 06:33:52');
create table category
(
cat_id smallint unsigned auto_increment primary key,
cat_name varchar(90) not null default '',
parent_id smallint unsigned
) charset utf8;
INSERT INTO `category`
VALUES (1, '手机类型', 0),
(2, 'CDMA手机', 1),
(3, 'GSM手机', 1),
(4, '3G手机', 1),
(5, '双模手机', 1),
(6, '手机配件', 0),
(7, '充电器', 6),
(8, '耳机', 6),
(9, '电池', 6),
(11, '读卡器和内存卡', 6),
(12, '充值卡', 0),
(13, '小灵通/固话充值卡', 12),
(14, '移动手机充值卡', 12),
(15, '联通手机充值卡', 12);
create table brand
(
brand_id int auto_increment
primary key,
brand_name varchar(64) not null
)
comment '品牌';
INSERT INTO brand (brand_id, brand_name)
VALUES (1, 'MI小米'),
(2, 'honor荣耀'),
(3, 'MEIZU魅族'),
(4, '三星盖乐世'),
(5, 'VIVO'),
(6, '一加Oneplus'),
(7, 'ZTE中兴'),
(8, 'Moto摩托罗拉'),
(9, 'Apple苹果'),
(10, 'XPERIA索尼');
1,主键为32的商品[goods]
SELECT * FROM goods WHERE goods_id=32;
2,不属第3栏目的所有商品[goods]
SELECT * FROM goods WHERE cat_id!=3;
3,本店价格高于3000元的商品[goods]
SELECT * FROM goods WHERE shop_price>3000;
4,本店价格低于或等于100元的商品[goods]
SELECT * FROM goods WHERE shop_price<=100;
5,取出第4栏目或第11栏目的商品(不许用or)[goods]
SELECT * FROM goods WHERE cat_id=4 || cat_id=11;
SELECT * FROM goods WHERE cat_id IN (4,11);
6,取出100<=价格<=500的商品(不许用and)[goods]
SELECT * FROM goods WHERE shop_price>=100 && shop_price<=500;
7,取出不属于第3栏目且不属于第11栏目的商品(and,或not in分别实现)[goods]
SELECT * FROM goods WHERE cat_id!=3 AND cat_id!=11;
SELECT * FROM goods WHERE cat_id NOT IN (3,11);
8,取出价格大于100且小于300,或者大于4000且小于5000的商品()[goods]
SELECT * FROM goods WHERE (shop_price>100 AND shop_price<300) OR (shop_price>4000 AND shop_price<5000);
9,取出第3个栏目下面价格<1000或>3000,并且点击量>5的系列商品[goods]
SELECT * FROM goods WHERE cat_id=3 AND (shop_price<1000 OR shop_price>3000) AND click_count>5;
10,取出第1个栏目下面的商品(注意:1栏目下面没商品,但其子栏目下有)[goods]
SELECT * FROM goods g,category c WHERE g.cat_id=c.cat_id AND (c.parent_id=1 OR g.cat_id=1);
11,取出名字以"诺基亚"开头的商品[goods]
SELECT * FROM goods WHERE goods_name LIKE '诺基亚%';
12,取出名字为"诺基亚Nxx"的手机[goods]
SELECT * FROM goods WHERE goods_name LIKE '诺基亚N__';#模糊查询不区分大小写
13,取出名字不以"诺基亚"开头的商品[goods]
SELECT * FROM goods WHERE goods_name NOT LIKE '诺基亚%';
14,取出第3个栏目下面价格在1000到3000之间,并且点击量>5 "诺基亚"开头的系列商品[goods]
SELECT * FROM goods WHERE cat_id=3 AND (shop_price BETWEEN 1000 AND 3000) AND goods_name LIKE '诺基亚%';
15,把good表中商品名为’诺基亚xxxx’的商品,改为’HTCxxxx’,[goods]
UPDATE goods SET goods_name=concat('HTC',substring(goods_name,4)) WHERE goods_name LIKE '诺基亚%'
16,查出最贵的商品的价格[goods]
SELECT MAX(shop_price) FROM goods;
17,查出最大(最新)的商品编号[goods]
SELECT MAX(goods_sn) FROM goods;
18,查出最便宜的商品的价格[goods]
SELECT MIN(shop_price) FROM goods;
19,查出最旧(最小)的商品编号[goods]
SELECT MIN(goods_sn) FROM goods;
20,查询该店所有商品的库存总量[goods]
SELECT SUM(goods_number) FROM goods;
21,查询所有商品的平均价[goods]
SELECT AVG(shop_price) FROM goods;
22,查询该店一共有多少种商品[goods]
SELECT COUNT(*) FROM goods;
23,:查询每个栏目下面:最贵商品价格;最低商品价格;商品平均价格;商品库存量;商品种类。[goods]
SELECT MAX(g.shop_price),MIN(g.shop_price),AVG(g.shop_price),SUM(g.goods_number),c.cat_name FROM goods g,category c WHERE g.cat_id=c.cat_id GROUP BY g.cat_id;
24,查询该店的商品价格和市场价格的差价[goods]
SELECT goods_name,shop_price,market_price-shop_price FROM goods;
25,查询每个商品所积压的货款(提示:库存*单价)[goods]
SELECT goods_name,shop_price*goods_number FROM goods;
26,查询该店积压的总货款
SELECT SUM(shop_price*goods_number) FROM goods;
27,查询该店每个栏目下面积压的货款.
SELECT c.cat_name,SUM(shop_price*goods_number) FROM goods g,category c WHERE g.cat_id=c.cat_id GROUP BY g.cat_id;
28,查询比市场价省钱200元以上的商品及该商品所省的钱(where和having分别实现)
SELECT goods_name,market_price-shop_price FROM goods WHERE (market_price-shop_price)>200;
SELECT goods_name,(market_price-shop_price) charjia FROM goods GROUP BY goods_id HAVING charjia>200;
29,查询积压货款超过2W元的栏目,以及该栏目积压的货款
SELECT c.cat_name,SUM(shop_price*goods_number) sum FROM goods g,category c WHERE g.cat_id=c.cat_id GROUP BY g.cat_id HAVING sum>20000;
30,查询出最新一行商品(以商品编号最大为最新,用子查询实现)
SELECT * FROM goods WHERE goods_sn=(SELECT MAX(goods_sn) FROM goods);
31,查询出编号为19的商品的栏目名称(用左连接查询和子查询分别)
SELECT c.cat_name FROM goods g LEFT JOIN category c ON g.cat_id=c.cat_id WHERE g.goods_id=19;
SELECT cat_name FROM category WHERE cat_id=(SELECT cat_id FROM goods WHERE goods_id=19);
32,把goods表中的每个栏目下面最新的商品取出来
SELECT * FROM goods g2 WHERE goods_sn IN (SELECT MAX(g1.goods_sn) FROM goods g1 GROUP BY g1.cat_id);
33,用exists型子查询,查出所有有商品的栏目
#exists型子查询:把外层sql的结果,拿到内层sql去测试,如果内层sql成立,则该行取出。
#先得到category.cat_id等于1的结果,然后把category.cat_id=1拿到内层去测试,如果内层有cat_id=1的数据,则输出改行;没有跳出。
#再得到category.cat_id等于2的结果,然后把category.cat_id=2拿到内层去测试,如果内层有cat_id=2的数据,则输出改行;没有跳出。
#...
select * from category where exists (select * from goods where goods.cat_id=category.cat_id);
34,按价格由高到低排序
SELECT * FROM goods ORDER BY shop_price DESC;
35,按发布时间由早到晚排序
SELECT * FROM goods ORDER BY add_time;
36,接栏目由低到高排序,栏目内部按价格由高到低排序
SELECT * FROM goods ORDER BY cat_id ,shop_price DESC;
37,取出价格最高的前三名商品
SELECT * FROM goods ORDER BY shop_price DESC LIMIT 0,3;
38,取出点击量前三名到前5名的商品
SELECT * FROM goods ORDER BY click_count DESC LIMIT 2,3;
39,取出所有商品的商品名,栏目名,价格
SELECT g.goods_name,c.cat_name,g.shop_price FROM goods g,category c WHERE g.cat_id=c.cat_id;
40,取出第4个栏目下的商品的商品名,栏目名,价格
SELECT g.goods_name,c.cat_name,g.shop_price FROM goods g,category c WHERE g.cat_id=c.cat_id AND g.cat_id=4;
41,取出第4个栏目下的商品的商品名,栏目名,与品牌名
SELECT g.goods_name,c.cat_name,b.brand_name FROM goods g,category c,brand b WHERE g.cat_id=c.cat_id AND g.brand_id=b.brand_id AND g.cat_id=4;
JavaWEB05:Mybatis
1.1 简答题目一
对查询结果封装映射配置文件中什么时候使用 resultType 属性?什么时候使用resultMap属性?
答:数据库字段与实体类字段不一时需要使用resultMap,其余都可以使用resultType
1.2 简答题目二
#{} 和 ${} 占位符的区别是什么?
答:#{}底层是preparestatement,采用了预编译,可以防止sql注入
${}是普通的字符串拼接
1.3 简答题目三
说出mapper接口方法上什么时候加@Param注解,什么不需要加@Param注解?
答:未封装为对象的需要加,单个对象不需要
1.4 简答题目四
如果需要在添加数据成功后获取数据库中自增长生成的主键值,需要如何配置?
答: useGeneratedKeys="true" keyProperty="id"
1.5 简答题目五
用来进行数据的CRUD的注解是?
答:@Select@delete@Insert@Update
JavaWEB06:Mybatis综合练习
1.1 简答题目一
对查询结果封装映射配置文件中什么时候使用 resultType 属性?什么时候使用resultMap属性?
答:
如果sql语句查询到字段名和实体类中的属性名相同就使用 resultType 属性指定封装类型
如果sql语句查询到的字段名和实体类中的属性名不相同就需要 resultMap 来定义字段名和实体类属性名的映射关系
1.2 简答题目二
#{} 和 ${} 占位符的区别是什么?
答:
#{} 底层使用的是PreparedStatement,不会出现sql注入问题;并且可以设置预编译,提高sql执行效率
${} 底层使用的是Statement,可能出现sql注入问题
1.3 简答题目三
说出mapper接口方法上什么时候加@Param注解,什么时候不需要加@Param注解?
答:
如果mapper接口方法上只有一个普通类型的参数,不需要加@Param注解,映射配置文件中#{}中可以任意写名称,建议做到见名知意
如果mapper接口方法上是实体类类型的参数,不需要加@Param注解,映射配置文件中#{}中和实体类中的属性名保持一致
如果mapper接口方法上是多个参数,需要加@Param注解给每个参数起名字,映射配置文件中#{}中书写的是@Param注解中写的名称
如果mapper接口方法是单个单列集合类型或者数组类型,需要加@Param注解给参数期名称
如果mapper接口方法是单个map集合类型,不需要加@Param注解,映射配置文件中#{}中名称需要和map集合的键名保持一致
1.4 简答题目四
在映射配置文件中有如下所示的配置
如果需要在添加数据成功后获取数据库中自增长生成的主键值,需要如何配置?
答:
在insert标签上使用如下两个属性
* useGeneratedKeys : 配置是否使用数据库自增长生成的主键值,true表示是,false表示否
* keyProperty : 配置需要将获取到的自增长生成的主键值封装到实体类的哪个属性中
1.5 简答题目五
用来进行数据的CRUD的注解是?
答:
@Insert : 新增数据
@Update : 修改数据
@Delete : 删除数据
@Select : 查询数据
JavaWEB07:HTML、CSS
7.1 编写如下页面
<!DOCTYPE html>
<html lang="cn">
<head>
<meta charset="UTF-8">
<title>注册详情</title>
<style>
form{
margin:0 auto;
text-align: center;
}
</style>
</head>
<body>
<form>
<span>注册详情</span>
<hr>
姓名:<input type="text" name="username" placeholder="在此输入姓名" ><br>
密码:<input type="password" name="password" placeholder="在此输入密码"><br>
邮箱:<input type="text" name="email" placeholder="在此输入邮箱"><br>
手机:<input type="text" name="phone" placeholder="在此输入手机"><br>
<hr>
性别:
<input type="radio" name="gender" value="1">男
<input type="radio" name="gender" value="0">女
<br>
爱好:
<input type="checkbox" name="hobby" value="1">音乐
<input type="checkbox" name="hobby" value="2">电影
<input type="checkbox" name="hobby" value="3">游戏
<br>
出生日期:<input type="date" name="birthday"><br>
所在城市:
<select name="city">
<option value="0" selected>---请选择所在城市---</option>
<option value="beijing">北京</option>
<option value="shanghai">上海</option>
<option value="guangzhou">广州</option>
</select>
<hr>
个性签名:<textarea name="description" cols="30" rows="5" placeholder="请写下您的与众不同"></textarea>
</form>
</body>
</html>
7.2 使用mybatis框架完成。
简答题
1.mybatis的配置文件中,都需要配置哪些?提示:三个部分(5分)
第1点:定义与SQL映射文件同名的Mapper接口,并且将Mapper接口和SQL映射文件放置在同一目录下。
第2点:设置SQL映射文件的namespace属性为Mapper接口全限定名
第3点:在 Mapper 接口中定义方法,方法名就是SQL映射文件中sql语句的id,并保持参数类型和返回值类型一致
2.表字段和bean类变量,不一致时怎么处理?(5分)
方法1:写sql语句时给这字段起别名,将别名定义成和属性名一致即可。
方法2:使用resultMap来定义字段和属性的映射关系。
3.多条件查询时,mybatis是怎么传递方法参数到SQL语句中的?(5分)
1.@Param散装传参数
2.封装一个实体对象
3.Map集合
4.总结SQL的增删改查规律。(5分)
都是在Mapper接口里面先创建方法,随后在对应的XML即SQL映射文件中设置好SQL语句的id与方法名相同,并保持参数类型和返回值类型一致。
学生信息管理
一、语言和环境
1.实现语句
SQL、java
2.环境要求
MySQL
二、功能要求
建立数据库mydb,建表userInfo。
字段名 | 数据类型 | 注释 | 备注 |
id | int | 序号 | 主键自增 |
uname | varchar(20) | 姓名 | 唯一性 |
upwd | varchar(20) | 密码 | 非空 |
realname | varchar(20) | 真实姓名 | 非空 |
建立bean类User,类中成员变量如下:
变量名 | 数据类型 | 注解 | 备注 |
id | Integer | 序号 | |
username | String | 姓名 | |
password | String | 密码 | |
realName | String | 真实姓名 |
1.数据库表中至少有5条测试数据。
2.添加新的User到表中。
3.查询指定username的用户详情。
3.查询所有表数据。–注解开发
4.修改一条数据。
5.删除一条数据。–注解开发
6.用单元测试完成即可。
四、注意事项
1.请注意界面元素排列整齐
2.请注意代码的书写规范,添加注释
五、评分标准(细则请参考评分标准文件)
数据库:10分
添加:20分
指定查询:10分
全查询:10分
修改:20分
删除:10分
mabatis配置文件:Ssrc/main/resources/mybatis-config.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!--
environments:配置数据库连接环境信息。可以配置多个environment,通过default属性切换不同的environment
-->
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<!--数据库连接信息-->
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql:///db_studentmanager?useSSL=false"/>
<property name="username" value="root"/>
<property name="password" value="1234"/>
</dataSource>
</environment>
</environments>
<mappers>
<!--加载sql映射文件-->
<mapper resource="com/xxx/mapper/UserMapper.xml"/>
</mappers>
</configuration>
JavaBean类:src/main/java/com/xxx/pojo/User.java
package com.xxx.pojo;
public class User {
private Integer id;
private String username;
private String password;
private String realName;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getRealName() {
return realName;
}
public void setRealName(String realName) {
this.realName = realName;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", username='" + username + '\'' +
", password='" + password + '\'' +
", realName='" + realName + '\'' +
'}';
}
}
Mapper接口:src/main/java/com/xxx/mapper/UserMapper.java
package com.xxx.mapper;
import com.xxx.pojo.User;
import org.apache.ibatis.annotations.Delete;
import org.apache.ibatis.annotations.Select;
import java.util.List;
public interface UserMapper {
void add(User user);
User selectByID(int id);
@Select("select id,uname as username,upwd as password,realname as realName from userinfo;")
List<User> selectALL();
void update(User user);
@Delete("delete from userinfo where id=#{id}")
void deleteByID(int id);
}
SQL映射文件:src/main/resources/com/xxx/mapper/UserMapper.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.xxx.mapper.UserMapper">
<resultMap id="userResultMap" type="com.xxx.pojo.User">
<result column="uname" property="username"></result>
<result column="upwd" property="password"></result>
<result column="realname" property="realName"></result>
</resultMap>
<insert id="add">
insert into userinfo( uname, upwd, realname)
values (#{username},#{password},#{realName})
</insert>
<update id="update">
update userinfo
<set>
<if test="username != null and username != '' ">
uname=#{username},
</if>
<if test="password != null and password != '' ">
upwd=#{password},
</if>
<if test="realName != null and realName != '' ">
realname=#{realName},
</if>
</set>
where id=#{id}
</update>
<select id="selectByID" parameterType="int" resultMap="userResultMap">
select *
from userinfo
where id=#{id}
</select>
</mapper>
测试类:src/test/java/com/xxx/test/TestDemo.java
package com.xxx.test;
import com.xxx.mapper.UserMapper;
import com.xxx.pojo.User;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
public class TestDemo {
private String resource = "mybatis-config.xml";
private InputStream inputStream;
private SqlSessionFactory sqlSessionFactory;
private SqlSession sqlSession;
private UserMapper userMapper;
@Before
public void ini() throws IOException {
//1. 获取SqlSessionFactory
inputStream = Resources.getResourceAsStream(resource);
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//2. 获取SqlSession对象
sqlSession = sqlSessionFactory.openSession(true);
//3. 获取Mapper接口的代理对象
userMapper = sqlSession.getMapper(UserMapper.class);
}
@After
public void close(){
//5. 释放资源
sqlSession.close();
}
/**
* 添加
*/
@Test
public void testAdd(){
//接受数据
String username="zhy";
String password="zhyPassword";
String realNmae="朱厚宇";
//封装对象
User user=new User();
user.setUsername(username);
user.setPassword(password);
user.setRealName(realNmae);
userMapper.add(user);
}
/**
* 指定查询
*/
@Test
public void testSelectByID(){
//接受数据
int id=5;
User user=userMapper.selectByID(id);
System.out.println(user);
}
/**
* 全查询
*/
@Test
public void testSelectAll(){
List<User> userList=userMapper.selectALL();
System.out.println(userList);
}
/**
* 修改:动态
*/
@Test
public void testUpdate(){
//接受数据
String username="zhy222";
String password="zhyPassword222";
String realNmae="朱厚宇";
Integer id=7;
//封装对象
User user=new User();
user.setUsername(username);
user.setPassword(password);
user.setRealName(realNmae);
user.setId(id);
userMapper.update(user);
}
/**
* 删除
*/
@Test
public void testDeleteByID(){
int id=7;
userMapper.deleteByID(id);
}
}
JavaWEB08:JavaScript
8.1 数据库开发 - Mybatis 单元作业
有一个在线交易的电商平台,主要包括三张数据库业务表:
需求1:现在需要基于MyBatis数据库ORM框架,实现读取商品信息和用户信息两个功能。
操作接口定义如下:
public interface Op {
//查询用户信息
public User getUser(int id);
//查询商品信息
public Product getProduct(int id);
}
需求2:查询某个用户购买的所有商品信息 (可以只写出sql)
public interface Op {
//查询用户购买的商品信息
public User findUserProductByUserId(int id);
}
需求3:查询某个用户购买的所有商品信息及用户名称 (可以只写出sql)
public interface Op {
//查询用户购买的商品信息及用户名称
public User findUserProductAndUserInfoByUserId(int id);
}
素材:sql脚本
-- ----------------------------
-- 商品表
-- ----------------------------
DROP TABLE IF EXISTS `Product`;
CREATE TABLE `Product` (
`ID` int(11) NOT NULL AUTO_INCREMENT,
`ProductName` varchar(100) NOT NULL,
`Catalog` varchar(100) DEFAULT NULL,
PRIMARY KEY (`ID`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;
-- ----------------------------
-- Records of Product
-- ----------------------------
INSERT INTO `Product` VALUES ('1', 'iPhone', 'Phone');
INSERT INTO `Product` VALUES ('2', 'iMac', 'PC');
INSERT INTO `Product` VALUES ('3', 'MacBook', 'PC');
INSERT INTO `Product` VALUES ('4', 'iPad', 'Pad');
-- ----------------------------
-- 交易表
-- ----------------------------
DROP TABLE IF EXISTS `transaction`;
CREATE TABLE `transaction` (
`ID` int(11) NOT NULL AUTO_INCREMENT,
`UserId` int(11) DEFAULT NULL,
`ProductId` int(11) DEFAULT NULL,
PRIMARY KEY (`ID`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;
-- ----------------------------
-- Records of transaction
-- ----------------------------
INSERT INTO `transaction` VALUES ('1', '1', '1');
INSERT INTO `transaction` VALUES ('2', '1', '3');
INSERT INTO `transaction` VALUES ('3', '1', '2');
INSERT INTO `transaction` VALUES ('4', '1', '4');
-- ----------------------------
-- Table structure for User 用户表
-- ----------------------------
DROP TABLE IF EXISTS `User`;
CREATE TABLE `User` (
`ID` int(11) NOT NULL AUTO_INCREMENT,
`UserName` varchar(100) DEFAULT NULL,
`Tel` varchar(100) DEFAULT NULL,
PRIMARY KEY (`ID`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;
-- ----------------------------
-- Records of User
-- ----------------------------
INSERT INTO `User` VALUES ('1', 'ZhanPeng', '12345678');
答案:
src/main/java/com/ecommerce/mapper/Op.java
package com.ecommerce.mapper;
import com.ecommerce.pojo.Product;
import com.ecommerce.pojo.User;
import com.ecommerce.pojo.UserProduct;
import java.util.List;
public interface Op {
//查询用户信息
public User getUser(int id);
//查询商品信息
public Product getProduct(int id);
//查询用户购买的商品信息
public List<Product> findUserProductByUserId(int id);
//查询用户购买的商品信息及用户名称
public List<UserProduct> findUserProductAndUserInfoByUserId(int id);
}
src/main/java/com/ecommerce/pojo/Product.java
package com.ecommerce.pojo;
public class Product {
private Integer ID;
private String ProductName;
private String Catalog;
}
src/main/java/com/ecommerce/pojo/User.java
package com.ecommerce.pojo;
public class User {
private Integer ID;
private String UserName;
private String Tel;
}
src/main/java/com/ecommerce/dto/UserProductDto.java
package com.ecommerce.pojo;
public class UserProductDto {
private Integer ID;
private String ProductName;
private String Catalog;
private String UserName;
}
src/main/resources/com/ecommerce/mapper/Op.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ecommerce.mapper.Op">
<!-- 查询用户信息 -->
<select id="getUser" resultType="com.ecommerce.pojo.User">
select * from user where ID=#{ID};
</select>
<!-- 查询商品信息 -->
<select id="getProduct" resultType="com.ecommerce.pojo.Product">
select * from product where ID=#{ID};
</select>
<!-- 查询用户购买的商品信息 -->
<select id="findUserProductByUserId" resultType="com.ecommerce.pojo.Product">
SELECT * from product p,transaction t WHERE p.ID=t.ProductId AND t.UserId=#{ID};
</select>
<!-- 查询用户购买的商品信息及用户名称 -->
<select id="findUserProductAndUserInfoByUserId" resultType="com.ecommerce.pojo.UserProduct">
SELECT p.ID,p.ProductName,P.Catalog,u.UserName FROM user u,product p,transaction t WHERE u.ID=t.UserId AND p.ID=t.ProductId AND u.ID=#{ID};
</select>
</mapper>
src/test/java/com/ecommerce/test/MybatisTest.java
package com.ecommerce.test;
import com.ecommerce.mapper.Op;
import com.ecommerce.pojo.Product;
import com.ecommerce.pojo.User;
import com.ecommerce.pojo.UserProduct;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
public class MybatisTest {
private String resource = "mybatis-config.xml";
private InputStream inputStream;
private SqlSessionFactory sqlSessionFactory;
private SqlSession sqlSession;
private Op opMapper;
@Before
public void ini() throws IOException {
//1. 获取SqlSessionFactory
inputStream = Resources.getResourceAsStream(resource);
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//2. 获取SqlSession对象
sqlSession = sqlSessionFactory.openSession();
//sqlSession = sqlSessionFactory.openSession(true); //设置自动提交事:增删改都需要提交事务。
//3. 获取Mapper接口的代理对象
opMapper = sqlSession.getMapper(Op.class);
}
@After
public void close(){
//5. 释放资源
sqlSession.close();
}
@Test
public void testGetUser(){
int ID=1;
User user=opMapper.getUser(ID);
System.out.println(user);
}
@Test
public void testGetProduct(){
int ID=1;
Product product=opMapper.getProduct(ID);
System.out.println(product);
}
@Test
public void testFindUserProductByUserId(){
int ID=1;
List<Product> products=opMapper.findUserProductByUserId(ID);
System.out.println(products);
}
@Test
public void testFindUserProductAndUserInfoByUserId(){
int ID=1;
List<UserProduct> userProducts=opMapper.findUserProductAndUserInfoByUserId(ID);
System.out.println(userProducts);
}
}
8.2 前端作业
需求
有如下注册页面,对表单进行校验,如果输入的用户名、密码、手机号符合规则,则允许提交;如果不符合规则,则不允许提交。
完成以下需求:
- 当输入框失去焦点时,验证输入内容是否符合要求
- 当点击注册按钮时,判断所有输入框的内容是否都符合要求,如果不合符则阻止表单提交
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>欢迎注册</title>
<link href="../css/register.css" rel="stylesheet">
</head>
<body>
<div class="form-div">
<div class="reg-content">
<h1>欢迎注册</h1>
<span>已有帐号?</span> <a href="#">登录</a>
</div>
<form id="reg-form" action="#" method="get">
<table>
<tr>
<td>用户名</td>
<td class="inputs">
<input name="username" type="text" id="username">
<br>
<span id="username_err" class="err_msg" style="display: none">用户名不太受欢迎</span>
</td>
</tr>
<tr>
<td>密码</td>
<td class="inputs">
<input name="password" type="password" id="password">
<br>
<span id="password_err" class="err_msg" style="display: none">密码格式有误</span>
</td>
</tr>
<tr>
<td>手机号</td>
<td class="inputs"><input name="tel" type="text" id="tel">
<br>
<span id="tel_err" class="err_msg" style="display: none">手机号格式有误</span>
</td>
</tr>
</table>
<div class="buttons">
<input value="注 册" type="submit" id="reg_btn">
</div>
<br class="clear">
</form>
</div>
<script>
var usernameInput = document.getElementById("username");
usernameInput.onblur = checkUsername;
function checkUsername() {
var reg = /^\w{6,12}$/;
var flag = reg.test(username);
if (flag) {
document.getElementById("username_err").style.display = 'none';
} else {
document.getElementById("username_err").style.display = '';
}
return flag;
}
var passwordInput = document.getElementById("password");
passwordInput.onblur = checkPassword;
function checkPassword() {
var password = passwordInput.value.trim();
var reg = /^\w{6,12}$/;
var flag = reg.test(password);
if (flag) {
document.getElementById("password_err").style.display = 'none';
} else {
document.getElementById("password_err").style.display = '';
}
return flag;
}
var telInput = document.getElementById("tel");
telInput.onblur = checkTel;
function checkTel() {
var tel = telInput.value.trim();
var reg = /^[1]\d{10}$/;
var flag = reg.test(tel);
if (flag) {
document.getElementById("tel_err").style.display = 'none';
} else {
document.getElementById("tel_err").style.display = '';
}
return flag;
}
var regForm = document.getElementById("reg-form");
regForm.onsubmit = function () {
var flag = checkUsername() && checkPassword() && checkTel();
return flag;
}
</script>
</body>
</html>