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/










