CGB2110-DAY08-Mybatis

49 篇文章 6 订阅
49 篇文章 2 订阅

文章目录

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文件中有些字符需要转义
                > &gt;   < &lt;
                & &amp;
    -->
    <select id="findUserByAge" resultType="com.jt.pojo.User">
        select * from demo_user where age>#{minAge} and age &lt; #{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 &lt; #{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文件中有些字符需要转义
                > &gt;   < &lt;
                & &amp;
    -->
    <select id="findUserByAge" resultType="com.jt.pojo.User">
        select * from demo_user where age>#{minAge} and age &lt; #{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>
  1. 标识注解
    在这里插入图片描述

  2. 使用别名
    在这里插入图片描述
    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站视频

常用注解

  1. @Configuration 标识当前类是配置类
  2. @ComponentScan 包扫描注解 扫描注解
  3. @Bean 标识该方法的返回值交给Spring容器管理
  4. @Scope 控制多例和单例
  5. @Lazy 懒加载
  6. @PostConstruct 初始化方法
  7. @PreDestroy 销毁方法
  8. @Component 将当前类未来的对象交给容器管理
  9. @Autowired 按照类型进行注入
  10. @Qualifier 按照名称进行注入
  11. @Repository 标识持久层注解
  12. @Service 标识Service层
  13. @Controller 标识Controller层
  14. @Value 为属性赋值 @Value("${key}")
  15. @PropertySource 加载指定路径的配置文件properties
  16. @Aspect 标识当前类是一个切面类
  17. @Pointcut 用于定义切入点表达式 表达式写法4种
  18. @EnableAspectJAutoProxy 让AOP的注解有效果
  19. @Before AOP-前置通知
  20. @AfterReturning AOP-后置通知
  21. @AfterThrowing AOP-异常通知
  22. @After AOP-最终通知
  23. @Around AOP-环绕通知
  24. @Order(1) //可以利用order关键字 实现AOP的排序 数字越小越先执行.
  25. @ResponseBody 将返回的数据转化为JSON串, 如果是字符串本身 原数据返回
  26. @RequestMapping("/hello") 实现浏览器的请求路径与方法的映射
  27. @PathVariable restFul结构,接收参数的注解.
  28. @GetMapping("") 只能接收GET请求类型
  29. @DeleteMapping("") 只能接收DELETE请求类型
  30. @PostMapping("") 只能接收POST请求类型
  31. @PutMapping("") 只能接收PUT请求类型
  32. @RestController 表示Controller类,同时要求返回值为JSON
  33. @CrossOrigin 允许跨域访问
  34. @RequestBody 参数接收时,将JSON串转化为java对象 json中的key与对象的属性一致.
  35. @Data lombok动态生成get/set/toString/equals/hashcode等方法
  36. @Accessors 控制是否开启链式加载结构
  37. @NoArgsConstructor 生成无参构造方法
  38. @AllArgsConstructor 生成全参构造方法
  39. @Mapper mybatis将当前的接口交给Spring容器管理. Map<类名小写,JDK动态代理对象>
  40. @SpringBootTest 该注解的作用在进行代码测试时启动spring容器,之后动态的获取对象 注意包路径 主启动类的同包及子包中.
  41. @Param Mybatis中将参数封装为Map集合. @Param(“maxAge”) int maxAge
  42. @Alias Mybatis中定义对象的别名 @Alias(“User”)
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

鱼香Ross

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值