首先把springboot解压,放在了ideaprojects文件下。
创建一个大包com.jdragon.springboot,来表示该项目
该项目下基本的三个部分,分别是controller(控制层:接收所有前台传过来的请求,再把它分配到它需要调的zhiservice里,相当于前后台的入口)、mapper(数据层:写在xml文件里,里面写对应的SQL语句,实现在数据库中怎么查找。)、service(业务层:所有的逻辑在Services里,逻辑,算法,都是由Services构成的)。
下图的pojo.entity包存放用户模板,我觉得是model层(Model:保存着与数据库表所对应的结构体,作用是方便用表的结构体,增加Mapper的易用性,把所有SQL字段变成变量放在里面,根据表结构自动生成)
service中有一个接口:UserService,其中只包含了一个返回user类的方法声明: User queryUser(String name);
service中有一个impl包,包中有一个UserServiceImpl的类,用于实现UserService接口。
UserService代码如下:
@Service
public class UserServiceImpl implements UserService {
@Autowired
UserMapper userMapper;
@Autowired
UserMapper2 userMapper2;
@Override
public User queryUser(String name) {
return userMapper.queryUser(name);
}
}
这段代码声明了一个usermapper实例对象,还声明了一个usermapper2接口。其中usermapper2接口只声明一个方法:List< User> queryAll();,一个返回list集合的方法(usermapper2是mapper的接口)
什么是注解
它提供了一种安全的类似注释的机制,用来将任何 的信息或元数据与程序元素进行关联。为程序的元素加上更直关、更明了的说明,这些说明信息与业务逻辑无关,并且供制定的工具或框架使用。
@Service – service标注业务层组件
这个注解是写在类上面的,标注将这个类交给Spring容器管理,spring容器要为他创建对象.
@autowired – DI注入
这个注解是用来修饰变量的,写在变量上面,并且由系统底层代理创建这个变量的实例,并注入到这个类中,就不用自己手动去创建对象了
只用autowired是会报错的,一般我们要调用哪个service接口时需要加上autowired没错,但前提是得再这个service的实现类上加上service注解,也就是告诉spring,我这个service接口的实现类是这个,你帮我在spring容器里创建它。
mapper
mapperdingyile一个usermapper类,其中含有一个user的集合数据,还有一个queryUser方法,用于返回user
controller
看一下usercontroller的代码:
@RestController
@RequestMapping("/user")
public class UserController {
@Autowired
UserService userService;
@Autowired
UserMapper2 userMapper2;
@GetMapping("/test")
public String test() {
return "test";
}
@GetMapping("/info")
public User info(@RequestParam("name") String name){
return userService.queryUser(name);
}
@GetMapping("/queryAll")
public List<User> queryAll(){
return userMapper2.queryAll();
}
}
requestmapping里面的括号,是外部访问路径
你访问的时候,是 ip+端口/拼接上requestMapping和getMapping/postMapping里面的内容
@requestparam(“name”),name是定义请求的参数。 就是 url后面跟着的问号,如:127.0.0.1:8080/user/info/?name=张三&age=18,这个就是等于 传了 name是张三,age是18
然后你在方法上面就要有这个 注解,@RequestParam(“name”) String name,@RequestParam(“age”) Integer age。如果 括号里面的值和你的变量名字一样的话,是可以省略括号的。
@restcontroller这个是什么?
是requestBody加controller。本身这个springmvc是有视图的,就是,他能返回一个html页面。但是我们写接口的时候,不 需要返回页面。因为我们现在做前后分离。然后只需要返回数据 。然后requestBody就是告诉springmvc,这个方法是返回数据的。不是返回视图的。
然后requestBody如果注解在方法上,就是针对某个方法返回数据 。如果注在类上,就是这个类所有方法都是返回数据的。
usermapper.xml
<mapper namespace="com.jdragon.springboot.mapper.UserMapper2">
<select id="queryAll" resultType="com.jdragon.springboot.pojo.entity.User">
select username as name from test_user;//mysql语句
</select>
</mapper>
resulttype:告诉返回值的类型是User
命名空间:是指具体的作用于
id是绑定了queryall()方法与mysql代码,让mysql代码来实现queryall()方法
springboot.yml
配置了服务器的端口号为8080
application.java
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
流程
启动application.java,在浏览器输入127.0.0.1:8080/user/info?name=张三。看到浏览器页面显示{“name”:“张三”},表示部署成功。
分析:
“127.0.0.1:8080/user/info?name=张三”是发送了一个get请求(前台用get,后台用post,post可以发送body参数和param参数,除了这两种参数,还有path参数)
请求首先经过controller层,调用了info方法。
再来到service层,调用queryuser方法。再进到mapper层,真正的调用queryuser方法
。
再一层一层向上返回,得到数据,也就是@RestController作用的地方。
那个queryall()方法实际上是没有具体实现的,因为是由xml来实现。