文章目录
- 1. Axios扩展知识
- 2 Mybatis学习
- 晚课串讲
- 作业:
- 常用注解
1. Axios扩展知识
1.1 前端JS-回调地狱
说明: 如果Ajax嵌套的层级较多,则把这种结构称之为"回调地狱"
嵌套规则:
1. 用户发起第一个Ajax请求.回调函数中的结果,要当做第二个ajax请求的参数.
2. 用户第二个ajax回调函数的结果,要当做第三个Ajax请求的参数 以此类推!!!
回调地狱问题说明:
由于回调方法和请求的方法在2行,导致嵌套的结构没有办法优化.如果需要优化,则应该将Ajax的请求一行搞定. 例如
let result1 = axios.get(url1);
let result2 = axios.get(url2,result1)
let result3 = axios.get(url3,result2)
1.2 前端JS-回调地狱-解决方案
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Axios入门案例</title>
</head>
<body>
<!-- 1.导入js文件 -->
<script src="js/axios.js"></script>
<!-- 2.编辑JS代码 -->
<script>
/* let url1 = "http://localhost:8080/axios/findUser"
axios.get(url1)
.then(function(promise){
console.log(promise.data)
axios.get("url2",promise.data)
.then(promise2 => {
console.log(promise2.data);
axios.get("url3",promise2.data)
.then(promise3 => {
console.log(promise3.data)
//...嵌套十八层,比喻为回调地狱
})
})
}) */
/**
* 语法:
* 1.async 关键字修饰函数
* 2.await 关键字修改ajax请求
* 3.先定义函数.之后调用函数
* 语法说明: 解构赋值操作
*/
async function getUser(){
let url1 = "http://localhost:8080/axios/findUser"
let {data: result} = await axios.get(url1)
console.log(result)
//let promise= let promise = await axios.get(url1)
//console.log(promise.data)
//return promise
}
//调用函数
getUser()
/* async function getUser2(data){
let url2 = "http://localhost:8080/axios/findUser"
let promise = await axios.get(url2,data)
return promise
}
let result1 = getUser();
let result2 = getUser2(result1); */
</script>
<h1>学习Axios的ajax调用</h1>
</body>
</html>
2 Mybatis学习
2.1 根据ID查询数据
2.1.1 编辑测试方法
/**
* 业务需求: 根据ID查询数据
* 参数: id = 1
*/
@Test
public void test02(){
int id = 1;
User user = userMapper.findUserById(id);
System.out.println(user);
}
2.1.2 编辑接口方法
User findUserById(int id);
2.1.3 编辑映射文件
<!--根据id查询用户数据
语法: 动态获取数据 #{属性名称}
#号效果: 有预编译的效果 防止Sql注入攻击问题
所以以后取值使用#号
-->
<select id="findUserById" resultType="com.jt.pojo.User">
select * from demo_user where id= #{id}
</select>
2.2 完成用户入库操作
2.2.1 编辑测试类
/**
* 实现用户入库操作
*/
@Test
public void saveUser(){
User user = new User();
user.setName("元旦快乐").setAge(2022).setSex("女");
//如果需要返回值 则int接收
int rows = userMapper.saveUser(user);
//如果不需要返回值 则void标识
//userMapper.saveUser(user);
System.out.println("入库成功:影响:"+rows+"行");
}
2.2.2 编辑Mapper接口
int saveUser(User user);
2.2.3 编辑Mapper映射文件
<!--
规则:
1.如果接口方法中,有int类型的返回值,则入库之后,mybatis自动回传数据
2.如果接口中传递的是POJO对象.则通过#{属性}取值
大小问题:
1.windows系统中程序运行不区分大小写.
2.Linux系统 严格区分大小写.
3.程序猿口头禅: 我在我本机上没问题呀!!!!
-->
<insert id="saveUser">
insert into demo_user(id,name,age,sex) values (null,#{name},#{age},#{sex})
</insert>
2.3 课堂作业
2.3.1 编辑测试类方法
/**
* 3.修改操作 将name="元旦快乐" 改为age=17,sex=男
*/
@Test
public void updateUser(){
User user = new User();
user.setName("元旦快乐").setAge(17).setSex("男");
userMapper.updateUser(user);
System.out.println("修改操作成功!!!");
}
//4.删除操作 将name="春节快乐"的数据删除
@Test
public void deleteUser(){
String name = "春节快乐";
userMapper.deleteUser(name);
System.out.println("删除成功!!!");
}
2.3.2 编辑Mapper接口方法
void updateUser(User user);
void deleteUser(String name);
2.3.3 编辑Mapper映射文件
<update id="updateUser">
update demo_user set age=#{age}, sex=#{sex}
where name=#{name}
</update>
<delete id="deleteUser">
delete from demo_user where name=#{name}
</delete>
2.4 Map集合封装数据
2.4.1 编辑测试方法
/**
* 业务: 查询age> 18岁 and age <100的用户.
* 知识点:
* 1.mybatis的参数可以是基本类型或者字符串.
* 2.如果遇到多个参数,应该使用对象(POJO)进行封装.
* 3.如果通过pojo封装不方便.则使用功能最为强大的Map进行封装
* 4.Mybatis的接口方法中只允许传递单值
*/
@Test
public void testFindUserByAge(){
Map<String,Object> map = new HashMap<>();
map.put("minAge",18);
map.put("maxAge",100);
List<User> userList = userMapper.findUserByAge(map);
System.out.println(userList);
}
2.4.2 编辑Mapper接口方法
List<User> findUserByAge(Map<String, Object> map);
2.4.3 编辑Mapper 映射文件
<!--
知识点1: 通过 #{参数名称/对象中的属性/Map中的key}
知识点2: xml文件中有些字符需要转义
> > < <
& &
-->
<select id="findUserByAge" resultType="com.jt.pojo.User">
select * from demo_user where age>#{minAge} and age < #{maxAge}
</select>
2.5 @Param注解
2.5.1 需求说明
说明: 根据下列的代码,不能非常直观去了解业务. 能否优化该操作.
List<User> findUserByAge(Map<String, Object> map);
2.5.2 编辑测试类
@Test
public void testFindUserByAge2(){
int minAge = 18;
int maxAge = 100;
List<User> userList = userMapper.findUserByAge2(minAge,maxAge);
System.out.println(userList);
}
2.5.3 编辑Mapper接口
//如果参数是多值,则需要封装为单值Map
//@Param将参数封装为Map集合
List<User> findUserByAge2(@Param("minAge") int minAge,
@Param("maxAge") int maxAge);
2.5.4 编辑Mapper映射文件
<select id="findUserByAge2" resultType="com.jt.pojo.User">
select * from demo_user where age>#{minAge} and age < #{maxAge}
</select>
2.6 Mybatis 模糊查询写法
2.6.1 编辑测试方法
/**
* 需求: 查询name中 包含"君"字的数据
* Sql: where name like "%君%"
*/
@Test
public void findByLike(){
String key = "君";
List<User> userList = userMapper.findByLike(key);
System.out.println(userList);
}
2.6.2 编辑接口方法
List<User> findByLike(String key);
2.6.3 编辑映射文件
<!--
知识点1: 通过 #{参数名称/对象中的属性/Map中的key}
知识点2: xml文件中有些字符需要转义
> > < <
& &
-->
<select id="findUserByAge" resultType="com.jt.pojo.User">
select * from demo_user where age>#{minAge} and age < #{maxAge}
</select>
2.7 Mybatis属性优化
2.7.1 别名包用法
其中resultType中的属性com.jt.pojo.User 定义别名.简化其操作.
<select id="findByLike" resultType="com.jt.pojo.User">
select * from demo_user where name like "%"#{key}"%"
</select>
-
标识注解
-
使用别名
3.定义别名包 定义别名包之后,以后的数据只需要写类名即可,使用时会自动的拼接前缀#3.配置Mybatis
mybatis:
#定义别名包
type-aliases-package: com.jt.pojo
2.7.2 Sql标签用法
<!--Sql标签作用: 抽取公共的部分,可以被其它的Sql引用-->
<sql id="findColumn">
select id,name,age,sex from demo_user
</sql>
<select id="findByLike" resultType="User">
<include refid="findColumn"/> where name like "%"#{key}"%"
</select>
2.8 Mybatis中集合参数用法 array/list
2.8.1 Array类型的参数说明
说明: 一般业务逻辑可能会用到array进行数据的封装. 问题: xml映射文件中如何解析数组
格式如下: Integer[] ids = {1,3,4,5,6};
2.8.2 测试代码
/**
* 业务说明: 集合参数的用法
* 需求: 查询id=1,3,4,5,6的数据
* Sql: where id in (1,3,4,5,6)
*/
@Test
public void findIn(){
Integer[] ids = {1,3,4,5,6};
List<User> list = userMapper.findIn(ids);
System.out.println(list);
}
2.8.3 编辑Mapper接口
List<User> findIn(Integer[] ids);
2.8.4 编辑Mapper 映射文件
<!--
需求: Integer[] ids 中的数据一个一个取出来.拼接Sql
知识点: mybatis中如何遍历数组
foreach标签用法:
1. collection:需要遍历的集合的类型
1.1 数组类型 关键字:array
1.2 list类型 关键字:list
1.3 map类型 关键字:Map中的key
2. open/close 循环开始和结束标签,一般自己写
3. item 遍历数据的变量名称
4. separator 参数之间的分隔符
-->
<select id="findIn" resultType="User">
select * from demo_user where id in (
<foreach collection="array" item="id" separator=",">
#{id}
</foreach>
)
</select>
2.9 Mybatis中集合参数用法Map封装
2.9.1 测试代码
@Test
public void findInMap(){
//准备2个集合,测试map集合封装
Integer[] ids1 = {1,3,4,5,6};
Integer[] ids2 = {1,3,4,5,6};
List<User> list = userMapper.findInMap(ids1,ids2);
System.out.println(list);
}
2.9.2 编辑Mapper接口
List<User> findInMap(@Param("ids1") Integer[] ids1,
@Param("ids2") Integer[] ids2);
2.9.3 编辑Mapper映射文件
<!--参数传递是Map集合,所以关键字使用key-ids1 -->
<select id="findInMap" resultType="User">
select * from demo_user where id in (
<foreach collection="ids1" item="id" separator=",">
#{id}
</foreach>
)
</select>
晚课串讲
1.基本类型和引用类型(包装类型)区别
尽可能使用包装类型
int a=0 没有方法,Integer a=null 有方法
2.为什么pojo需要序列化
业务需求: 微服务框架后端服务器可能有多个.
总结: 使用序列化保证数据在不同的线程的安全性
3.AOP-joinPoint
如果该方法满足切入点表达式,则该方法变化为"joinPoint"
4.SpringMVC-组件
5年前课上就会讲, ModelAndView对象 Model代表数据/View代表页面
5.测试类用法
测试方法运行,首先查找主启动类 之后开启包扫描 启动spring容器
6.Map集合的遍历
见代码
7.list和map
8.Spring中的bean工厂
9.回调地狱问题
10.代理对象 pass JDK代理 接口 CGLIB 继承
作业:
1.提前安装vue-cli客户端工具 B站 不二子阳 VUE后台脚手架安装过程
2.扩展mvc 组件内容 SpringMVC调用流程图
3.安装Vmware虚拟机 B站视频
常用注解
- @Configuration 标识当前类是配置类
- @ComponentScan 包扫描注解 扫描注解
- @Bean 标识该方法的返回值交给Spring容器管理
- @Scope 控制多例和单例
- @Lazy 懒加载
- @PostConstruct 初始化方法
- @PreDestroy 销毁方法
- @Component 将当前类未来的对象交给容器管理
- @Autowired 按照类型进行注入
- @Qualifier 按照名称进行注入
- @Repository 标识持久层注解
- @Service 标识Service层
- @Controller 标识Controller层
- @Value 为属性赋值 @Value("${key}")
- @PropertySource 加载指定路径的配置文件properties
- @Aspect 标识当前类是一个切面类
- @Pointcut 用于定义切入点表达式 表达式写法4种
- @EnableAspectJAutoProxy 让AOP的注解有效果
- @Before AOP-前置通知
- @AfterReturning AOP-后置通知
- @AfterThrowing AOP-异常通知
- @After AOP-最终通知
- @Around AOP-环绕通知
- @Order(1) //可以利用order关键字 实现AOP的排序 数字越小越先执行.
- @ResponseBody 将返回的数据转化为JSON串, 如果是字符串本身 原数据返回
- @RequestMapping("/hello") 实现浏览器的请求路径与方法的映射
- @PathVariable restFul结构,接收参数的注解.
- @GetMapping("") 只能接收GET请求类型
- @DeleteMapping("") 只能接收DELETE请求类型
- @PostMapping("") 只能接收POST请求类型
- @PutMapping("") 只能接收PUT请求类型
- @RestController 表示Controller类,同时要求返回值为JSON
- @CrossOrigin 允许跨域访问
- @RequestBody 参数接收时,将JSON串转化为java对象 json中的key与对象的属性一致.
- @Data lombok动态生成get/set/toString/equals/hashcode等方法
- @Accessors 控制是否开启链式加载结构
- @NoArgsConstructor 生成无参构造方法
- @AllArgsConstructor 生成全参构造方法
- @Mapper mybatis将当前的接口交给Spring容器管理. Map<类名小写,JDK动态代理对象>
- @SpringBootTest 该注解的作用在进行代码测试时启动spring容器,之后动态的获取对象 注意包路径 主启动类的同包及子包中.
- @Param Mybatis中将参数封装为Map集合. @Param(“maxAge”) int maxAge
- @Alias Mybatis中定义对象的别名 @Alias(“User”)