JavaWeb开发---学习---(一)
前言
前端知识会点,后端知识一直算是空白,但也不算是太空
会java、sql、web,好赖懂点,现在要串联起来,学会服务端开发
也为日后自己做个小项目打点基础(虽然有点晚,但是,只要学,就有机会)
本次学习视频教程:JavaWeb
自己只做部分知识点的记录,详细的,可以看老师有自己的讲义,可参考
Web后端基础
Maven(专家)
类似于cocoapods,是集成下载第三方库的
搜索第三方库的网址:https://mvnrepository.com/
单元测试
单元测试,一般使用JUnit(测试框架)来进行
有几个好处:
- 测试代码与源代码分开,便于维护
- 可根据需要进行自动化测试
- 可自动分析测试结果,产出测试报告
Spring
Spring
照猫画虎,哈哈,画成了~
@ResponseBody注解的作用
- 将controller方法的返回值直接写入HTTP响应体
- 如果是对象或集合,会先转为json,再响应
- @RestController = @Controller + @ResponseBody
分层解耦
三层架构
分层解耦
数据库学习
MySql下载地址
按照MySql后,按照Mac安装MySQL详细教程文档,配置一下
常用操作:
-- 查看当前数据库所有表
show tables;-- 查看表结构
desc emp;-- 查询建表语句
show create table emp;# CREATE TABLE `emp` (
# `id` int unsigned NOT NULL AUTO_INCREMENT COMMENT '唯一标识',
# `username` varchar(20) NOT NULL COMMENT '用户名',
# `password` varchar(32) DEFAULT '123456' COMMENT '密码',
# `name` varchar(10) NOT NULL COMMENT '姓名',
# `gender` tinyint unsigned NOT NULL COMMENT '性别 1男 2女',
# `phonenumber` char(11) NOT NULL COMMENT '手机号',
# `posit` tinyint unsigned DEFAULT NULL COMMENT '职位 1班主任 2讲师 3 学工主管',
# `salary` float unsigned DEFAULT NULL COMMENT '薪资',
# `icon` varchar(255) DEFAULT NULL COMMENT '头像',
# `join_date` date DEFAULT NULL COMMENT '入职日期',
# `create_time` datetime DEFAULT NULL COMMENT '创建时间',
# `update_time` datetime DEFAULT NULL COMMENT '修改时间',
# `qq` varchar(13) DEFAULT NULL COMMENT 'QQ',
# PRIMARY KEY (`id`),
# UNIQUE KEY `id` (`id`),
# UNIQUE KEY `username` (`username`),
# UNIQUE KEY `phonenumber` (`phonenumber`)
# ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='员工表'-- 字段:添加字段wx
alter table db02.emp add weixin varchar(10) comment '微信号';-- 字段:修改字段类型 weixin varchar(10)
alter table emp modify weixin varchar(20);-- 字段:修改字段名 weixin -> wx
alter table emp change weixin wx varchar(20);-- 字段:删除字段 qq
alter table emp drop qq;-- 修改表名
alter table emp rename to employee;-- 删除表
drop table employee;
表查询语句:
-- =================== DQL: 基本查询 ======================
-- 1. 查询指定字段 name,entry_date 并返回
select name, emp.entry_date from emp;-- 2. 查询返回所有字段
select * from emp;-- 3. 查询所有员工的 name,entry_date, 并起别名(姓名、入职日期)
select name as name1, entry_date as entry_date2 from emp;-- 4. 查询已有的员工关联了哪几种职位(不要重复)
select distinct emp.job from emp;-- =================== DQL: 条件查询 ======================
-- 1. 查询 姓名 为 柴进 的员工
select * from emp where name = "柴进";-- 2. 查询 薪资小于等于5000 的员工信息
select * from emp where salary <= 5000;-- 3. 查询 没有分配职位 的员工信息
select * from emp where job is null;-- 4. 查询 有职位 的员工信息
select * from emp where job is not null;-- 5. 查询 密码不等于 '123456' 的员工信息
select * from emp where password != '123456';-- 6. 查询 入职日期 在 '2000-01-01' (包含) 到 '2010-01-01'(包含) 之间的员工信息
select * from emp where emp.entry_date between '2000-01-01' and '2010-01-01';-- 7. 查询 入职时间 在 '2000-01-01' (包含) 到 '2010-01-01'(包含) 之间 且 性别为女 的员工信息
select * from emp where emp.entry_date between '2000-01-01' and '2010-01-01' and gender = '2';-- 8. 查询 职位是 2 (讲师), 3 (学工主管), 4 (教研主管) 的员工信息
select * from emp where job in(2, 3, 4);-- 9. 查询 姓名 为两个字的员工信息
# select * from emp where name
select * from emp where name like '__';-- 10. 查询 姓 '李' 的员工信息
select * from emp where name like '李%';-- 11. 查询 姓名中包含 '二' 的员工信息
select * from emp where name like '%二%';
-- =================== DQL: 分组查询 ======================
-- 聚合函数-- 1. 统计该企业员工数量
select count(emp.id) from emp;
select count(*) from emp;
select count(1) from emp;-- 2. 统计该企业员工的平均薪资
select avg(emp.salary) from emp;-- 3. 统计该企业员工的最低薪资
select min(emp.salary) from emp;-- 4. 统计该企业员工的最高薪资
select max(emp.salary) from emp;-- 5. 统计该企业每月要给员工发放的薪资总额(薪资之和)
select sum(emp.salary) from emp;-- 分组
-- 1. 根据性别分组 , 统计男性和女性员工的数量
select gender, count(*) from emp group by gender;-- 2. 先查询入职时间在 '2015-01-01' (包含) 以前的员工 , 并对结果根据职位分组 , 获取员工数量大于等于2的职位
select job, count(*) from emp where entry_date <= '2015-01-01' group by job having count(*) > 2;
-- =================== 排序查询 ======================
-- 1. 根据入职时间, 对员工进行升序排序
select * from emp order by entry_date;-- 2. 根据入职时间, 对员工进行降序排序
select * from emp order by entry_date desc;-- 3. 根据 入职时间 对公司的员工进行 升序排序 , 入职时间相同 , 再按照 更新时间 进行降序排序
select * from emp order by entry_date asc, update_time desc;
JDBC
关系型数据库有很多,比如mySql、Oracle、SqlServer
不同的数据库有差别,所以,有一套提供接口的API:JDBC,方便大家用一套API,操作不同的数据库
Mybatis又是对JDBC的一层封装
MyBatis
@Mapper// 加上这句话,可以在程序运行时,自动为该接口创建一个实现类对象(代理对象),并且会自动将该实现类对象存入IOC容器
public interface UserMapper {//@Select("select id, username, password, name, age from user")//查询所有用户信息public List<User> findAll();@Delete("delete from user where id = #{id}")
// public void deleteById(Integer id);// 无返回值public Integer deleteById(Integer id); // 有返回值@Insert("insert into user(username, password, name, age) values(#{username}, #{password}, #{name}, #{age})")public Integer insertUser(User user);// @Update("update user set username = #{username}, password = #{password}, name = #{name}, age = #{age} where id = #{id}")@Update("update user set username = #{username}, password = #{password}, name = #{name}, age = #{age} where id = #{id}")public Integer updateUser(User user);@Update("update user set username = #{username} where id = #{id}")public Integer updateUser2(User user);@Select("select * from user where username = #{username} and password = #{password}")
// public User findByUsernameAndPassword(@Param("username") String username, @Param("password") String password);public User findByUsernameAndPassword( String username, String password);
}import java.util.List;@SpringBootTest(classes = SpringbootMybatisQuickstartApplication.class) //单元测试的注解
class SpringbootMybatisQuickstartApplicationTests {@Autowiredprivate UserMapper userMapper;@Testpublic void testFindAll(){List<User> userList = userMapper.findAll();userList.forEach(System.out::println);}@Testpublic void testDeleteById(){Integer rows = userMapper.deleteById(5);System.out.println("rows = " + rows);//影响的行数}@Testpublic void testInsertUser(){User user = new User(null, "zhouyu", "123456", "周瑜", 20);Integer rows = userMapper.insertUser(user);System.out.println("rows = " + rows);}@Testpublic void testUpdateUser(){User user = new User(6, "huanggai", "123456", "黄盖", 60);Integer rows = userMapper.updateUser(user);System.out.println("rows = " + rows);}@Testpublic void testUpdateUser2(){User user = new User();user.setId(6);user.setUsername("huanggai2");Integer rows = userMapper.updateUser2(user);System.out.println("rows = " + rows);}@Testpublic void testFindByUsernameAndPassword(){User user = userMapper.findByUsernameAndPassword("huanggai2", "123456");System.out.println(user);}
}
yml配置
Web后端实战
Tlias案例
前端服务器是nginx
后端服务器是tomcat
Restful
Restful,表述性状态转换,它是一种软件架构风格。
get查询
post新增
put修改
delete删除
话说,工作这么久,大部分接口都是get\post,基本上没用过put或者delete
创建新项目,需要添加的依赖:
有关注解的一些信息:
Spring相关注解
-
@SpringBootApplication
: 标记在 [TliasWebManagementApplication](file:///Users/mac/IdeaProjects/web-ai-project02/tlias-web-management/src/main/java/com/example/TliasWebManagementApplication.java#L5-L12) 类上,这是Spring Boot应用的入口注解,组合了多个注解功能,用于启用自动配置和组件扫描 -
@RestController
: 标记在 [DeptController](file:///Users/mac/IdeaProjects/web-ai-project02/tlias-web-management/src/main/java/com/example/controller/DeptController.java#L12-L25) 类上,是@Controller
和@ResponseBody
的组合注解,用于构建RESTful Web服务,所有方法的返回值都会直接写入HTTP响应体 -
@Autowired
: 用于自动装配依赖,如在 [DeptController](file:///Users/mac/IdeaProjects/web-ai-project02/tlias-web-management/src/main/java/com/example/controller/DeptController.java#L12-L25) 和 [DeptServiceImpl](file:///Users/mac/IdeaProjects/web-ai-project02/tlias-web-management/src/main/java/com/example/service/impl/DeptServiceImpl.java#L10-L20) 中注入其他组件 -
@Service
: 标记在 [DeptServiceImpl](file:///Users/mac/IdeaProjects/web-ai-project02/tlias-web-management/src/main/java/com/example/service/impl/DeptServiceImpl.java#L10-L20) 类上,声明这是一个服务层组件,会被Spring容器自动检测和管理 -
@Mapper
: 标记在 [DeptMapper](file:///Users/mac/IdeaProjects/web-ai-project02/tlias-web-management/src/main/java/com/example/mapper/DeptMapper.java#L8-L12) 接口上,这是MyBatis框架的注解,表示这是一个Mapper接口,用于与数据库交互
Spring MVC相关注解
@RequestMapping
: 用于映射HTTP请求到处理方法value = "/depts"
: 指定请求的URL路径method = RequestMethod.GET
: 指定处理GET请求
MyBatis相关注解
@Select
: 在 [DeptMapper](file:///Users/mac/IdeaProjects/web-ai-project02/tlias-web-management/src/main/java/com/example/mapper/DeptMapper.java#L8-L12) 接口中使用,用于直接在注解中编写SQL查询语句
Lombok相关注解
-
@Data
: 在 [Dept](file:///Users/mac/IdeaProjects/web-ai-project02/tlias-web-management/src/main/java/com/example/pojo/Dept.java#L8-L16) 和 [Result](file:///Users/mac/IdeaProjects/web-ai-project02/tlias-web-management/src/main/java/com/example/pojo/Result.java#L9-L38) 类上使用,自动生成getter、setter、toString等方法 -
@NoArgsConstructor
: 生成无参构造函数 -
@AllArgsConstructor
: 生成全参构造函数
注解使用时机总结
- 类级别注解: 通常在定义类时使用,如
@RestController
、@Service
、@Mapper
- 方法级别注解: 用于处理特定请求或执行特定功能,如
@RequestMapping
- 字段级别注解: 用于依赖注入或数据映射,如
@Autowired
- SQL注解: 直接在Mapper接口方法上编写SQL语句,如
@Select
这些注解大大简化了Java代码的编写,通过声明式的方式实现各种功能,减少了样板代码的编写。
内连数据
-- ============================= 内连接 ==========================
-- A. 查询所有员工的ID, 姓名 , 及所属的部门名称 (隐式、显式内连接实现)
select emp.id, emp.name, dept.name from emp, dept where emp.dept_id = dept.id;select emp.id, emp.name, dept.name from emp inner join dept on emp.dept_id = dept.id;select emp.id, emp.name, dept.name from emp join dept on emp.dept_id = dept.id;-- B. 查询 性别为男, 且工资 高于8000 的员工的ID, 姓名, 及所属的部门名称 (隐式、显式内连接实现)
select emp.id, emp.name, dept.name from emp, dept where emp.dept_id = dept.id and emp.gender = 1 and emp.salary > 8000;
-- =============================== 外连接 ============================
-- A. 查询员工表 所有 员工的姓名, 和对应的部门名称 (左外连接)
# select emp.name, dept.name from emp, dept where emp.dept_id = dept.id;select emp.name, dept.name from emp left outer join dept on emp.dept_id = dept.id;-- B. 查询部门表 所有 部门的名称, 和对应的员工名称 (右外连接)
select emp.name, dept.name from emp right outer join dept on emp.dept_id = dept.id;select emp.name, dept.name from dept left outer join emp on emp.dept_id = dept.id;-- C. 查询工资 高于8000 的 所有员工的姓名, 和对应的部门名称 (左外连接)
select emp.name, dept.name from emp left outer join dept on emp.dept_id = dept.id where emp.salary > 8000;