CGB2107-Day06-SpringBoot整合Mybatis
1. Mybatis补充知识
1.1 参数取值特殊说明
<!--
知识点:
1. 形参/实参 参数传递的是值,和名称无关.
2. resultMap的简化 当开启驼峰映射规则时,可以自动映射,则使用
resultType即可.
3. 如果mybatis传递的参数只有一个,则mybatis是利用下标取值.
所以名称任意 #{xxxx},但是一般需要注意开发规范
-->
<select id="findDeptById" resultType="Dept">
select * from dept where dept_id = #{id}
</select>
1.2 代理对象说明
1.2.1 常见动态代理
- JDK动态代理
特点:
1.要求被代理者必须实现(有)接口.
2.JDK代理是jdk默认提供的. - CGLIB动态代理
特点:
1.不管被代理者是否有接口,都可以为其创建代理对象. 代理对象是目标对象的子类.
2.cglib需要手动导入jar包
3.spring为了创建代理对象方便,自身自动添加cglib依赖项.
1.2.2 Mapper接口的说明
/**
* 案例说明: 根据id查询部门信息
* 关于对象创建说明:
* 1.DeptMapper是一个接口. 接口不能直接实例化对象!!!
* 2.获取的DeptMapper是JDK在内部动态为接口生成的代理对象.
* 3.调用代理对象功能上与接口一致.
*/
@Test
public void testFindDeptById(){
SqlSession sqlSession = sqlSessionFactory.openSession();
DeptMapper deptMapper = sqlSession.getMapper(DeptMapper.class);
System.out.println(deptMapper.getClass());
int id = 100;
Dept dept = deptMapper.findDeptById(id);
System.out.println(dept);
sqlSession.close();
}
2. 三大框架整合
2.1 框架概述
2.1.1 Spring框架
Spring为了团队开发将复杂的框架进行整合,使得程序从控制到调用浑然一体.以一种统一的方式进行调用.
核心: 整合第三方框架.
2.1.2 Spring框架核心机制
- IOC:
控制反转: 将对象创建的权利交给Spring容器管理,由Spring容器管理对象的生命周期
DI: 依赖注入
创建对象时,如果该对象中有需要依赖的属性,Spring负责为属性赋值.
@RestController
public class UserController {
@Autowired
private UserService userService;
}
12345
- AOP 面向切面编程
2.1.2 SpringMVC
说明: 该框架的主要的作用 接收用户的请求,之后完成业务处理,最终返回响应给用户.
2.1.3 框架之间的调用关系
2.2 项目整合实现
2.2.1 创建项目
- 创建项目
选择springBoot版本
2.2.2 编辑pom.xml文件
说明: 复制之前的项目中的pom.xml文件 格式如下
<!--只需要复制 除了坐标之外的文件即可-->
<properties>
<java.version>1.8</java.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<spring-boot.version>2.4.1</spring-boot.version>
</properties>
<dependencies>
<!--springBoot整合mvc-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--springBoot整合测试方法-->
<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>
<!--mybatis依赖包-->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.2.0</version>
</dependency>
<!--jdbc依赖包-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>${spring-boot.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>2.4.1</version>
<configuration>
<mainClass>com.jt.SpringbootDemo1Application</mainClass>
</configuration>
<!--排除一些指定的配置-->
<executions>
<execution>
<id>repackage</id>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
2.3 编辑核心代码
2.3.1 编辑User的POJO
package com.jt.pojo;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
import java.io.Serializable;
@Data
@Accessors(chain = true)
@NoArgsConstructor
@AllArgsConstructor
public class User implements Serializable {
private Integer id;
private String name;
private Integer age;
private String sex;
}
2.3.2 编辑Mapper接口
package com.jt.mapper;
import com.jt.pojo.User;
import java.util.List;
public interface UserMapper {
//查询demo_user表中的所有数据
List<User> findAll();
}
2.3.3 编辑xml映射文件
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.jt.mapper.UserMapper">
<select id="findAll" resultType="com.jt.pojo.User">
select * from demo_user
</select>
</mapper>
2.3.4 编辑Service接口和实现类
1.编辑UserService接口
package com.jt.service;
import com.jt.pojo.User;
import java.util.List;
public interface UserService {
//查询user表中的所有的数据
List<User> findAll();
}
2.编辑ServiceImpl实现类
package com.jt.service;
import com.jt.mapper.UserMapper;
import com.jt.pojo.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Service;
import java.util.List;
@Service //将该类交给Spring容器管理
public class UserServiceImpl implements UserService{
@Autowired
private UserMapper userMapper; //代理对象 JDK动态代理
@Override
public List<User> findAll() {
//List<User> userList = userMapper.findAll();
//return userList;
return userMapper.findAll();
}
}
2.3.5 编辑Controller
package com.jt.controller;
import com.jt.pojo.User;
import com.jt.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
@RestController //@Controller 将该类交给Spring容器管理 +//@ResponseBody 业务返回值时,将数据转化为JSON.
public class UserController {
@Autowired
private UserService userService;
/**
* 需求: 查询全部user表数据
* 请求类型: get/post/put/delete
* 路径: /findUser
* 参数: 无
* 返回值: List<User>
*/
@RequestMapping("/getUser")
public List<User> findUser(){
return userService.findAll();
}
}
2.4 编辑核心配置-application.yml
2.4.1 数据源配置
链接写法:
- serverTimezone=GMT%2B8 指定时区 东八区
- useUnicode=true&characterEncoding=utf8
开启使用Unicode编码,并且指定字符集utf-8 - autoReconnect=true 断线是否重新链接.
- &allowMultiQueries=true 是否允许批量操作
2.4.2 编辑yml文件
#语法: 1.key:(空格)value结构
server:
port: 8090
#整合数据源
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:
#指定别名包
type-aliases-package: com.jt.pojo
#加载指定的xml映射文件
mapper-locations: classpath:/mybatis/mappers/*.xml
#开启驼峰映射
configuration:
map-underscore-to-camel-case: true
2.5 Spring管理Mapper接口
2.5.1 报错说明
2.5.2 @Mapper和@MapperScan注解
- @Mapper
- @MapperScan 通过包扫描 简化配置信息
2.6 整合报错说明
2.6.1 绑定异常
- 检查xml映射文件中的namespace
- 检查xml映射文件中Sql的ID
3.检查YML文件中xml映射文件的导入
检查YML文件是否定格,是否有层级缩进问题
4.检查@MapperScan(“com.jt.mapper”)
2.6.2 数据库链接异常
报错说明: 数据库链接异常
检查数据库链接地址/用户名/密码
3 RestFul实现参数传递
3.1 根据ID查询数据
3.1.1 请求路径
Get请求类型:
url:http://localhost:8090/findUserById?id=1
3.1.2 编辑UserController
/**
* 业务: 根据ID查询用户数据.
* 请求类型: get
* URL:http://localhost:8090/findUserById?id=1
* 参数: id=1
* 返回值: User对象
* SpringMVC业务规范:
* 1.接收参数时,必须与用户参数保持一致.
*/
//@RequestMapping(value = "findUserById",method = RequestMethod.GET)
@GetMapping("findUserById") //只能接收Get请求类型
public User findUserById(Integer id){
return userService.findUserById(id);
}
3.1.3 编辑UserService接口/实现类
1.编辑业务接口
-
编辑具体实现
package com.jt.service;
import com.jt.mapper.UserMapper;
import com.jt.pojo.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Service;
import java.util.List;
@Service //将该类交给Spring容器管理
public class UserServiceImpl implements UserService{
@Autowired
private UserMapper userMapper; //代理对象 JDK动态代理
@Override
public User findUserById(Integer id) {
return userMapper.findUserById(id);
}
}
3.1.4 编辑Mapper接口/映射文件
1.编辑Mapper接口
- 编辑xml映射文件
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.jt.mapper.UserMapper">
<select id="findUserById" resultType="User">
select * from demo_user where id = #{id}
</select>
</mapper>
4 框架整合作业
- 要求根据name和age查询用户信息
URL: http://localhost:8090/findUserByNA?name=xxx&age=xxx - 查询名称以"xxx"结尾的数据.
URL: http://localhost:8090/findUserLike?name=xx - 查询id为 1,3,5,6,7的数据
URL: http://localhost:8090/findUserByIds?id=1,3,5,6,7 - 根据对象中不为null的元素查询数据 动态Sql查询
URL: http://localhost:8090/findUser?id=xx&name=“xx”&age=xx&sex=xx
URL: http://localhost:8090/findUser?age=xx&sex=xx
URL: http://localhost:8090/findUser?sex=xx - 更新操作 利用restFul的结构, 根据Id修改数据,修改name/age
URL:http://localhost:8090/user/貂蝉/18/227
解析: URL:http://localhost:8090/user/{name}/{age}/{id}
5 SpringMVC参数传递
5.1 关于前端控制器说明
前端控制器: 主要负责用户请求的接收,及后端业务处理的分发
5.2 Servlet
5.2.1 什么是Servlet
Servlet(Server Applet)是Java Servlet的简称,称为小服务程序或服务连接器,用Java编写的服务器端程序,具有独立于平台和协议的特性,主要功能在于交互式地浏览和生成数据,生成动态Web内容。
狭义的Servlet是指Java语言实现的一个接口,广义的Servlet是指任何实现了这个Servlet接口的类,一般情况下,人们将Servlet理解为后者。Servlet运行于支持Java的应用服务器中。从原理上讲,Servlet可以响应任何类型的请求,但绝大多数情况下Servlet只用来扩展基于HTTP协议的Web服务器。
概括: Servlet是java后台程序与用户交互的机制(媒介).
5.2.2 串讲案例
//http://localhost:8090/findUserByIds?id=1,3,5,6,7
@GetMapping("/findUserByIds")
public String findUserByIds(HttpServletRequest request){
String id = request.getParameter("id");
String[] idStr = id.split(",");
Integer[] intArray = new Integer[idStr.length];
for (int i=0;i<idStr.length;i++){
intArray[i] = Integer.parseInt(idStr[i]);
}
System.out.println(intArray);
return "参数接收成功!!!";
}
/**
* Servlet参数传递核心规则
* http://localhost:8090/findServlet?name="张三"
* 问题: String name 值从哪里来????
* 核心: 参数是取的 而不是传的
* 请求的流程: 一个request对象,返回response
* 注意事项:
* 1.参数名称必须相同.
* 2.弊端无论什么样的数据,都是String数据类型,需要手动的转化
* SpringMVC:
* 在内部封装了Servlet机制.并且可以根据用户的参数类型,实现自动的数据
* 类型的转化
*/
@GetMapping("/findServlet")
public String findServlet(Integer age){
return "获取数据:"+age;
}
/*@GetMapping("/findServlet")
public String findServlet(HttpServletRequest request){
String age = request.getParameter("age");
Integer ageInt = Integer.parseInt(age);
return "获取数据:"+age;
}*/
5.2.3 预习作业
按照视频过一遍了解ElementUi脚手架客户端的安装的原理
URL: https://www.bilibili.com/video/BV1SU4y1V7Jc/