菜鸟从0学微服务——MyBatis-Plus

关于“菜鸟从0学微服务”

针对有编程基础,开始学习微服务的同学,我们陆续推出从0学微服务的笔记分享。力求从各个中间件的使用来反思这些中间件的作用和优势。

会分享的比较快,会记录demo演算和中间件的使用过程,至于细节的理论知识请自主查阅相关资料并学习。满是干货,注意查收。

本期我们开始学习MyBatis-Plus。

基础概念

为什么选择 MyBatis-Plus?

  1. 无侵入:只做增强不做改变,引入它不会对现有工程产生影响,如丝般顺滑
  2. 损耗小:启动即会自动注入基本 CURD,性能基本无损耗,直接面向对象操作
  3. 强大的 CRUD 操作:内置通用 Mapper、通用 Service,仅仅通过少量配置即可实现单表大部分 CRUD 操作,更有强大的条件构造器,满足各类使用需求
  4. 支持 Lambda 形式调用:通过 Lambda 表达式,方便的编写各类查询条件,无需再担心字段写错
  5. 支持主键自动生成:支持多达 4 种主键策略(内含分布式唯一 ID 生成器 - Sequence),可自由配置,完美解决主键问题
  6. 支持 ActiveRecord 模式:支持 ActiveRecord 形式调用,实体类只需继承 Model 类即可进行强大的 CRUD 操作
  7. 支持自定义全局通用操作:支持全局通用方法注入( Write once, use anywhere )
  8. 内置代码生成器:采用代码或者 Maven 插件可快速生成 Mapper 、 Model 、 Service 、 Controller 层代码,支持模板引擎,更有超多自定义配置等您来使用
  9. 内置分页插件:基于 MyBatis 物理分页,开发者无需关心具体操作,配置好插件之后,写分页等同于普通 List 查询
  10. 分页插件支持多种数据库:支持 MySQL、MariaDB、Oracle、DB2、H2、HSQL、SQLite、Postgre、SQLServer 等多种数据库
  11. 内置性能分析插件:可输出 SQL 语句以及其执行时间,建议开发测试时启用该功能,能快速揪出慢查询
  12. 内置全局拦截插件:提供全表 delete 、 update 操作智能分析阻断,也可自定义拦截规则,预防误操作

学习 MyBatis-Plus 的步骤

  1. 了解 MyBatis 基础:虽然 MyBatis-Plus 是 MyBatis 的增强版,但建议先了解 MyBatis 的基本原理和用法,这有助于更好地理解 MyBatis-Plus。

  2. 阅读官方文档:MyBatis-Plus 的官方文档是学习的最佳资源,包含了安装、配置、使用、插件等各方面的内容。

  3. 搭建开发环境:可以使用 Spring Boot 快速搭建一个 MyBatis-Plus 的开发环境,并尝试运行一些示例代码。

  4. 学习 CRUD 操作:MyBatis-Plus 提供了丰富的 CRUD 方法,包括基本的增删改查以及批量操作等,需要熟练掌握。

  5. 掌握条件构造器:MyBatis-Plus 的条件构造器是其一大亮点,可以很方便地构造复杂的 SQL 语句,需要重点学习。

  6. 使用插件:了解并尝试使用 MyBatis-Plus 提供的各种插件,如分页插件、性能分析插件等,以提高开发效率和系统性能。

  7. 实践项目:通过参与实际项目,将 MyBatis-Plus 应用到具体的业务场景中,以加深对其的理解和掌握。

HelloWorld

由于本文阅读对象是已经有其他语言或框架的编程基础的人,所以我们快速的开始一个Demo来变做变学,以战代练。

我们创建一个MP项目,环境选择:

jdk选择了1.8,spring boot版本2.6.13,mysql5.7

工程目录

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.6.13</spring-boot.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>

        <!-- Spring Boot Starter Web (如果你需要Web支持) -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <!-- MySQL JDBC 驱动 -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.29</version> <!-- 使用与MySQL 5.7兼容的8.0.x版本 -->
        </dependency>

        <!-- MyBatis-Plus -->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.5.1</version> <!-- 使用一个与Spring Boot 2.x兼容的版本 -->
        </dependency>

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

application.properties

# 应用服务 WEB 访问端口
server.port=8080
# 数据库连接信息
spring.datasource.url=jdbc:mysql://localhost:3316/mytest?useUnicode=true&characterEncoding=utf-8&serverTimezone=UTC
spring.datasource.username=root
spring.datasource.password=****
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

StudentMapper

package com.example.mp.repository.mapper;

import com.example.mp.model.Student;
import org.apache.ibatis.annotations.Mapper;

@Mapper
public interface StudentMapper {
    Student findById(Long id);

    void save(Student student);

    void update(Student student);

    void delete(Long id);
}

 @Mapper注解是MyBatis框架中的一个注解,用于标识一个接口为MyBatis的Mapper接口。MyBatis的Mapper接口用于定义数据库操作的方法,这些方法可以通过XML文件或注解来定义SQL语句。

以下是@Mapper注解的一些主要用途:

  1. 自动扫描Mapper接口: 当你使用@Mapper注解标记一个接口时,MyBatis会自动扫描这个接口,并将其注册为一个Mapper。这意味着你不需要手动配置Mapper接口的位置。

  2. 简化SQL语句的定义: 在Mapper接口中,你可以使用注解来定义SQL语句,而不需要编写XML文件。例如,你可以使用@Select@Insert@Update@Delete注解来定义查询、插入、更新和删除操作。

  3. 支持动态SQL: MyBatis的Mapper接口支持动态SQL,这意味着你可以在SQL语句中添加条件、循环等逻辑,以适应不同的查询需求。

以下是一个使用@Mapper注解的例子:

@Mapper
public interface StudentMapper {
    @Select("SELECT * FROM students WHERE id = #{id}")
    Student findById(Long id);

    @Insert("INSERT INTO students(name, age) VALUES(#{name}, #{age})")
    void save(Student student);

    @Update("UPDATE students SET name=#{name}, age=#{age} WHERE id=#{id}")
    void update(Student student);

    @Delete("DELETE FROM students WHERE id=#{id}")
    void delete(Long id);
}

但是看到我之前贴的代码里,SQL语句并不包含在接口代码中,那么SQL去哪里了呢?其实刚才说了,@Mapper注解也可以通过XML文件定义SQL语句。细心点的可以看到工程目录里,有个src/main/resources/mapper/StudentMapper.xml,通过@Mapper注解可以关联到他。

StudentMapper.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.example.mp.repository.mapper.StudentMapper">

    <select id="findById" resultType="com.example.mp.model.Student">
        SELECT * FROM student WHERE id = #{id}
    </select>

    <insert id="save" parameterType="com.example.mp.model.Student">
        INSERT INTO student (id, name, age) VALUES (#{id}, #{name}, #{age})
    </insert>

    <update id="update" parameterType="com.example.mp.model.Student">
        UPDATE student SET name = #{name}, age = #{age} WHERE id = #{id}
    </update>

    <delete id="delete" parameterType="Long">
        DELETE FROM student WHERE id = #{id}
    </delete>

</mapper>

在MyBatis(包括MyBatis-Plus)中,Mapper的XML文件提供了一种灵活的方式来定义SQL语句,特别是当SQL语句变得复杂或需要动态构建时。这种方法允许开发者将SQL语句与Java代码分离,使得SQL语句的编写、修改和调试变得更加容易。

写在XML里的好处
  1. 分离关注点:将SQL语句与Java代码分离,使得代码更加清晰,也更容易维护。
  2. 灵活性:XML文件支持复杂的SQL语句,包括动态SQL(如<if><choose><when><otherwise><foreach>等标签),可以轻松地处理各种复杂的查询和更新逻辑。
  3. 可读性:对于复杂的SQL语句,使用XML文件可以提高可读性,特别是当SQL语句很长或包含多个条件时。
  4. 重用性:XML中的SQL语句可以被多个Mapper接口方法重用,减少了代码重复。
流行性和推荐性

在MyBatis社区中,使用XML文件来定义SQL语句是非常流行和推荐的做法。尽管MyBatis-Plus提供了许多便捷的CRUD操作和条件构造器,但在处理复杂查询和更新时,XML文件仍然是一个强大的工具。

如何使用
  1. 定义Mapper接口:首先,你需要定义一个Mapper接口,该接口中的方法将对应于XML文件中的SQL语句。

  2. 编写XML文件:然后,在src/main/resources目录下的相应包路径中创建一个XML文件,文件名需要与Mapper接口的全路径名相同,但后缀为.xml

  3. 映射SQL语句:在XML文件中,使用<mapper>标签作为根元素,并使用<select><insert><update><delete>等标签来定义SQL语句。你可以使用id属性来指定该SQL语句对应的Mapper接口中的方法名。

  4. 使用动态SQL:如果SQL语句需要根据条件动态构建,可以使用MyBatis提供的动态SQL标签(如<if><choose>等)来实现。

  5. 配置Mapper扫描:确保你的MyBatis或MyBatis-Plus配置中包含了Mapper接口的扫描路径,这样MyBatis才能找到并加载这些Mapper接口及其对应的XML文件。

  6. 在Service层调用:最后,在你的Service层中,你可以像调用普通Java方法一样调用Mapper接口中的方法,MyBatis会自动将调用转发到对应的SQL语句并执行。

三个核心字段说明
Mapper Namespace

mapper namespace在MyBatis中是一个标识符,用于唯一标识一个Mapper接口。它通常设置为Mapper接口的全限定名(即包含包名的类名)。例如,如果你的Mapper接口路径位于com.example.mp.repository.mapper.StudentMapper,那么mapper namespace就应该是"com.example.mp.repository.mapper.StudentMapper"

resultType

resultType是MyBatis中用于指定SQL查询返回结果应该被映射到的Java类型的别名或全限定名。它并不直接对应于项目中的一个层或包,而是与你的Java模型(Model)类相关。在例子中,resultType="om.example.mp.model.Student"表示查询结果应该被映射到om.example.mp.model.Student类。

parameterType

其实还有第三个字段parameterType,主要就是SQL入参的类型。比如:

<!-- 查询单个用户 -->  
<select id="selectUserById" resultType="com.example.User">  
  SELECT * FROM users WHERE id = #{id}  
</select>

在这个例子中,resultType被设置为com.example.User,这意味着查询结果将被映射到User类的实例中。这里不需要(也不应该)设置parameterType,因为MyBatis(包括MyBatis-Plus)可以根据方法参数自动推断出它。但是,如果出于某种原因你想显式地指定它,你可以这样做(尽管这在这个特定例子中是多余的): 

<!-- 查询单个用户(显式指定parameterType,尽管通常是多余的)-->  
<select id="selectUserById" resultType="com.example.User" parameterType="int">  
  SELECT * FROM users WHERE id = #{id}  
</select>

对于单个基本类型参数(如intlongString等),MyBatis能够自动处理,因此显式指定parameterType通常是不必要的。

StudentService

package com.example.mp.service;

import com.example.mp.model.Student;
import com.example.mp.repository.mapper.StudentMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class StudentService {
    @Autowired
    private StudentMapper studentMapper;

    public void saveStudent(Student student) {
        // 检查必要属性是否为空
        if (student.getName() != null && student.getAge() > 0) {
            // 执行插入操作
            studentMapper.save(student);
            System.out.println("学生信息插入成功");
        } else {
            System.out.println("学生信息插入失败,缺少必要属性");
        }
    }
}

StudentController

package com.example.mp.controller;

import com.example.mp.model.Student;
import com.example.mp.service.StudentService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

@RestController
@RequestMapping("/students")
public class StudentController {
    @Autowired
    private StudentService studentService;

    @PostMapping
    public String addStudent(@RequestBody Student student) {
        studentService.saveStudent(student);
        return "Student added successfully";
    }
    @GetMapping
    public String addStudent(long id,String name,int age) {
        Student student = new Student();
        student.setId(id);
        student.setName(name);
        student.setAge(age);
        studentService.saveStudent(student);
        return "Student added successfully";
    }
}

分别用get,post,body和参数的方式做了实验,结果能成功插入数据库。棒棒哒。

但是我们对MP的学习还没有结束。还有个重要课题,就是构造器。

构造器(Wrapper)

使用构造器方式(Wrapper)是MyBatis Plus提供的一种更灵活的SQL查询方式,它可以帮助你快速构建复杂的查询条件,并生成对应的SQL语句。相比于传统的XML映射文件,使用构造器方式可以减少重复代码,提高代码的可读性和灵活性。

推荐MyBatis-Plus中的Wrapper(包括QueryWrapperUpdateWrapperLambdaQueryWrapperLambdaUpdateWrapper)的理由主要有以下几点:

1. 简化复杂查询和更新条件的构建

  • 链式调用:Wrapper提供了丰富的链式函数,允许开发者通过链式调用的方式构建复杂的查询和更新条件。这种方式比传统的XML SQL语句或字符串拼接更加直观和易于维护。
  • 类型安全:LambdaQueryWrapperLambdaUpdateWrapper通过Lambda表达式的方式引用实体类的属性名,避免了手写字段名字符串可能带来的拼写错误和不易维护的问题,提高了代码的类型安全性。

2. 提高开发效率

  • 减少模板代码:使用Wrapper可以显著减少重复的代码模板,使得开发者能够更加专注于业务逻辑的实现。
  • 快速迭代:在快速迭代的开发环境中,Wrapper的灵活性和易用性可以帮助开发者快速构建查询和更新条件,提高开发效率。

3. 易于维护和扩展

  • 清晰的代码结构:Wrapper的链式调用方式使得代码结构更加清晰,易于理解和维护。
  • 易于扩展:随着业务需求的变化,Wrapper提供的灵活条件构建能力使得开发者可以轻松地扩展查询和更新条件,而不需要对原有代码进行大规模修改。

4. 安全性

  • 防SQL注入:虽然Wrapper本身并不直接提供防SQL注入的功能,但MyBatis-Plus在内部对SQL语句进行了预处理和参数绑定,这在一定程度上降低了SQL注入的风险。然而,开发者仍然需要确保传递给Wrapper的参数是安全的,避免将用户输入直接用于构建条件。

Wrapper的使用

若要使用Wrapper来快速实现SQL读写,上面的关于Student的Demo代码,我们可以改造如下:

StudentService

package com.example.application.service;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.example.application.mapper.StudentMapper;
import com.example.application.model.Student;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
public class StudentService {

    @Autowired
    private StudentMapper studentMapper;

    public List<Student> findStudentsByName(String name) {
        QueryWrapper<Student> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("name", name);
        return studentMapper.selectList(queryWrapper);
    }

    public void updateStudentAge(Long id, int age) {
        UpdateWrapper<Student> updateWrapper = new UpdateWrapper<>();
        updateWrapper.eq("id", id).set("age", age);
        studentMapper.update(null, updateWrapper);
    }
}

StudentMapper

package com.example.application.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.example.application.model.Student;

public interface StudentMapper extends BaseMapper<Student> {
}

在上面的示例中, StudentService 中的 findStudentsByName 方法使用 QueryWrapper 构造器来构建查询条件,实现根据学生姓名查询学生信息; updateStudentAge 方法使用 UpdateWrapper 构造器来构建更新条件,实现根据学生ID更新学生年龄的操作。

selectListupdate 方法是基于MyBatis Plus提供的 BaseMapper 接口而来,不需要在Mapper接口中显式定义。

通过使用Wrapper,可以简化SQL查询条件的构建,提高代码的可维护性和可读性。

PS:尽管见识了MP的构造器Wrapper的灵巧和强大,但是我个人而言,潜意识还是很抗拒摆脱SQL的写法,不知道你怎么想?

好了,先到这里,下次《菜鸟从0学微服务》再见!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

SSIS_SQLITE

1.安装 SQLite ODBC 驱动程序 2.添加SQLite数据源 在“用户DSN”或“系统DSN”选项卡中&#xff0c;点击“添加”。选择“SQLite3 ODBC Driver”&#xff0c;然后点击“完成”。在弹出的配置窗口中&#xff0c;设置数据源名称&#xff08;DSN&#xff09;&#xff0c;并指定S…

k8s核心知识总结

写在前面 时间一下子到了7月份尾&#xff1b;整个7月份都乱糟糟的&#xff0c;不管怎么样&#xff0c;日子还是得过啊&#xff0c; 1、7月份核心了解个关于k8s&#xff0c;iceberg等相关技术&#xff0c;了解了相关的基础逻辑&#xff0c;虽然和数开主线有点偏&#xff0c;但是…

二、【Python】入门 - 【PyCharm】安装教程

往期博主文章分享文章&#xff1a; 【机器学习】专栏http://t.csdnimg.cn/sQBvw 目录 第一步&#xff1a;PyCharm下载 第二步&#xff1a;安装&#xff08;点击安装包打开下图页面&#xff09; 第三步&#xff1a;科学使用&#xff0c;请前往下载最新工具及教程&#xff1a…

FreeSWITCH 1.10.10 简单图形化界面26-在网页上播放SIP设备视频

​ FreeSWITCH 1.10.10 简单图形化界面26-在网页上播放SIP设备视频 1、前言2、大概流程3、测试环境4、安装流媒体服务器5、设置流媒体服务器接口6、简单写个web接口7、测试一下1、web播放在线播放器1在线播放器2本地video控件 2、vlc播放vlc播放rtmpvlc播放rtsp 8、总结 1、前…

Jmeter三种方式获取数组中多个数据并将其当做下个接口参数入参【附带JSON提取器和CSV格式化】

目录 一、传统方式-JOSN提取器获取接口返回值 1、接口调用获取返回值 2、添加JSON提取器 3、调试程序查看结果 4、添加循环控制器 5、设置count计数器 6、添加请求 7、执行请求 二、CSV参数化 1、将结果写入后置处理程序 2、设置循环处理器 3、添加CSV文件 4、设置…

前端面试项目细节重难点分享(十三)

面试题提问&#xff1a;分享你最近做的这个项目&#xff0c;并讲讲该项目的重难点&#xff1f; 答&#xff1a;最近这个项目是一个二次迭代开发项目&#xff0c;迭代周期一年&#xff0c;在做这些任务需求时&#xff0c;确实有很多值得分享的印象深刻的点&#xff0c;我讲讲下面…

【中项】系统集成项目管理工程师-第5章 软件工程-5.3软件设计

前言&#xff1a;系统集成项目管理工程师专业&#xff0c;现分享一些教材知识点。觉得文章还不错的喜欢点赞收藏的同时帮忙点点关注。 软考同样是国家人社部和工信部组织的国家级考试&#xff0c;全称为“全国计算机与软件专业技术资格&#xff08;水平&#xff09;考试”&…

设计模式|观察者模式

观察者模式是一种行为设计模式&#xff0c;它定义了一种一对多的依赖关系&#xff0c;让多个观察者对象同时监听某一个主题对象。当主题对象发生变化时&#xff0c;它的所有观察者都会收到通知并更新。观察者模式常用于实现事件处理系统、发布-订阅模式等。在项目中&#xff0c…

【spring boot】初学者项目快速练手

项目视频&#xff1a;一小时带你从0到1实现一个SpringBoot项目开发_哔哩哔哩_bilibili 注解视频&#xff1a;10、Java高级技术&#xff1a;注解&#xff1a;认识注解_哔哩哔哩_bilibili 一、基础知识 1.注解Annotation &#xff08;1&#xff09;定义 注解是Java代码里的特…

Wordpress安装到win10(2024年7月)

目录 1.wordpress介绍 2下载应用 2.1.wordpress 2.2XAMPP 2.3 PHPmyadmin 3.配置应用 3.1XAMPP进程 3.2 文件配置 3.3 phpmyadmin配置 4.配置网页 4.1 数据库创建 4.2 安装wordpress 5.进入面板 6.总结 1.wordpress介绍 WordPress是一个开源内容管理系统&#xff0…

Node.js知识点总结

Node.js知识点总结 Node.js其本质和浏览器一样是一个JavaScript运行环境。浏览器的运行环境为V8引擎浏览器内置API&#xff08;BOM、DOM、Canvas);而node.js的运行环境是V8引擎node提供的API(fs、path、http)。它使JavaScript可以编写后端。 基本知识 fs文件系统模块 它提供一…

C语言·分支和循环语句(超详细系列·全面总结)

前言&#xff1a;Hello大家好&#x1f618;&#xff0c;我是心跳sy&#xff0c;为了更好地形成一个学习c语言的体系&#xff0c;最近将会更新关于c语言语法基础的知识&#xff0c;今天更新一下分支循环语句的知识点&#xff0c;我们一起来看看吧~ 目录 一、什么是语句&#xf…

剪画小程序:短视频搬运必备!去除视频字幕!

在这个人人都自媒体的盛世&#xff0c;新人想要创作爆款视频那里难上加难&#xff0c;所以搬运视频就成了很多新手自媒体人的不二选择。 搬运优质内容成为许多人的需求。但原视频中的字幕往往成为困扰大家的难题。 你是否曾为了搬运一个精彩的短视频&#xff0c;却因为无法去除…

gitee设置ssh公钥密码避免频繁密码验证

gitee中可以创建私有项目&#xff0c;但是在clone或者push都需要输入密码&#xff0c; 比较繁琐。 公钥则可以解决该问题&#xff0c;将私钥放在本地&#xff0c;公钥放在gitee上&#xff0c;当对项目进行操作时带有的私钥会在gitee和公钥进行验证&#xff0c;避免了手动输入密…

CTF-Web习题:[GXYCTF2019]Ping Ping Ping

题目链接&#xff1a;[GXYCTF2019]Ping Ping Ping 解题思路 访问靶机&#xff0c;得到如下页面&#xff0c;类似于URL参数 尝试用HackBar构造url传输过去看看 发现返回了ping命令的执行结果&#xff0c;可以猜测php脚本命令是ping -c 4 $ip&#xff0c;暂时不知道执行的函数…

【Android】数据存储方案——文件存储、SharedPreferences、SQLite数据库用法总结

文章目录 文件存储存储到文件读取文件 SharedPreferences存储存储获取SharedPreferences对象Context 类的 getSharedPreferences() 方法Activity 类的 getPreferences() 方法PreferenceManager 类中的 getDefaultSharedPreferences() 方法 示例 读取记住密码的功能 SQLite数据库…

通信协议_C#实现CAN通信

CAN协议 CAN&#xff08;Controller Area Network&#xff09;即控制器局域网络。特点&#xff1a; 多主网络&#xff1a;网络上的任何节点都可以主动发送数据&#xff0c;不需要一个固定的主节点。双绞线&#xff1a;使用双绞线作为通信介质&#xff0c;支持较远的通信距离。…

挑战房市预测领头羊:KNN vs. 决策树 vs. 线性回归

挑战房市预测领头羊&#xff08;KNN&#xff0c;决策树&#xff0c;线性回归&#xff09; 1. 介绍1.1 K最近邻&#xff08;KNN&#xff09;&#xff1a;与邻居的友谊1.1.1 KNN的基础1.1.2 KNN的运作机制1.1.3 KNN的优缺点 1.2 决策树&#xff1a;解码房价的逻辑树1.2.1 决策树的…

kafka服务介绍

kafka 安装使用管理 Kafka Apache Kafka 是一个开源的分布式事件流平台&#xff0c;主要用于实时数据传输和流处理。它最初由 LinkedIn 开发&#xff0c;并在 2011 年成为 Apache 基金会的顶级项目。Kafka 设计的目标是处理大规模的数据流&#xff0c;同时提供高吞吐量、低延迟…

shopee虾皮 java后端 一面面经 整体感觉不难

面试总结&#xff1a;总体不难&#xff0c;算法题脑抽了只过了一半&#xff0c;面试官点出了问题说时间到了&#xff0c;反问一点点&#xff0c;感觉五五开&#xff0c;许愿一个二面 1.Java中的锁机制&#xff0c;什么是可重入锁 Java中的机制主要包括 synchronized关键字 Loc…