设计思想

IOC

  • 解释:Inversion of Control 控制反转
  • 含义:将设计好的对象交给容器控制。
  • 好处:
    • 解耦:因为把对象生成放在了XML里定义,所以当我们需要换一个实现子类将会变成很简单(一般这样的对象都是实现于某种接口的),只要修改XML就可以了,这样我们甚至可以实现对象的热插拔(有点像USB接口和SCSI硬盘了)。
    • 可维护性和灵活性
    • 使得组件可以依赖于接口,而不是依赖于实现。
  • 理解

    • 谁控制谁?
      • 在传统的Java程序中,我们会通过new创建对象;而IOC有一个专门的容器来创建这些对象,即由IOC容器控制对象的创建。
    • 控制什么?
      • 主要控制了外部资源获取。
    • 为何是反转?
      • 在传统程序中由我们自己在对象中主动控制,并直接获取依赖对象(如用户类依赖于用户信息类);反转则是由容器来帮忙创建及注入依赖对象,对象只是被动的接受依赖对象
    • 图1,传统应用程序;图2,有IoC/DI容器后程序结构示意图
      • SpringBoot - 图1 SpringBoot - 图2

        DI

  • 解释:Dependency Injection,依赖注入

  • 含义:由IOC容器动态的将某个组件依赖的对象注入到组件之中
  • 理解

    • 和IOC的关系:依赖注入用于实现控制反转
    • 谁依赖于谁:应用程序依赖于IoC容器;
    • 为什么需要依赖:应用程序需要IoC容器来提供对象需要的外部资源;
    • 谁注入谁:IoC容器注入应用程序某个应用程序依赖的对象;
    • 注入了什么:就是注入某个对象所需要的外部资源(包括对象、资源、常量数据)

      Bean管理

  • Bean是什么:类的代理或代言人

  • Bean管理

    (注解分为两类,注册Bean和使用Bean)

    1. 注册Bean:凡是子类及带有方法或属性的类都要加上注册Bean到Spring IoC的注解(如@Component , @Repository , @ Controller , @Service , @Configration)。这些注解都是把你要实例化的对象转化成一个Bean,放在IoC容器中,等你要用的时候,它会和上面的@Autowired , @Resource配合到一起,把对象、属性、方法完美组装。
    2. 使用Bean:把已经在xml文件中配置好的Bean拿来用,完成属性、方法的组装;比如@Autowired , @Resource,可以通过byTYPE(@Autowired)、byNAME(@Resource)的方式获取Bean;

      注解

  1. @Controller
    • 作用:
      • 在对应的方法上,视图解析器可以解析return 的jsp,html页面,并且跳转到相应页面,若返回json等内容到页面,则需要加@ResponseBody注解。
      • 标注控制层组件
  2. @Autowired
    • 作用:@Autowired可以标注在属性上、方法上和构造器上,来完成自动装配。
  3. @Data
    • 作用:
      • @ToString、 @EqualsAndHashCode、所有属性的@Getter、所有non-final属性的@Setter和@RequiredArgsConstructor的组合,即会生成这些函数。
      • 通常情况下,我们在entity使用这个注解就足够了。
  4. @RestController
    • 作用:相当于@Controller+@ResponseBody两个注解的结合,返回json数据不需要在方法前面加@ResponseBody注解了,但使用@RestController这个注解,就不能返回jsp,html页面,因为视图解析器无法解析jsp,html页面。
  5. @RequestMapping
    • 作用:为控制器指定可以处理哪些URL 请求
    • 参数:
      • value:请求URL
      • method:请求方法(默认支持get:查和post:增删改)
      • params:请求参数
      • consumes、
      • produces:表示返回数据格式
      • headers:请求头
  • 示例
    • @RequestMapping(“/sys”)
    • @RequestMapping(value=”/testParamsAndHeaders”, params={“username”, “age!=20”})
    • @RequestMapping(value= “/login”, method=RequestMethod.GET, consumes=”application/json”, produces=”application/json”,params=”myParam=myValue”, headers=”Referer=http://www.ifeng.com/“)
  1. @GetMapping
    • 作用:@RequestMapping和method=RequestMethod.GET的组合注解
  2. @RequestBody
    • 作用:接收post请求传来的json参数(因为get请求传不了json)
    • ps:
      • 在传json字符串给后端时,如果某个参数没有value的话,要么干脆就不把该字段写到json字符串中;要么写value时, 必须有值,null 或””都行。千万不能有类似”stature”:,这样的写法。
      • @RequestBody和@RequestParam可以同时使用,前者会接收请求体中的Json对象,后者会接收通过url返回的表单格式的key-value数据。
    • 实例: ```java //通过一个对象接收 @PostMapping(“test”) public String test(@RequestBody User user){ }

//通过一个字符串接收 @PostMapping(“test”) public String test(@RequestBody String str){ }

  1. 8. @ResponsonBody
  2. - 作用: Controller需要返回的Java对象转换为Json对象返回
  3. - 示例:
  4. ```java
  5. @GetMapping("/sys")
  6. @ResponseBody
  7. public Result<?> helloWorld() {
  8. return"Hello World";
  9. }
  1. @PathVariable

    • 作用:获取url中的动态参数
    • 示例:
      1. @GetMapping(value="/{id}/queryNum")
      2. public String test(@PathVariable("id") int id){
      3. System.out.println(id);
      4. }
  2. @RequestParam

    • 作用:接收前端通过url返回的普通参数,并对这些普通参数有所限制。
    • ps:
      • 接收前端通过url返回的普通参数时,该注解可写不可写,只写注解而不更改其默认参数,会导致一些限制,比如必传。接收json参数时不可写。
      • @RequestBody和@RequestParam可以同时使用,前者会接收请求体中的Json对象,后者会接收通过url返回的表单格式的key-value数据。
    • 参数:
      • required
        • @RequestParam(required=false)
        • 默认为true,表示必传(如果不传报400);若为false,可传可不传
      • defaultValue
        • @RequestParam(defaultValue=”0”)
        • 给传过来的参数设置默认值,若前端没有传该参数或值为空,会默认赋值为0(一会儿试试字符串)
      • value
        • @RequestParam(value=”id”)
        • 接收url的参数名,相当于key值
    • 示例:
      1. @GetMapping("/sys")
      2. public String targetAdd(@RequestParam(value = "id",required = false) int indexId,
      3. @RequestParam("arrays") List<String> arrays){}
  3. @Mapper

    • 作用:标注Mybatis负责的组件(用于告诉spring框架此接口的实现类由Mybatis负责创建,并将其实现类对象存储到spring容器中。)
  4. @Repository
    • 作用:标注数据访问组件
  5. @Service
    • 作用:标注业务层组件
  6. @Component
    • 作用:泛指组件,当组件不好归类时,我们使用这个注释进行标注。(反正就是个注入Bean)
  7. @CrossOrigin
    • 作用:使后端可以与来自不同域的请求进行交互
    • 使用
      • springMVC的版本要在4.2或以上版本
      • 放在@Controller注解的上方
      • 在@RequestMapping注解中指定Get、Post方式














  8. 前后端交互实例

  • 分类
    • Content-Type:application/json
      • post
        • 要点
          • 直接传json只能使用post
          • 后端使用@RequestBody注解绑定json到实体类
        • 代码 ```javascript //前端 let p = { “a”:1, “b”:2 }

this.$axios.post(‘/eloise/indexChoice’,p).then(res=>{ console.log(res.data); })

  1. ```java
  2. //后端
  3. //没有对应的实体类时使用map
  4. @PostMapping("/indexChoice")
  5. public List<IndexChoice> getIndexChoice(@RequestBody Map map){
  6. System.out.println(map.get("a"));
  7. System.out.println(map.get("b"));
  8. return base.getIndexChoice();
  9. }
  10. //有对应的实体类时使用该类
  11. //前端:(注意必须一一对应)
  12. // let p = {
  13. // "indexChoiceId":1,
  14. // "indexChoiceName":"anna",
  15. // "picturePlace":"罗马"
  16. // }
  17. @PostMapping("/indexChoice")
  18. public List<IndexChoice> getIndexChoice(@RequestBody IndexChoice i){
  19. System.out.println(i.getIndexChoiceId());
  20. //前端如果不传该实体类中的某个属性,其值会为null;
  21. System.out.println(i.getPicturePlace());//null
  22. return base.getIndexChoice();
  23. }
  • 放在data里传:注意一定要用实体去接收 ```java //前端 let p = { “indexChoiceId”:1 }

console.log(p); this.$axios({ url: ‘/eloise/indexChoice’, method: ‘POST’, data:p }).then(res=>{ console.log(res.data); })

  1. ```java
  2. //后端
  3. @PostMapping("/indexChoice")
  4. public List<IndexChoice> getIndexChoice(@RequestBody IndexChoice i){
  5. System.out.println(i);
  6. return base.getIndexChoice();
  7. }
  • 通过params之缩写版
    • 要点
    • 代码
      • 简写 ```javascript //前端-缩写版 let p = { params:{ “a”:1 //前后端的名字一定要保持一致 } } this.$axios.get(‘/eloise/indexChoice’,p).then(res=>{ console.log(res.data); })

//前端-扩写版 let p = { “indexChoiceId”:1 } this.$axios({ url:’/eloise/indexChoice’, method:”POST”, params:p }).then(res=>{ console.log(res.data); })

  1. ```java
  2. //后端
  3. //枚举参数
  4. @GetMapping("/indexChoice")
  5. public List<IndexChoice> getIndexChoice(int a){
  6. //如果是数组:String[] keywords
  7. System.out.println(a);
  8. return base.getIndexChoice();
  9. }
  10. //封装为实体
  11. //前端:(注意必须一一对应)
  12. // let p = {
  13. // params:{
  14. // "indexChoiceId":1,
  15. // "indexChoiceName":"anna",
  16. // "picturePlace":"罗马"
  17. // }
  18. // }
  19. @GetMapping("/indexChoice")
  20. public List<IndexChoice> getIndexChoice(IndexChoice i){
  21. System.out.println(i);
  22. System.out.println(i.getPicturePlace());
  23. return base.getIndexChoice();
  24. }
  1. - 通过params之扩写版
  2. - 。。。。
  • Content-Type: multipart/form-data;
    • 应用
      • 传输文件
    • 要点
      • form-data只能使用post
      • 后端不需要额外加标注 ```java //前端-缩写版 let p = new FormData(); p.append(‘a’,1);

this.$axios.post(‘/eloise/indexChoice’,p).then(res=>{ console.log(res.data); })

//前端扩写版 let p = new FormData(); p.append(‘a’, 1); this.$axios({ url: ‘/eloise/indexChoice’, method: ‘POST’, headers: { ‘Content-Type’: ‘multipart/form-data’ //这一行可有可无 }, data: p })

  1. ```java
  2. //后端
  3. @PostMapping("/indexChoice")
  4. public List<IndexChoice> getIndexChoice(int a){
  5. System.out.println(a);
  6. return base.getIndexChoice();
  7. }
  • Content-Type:application/x-www-form-urlencoded;
    • 应用
      • 传输键值对
      • 后端怎么接收这个键值对??
      • 还有一种方法是什么??
    • 要点
      • 只能使用post ```java //前端 let p = new URLSearchParams(); p.append(‘a’, 1);

this.$axios({ url: ‘/eloise/indexChoice’, method: ‘post’, headers: { //可有可无的一项 ‘Content-Type’: ‘application/x-www-form-urlencoded’ }, data: p })

  1. ```java
  2. //后端
  3. @PostMapping("/indexChoice")
  4. public List<IndexChoice> getIndexChoice(int a){
  5. System.out.println(a);
  6. return base.getIndexChoice();
  7. }
  • put和delete
    • SpringBoot 2.2.X默认不支持put,delete等请求方式

Mybatis专题

标签

  1. mapper标签
    • 作用:基础标签
    • 属性
      • namespace:与该xml文件映射的接口文件路径
  2. resultMap标签

    • 作用:如果要接收一个list,且数据库列名和entity中的属性名不对应,需要用resultMap将两者对应起来
    • 属性
      • id:该resultMap的标识
      • type:该resultMap对应的entity路径
    • 子标签
      • id:主键映射
      • result:非主键映射
    • 子标签的属性
      • property:程序中的实体属性名
      • column:数据库对应的列名
    • 示例
      1. <mapper namespace="com.zyh.eloisesecret.mapper.BaseMapper">
      2. <resultMap id="IndexChoiceMap" type="com.zyh.eloisesecret.entity.IndexChoice">
      3. <id property="indexChoiceId" column="index_choice_id"/>
      4. <result property="indexChoiceName" column="index_choice_name"/>
      5. <result property="picturePlace" column="picture_place"/>
      6. </resultMap>
      7. <select id="getIndexChoice" resultMap="IndexChoiceMap">
      8. select * from indexchoice
      9. </select>
      10. </mapper>
  3. resultType标签

  4. 。。

application配置文件