SpringBoot使用MyBatis Plus + 自动更新数据表

1、Mybatis Plus介绍

Mybatis,用过的都知道,这里不介绍,mybatis plus只是在mybatis原来的基础上做了些改进,增强了些功能,增强的功能主要为增加更多常用接口方法调用,减少xml内sql语句编写,也可以自定义接口,简单的查询、新增和删除只需调用内置接口方法即可,有点类似于springdata jpa的方式。

2、插件引入和启动配置

2.1、pom.xml

<dependencies>
<!-- mybatis-plus插的springboot支持 -->
   <dependency>
        <groupId>com.baomidou</groupId>
        <artifactId>mybatis-plus-boot-starter</artifactId>
        <version>3.5.2</version>
    </dependency>
    <!-- MySql -->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>8.0.30</version>
    </dependency>
    <!-- 连接池 -->
    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>druid</artifactId>
        <version>1.2.15</version>
    </dependency>
</dependencies>

2.2、application.yml配置

server:
  port: 8080
spring:
  application:
    name: mybatisPlus
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://127.0.0.1:3306/mybatistest?useUnicode=true&characterEncoding=utf8&autoReconnect=true&allowMultiQueries=true&useSSL=false
    username: liuliu
    password: 123456
mybatis:
  database:
    type: mysql
mybatis-plus:
  mapper-locations: classpath*:mapper/*.xml

mapper-locations: 这里配置xxxMapper.xml文件路径的地方,静态目录【resources】下,如果项目简单,不需要用到xml内的查询,这里可以省略掉。

2.3、启动入口配置

package com.liuliu.demo;

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

@SpringBootApplication
//启动前需扫描dao接口文件所对应的包路径,加入到bean处理,
//这里很重要,否则自定义的查询接口无效
@MapperScan("com.liuliu.demo.mapper")
public class DemoApplication {

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

}

3、查询

3.1、创建数据表对象

数据表结构:

CREATE TABLE `tb_user` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `user_name` varchar(32) NOT NULL COMMENT '用户名称',
  `password` varchar(32) DEFAULT NULL COMMENT '密码',
  `name` varchar(64) DEFAULT NULL COMMENT 'name',
  `age` int(11) DEFAULT NULL,
  `email` varchar(32) DEFAULT NULL,
  `demp_id` int(11) DEFAULT NULL,
  `md5` char(32) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE `demp` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `classname` varchar(32) NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `actable_uni_classname` (`classname`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

创建实体类:

@Data
@TableName("tb_user")
public class User {
    @TableId(type = IdType.AUTO)
    private Integer id;

    private String userName;

    @TableField(select = false)
    private String password;

    private String name;

    private Integer age;

    @TableField(value = "email")
    private String mail;

    @TableField(exist = false)
    private String address;

    @TableField(value = "demp_id")
    private Integer dempId;

    private String md5;

    @TableField(exist = false)
    private Demp demp;
}
@Data
public class Demp {

    @TableId(type = IdType.AUTO)
    private Integer id;

    private String classname;
}

创建mapperDao接口

@Mapper
@Repository
public interface UserMapper extends BaseMapper<User> {
}
@Mapper
@Repository
public interface DempMapper extends BaseMapper<Demp> {
}

创建service接口

package com.liuliu.demo.service;

public interface UserService extends IService<User> {
}

这里只需演示一个表的查询,其它的service就不演示创建了。

3.2、查询数据

先手动创建好数据:
在这里插入图片描述

创建一个实现查询接口service类

package com.liuliu.demo.service.impl;

@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {
    @Autowired
    private UserMapper userMapper;

    public void findUserModule(){
        //查多条,当没查到时返回[]
       System.out.println(list(query().ge("id", 2).getWrapper()));

       //只查一条,当没查到时返回null
       System.out.println(getOne(query().ge("age", 22).orderByDesc("id").getWrapper().last("limit 1")));
    }

创建一个controller类

@RestController
public class UserController {

    @Autowired
    private UserServiceImpl userserviceimpl;

    @GetMapping("findtest")
    public long findtestmodule(){

        userserviceimpl.findUserModule();
        //作为测试效果,这里不做数据返回了,而是在内部控制台打印
        return System.currentTimeMillis();
    }
}

控制台输出的结果:

[User(id=2, userName=李四, password=null, name=lisi, age=22, mail=lisi@aa.com, address=null, dempId=2, md5=null, demp=null), User(id=3, userName=王强, password=null, name=wangqiang, age=35, mail=wang@qq.com, address=null, dempId=1, md5=null, demp=null), User(id=5, userName=川建国, password=null, name=DonaldTrump, age=83, mail=donald@qq.com, address=null, dempId=2, md5=null, demp=null)]
User(id=5, userName=川建国, password=null, name=DonaldTrump, age=83, mail=donald@qq.com, address=null, dempId=2, md5=null, demp=null)

是不是很解单?新增和删除数据方法自己去试试:

this.save(user);
userMapper.deleteById(id);

3.3、关联查询

通过Mybatis plus自带方法来查关联表,暂时好像还不支持,但可以使用xml文件内的sql语法来创建

3.3.1、自定义接口方法

package com.liuliu.demo.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.liuliu.demo.pojo.User;
import org.apache.ibatis.annotations.Mapper;
import org.springframework.stereotype.Repository;

import java.util.List;

@Mapper
@Repository
public interface UserMapper extends BaseMapper<User> {

    User getUserById(Integer id);

    List<User> getUserAll();
}

3.3.2、创建userMapper.xml

路径:resources/mapper/userMapper.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.liuliu.demo.mapper.UserMapper">
    <sql id="fieldAll">tb_user.*,demp.id as dempId,demp.classname</sql>
    <resultMap id="userMap" type="com.liuliu.demo.pojo.User">
        <id property="id" column="id" />
        <result property="userName" column="user_name" />
        <result property="name" column="name" />
        <result property="age" column="age" />
        <result property="password" column="password" />
        <result property="mail" column="email" />
        <result property="dempId" column="demp_id" />
        <association property="demp" javaType="com.liuliu.demo.pojo.Demp">
            <result property="id" column="dempId" />
            <result property="classname" column="classname" />
        </association>
    </resultMap>
    <select id="getUserById" resultMap="userMap" parameterType="Integer">
        select <include refid="fieldAll"/> from tb_user join demp on tb_user.demp_id=demp.id where tb_user.id=#{id}
    </select>
    <select id="getUserAll" resultMap="userMap">
        select <include refid="fieldAll"/> from tb_user join demp on tb_user.demp_id=demp.id
    </select>
</mapper>

3.3.3、实现关联查询

UserServiceImpl.java内添加查询方法

public User findByid(Integer id){
     return userMapper.getUserById(id);
}

@Override
public List<User> findUserAll() {
     return userMapper.getUserAll();
}

控制器内添加查询对接

@GetMapping("/findById")
    public User findById(@RequestParam(name = "id") Integer id){
        return userserviceimpl.findByid(id);
    }

    @GetMapping("/findUserAll")
    public List<User> findUserAll(){
        return userserviceimpl.findUserAll();
    }

demp表数据:
在这里插入图片描述

访问结果
http://127.0.0.1:8080/findById?id=5
在这里插入图片描述

{
	"id": 5,
	"userName": "川建国",
	"password": "fjiewofdsafadfkewok",
	"name": "DonaldTrump",
	"age": 83,
	"mail": "donald@qq.com",
	"address": null,
	"dempId": 2,
	"md5": null,
	"demp": {
		"id": 2,
		"classname": "技术部"
	}
}

http://127.0.0.1:8080/findUserAll
在这里插入图片描述

[
	{
		"id": 1,
		"userName": "张三",
		"password": "123456",
		"name": "zhangsan",
		"age": 20,
		"mail": "da@aa.com",
		"address": null,
		"dempId": 1,
		"md5": null,
		"demp": {
			"id": 1,
			"classname": "财务部"
		}
	},
	{
		"id": 2,
		"userName": "李四",
		"password": "123456",
		"name": "lisi",
		"age": 22,
		"mail": "lisi@aa.com",
		"address": null,
		"dempId": 2,
		"md5": null,
		"demp": {
			"id": 2,
			"classname": "技术部"
		}
	},
	{
		"id": 3,
		"userName": "王强",
		"password": "fjeiwofjdksajl",
		"name": "wangqiang",
		"age": 35,
		"mail": "wang@qq.com",
		"address": null,
		"dempId": 1,
		"md5": null,
		"demp": {
			"id": 1,
			"classname": "财务部"
		}
	},
	{
		"id": 5,
		"userName": "川建国",
		"password": "fjiewofdsafadfkewok",
		"name": "DonaldTrump",
		"age": 83,
		"mail": "donald@qq.com",
		"address": null,
		"dempId": 2,
		"md5": null,
		"demp": {
			"id": 2,
			"classname": "技术部"
		}
	}
]

4、SpringBoot启动时自动更新数据表

自动更新表结构,在团队开发中非常重要,否则在开发管理上很麻烦,并且增加正式环境中的运维难度,每次新增一个表或更改一个表结构,都需要单独在数据库中去操作,这不符合实际开发应用。
Mybatis plus自动更新数据表结构在设置上相比springdata jpa要复杂一些,需要先在pom中引入一个包,然后在yml配置文件中配置相关启动开关,还需在入口处配置实体扫描。

4.1、pom.xml引入相关包

<dependency>
     <groupId>com.gitee.sunchenbin.mybatis.actable</groupId>
     <artifactId>mybatis-enhance-actable</artifactId>
     <version>1.1.1.RELEASE</version>
</dependency>

4.2、application.yml增加内容

mybatis:
  table:
    auto: update  #update: 数据表实体类只要有变动,就会对数据表实施更改操作,包括删除表、新增表、更新表字段等。
  model:
    pack: com.liuliu.demo.pojo  #扫描数据实体位置
  database:
    type: mysql  #数据库类型
mybatis-plus:
#前部分为自动更新需用到的查询xml
  mapper-locations: com/gitee/sunchenbin/mybatis/actable/mapping/*/*.xml,classpath*:mapper/*.xml

4.3、入口启动文件配置

package com.liuliu.demo;

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

@SpringBootApplication
@MapperScan({"com.gitee.sunchenbin.mybatis.actable.dao.*", "com.liuliu.demo.mapper"})
@ComponentScan({"com.gitee.sunchenbin.mybatis.actable.manager.*", "com.liuliu.demo.*"})
public class DemoApplication {

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

注意@ComponentScan,前段是mybatis自带的,没有是会报错的,会报找不到对应的bean,后段是当前项目根目录包,如果不写,会访问不到任何控制器,因为这里的扫描会导致后面的been添加无效。

4.4、数据实体配置

实体类需要添加对应的@注解,否则前面做了那么多,也没有用。
主要有:
@Table
@IsKey
@IsAutoIncrement
@Column
@Unique
@Index

User.java

package com.liuliu.demo.pojo;

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 com.gitee.sunchenbin.mybatis.actable.annotation.*;
import lombok.Data;

@Data
@TableName("tb_user")
@Table(name = "tb_user")
public class User {
    @TableId(type = IdType.AUTO)
    @IsKey
    @IsAutoIncrement
    @Column
    private Integer id;

	//这里有个bug说明下,这个length默认是255,设置length时如果不设置type,是无效的,最后查看数据表结果还是255
    @Column(name = "user_name", length = 32, comment = "用户名称", type = "varchar", isNull = false)
    private String userName;

    @TableField(select = false)
    @Column(name = "password", length = 32, comment = "密码", type = "varchar")
    private String password;

    @Column(name = "name", length = 64, comment = "name", type = "varchar")
    private String name;

    @Column
    private Integer age;

    @TableField(value = "email")
    @Column(name = "email", length = 32, type = "varchar")
    private String mail;

    @TableField(exist = false)
    private String address;

    @TableField(value = "demp_id")
    @Column(name = "demp_id")
    private Integer dempId;

    @Column(type = "char", length = 32)
    private String md5;

    @TableField(exist = false)
    private Demp demp;
}

Demp.java

package com.liuliu.demo.pojo;

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.gitee.sunchenbin.mybatis.actable.annotation.*;
import lombok.Data;

@Data
@Table(name = "demp")
public class Demp {

    @TableId(type = IdType.AUTO)
    @Column
    @IsAutoIncrement
    @IsKey
    private Integer id;

    @Column(type = "varchar", length = 32, isNull = false)
    @Unique
    private String classname;
}

4.5、重启springboot应用查看效果

重启前先清空数据表

 :: Spring Boot ::       (v2.3.12.RELEASE)

2023-07-31 16:49:42.628  INFO 17156 --- [           main] com.liuliu.demo.DemoApplication          : Starting DemoApplication on yonnry with PID 17156 (C:\src\test\mybatisPlusDemo\target\classes started by yongp in C:\src\test\mybatisPlusDemo)
2023-07-31 16:49:42.629  INFO 17156 --- [           main] com.liuliu.demo.DemoApplication          : No active profile set, falling back to default profiles: default
2023-07-31 16:49:42.669  WARN 17156 --- [kground-preinit] o.s.h.c.j.Jackson2ObjectMapperBuilder    : For Jackson Kotlin classes support please add "com.fasterxml.jackson.module:jackson-module-kotlin" to the classpath
2023-07-31 16:49:43.198  INFO 17156 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat initialized with port(s): 8080 (http)
2023-07-31 16:49:43.203  INFO 17156 --- [           main] o.apache.catalina.core.StandardService   : Starting service [Tomcat]
2023-07-31 16:49:43.203  INFO 17156 --- [           main] org.apache.catalina.core.StandardEngine  : Starting Servlet engine: [Apache Tomcat/9.0.46]
2023-07-31 16:49:43.241  INFO 17156 --- [           main] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring embedded WebApplicationContext
2023-07-31 16:49:43.241  INFO 17156 --- [           main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 575 ms
2023-07-31 16:49:43.422  WARN 17156 --- [           main] c.b.m.core.injector.AbstractMethod       : [com.liuliu.demo.mapper.DempMapper.selectById] Has been loaded by XML or SqlProvider or Mybatis's Annotation, so ignoring this injection for [class com.baomidou.mybatisplus.core.injector.methods.SelectById]
 _ _   |_  _ _|_. ___ _ |    _ 
| | |\/|_)(_| | |_\  |_)||_|_\ 
     /               |         
                        3.5.2 
2023-07-31 16:49:43.742  INFO 17156 --- [           main] c.g.s.m.a.m.handler.StartUpHandlerImpl   : databaseType=mysql,开始执行mysql的处理方法
2023-07-31 16:49:43.749  INFO 17156 --- [           main] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Starting...
2023-07-31 16:49:43.818  INFO 17156 --- [           main] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Start completed.
file类型的扫描:com.liuliu.demo.pojo
2023-07-31 16:49:43.907  INFO 17156 --- [           main] s.m.a.m.s.SysMysqlCreateTableManagerImpl : 开始创建表:tb_user
2023-07-31 16:49:43.958  INFO 17156 --- [           main] s.m.a.m.s.SysMysqlCreateTableManagerImpl : 完成创建表:tb_user
2023-07-31 16:49:43.958  INFO 17156 --- [           main] s.m.a.m.s.SysMysqlCreateTableManagerImpl : 开始创建表:demp
2023-07-31 16:49:43.973  INFO 17156 --- [           main] s.m.a.m.s.SysMysqlCreateTableManagerImpl : 完成创建表:demp
2023-07-31 16:49:43.973  INFO 17156 --- [           main] s.m.a.m.s.SysMysqlCreateTableManagerImpl : 开始创建表demp中的唯一约束actable_uni_classname
2023-07-31 16:49:43.982  INFO 17156 --- [           main] s.m.a.m.s.SysMysqlCreateTableManagerImpl : 完成创建表demp中的唯一约束actable_uni_classname
2023-07-31 16:49:44.064  INFO 17156 --- [           main] o.s.s.concurrent.ThreadPoolTaskExecutor  : Initializing ExecutorService 'applicationTaskExecutor'
2023-07-31 16:49:44.100  INFO 17156 --- [           main] o.s.b.a.w.s.WelcomePageHandlerMapping    : Adding welcome page: class path resource [static/index.html]
2023-07-31 16:49:44.154  INFO 17156 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port(s): 8080 (http) with context path ''
2023-07-31 16:49:44.159  INFO 17156 --- [           main] com.liuliu.demo.DemoApplication          : Started DemoApplication in 1.738 seconds (JVM running for 2.192)

注意看,已成功启动,console中有提示“完成创建数据表***”,修改表就不演示了,原理是一样的。

5、结束

源码下载:https://download.csdn.net/download/u012029030/88136220
感谢观看,以上是我对springboot总结的经验,如有什么疑问或不同意见,欢迎留言。

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

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

相关文章

Day03-作业(AxiosElementUI)

作业1&#xff1a; 根据需求完成如下页面数据列表展示 需求&#xff1a;Vue挂载完成后,通过axios发送异步请求到服务端,获取学生列表数据,并通过Vue展示在页面上 获取数据url&#xff1a;http://yapi.smart-xwork.cn/mock/169327/student 素材&#xff1a; <!DOCTYPE html…

赛车游戏——【极品飞车】(内含源码inscode在线运行)

前言 「作者主页」&#xff1a;雪碧有白泡泡 「个人网站」&#xff1a;雪碧的个人网站 「推荐专栏」&#xff1a; ★java一站式服务 ★ ★前端炫酷代码分享 ★ ★ uniapp-从构建到提升★ ★ 从0到英雄&#xff0c;vue成神之路★ ★ 解决算法&#xff0c;一个专栏就够了★ ★ 架…

Windows7+内网, 安装高版本nodejs,使用vite+vue3+typescript开发项目

前言&#xff1a;vite只支持高版本的nodejs&#xff0c;而高版本的nodejs只支持windows8及以上&#xff0c;且vite还对浏览器版本有兼容问题。以下均为vite官网截图 1、安装好低版本的nodejs win7系统建议安装13.及以下&#xff0c;我的是12.12.0这个版本。nodejs低版本官网下载…

Node.js之express框架学习心得

Node.js:颠覆传统的服务器端开发 Node.js是基于Chrome V8引擎构建的JavaScript运行时,它采用了完全不同的开发模型。Node.js使用事件驱动和非阻塞I/O的方式处理请求,通过单线程和异步机制,实现高效的并发处理。这意味着在Node.js中,一个线程可以处理数千个并发连接,大大提…

Bootstrap框架(JavaScript组件)

目录 前言一&#xff0c;JavaScript插件简介二&#xff0c;插件的引入方式三&#xff0c;data属性四&#xff0c;关闭data属性五&#xff0c;过渡插件六&#xff0c;模态框6.1&#xff0c;JavaScript操作模态框6.2&#xff0c;模态框属性6.3&#xff0c;模态框方法6.4&#xff…

机器学习(一)---概述

文章目录 1.人工智能、机器学习、深度学习2.机器学习的工作流程2.1 获取数据集2.2 数据基本处理2.3 特征工程2.3.1 特征提取2.3.2 特征预处理2.3.3 特征降维 2.4 机器学习2.5 模型评估 3.机器学习的算法分类3.1 监督学习3.1.1 回归问题3.1.2 分类问题 3.2 无监督学习 1.人工智能…

小程序动态隐藏分享按钮

// 禁用分享 wx.hideShareMenu({menus: [shareAppMessage, shareTimeline] })// 显示分享 wx.showShareMenu({withShareTicket: true,menus: [shareAppMessage, shareTimeline] })//私密消息 wx.updateShareMenu({isPrivateMessage: true, })

【VTK】基于读取出来的 STL 模型,当用户点击鼠标左键时,程序将获取点击位置的点,显示其坐标,并设置它为模型的旋转原点

知识不是单独的&#xff0c;一定是成体系的。更多我的个人总结和相关经验可查阅这个专栏&#xff1a;Visual Studio。 文章目录 class PointPickedSignal : public QObjectclass MouseInteractorCommand : public vtkCommandvoid A::on_pushButtonSelected_clicked()void A::on…

想了解好用的翻译pdf的软件吗?

在全球化的时代背景下&#xff0c;跨国贸易越来越普遍&#xff0c;跨语言沟通也越来越频繁。小黄是一家跨国公司的员工&#xff0c;他梦想能在全球各地拓展自己的业务&#xff0c;奈何遇到了一个巨大的挑战&#xff1a;跨语言沟通。在这其中&#xff0c;pdf文件是他经常接收到的…

【LeetCode】【数据结构】单链表OJ常见题型(一)

&#x1f440;樊梓慕&#xff1a;个人主页 &#x1f3a5;个人专栏&#xff1a;《C语言》《数据结构》《蓝桥杯试题》《LeetCode刷题笔记》 &#x1f31d;每一个不曾起舞的日子&#xff0c;都是对生命的辜负。 目录 前言&#xff1a; 【LeetCode】203.移除链表元素 【LeetCo…

SI24R2H 2.4G+125K中长跑应用原理

一、中长跑计时系统应用背景 采用125KHZ低频唤醒高频射频识别系统和先进的技术、计算机信息处理等高新技术与体育竞赛相结合&#xff0c;便于运动员携带而不影响其跑步状态&#xff0c;当运 动员带着射频识别卡经过计时线圈时&#xff0c;读卡天线能够立即检测到通过的卡片信息…

VR全景旅游,智慧文旅发展新趋势!

引言&#xff1a; VR全景旅游正在带领我们踏上一场全新的旅行体验。这种沉浸式的旅行方式&#xff0c;让我们可以足不出户&#xff0c;却又身临其境地感受世界各地的美景。 一&#xff0e;VR全景旅游是什么&#xff1f; VR全景旅游是一种借助虚拟现实技术&#xff0c;让用户…

【报错1】无法找到模块“element-plus/dist/locale/zh-cn.mjs”的声明文件。

报错&#xff1a;无法找到模块“element-plus/dist/locale/zh-cn.mjs”的声明文件。“e:/codeAll/webProject/Project/vue_ts/project727/node_modules/element-plus/dist/locale/zh-cn.mjs”隐式拥有 "any" 类型。 如果“element-plus”包实际公开了此模块&#x…

Charles安装和配置

Charles 是一个HTTP代理服务器,HTTP监视器,反转代理服务器&#xff0c;当程序连接Charles的代理访问互联网时&#xff0c;Charles可以监控这个程序发送和接收的所有数据。它允许一个开发者查看所有连接互联网的HTTP通信&#xff0c;这些包括request, response和HTTP headers &a…

快速响应,上门维修小程序让您享受无忧生活

随着科技的不断发展和智能手机的普及&#xff0c;上门维修小程序成为了现代人生活中越来越重要的一部分。上门维修小程序通过将维修服务与互联网相结合&#xff0c;为用户提供了更加便捷、高效的维修服务体验。下面将介绍上门维修小程序开发的优势。   提供便捷的预约方式&am…

OpenLayers入门,OpenLayers如何加载WFS服务的要素资源数据

专栏目录: OpenLayers入门教程汇总目录 前言 本章讲解如何使用OpenLayers加载WFS服务的要素资源数据。 WFS规范介绍 WFS是基于地理要素级别的数据共享和数据操作,WFS规范定义了若干基于地理要素(Feature)级别的数据操作接口,并以 HTTP 作为分布式计算平台。通过 WFS服…

.NET 8 Preview 5推出!

作者&#xff1a;Jiachen Jiang 排版&#xff1a;Alan Wang 我们很高兴与您分享 .NET 8 Preview 5 中的所有新功能和改进&#xff01;此版本是 Preview 4 版本的后续版本。在每月发布的版本中&#xff0c;您将看到更多新功能。.NET 6 和 7 用户可以密切关注此版本&#xff0c;而…

JVM总结笔记

JVM JVM是什么?JVM 的主要组成部分JVM工作流程JVM内存模型直接内存与堆内存的区别&#xff1a;堆栈的区别Java会存在内存泄漏吗&#xff1f;简述Java垃圾回收机制垃圾收集算法轻GC(Minor GC)和重GC(Full GC)新生代gc流程JVM优化与JVM调优 JVM是什么? JVM是Java Virtual Mach…

第五章 Opencv图像处理框架实战 5-3 图像阈值与平滑处理

图像阈值 ret, dst cv2.threshold(src, thresh, maxval, type) src&#xff1a; 输入图&#xff0c;只能输入单通道图像&#xff0c;通常来说为灰度图 dst&#xff1a; 输出图 thresh&#xff1a; 阈值 maxval&#xff1a; 当像素值超过了阈值&#xff08;或者小于阈值&am…

字符串性能优化

String 对象作为 Java 语言中重要的数据类型&#xff0c;是内存中占据空间最大的一个对象。高效地 使用字符串&#xff0c;可以提升系统的整体性能。 来一到题来引出这个话题 通过三种不同的方式创建了三个对象&#xff0c;再依次两两匹配&#xff0c;每组被匹配的两个对象是否…