前言:
本次注解分3层讲解,先说明注解的用途,然后有对应层次的完整代码,代码中有对应的注解的实战用法(含详细注释)
本次所讲的层级结构截图:
一.domian(实体类)
lombok家族注解用于实体类,帮助简化实体类的编写。
@Setter
用于实体类,自动生成setter方法@Getter
用于实体类,自动生成getter方法@ToString
用于实体类,自动重写toString()方法,返回所有属性变量名和变量值。@EqualsAndHashCode
自动生成 equals(Object other) 和 hashcode() 方法,包括所有非静态变量和非 transient 的变量@AllArgsConstructor
用于实体类,生成一个包含所有参数的构造器@NoArgsConstructor
用于实体类,生成一个无参的构造器@RequiredArgsConstructor
生成一个包含 “特定参数” 的构造器,特定参数指的是那些有加上 final 修饰词的变量们;
如果所有的变量都是正常的,都没有用 final 修饰的话,那就会生成一个没有参数的构造器@Data
整合包,只要加了 @Data 这个注解,等于同时加了以下注解:@Getter
@Setter
@ToString
@EqualsAndHashCode
@RequiredArgsConstructor
实体类例子:
domain包中的类:
Hero类完整代码:
package com.ysw.springboot01.domain;
import lombok.Data;
@Data
public class Hero {
private int id;
private String name;
private int age;
private String sex;
private long price;
private int type_id;
}
二.mapper层注解
@Select("sql语句")
mybatis家族注解,非spring家族注解,在mybatis中,mybatis的前身是ibatis。
作用:自动把注解封装成jdbc里的sql语句,把sql提取出来,到数据库中查,查完以后把查询出的结果集封装到java对象中。
@Mapper
用在接口类上,在编译之后会生成相应的接口实现类,是mybatis的注解。
位置:对应的某个接口类上面
@Repository
@Repository作用于mapper层,Repository注解会创建实现类的对象,存入spring容器中。
mapper层例子:
mapper层包中的类和接口:
IHeroMapper接口完整代码:
package com.ysw.springboot01.mapper;
import com.ysw.springboot01.domain.Hero;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;
import org.springframework.stereotype.Repository;
import java.util.List;
/*
* @Mapper,用在接口类上,在编译之后会生成相应的接口实现类,是mybatis的注解。
* Repository注解,作用于mapper层,会创建实现类的对象,存入spring容器中
* */
@Mapper
@Repository
public interface IHeroMapper {
/*
* Select注解,该注解在mybatis中,mybatis的前身是ibatis;
* 作用:自动把注解封装成jdbc里的sql语句,把sql提取出来,
* 到数据库中查,查完以后把查询出的结果集封装到list集合中
* */
@Select("SELECT * FROM hero")
//查询所有英雄数据
List<Hero> selectAllHero();
}
3.service层注解
3.service层注解
@Autowired
自动注入,它会自动从spring容器中搜索符合类型的对象,给作用的成员属性赋值。
@Service
@Service注解作用于service层,
与上述注解@Repository实现过程类似,它的作用是自动创建实现类的对象并且存入spring容器中。
service层例子:
service层包中的类和接口:
IHeroService接口完整代码:
package com.ysw.springboot01.service;
import com.ysw.springboot01.domain.Hero;
import java.util.List;
public interface IHeroService {
List<Hero> selectAllHero();
}
HeroServiceImpl实现类完整代码:
package com.ysw.springboot01.service.impl;
import com.ysw.springboot01.domain.Hero;
import com.ysw.springboot01.mapper.IHeroMapper;
import com.ysw.springboot01.service.IHeroService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
//@Service注解,创建service实现类的对象,并且存入spring容器中
@Service
public class HeroServiceImpl implements IHeroService {
//用@Autowired直接从spring容器中取出mapper层存入spring容器的实现类的对象
@Autowired
private IHeroMapper mapper;
@Override
public List<Hero> selectAllHero() {
//调用mapper层
return mapper.selectAllHero();
}
}
四.controller层
四.controller层
@RequestMapping("/hero")
映射请求路径,相当于servlet中的@WebServlet注解,用于Controller层的类和方法体,
访问时是两层路径,类是一级路径,方法是二级路径。
@Controller
创建Controller类的对象,存入spring容器中,由服务器从spring容器中得到该对象,并调用其方法,
与上述注解@Service,@Repository类似,他们都是创建类的对象并存入spring容器中。
@ResponseBody
这个注解通常使用在controller层,响应数据给客户端,类似于servlet中的response.getWrite().write()。
它将java对象转为json格式的数据,其作用是将方法的返回值以特定的格式写入到response的body区域,进而将数据返回给客户端。假如返回值是字符串则直接将字符串写到客户端,假如是一个对象,此时会将对象转化为json串然后写到客户端。
ps:这里需要注意的是,如果返回对象,按utf-8编码。如果返回String,默认按iso8859-1编码,页面可能出现乱码。因此在注解中我们可以手动修改编码格式,例如@RequestMapping(value = "/selectAll",produces = "application/json;charset=utf-8")
。
controller层例子:
controller层包中的类和接口:
HeroController类完整代码:
package com.ysw.springboot01.controller;
import com.ysw.springboot01.domain.Hero;
import com.ysw.springboot01.service.IHeroService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import java.util.List;
@RequestMapping("/hero") //映射请求路径,相当于servlet中的@WebServlet注解,一级路径
@Controller //创建Controller类的对象,存入spring容器中,由服务器来调用
public class HeroController {
//从spring容器总取出service层的对象,自动注入
@Autowired
private IHeroService service ;
/* * 每个方法都需要有转这个步骤,即需要有一下两个思路中的一种 * 1.跳转到某个页面,thymeleaf页面 * 2.响应数据给客户端 @ResponseBody注解 * */
@RequestMapping(value = "/selectAll",produces = "application/json;charset=utf-8") //二级路径
/* * 在后台生成一个java对象listHero,用于返回给页面; * 经过@ResponseBody的作用后直接转成了json格式,如果没有这个转化的话,我们前台得到的是Object对象 * */
@ResponseBody
//查询所有英雄数据
public List<Hero> selectAllHero(){
List<Hero> listHero = service.selectAllHero();
return listHero;
}
@RequestMapping("/showAllHero") //二级路径
//查询所有英雄数据,显示出来
public String selectShowAllHero(Model model){
List<Hero> heroes = service.selectAllHero();
model.addAttribute("heroes",heroes);
return "hero";
}
}
五.启动类注解
五.启动类注解
@MapperScan("package包路径")
作用:扫描指定包下所有的接口,然后所有接口在编译之后都会生成相应的实现类
位置:是在SpringBoot启动类上面添加,
@SpringBootApplication
在主方法上使用,是一个组合注解,用于快捷配置启动类。
启动类例子:
启动类:
启动类完整代码:
package com.ysw.springboot01; import org.mybatis.spring.annotation.MapperScan; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; //在主方法上使用,是一个组合注解,用于快捷配置启动类 @SpringBootApplication //扫描指定包下所有的接口类,然后所有接口在编译之后都会生成相应的实现类 //@MapperScan("com.ysw.springboot01.mapper") public class Springboot01Application {
public static void main(String[] args) {
SpringApplication.run(Springboot01Application.class, args); } }