mybatis 和 mybatis-plus

news2024/9/21 13:49:05

mybatis

配置

1.新建MAVEN项目

2.配置mybatis依赖

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>org.example</groupId>
    <artifactId>DemoMybatis</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <maven.compiler.source>17</maven.compiler.source>
        <maven.compiler.target>17</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>


    <dependencies>
        <!--        连接数据库驱动-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.30</version>
        </dependency>
        <!--        mybatis-->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.5.12</version>
        </dependency>


    </dependencies>

    <build>
        <!--    配置idea扫描xml或者properties文件 -->
        <resources>
            <resource>
                <directory>src/main/resources</directory>
                <includes>
                    <include>**/*.properties</include>
                    <include>**/*.xml</include>
                </includes>
            </resource>
        </resources>
    </build>


</project>

3.创建表

REATE TABLE IF NOT EXISTS users \
    id INT AUTO_INCREMENT PRIMARY KEY, \
    name VARCHAR(100), \
    email VARCHAR(150));

4.创建数据源database.properties文件

resources 目录下 创建 database.properties文件:用于mybatis配置文件读取数据库信息

driver=com.mysql.cj.jdbc.Driver
url= jdbc:mysql://127.0.0.1:3306/mydatabase?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&useSSL=false&allowPublicKeyRetrieval=true
username=root
password=123456

5.编写mybatis-config.xml配置文件

resources 目录下 创建 mybatis-config.xml配置文件: 用于配置数据库连接和 MyBatis 运行时所需的各种特性,包含了设置和影响 MyBatis 行为的属性、映射文件的位置。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">

<!-- mybatis的主配置文件 -->
<configuration>
    <!-- 引入外部资源: database.properties 配置文件-->
    <properties resource="database.properties"/>

    <!-- 配置环境:有助于将 SQL 映射应用于多种数据库之中 -->
    <environments default="mysql">
        <!-- 配置环境id:mysql-->
        <environment id="mysql">
            <!-- 配置事务的类型:使用JDBC的事务-->
            <transactionManager type="JDBC"/>
            <!-- 配置数据源(连接池)type="POOLED说明是使用连接池方式,节省资源 -->
            <dataSource type="POOLED">
                <!-- 配置连接数据库的4个基本信息 -->
                <property name="driver" value="${driver}"/>
                <property name="url" value="${url}"/>
                <property name="username" value="${username}"/>
                <property name="password" value="${password}"/>
            </dataSource>
        </environment>
    </environments>

</configuration>

6.连接测试

package org.example;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import java.io.IOException;
import java.io.Reader;

public class Main {
    public static void main(String[] args) {
        // mybatis-config.xml 路径
        String mybatisConfig = "mybatis-config.xml";
        try {
            // 加载配置文件
            Reader config = Resources.getResourceAsReader(mybatisConfig);
            // 构建会话
            SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(config);
            SqlSession sqlSession = sqlSessionFactory.openSession();
            System.out.println(sqlSession.getConfiguration());

            sqlSession.close();
        }catch (IOException e){
            e.printStackTrace();
        }
    }
}

使用

1.映射类

创建entity/User类:用于跟数据库字段做映射。

注意:与数据库中字段名、类型一致

package org.example.user;

import lombok.Data;

@Data
public class UserEntity {
    private int id;
    private String name;
    private String email;
}

2.Mapper接口

创建mapper/IUserMapper接口: 用于操作数据库CURD的方法

package org.example.mapper;

import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import org.example.entity.User;

import java.util.List;
import java.util.Map;

public interface IUserMapper {

    List<User> queryUser();

//    @Select("SELECT * FROM users")
//    List<User> queryUser();

    String getNameById(@Param("id") Long id);

    List<User> queryUserByMap(Map<String, Object> param);

    List<User> queryUserEntity(User user);

    int insertUser(@Param("user") User user);

    int updateUser(@Param("user") User user);

    int deleteUser(@Param("id") Long id);


}

3.mapper.xml文件

resources 目录下 org/example/mapper创建IUserMapper.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">
<!--namespace=绑定一个对应的Mapper接口-->
<mapper namespace="org.example.mapper.IUserMapper">
    <!--查询所有用户-->
    <!--<select> 标签表明这是一条查询语句,属性id用来标识这条SQL;resultType表示返回的是一个userEntity类型的值。 -->
    <select id="queryUser" resultType="org.example.entity.User">
        select * from users;
    </select>

    <select id="getNameById" resultType="string">
        select name from users where id = #{id};
    </select>

    <select id="queryUserByMap" parameterType="map" resultType="org.example.entity.User">
        select * from users where id = #{id};
    </select>

    <select id="queryUserEntity" parameterMap="org.example.entity.User" resultType="org.example.entity.User">
        select * from users where id = #{id};
    </select>

    <insert id="insertUser" keyProperty="id" useGeneratedKeys="true">
        insert into users (name, email)
        values (#{user.name}, #{user.email})
    </insert>

    <update id="updateUser">
        update users set email=#{user.email} where id = #{user.id}
    </update>

    <delete id="deleteUser">
        delete from users where id = #{id}
    </delete>

</mapper>

注意:

mapper接口和mapper.xml之间需要遵循一定规则,才能成功的让mybatis将mapper接口和mapper.xml绑定起来

  • mapper接口和mapper.xml的命名要一样;
  • mapper接口的全限定名,要和mapper.xml的namespace属性一致;
  • mapper接口中的方法名,要和mapper.xml中的SQL标签的id一致;
  • mapper接口中的方法入参类型,要和mapper.xml中SQL语句的入参类型一致;
  • mapper接口中的方法出参类型,要和mapper.xml中SQL语句的返回值类型一致。 

Java框架:Mybatis【详细】_java mybatis-CSDN博客

mybatis-plus

MyBatis Plus 和 MyBatis 的区别
MyBatis Plus 与原始的 MyBatis 框架有以下主要区别:

功能增强:MyBatis Plus 在 MyBatis 的基础上提供了更多的功能,如通用的 CRUD 操作、分页查询、条件构造器等。这些功能减少了开发人员的工作量,提高了开发效率。

注解支持:MyBatis Plus 引入了一系列注解,如@TableName、@TableId、@TableField等,使得实体类的映射更加灵活和方便,不再需要 XML 映射文件。

更强大的条件构造器:MyBatis Plus 的条件构造器允许我们以更加直观和链式的方式构建 SQL 查询条件,而不必担心拼接 SQL 字符串。

自动代码生成:MyBatis Plus 提供了代码生成器,可以根据数据库表结构自动生成实体类和 Mapper 接口,极大地简化了开发过程。

总的来说,MyBatis Plus 是 MyBatis 的增强版,旨在提供更多便捷的特性,减少开发工作,同时保留了 MyBatis 的灵活性和强大性能。

1. 实体类注解
@TableName:用于指定数据库表的名称。
@TableId:用于指定主键字段。
@TableField:用于指定非主键字段的属性配置。
2. 逻辑删除注解
@TableLogic:用于实现逻辑删除。
3. 字段填充注解
@TableField:其中的 fill 属性可以用于指定字段的自动填充策略,如插入和更新时自动填充时间戳等。

SpringBoot中使用mybatis-plus

 1.新建SpringBoot项目

2.配置mybatis-plus依赖

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>3.3.4</version>
		<relativePath/> <!-- lookup parent from repository -->
	</parent>
	<groupId>org.example</groupId>
	<artifactId>MySpringBoot</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<name>MySpringBoot</name>
	<description>MySpringBoot</description>
	<url/>
	<licenses>
		<license/>
	</licenses>
	<developers>
		<developer/>
	</developers>
	<scm>
		<connection/>
		<developerConnection/>
		<tag/>
		<url/>
	</scm>
	<properties>
		<java.version>17</java.version>
	</properties>
	<dependencies>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>

		<dependency>
			<groupId>mysql</groupId>
			<artifactId>mysql-connector-java</artifactId>
			<version>8.0.30</version>
		</dependency>

		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
		</dependency>

		<dependency>
			<groupId>com.baomidou</groupId>
			<artifactId>mybatis-plus-spring-boot3-starter</artifactId>
			<version>3.5.5</version>
		</dependency>
		<dependency>
			<groupId>org.projectlombok</groupId>
			<artifactId>lombok</artifactId>
			<version>1.18.34</version>
			<scope>provided</scope>
		</dependency>

	</dependencies>

	<build>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
			</plugin>
		</plugins>
	</build>

</project>

3.创建表

CREATE TABLE `users` (
  `id` INT NOT NULL AUTO_INCREMENT,
  `name` varchar(50) NOT NULL,
  `email` varchar(150) DEFAULT NULL,
  `status` int(10) DEFAULT '1',
  `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

4.配置数据库

application.properties文件中配置数据库连接信息:

spring.application.name=MySpringBoot
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/mydatabase?useUnicode=true&characterEncoding=utf-8&useSSL=false
spring.datasource.username=root
spring.datasource.password=123456
#debug=true

5.配置 MapperScan 注解

MySpringBootApplication.java

package org.example.myspringboot;

import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
@MapperScan("org.example.myspringboot.**.mapper")  // 配置 MapperScan 注解
public class MySpringBootApplication {

	public static void main(String[] args) {
		SpringApplication.run(MySpringBootApplication.class, args);
	}

}

6.映射类

Users.java

package org.example.myspringboot.accounts.domain;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;

import java.time.LocalDateTime;


@Data
@TableName("users")
public class Users {
    @TableId(value = "id", type = IdType.AUTO)
    private Long id;

    @TableField("name")
    private String name;

    @TableField("email")
    private String email;

    @TableField("status")
    private Long status;

    @TableField("create_time")
    private LocalDateTime create_time;
    @TableField("update_time")
    private LocalDateTime update_time;

//    @TableField("isMarried")
//    private Boolean isMarried;
}

7.Mapper映射

UsersMapper.java

package org.example.myspringboot.accounts.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
import org.example.myspringboot.accounts.domain.Users;

@Mapper
public interface UsersMapper extends BaseMapper<Users> {
}

8.CURD

UserContorller.java

package org.example.myspringboot.accounts.controller;


import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.example.myspringboot.accounts.domain.Users;
import org.example.myspringboot.accounts.mapper.UsersMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.HashMap;
import java.util.List;

@RequestMapping("/users")
@RestController
public class UserContorller {

    @Autowired
    private UsersMapper usersMapper;

    @RequestMapping
    public ResponseEntity<List<Users>> list(){
        // 查询所有
        // List<Users>  usersList = usersMapper.selectList(null);

        // 分页查询
        Page<Users> page = new Page<>(1, 10);
        IPage<Users> usersPage = usersMapper.selectPage(page, null);
        List<Users> usersList = usersPage.getRecords();
        return ResponseEntity.ok()
                .body(usersList);
    }

    @RequestMapping("/add")
    public ResponseEntity<Users> add(){
        Users users = new Users();
        users.setName("admin");
        users.setEmail("admin@example.com");
        users.setStatus(1L);
        int row = usersMapper.insert(users);
        System.out.println(row);

        return ResponseEntity.ok()
                .body(users);
    }

    @RequestMapping("/get")
    public ResponseEntity<List<Users>> getUser(){
        //Users users = usersMapper.selectById(1L);

        HashMap<String, Object> map = new HashMap<>();
        // 查找 name=admin and status=0
        map.put("name", "admin");  // 查找name=admin
        map.put("status", "0");  // 查找status=0
        List<Users> userList = usersMapper.selectByMap(map);
        return ResponseEntity.ok()
                .body(userList);

    }

    @RequestMapping("/update")
    public ResponseEntity<String> update(){
        Users users = new Users();
        users.setId(1L);
        // 修改用户邮箱和status
        users.setEmail("admin@xxxxx.com");  // 修改id=1的用户邮箱
        users.setStatus(0L);  // 修改id=1的 status
        int row = usersMapper.updateById(users);
        System.out.println(row);
        return ResponseEntity.ok("OK");
    }
    
    public ResponseEntity<String> delete(){
        int row = usersMapper.deleteById(1L);
        return ResponseEntity.ok("OK");
    }
}

【MyBatis Plus】初识 MyBatis Plus,在 Spring Boot 项目中集成 MyBatis Plus,理解常用注解以及常见配置_mybatisplus-CSDN博客

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2152482.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于YOLOv5s的无人机航拍输电线瓷瓶检测(附数据集与操作步骤)

本文主要内容:详细介绍了无人机航拍输电线瓷瓶检测的整个过程&#xff0c;从创建数据集到训练模型再到预测结果全部可视化操作与分析。 文末有数据集获取方式&#xff0c;请先看检测效果 现状 输电线路绝缘瓷瓶的检测主要依赖人工巡检。巡检人员需携带专业设备&#xff0c;攀…

Typora安装和导入导出

Typora安装和导入导出 文章目录 Typora安装和导入导出前言Typora v1.9.5Typora v1.4.7Pandoc 前言 Typora v1.9是最新版, , Typora v1.4是老版本的, 这两个选择一个即可Pandoc可以导入导出word Typora v1.9.5 Typora v1.9.rar, 提取码&#xff1a;tian按ctrl单击鼠标左键打开…

毕业设计选题:基于ssm+vue+uniapp的捷邻小程序

开发语言&#xff1a;Java框架&#xff1a;ssmuniappJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#xff1a;M…

大数据实验一: Linux系统安装和使用

一、实验目的 描述Ubuntu的安装过程&#xff1b;使用命令完成Ubuntu中的基础操作&#xff1b; 二、实验平台 操作系统&#xff1a;window系统&#xff1b;内存&#xff1a;4G以上&#xff1b;硬盘&#xff1a;100GB以上&#xff1b;Virtual Box或者VMware&#xff1b;Ubuntu…

如何用1024张显卡训练一个模型

最近看到知乎一个回答&#xff0c;把千卡训练的难度吹上天了。但其实真正用过千卡就会发现也就那么几个点。于是想写一篇文章简单讲讲。 本文将包括几个部分&#xff1a; 首先我们将讨论千卡训练的难题&#xff0c;以及应该在什么时候使用千卡训练&#xff1b; 接着&#xff…

品牌建设是什么?怎么做好品牌建设?

品牌建设&#xff0c;是每个公司品牌形象树立过程中所做的一系列动作&#xff0c;旨在与目标市场建立情感联系&#xff0c;并在竞争激烈的市场中为企业或产品赢得认同和忠诚度。要做好品牌建设&#xff0c;公司首先要明确自己的品牌定位&#xff0c;然后在通过一些品牌建设策略…

Java调用数据库 笔记06 (修改篇)

1.创建Java的普通class类 2.加载驱动 Class.forName("com.mysql.jdbc.Driver"); 3.驱动管理类调用方法进行连接&#xff0c;得到连接对象 DriverManager.getConnection(url, user, password); 其中设置参数&#xff1a; static final String url "jdbc:my…

2024年上海小学生古诗文大会倒计时一个月:做2024官方模拟题

2024年上海市小学生古诗文大会自由参赛的初赛将于10月19日开始&#xff0c;还有不到一个月的时间。 今天好真题继续带着大家来继续做官方2024年小学生古诗文大会的官方模拟题。 【温馨提示】我给每一道题都独家制作了解析&#xff0c;便于孩子理解和熟记题目背后的知识点&…

【python设计模式6】行为型模式1

目录 责任链模式 观察者模式 责任链模式 责任链模式的内容&#xff1a;使多个对象都有机会处理请求&#xff0c;从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链并沿着这条链传递该请求&#xff0c;直到有一个对象处理它为止。责任链的角色有抽象处理者、…

b2b2c商城系统好用么 多用户商城系统四大盈利模式

商淘云B2B2C商城系统能帮助企业快速搭建企业自己的多用户商城系统&#xff0c;它提供了多种功能&#xff0c;如多商家管理、订单处理、支付模块集成等&#xff0c;适合各种规模的企业。用户界面友好&#xff0c;且支持定制化&#xff0c;能满足不同业务需求。 多用户商城有四大…

【ARM】A64指令介绍及内存屏障和寄存器

A64指令集介绍 ISA : Instruction System Architecture 指令集总结 跳转指令 使用跳转指令直接跳转&#xff0c;跳转指令有跳转指令B&#xff0c;带链接的跳转指令BL &#xff0c;带状态切换的跳转指令BX。 B 跳转指令&#xff0c;跳转到指定的地址执行程序。 BL 带链接的跳…

.NET周刊【9月第3期 2024-09-15】

国内文章 关于.NET在中国为什么工资低的分析 https://www.cnblogs.com/thinkingmore/p/18406244 .NET在中国开发者的薪资偏低&#xff0c;主要因市场需求、技术栈选择和企业文化等因素所致。历史上&#xff0c;.NET曾因微软的闭源策略发展受限&#xff0c;尽管后来推出了跨平…

传输层协议 —— TCP协议(下篇)

目录 0.前言 1.流量控制 什么是流量控制&#xff1f; 如何做到流量控制&#xff1f; 窗口探测 PSH标志位与流量控制 一个问题 2.滑动窗口 为什么要有滑动窗口&#xff1f; 滑动窗口在哪&#xff1f; 滑动窗口到底是什么&#xff1f; 滑动窗口的工作原理 滑动窗口中…

Java——认识String类

在 C 语言中已经涉及到字符串了&#xff0c;但是在 C 语言中要表示字符串只能使用字符数组或者字符指针&#xff0c;可以使用标准库提供的字符串系列函数完成大部分操作&#xff0c;但是这种将数据和操作数据方法分离开的方式不符合面相对象的思想&#xff0c;而字 符串应用又非…

【射频通信电子线路基础第五讲】噪声、噪声系数和灵敏度

一、噪声 确定信号对应的是干扰&#xff0c;而随机信号对应的是噪声&#xff0c;噪声又分为系统内部的噪声和外部对系统的噪声。 1、电阻热噪声 &#xff08;1&#xff09;无源有耗网络的热噪声 &#xff08;2&#xff09;热噪声通过线性网络 &#xff08;3&#xff09;等效噪…

酷炫航模飞手飞行技术详解

在无人机与航模的广阔世界里&#xff0c;成为一名技艺高超的飞手&#xff0c;不仅需要对飞行器有深入的理解&#xff0c;还需掌握一系列精湛的飞行技巧。本文将从基础飞行技巧、特技飞行动作、FPV第一人称视角、安全飞行要点、设备调试与维护&#xff0c;以及实战应用与拓展六个…

2024 “华为杯” 中国研究生数学建模竞赛(E题)深度剖析|高速公路应急车道启用建模|数学建模完整代码+建模过程全解全析

当大家面临着复杂的数学建模问题时&#xff0c;你是否曾经感到茫然无措&#xff1f;作为2022年美国大学生数学建模比赛的O奖得主&#xff0c;我为大家提供了一套优秀的解题思路&#xff0c;让你轻松应对各种难题&#xff01; CS团队倾注了大量时间和心血&#xff0c;深入挖掘解…

深度学习--从零实现线性回归【数据流水线+模型+损失函数+小批量梯度下降】

代码来源于动手学深度学习pytorch版&#xff0c;感兴趣的同学可以自行购买观看。本节内容带着大家了解深度学习框架底层实现逻辑&#xff0c;如何自定义模型&#xff0c;自定义层或自定义损失函数&#xff0c;方便大家后续使用深度学习框架时候能够明白一些基本函数的实现过程&…

C语言——————结构体

前言&#xff1a; 我们都已经学了很多int char …等类型还学到了同类型元素构成的数组&#xff0c;以及取上述类型的指针&#xff0c;在一些小应用可以灵活使用&#xff0c;然而&#xff0c;在实际问题中有时候我们需要几种数据类型一起来修饰某个变量。 例如一个学生的信息就…

2024 “华为杯” 中国研究生数学建模竞赛(F题)深度剖析|X射线脉冲星光子到达时间建模|数学建模完整代码+建模过程全解全析

当大家面临着复杂的数学建模问题时&#xff0c;你是否曾经感到茫然无措&#xff1f;作为2022年美国大学生数学建模比赛的O奖得主&#xff0c;我为大家提供了一套优秀的解题思路&#xff0c;让你轻松应对各种难题&#xff01; CS团队倾注了大量时间和心血&#xff0c;深入挖掘解…