java第三阶段第六天--CureGuy

本文详细介绍了MyBatis的参数取值规则和代理对象的概念,包括JDK与CGLIB动态代理的区别。接着,讲解了Spring、SpringMVC框架的核心机制如IOC和AOP,并展示了如何整合这三个框架,创建项目、配置pom.xml、编写POJO对象、Mapper接口和XML映射文件、Service和Controller。此外,还探讨了RESTful风格的参数传递,以GET方法为例,展示了如何实现不同场景的参数查询。最后,简单介绍了Servlet作为后台程序与用户交互的机制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

1 、mybatis的补充知识

1.1 、参数取值特殊说明

1.2 、代理对象的说明

2 、三大框架整合

2.1 、框架概述

2.1.1 、Spring框架: 

2.1.2 、核心机制:IOC-DI       AOP

2.1.3 、SpringMVC

2.2 、项目整合

2.2.1 、创建项目

2.2.2 、编辑pom.xml文件(添加依赖包)

2.2.4 、创建pojo对象:

2.2.5 、Mapper接口:

2.2.6 、xml映射文件:

2.2.7 、service接口和实现类:

2.2.8 、Controller类:

2.3 、编辑核心配置信息 

3 、RestFul实现参数传递

3.1 、get方法

3.2 、作业

4 、Servlet


1 、mybatis的补充知识

1.1 、参数取值特殊说明

//  案例:根据id查询部门信息
    @Test
    public void testFindDeptById(){
        SqlSession sqlSession=sqlSessionFactory.openSession();
        DeptMapper deptMapper=sqlSession.getMapper(DeptMapper.class);
        int id=100;
        Dept dept=deptMapper.findDeptById(id);
        System.out.println(dept);
        sqlSession.close();

    }
<!--    1.形参和实参  参数传递的是值 和名称无关
        2.resultMap 的简化 当开启驼峰映射规则时,可以自动映射,则使用resultType 即可
        3.如果mybatis传递的参数只有一个,则mybatis是利用下标取值,所以名称可以任意取名#{xxx}
        注意开发注意规范
        -->
    <select id="findDeptById" resultType="com.jt.pojo.Dept">
        select * from dept where dept_id=#{id}
    </select>

1.2 、代理对象的说明

JDK动态代理

  特点:

            要求被代理者必须实现(有)接口,代理对象是目标对象的实现类或兄弟元素。

            JDK代理是jdk默认提供的

CGLIB动态代理

  特点:

            不管我们的被代理者是否有接口,我们都可以为其创建代理对象,代理对象是目标对象的子类。

            cglib需要手动导jar包

            spring为了创建对象方便处理对象自身,自身自动添加cglib依赖

对象创建说明:

关于对象创建说明:
    DeptMapper是一个接口 接口不能直接实例化对象
    获取的deptMapper是jdk在内部动态为接口生成的代理对象
    调用代理对象功能上与接口一致 

2 、三大框架整合

2.1 、框架概述

2.1.1 、Spring框架: 

        Spring为了团队开发将复杂的框架进行整合,使得程序从控制到调用浑然一体,以一种统一的方式进行调用。

核心:整合第三方框架

2.1.2 、核心机制:IOC-DI       AOP

IOC:控制反转  将对象创建的权利交给Spring容器管理,由Spring容器管理对象的生命周期.

DI:依赖注入  创建对象时,如果该对象中有需要依赖的属性,Spring负责对属性赋值.

@RestController
public class UserController{

    @Autowired
    private Uservice uservice;
}

AOP:面向切面编程

2.1.3 、SpringMVC

说明:该框架的主要作用    接受用户的请求  之后完成相应的业务处理  最终返回响应给用户

2.2 、项目整合

2.2.1 、创建项目

2.2.2 、编辑pom.xml文件(添加依赖包)

   <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</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>
        <!--支持热部署 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

2.2.4 、创建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.2.5 、Mapper接口:

package com.jt.mapper;

import com.jt.pojo.User;
import org.apache.ibatis.annotations.Mapper;

import java.util.List;
//该接口应该交给spring容器管理
@Mapper
public interface UserMapper {
    //查询表中所有数据
    List<User> findAll();
}

2.2.6 、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">
<!--xml映射文件 必须与接口一对一绑定
namespace:指定需要绑定的接口名称,不能重复。-->
<mapper namespace="com.jt.mapper.UserMapper">

    <select id="findAll" resultType="com.jt.pojo.User">
        select * from demo_user
    </select>
</mapper>

2.2.7 、service接口和实现类:

接口:

package com.jt.service;

import com.jt.pojo.User;

import java.util.List;

public interface UserService {
    //查询表中所有数据
    List<User> findAll();
}

实现类:

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.2.8 、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;
//@Controller 将该类交给spring容器+
//@RestController 业务返回值时,将数据转化json
@RestController
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.3 、编辑核心配置信息 

#数据源配置连接大写法
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

serverTimezone=GMT%2B8   指定时区 东8区    %2B 是 + 的意思

&useUnicode=true &characterEncoding=utf8  开启使用Unicode编码 并且指定字符集 utf-8

&autoReconnect=true 断线 是否重新连接

&allowMultiQueries=true 是否允许批量操作

#整合mybatis
mybatis:
  #指定别名包
  type-aliases-package: com.jt.pojo
  #加载指定的xml映射文件
  mapper-locations: classpath:\mybatis\mappers\*.xml
  #开启驼峰映射
  configuration:
    map-underscore-to-camel-case: true

spring 报错说明

 在启动类里添加@mapperScan注解,根据包扫描 扫描全部的mapper文件

@MapperScan("com.jt.mapper")//根据包扫描 扫描全部的mapper文件

解决方案(绑定异常): 

1.检查xml文件中的namespace;

2.检查xml文件里查询语句id的方法名;

3.检查yml文件中整合mybatis的加载xml映射文件的导入,以及是否存在没有顶格写,存在层级问题;

4.启动文件里的@MapperScan()注解的配置路径问题。

连接不上数据库问题(数据库连接异常):

解决方案:检查yml文件数据源的相关配置

3 、RestFul实现参数传递

3.1 、get方法

    /*
    * 需求:根据id查询用户数据
    * URL:http://localhost:8088/findUserById?id=1
    * 参数:id=1
    * 返回值:User对象
    * springMVC业务规范:接受参数时必须与用户的参数保持一致
    *
    * */
    //@RequestMapping(value = "findUserById",method = RequestMethod.GET)//method=指定的类型
    @GetMapping("findUserById")//只能接受get请求的类型
    public User findUserById(Integer id){
        return userService.findUserById(id);
    }
UserServiceImpl 里有两个方法了得再重写一下
    @Override
    public User findUserById(Integer id) {
        return userMapper.findUserById(id);
    }

查询代码:

    <select id="findUserById" resultType="User">
        select * from demo_user where id=#{id}
    </select>

执行后在浏览器容易得到不同的结果(更改?id=后面的参数值就可以得到不同的数据)

3.2 、作业

1.根据用户的name和age查询用户信息

    @GetMapping("findUserByNA")
    public User findUserByNA(User user){
        return userService.findUserByNA(user);
    }
    <select id="findUserByNA" resultType="User">
        select * from demo_user where name=#{name} and age=#{age}
    </select>

查询结果:

 2.查询名称以“xxx”结尾的数据

    @GetMapping("findUserLike")
    public User findUserLike(User user){
        return userService.findUserLike(user);
    }
   <select id="findUserLike" resultType="User">
        select * from demo_user where name like concat('%',#{name},'%')
    </select>

查询结果:

 3.查询id为1,3,5,6,7的数据

@GetMapping("findUserByIds")
    public List<User> findUserByIds(Integer[] id){
        return userService.findUserByIds(id);
    }
    <select id="findUserByIds" resultType="User">
        select * from demo_user where id in
        <foreach collection="array" item="id" open="(" close=")" separator=",">
            #{id}
        </foreach>
    </select>

查询结果:

 4.根据对象中不为null的元素查询数据 动态Sql查询

//根据对象中不为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
@GetMapping("findUser")
public  List<User> findUser(User user){
        return userService.findUser(user);
}
    <!-- 4动态通过name,age,sex,id来查询用户的所有信息 -->
    <select id="findUser" resultType="User" >
    select * from demo_user
    <where>
    <if test="id!=null">id=#{id}</if>
        <if test="name!=null"> and name=#{name}</if>
        <if test="age!=null">and age=#{age}</if>
        <if test="sex!=null">and sex=#{sex}</if>
    </where>

</select>

查询结果:

5.更新操作 利用restFul的结构, 根据Id修改数据,修改name/age

    //更新操作 利用restFul的结构, 根据Id修改数据,修改name/age
    //URL:http://localhost:8090/user/貂蝉/18/227
    //解析: URL:http://localhost:8090/user/{name}/{age}/{id}
@GetMapping("/updateUser/{id}/{name}/{age}")
    public Integer updateUser(
            @PathVariable Integer id,
            @PathVariable String name,
            @PathVariable Integer age){
        User user=new User();
        user.setId(id).setName(name).setAge(age);
        return userService.updateUser(user);
    }
<!--5.更新操作 利用restFul的结构, 根据Id修改数据,修改name/age-->
    <update id="updateUser">
        update demo_user
        <set>
            <if test="name !=null">name = #{name},</if>
            <if test="age !=null">age = #{age}</if>
        </set>
        where
        id = #{id}
    </update>

查询结果:

 

4 、Servlet

Servlet(Server Applet)是Java Servlet的简称,称为小服务程序或服务连接器,用Java编写的服务器端程序,具有独立于平台和协议的特性,主要功能在于交互式地浏览和生成数据,生成动态Web内容。
狭义的Servlet是指Java语言实现的一个接口,广义的Servlet是指任何实现了这个Servlet接口的类,一般情况下,人们将Servlet理解为后者。Servlet运行于支持Java的应用服务器中。从原理上讲,Servlet可以响应任何类型的请求,但绝大多数情况下Servlet只用来扩展基于HTTP协议的Web服务器。

概括: Servlet是java后台程序与用户交互的机制(媒介).
 

 //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;
    }*/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值