Spring Boot 是由Pivotal 团队提供的全新框架,其设计目的是用来简化新Spring 应用的初始搭建以及开发过程。 该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置。
9.3.3 Springboot 的优势
(1)不再需要那些千篇一律,繁琐的xml文件。
(2)内嵌Tomcat,不再需要外部的Tomcat
(3)更方便的和各个第三方工具(mysql,redis,elasticsearch,dubbo,kafka等等整合),而只要维护一个配置文件即可。
9.3.4 Springboot和ssm的关系
springboot整合了springmvc ,spring,mybatis 等核心功能。也就是说本质上实现功能的还是原有的spring ,springmvc的包,但是springboot单独包装了一层,这样用户就不必直接对springmvc, spring等,在xml中配置。
9.3.5创建springboot 模块
1)增加新模块,选择springboot初始模板
2)填写模块路径
3)选择依赖
选择spring web 包括web应用的常用注解,以及web容器(默认tomcat)。
选择lombok,修饰实体类的注解插件。
这里不选也可以在之后去pom.xml里添加依赖。
4)选择路径
5)自动产生的文件
创建好后的,springboot的工程比maven的工程多了两个文件。其中:
DemoCustomerApplication 是整个程序的启动类。
application.properties 是整个工程的配置文件。
9.3.6 应用开发的分层
web的应用开发,经历了数十年发展至今已经有一套比较成熟的分层结构,目的就是让程序更加的清晰,各层之间各司其职。任何一个web应用开发程序员接手一个新项目都可以很快上手,就是因为大家都在履行这种分层约定。
9.3.7 controller层
9.3.7.1 职责
(1)接收请求和参数
(2)调用服务层
(3)返回响应和结果
9.3.7.2 相关注解
9.3.7.3 HelloWorld
1)请求打通
package com.atguigu.springboot.controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* @RestController将类标识为Controller , 作为请求的入口类。
*/
@RestController
public class CustomerController {
/**
* 请求处理方法
* 通过@RequestMapping将请求与方法进行映射
*/
@RequestMapping("/hello")
public String helloController(){
return "hello world" ;
}
}
2)浏览器地址栏输入 127.0.0.1:8080/hello 进行访问
9.3.7.4 请求参数
1)请求路径中的键值对参数
例如: <u>http://127.0.0.1:8080/hello?name=zs&age=22</u>
/**
* 请求处理方法
*
* @RequestParam 用来将请求路径中的键值对参数映射到方法的形参上
*/
@RequestMapping("/hello")
public String helloController(@RequestParam("name") String name , @RequestParam("age") Integer age ){
return "hello world , name = " + name + " , age = "+ age ;
}
2)请求路径中嵌入的参数
例如: <u>http://127.0.0.1:8080/hello/lisi/33</u>
/**
* 请求处理方法
*
* @PathVariable 用来将请求路径中嵌入的参数映射到方法的形参上
*/
@RequestMapping("/hello/{name}/{age}")
public String helloController(@PathVariable("name") String name , @PathVariable("age") Integer age ){
return "hello world , name = " + name + " , age = "+ age ;
}
3)请求体中的参数, 单个参数映射
/**
* 请求处理方法
*
* method 用来指定接收的请求类型
* GET : 一般是用来查
* POST: 一般是用来写
*
* @GetMapping = @RequestMapping + RequestMethod.GET
* @PostMapping = @RequestMapping + RequestMethod.POST
*
* 如果请求参数名和方法形参名一致,可以不通过@RequestMapping指定
*
*/
//@RequestMapping(value = "/hello" ,method = RequestMethod.POST)
@PostMapping("/hello")
public String helloController(String name , Integer age ){
return "hello world , name = " + name + " , age = "+ age ;
}
4)参数直接映射到bean
/**
* 请求处理方法
* @RequestBody 用来将请求体中的请求参数映射到Bean类中对应的属性上
*/
@PostMapping("/hello")
public String helloController(@RequestBody Customer customer){
return "hello world , name = " + customer.getName() + " , age = "+ customer.getAge() ;
}
9.3.8 实体类
1)Lombok注解
2)实体类
package com.atguigu.springboot.demo.bean;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Customer {
private Integer id ;
private String name ;
private Integer age ;
}
9.3.9 服务层
9.3.9.1 职责
(1)接收控制层调用
(2)接收其他服务层的调用/调用其他服务层
(3)处理业务
(4)调用数据层
(5)返回结果
9.3.9.2 相关注解
9.3.9.3 HelloWorld
1)Service层由两个类组成,一个接口和一个实现类组成。
(1)服务层接口
package com.atguigu.springboot.demo.service;
/**
* 服务层接口
*/
public interface CustomerService {
}
(2)服务层实现类
package com.atguigu.springboot.demo.service;
/**
* 服务层实现类
*/
public class CustomerServiceImpl implements CustomerService{
}
2)在CustomerService中增加方法, 例如通过id查询Customer
public interface CustomerService {
public Customer getCustomerById(Integer id ) ;
}
3)在CunstomerServiceImpl中实现方法
@Service
public class CustomerServiceImpl implements CustomerService{
@Override
public Customer getCustomerById(Integer id) {
return new Customer(id,"zhangsan",22);
}
}
4)在Controller层调用服务层
@RestController
public class CustomerController {
@Autowired
private CustomerService customerService ;
@GetMapping("/get/{id}")
public Customer getCustomer(@PathVariable("id") Integer id ){
return customerService.getCustomerById(id) ;
}
}
5)在浏览器地址栏中输入 http://127.0.0.1****/****get/1001** 进行访问**
9.3.10 数据层
MyBatis 是一款优秀的持久层框架,它支持自定义 SQL。 MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射。
9.3.10.1 职责
(1)接收服务层调用
(2)处理jdbc数据的操作
(3)返回结果
9.3.10.2 相关注解
关于注解中的参数
9.3.10.3 HelloWorld
1)创建测试表
CREATE TABLE `customer` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`name` varchar(200) DEFAULT NULL,
`age` bigint(20) DEFAULT NULL,
PRIMARY KEY (`id`)
)
ENGINE=InnoDB DEFAULT CHARSET=utf8
2)引入依赖
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.1.4</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
3)application.properties
spring.datasource.url=jdbc:mysql://hadoop102:3306/user_profile_manager?characterEncoding=utf-8&useSSL=false
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.username=root
spring.datasource.password=123456
4)创建Mapper接口
@Mapper
public interface CustomerMapper {
@Select("select * from customer ")
public List<Customer> getCustomerList();
@Select("select * from customer where id=#{id}")
public Customer getCustomerById(Long id );
@ Select("select * from customer")
public List<Customer> selectCustomerList();
@Insert("insert into customer(name,age) values (#{customer.name}, #{customer.age} )")
public void insertCustomer(@Param("customer") Customer customer);
@Update("update customer set age= #{customer.age} where id=#{ customer.id }")
public void updateCustomer (@Param("customer")Customer customer );
@Delete("delete customer_info where id=#{id}")
public void deleteCustomerById (Long id );
}
5)Service层中加入调用方法
@Service
public class CustomerServiceImpl implements CustomerService {
@Autowired
CustomerMapper customerMapper;
@Override
public Customer getCustomerById(Integer id) {
return customerMapper.getCustomerById(id);
}
}
9.3.11 Mybatis-plus
(简称 MP)是一个Mybatis 的增强工具,在 MyBatis 的基础上只做增强不做改变,完全去SQL化,封装好了大量的CURD操作。 甚至把CRUD操作封装到了Service层,可以直接在controller调用现成的CRUD服务层,极度舒适省心。
局限:只支持简单的CRUD 操作。不支持多表操作(join ,union,子查询) ,不支持GroupBy 和各种函数。
9.3.11.1 HelloWorld
1)引入mybatis依赖
<!--mybatis-plus-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.4.1</version>
</dependency>
2)增加Mybatis-plus规范的服务层和数据层
Mapper接口
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
@Mapper
public interface CustomerMapper extends BaseMapper<Customer> {
}
Service接口
public interface CustomerService extends IService<Customer> {
}
3)重写CustomerService实现类
@Service
public class CustomerImpl extends ServiceImpl<CustomerMapper, Customer> implements CustomerService {
}
只要加上这个三个继承。在controller 中直接就可以使用CRUD命令。
4)在Bean上加入对主键的标识
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Customer {
@TableId(value = "id",type = IdType.AUTO) //标识根据数据库自增生成主键
String id;
String name;
int age;
}
5)Controller直接调用封装方法
@GetMapping("/customer/list")
public List<Customer> getCustomerList(){
List<Customer> list = customerService.list();
return list ;
}
@GetMapping("/customer")
public Customer getCustomer(@RequestParam("id") String id){
return customerService.getById(Integer.valueOf(id)); //直接返回会自动转为json (jackson)
}
@PostMapping("/customer")
public String saveCustomer(@RequestBody Customer customer){
//会根据主键是否为空来决定 是插入还是修改
customerService.saveOrUpdate(customer);
return "success";
}
@DeleteMapping("/customer")
public String deleteCustomer(@RequestParam("id") String id){
customerService.removeById(id);
return "success";
}
9.3.12 动态数据源
9.3.12.1 介绍
动态数据源可以实现在同一个项目中支持多种数据源,并能灵活切换不同的数据源。
9.3.12.2 相关注解
9.3.12.3 HelloWorld
1)添加依赖
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>dynamic-datasource-spring-boot-starter</artifactId>
<version>3.3.2</version>
</dependency>
2)定义多个数据源
spring.datasource.dynamic.datasource.mysql0111.url=jdbc:mysql://hadoop102:3306/user_profile_manager_0111?characterEncoding=utf-8&useSSL=false
spring.datasource.dynamic.datasource.mysql0111.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.dynamic.datasource.mysql0111.username=root
spring.datasource.dynamic.datasource.mysql0111.password=123456
spring.datasource.dynamic.datasource.mysql0222.url=jdbc:mysql://hadoop102:3306/user_profile_manager_0222?characterEncoding=utf-8&useSSL=false
spring.datasource.dynamic.datasource.mysql0222.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.dynamic.datasource.mysql0222.username=root
spring.datasource.dynamic.datasource.mysql0222.password=123456
3)在service层和 mapper的类上增加默认数据源
@Service
@DS("mysql0111")
public class CustomerServiceImpl extends ServiceImpl<CustomerMapper, Customer> implements CustomerService {
@Mapper
@DS("mysql0111")
public interface CustomerMapper extends BaseMapper<Customer> {
4)在特定的方法上增加特定数据源
@Insert("insert into customer(name,age) values (#{customer.name}, #{customer.age} )")
@DS("mysql0222")
public void insertCustomer0111(@Param("customer") Customer customer);