框架
1.SpringBoot(框架的框架/工具)
2.Spring(整合第三方框架)
3.springMVC(实现前后端的交互)
4.mybatis/MP(实现持久化操作)
spring框架流程:
1.主要流程依然不变,数据从网页端发送请求,
2,3.服务器收到请求,并参考pojo的对象类整理请求参数
4.从Controller模块中找到对应的方法.
5.加载对应服务类
6.加载对应接口的实现方法
7.加载映射文件(MyBatis)
8.实现DB
创建代码层
模型层(pojo), @Component:将该类交给spring管理
持久层(mapper/dao), @MapperScan:将该类交给spring管理
业务层(service), @Service:将该类交给spring管理
控制层(controller), @RestController=@Controller+@ResponseBody
@ResponseBody:将服务器数据转化为JSON返回
@Controller: 将该类交给spring管理
public class UserController
{
@Autowired
//编码规则:面向接口开发:解耦
private UserService userService;使用接口
}
项目层次
控制层(controller)
@RequestMapping可以接受get,post,put,delete请求
@GetMapping 只能接受get请求
@PostMapping 只能接受post的请求
@PutMapping 只能接受Put的请求
@DeleteMapping 只能接受Delete的请求
SpringMVC可以利用对象的方式接收
底层实现:将参数“name=XXX” 拼接为setname,之后检查是否存在对应的Setname(),如果存在就为对象赋值。
1.参数名称必须与url中的名称一致
2.SpringMVC可以根据用户的需求,自动实现类型的转换
底层实现,SpringMVC可以根据用户的参数类型,自动实现类的转化,
//控制类UserController代码
//SpringMVC直接根据网页传输的数据整理成user对象,传输进方法中
@GetMapping("findByUser")
public User findUserById(User user){
return userService.findByUser(user);
}//服务层UserServiceImpl的代码
//MP可以直接将对象中不为null的值作为where的条件
public User findByUser(User user) {
//直接将user作为对象填入QueryWrapper中,MP会自动将对象中不为null的值作为where的条件
QueryWrapper<User> queryWrapper = new QueryWrapper(user);
//仅限关系为=时可以使用user封装
return userMapper.selectOne(queryWrapper);
}
RestFul说明
Get请求:localhost:/8090/findUserByNS?王昭君/女
信息
- 用户不能了解请求的意图,
- 参数保密,只有后端服务器了解参数的意义
- 请求字节传输量少,简介
规定:
请求的方法不能出现动词!只能写名词。
注意事项:
- url地址中的参数与参数之间使用/分隔
- 参数的位置但固定,不能轻易修改
- 用户发起请求时,应该按照restFull的结构执行
- restFul请求一般以get请求为主.put/delete/post
案列
前端数据
查询name=“sayhi” age<18岁的用户
URL:http://localhost:8090/user/sayhi/18 对应控制层:@GetMapping("/user/{name}/{age}")
URL:http://localhost:8090/user/sayhi,18 对应控制层:@GetMapping("/user/{name},{age}")
数值与数值之间的隔断关系如何,那么控制层获取数据的方式也要一一对应
后端接收
接受规则:
- 参数与参数之后使用/分隔
- 参数的位置一旦确定,一般不变
- 接受的参数使用{变量名}
- 使用@PathVariable 接受
- 如果参数有多个,建议使用对象接受 参数必须与属性名一致
注意:如果名称不统一,@PathVariable(原名) String 别名,
public List<User> findUserById2(@PathVariable(name)String userName){}
URL:http://localhost:8090/user/sayhi/18
参数:name/age
返回值:list<User>
编辑UserController
@GetMapping("/user/{name},{age}")
public List<User> findUserByNA(User user){
return userService.findByUser(user);
}
编辑UserServiceImpl
//参数有多个,参数必须与属性名一致,可以使用对象接收数据
public List<User> findByUser(User user) {
判定关系不都是"="的关系,包含比较关系"<",无法直接将user作为对象传入
QueryWrapper queryWrapper = new QueryWrapper();
//使用判断方法,如果为空,就不执行,增加了代码的耦合性,减少编程压力
queryWrapper.eq(user.getId()!=null,"id",user.getId())
.eq(user.getName()!=null, "name", user.getName())
.gt(user.getAge()!=null, "age" , user.getAge() )
.eq(user.getSex()!=null, "sex" , user.getSex() );
直接将查询结果作为数据输出返回
return userMapper.selectList(queryWrapper);
}
查询多个用户
URL:http://localhost:8090/findUserByIds?id=1,2,3,4,5,6
规则:如果参数使用“,”分割,则SpringMVC可以自动转化为数组
将数组转化为列表,就可以使用列表进行查找了
编辑UserController
@GetMapping("/getUserByIds")
//SpringMVC可以自动将多个数据转化为数组
public List<User> getUserByIds(Integer[] ids){
return userService.getUserByIds(ids);
}
编辑UserServiceImpl
@Override
public List<User> getUserByIds(Integer[] ids) {
//将数组转化为列表,就可以使用列表进行查找了
List<Integer> idList = Arrays.asList(ids);
return userMapper.selectBatchIds(idList);
}
@RestController
@RequestMapping
public class UserController {
@Autowired
private UserService userService;
@RequestMapping("findAll")
public List<User> findAll(){
return userService.findAll();
}
//1.参数名称必须与url中的名称一致
//2.SpringMVC可以根据用户的需求,自动实现类型的转换
//底层实现,SpringMVC可以根据用户的参数类型,自动实现类的转化,
@GetMapping("findUserById")
public User findUserById(Integer id){
return userService.findUserById(id);
}
@GetMapping("findByUser")
public User findUserById(User user){
return userService.findByUser(user);
}
}
jar包的继承/导入
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.5.3</version>
<relativePath/>
</parent>
<properties>
<!--指定JDK版本-->
<java.version>1.8</java.version>
<!--跳过测试类打包-->
<skipTests>true</skipTests>
</properties>
<!--按需导入
历史说明: 2010 原来SSM 需要手动的编辑大量的的配置文件
思想: SpringBoot使用体现了"开箱即用"的思想
-->
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<!--Springboot的启动器 在内部已经将整合的配置写好,实现拿来就用-->
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!--支持热部署 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
</dependency>
<!--引入插件lombok 自动的set/get/构造方法插件 -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<!--引入数据库驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<!--springBoot数据库连接 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<!--spring整合mybatis-plus 删除mybatis的包 -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.4.3</version>
</dependency>
</dependencies>
配置文件application.yml
#是一个特殊的文件,特殊在这个文件将被springboot框架自动加载-开箱即用
#格式非常严格,k: v
#端口配置
server:
port: 8090
#配置数据源
#SpringBoot配置mysql信息
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://127.0.0.1:3306/jt?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf8&autoReconnect=true&allowMultiQueries=true
username: root
password: root
#SpringBoot整合Mybatis配置
mybatis-plus:
#定义别名包
type-aliases-package: com.jt.pojo
#指定UserMapper.xml文件的位置
#地址位置要填入相对对应地址
mapper-locations: classpath:/mappers/*.xml
#mapper-locations: classpath*:/*.xml 强制扫描外面的包的配置文件
#开启驼峰映射
#mybatis 功能1:可以实现结果集和实体对象的映射
#对象与表一一对应
#对象中的属性对象与表中的字段 一一对应
#User(userId,userName)
#User表(user_id,user_name)
#resulttype:不能映射
#resultMap金可以映射
#简化上述操作引入驼峰规则
#思考,开启驼峰规则如下是否可以映射?
#User(user_id,user_name)
#ser表(user_id,user_name)
configuration:
map-underscore-to-camel-case: true
#打印sql语句
logging: #日志
level: #等级
com.jt.mapper: debug #为com.jt.mapper的执行打印日志
启动层RunApp
@SpringBootApplication
@MapperScan(value = "com.jt.mapper")
public class RunApp {
public static void main(String[] args) {
SpringApplication.run(RunApp.class, args);
}
}
模型层(pojo)
//序列化作用,保证对象网络传输的有效性!!!!
//1.将对象与表进行关联
//规则,1.如果表名与类中的名一致,则可省略不写
// 2.对项名与属性名如果一直,则注解可以省略不写
@TableName("demo_user")
public class User implements Serializable{//固定写法
//2.主键自增/非空/UUID
//UUID生成唯一编号
@TableId(type = IdType.AUTO,value = "id")
private Integer id;
//3.标识属性与字段的映射
//@TableField("name")
private String name;
private Integer age;
private String sex;
}
持久层(mapper/dao)
//规则1:继承basemap时,不许添加面向目标的泛型对象
//规则2:自己的方法不要与接口方法重名
public interface UserMapper extends BaseMapper<User> {
//@Mapper //将该接口交给Spring管理,spring创建对象
User find(User user);
List<User> find();
}
服务层(service)接口文件
@Service
public interface UserService {
List<User> findAll();
}
服务层(service)实现文件
@Service
public class UserServiceImpl implements UserService{
@Autowired
private UserMapper userMapper;
@Override
public List<User> findAll() {
return userMapper.selectList(null);
}
}
完成前后端的测试
查询案列
浏览器输入地址:http://localhost:8090/findAll 查询全部数据
http://localhost:8090/findUserById?id=10 查询id=10的数据
要求利用mp查询数据库返回集合的JSON数据