【SpringBoot详细教程】-05-整合Druid操作数据库【持续更新】

news2024/12/27 2:09:51
文末看往期系列教程:给个关注可好?

🌲 SpringData简介

对于数据访问层,无论是 SQL (关系型数据库) 还是 NoSql (非关系型数据库),Spring Boot 底层都是采用 Spring Data 的方式进行统一处理。

Spring Boot 底层都是采用 Spring Data 的方式进行统一处理各种数据库,Spring Data 也是 Spring 中与 Spring Boot、Spring Cloud 等齐名的知名项目。

Sping Data 官网:Spring Data

🌲 整合Druid数据源

🌾 Druid简介

Java程序很大一部分要操作数据库,为了提高性能操作数据库的时候,又不得不使用数据库连接池。Druid 是阿里巴巴开源平台上一个数据库连接池实现,结合了 C3P0、DBCP 等 DB 池的优点,同时加入了日志监控。

Druid 可以很好的监控 DB 池连接和 SQL 的执行情况,天生就是针对监控而生的 DB 连接池。Druid 已经在阿里巴巴部署了超过600个应用,经过一年多生产环境大规模部署的严苛考验。

Spring Boot 2.0 以上默认使用 Hikari 数据源,可以说 Hikari 与 Driud 都是当前 Java Web 上最优秀的数据源,我们来重点介绍 Spring Boot 如何集成 Druid 数据源,如何实现数据库监控。

Druid Github地址:https://github.com/alibaba/druid/

配置

缺省值

说明

name

配置这个属性的意义在于,如果存在多个数据源,监控的时候可以通过名字来区分开来。如果没有配置,将会生成一个名字,格式是:"DataSource-" + System.identityHashCode(this). 另外配置此属性至少在1.0.5版本中是不起作用的,强行设置name会出错。详情-点此处

url

连接数据库的url,不同数据库不一样。例如: mysql : jdbc:mysql://10.20.153.104:3306/druid2 oracle : jdbc:oracle:thin:@10.20.149.85:1521:ocnauto

username

连接数据库的用户名

password

连接数据库的密码。如果你不希望密码直接写在配置文件中,可以使用ConfigFilter。详细看这里

driverClassName

根据url自动识别

这一项可配可不配,如果不配置druid会根据url自动识别dbType,然后选择相应的driverClassName

initialSize

0

初始化时建立物理连接的个数。初始化发生在显示调用init方法,或者第一次getConnection时

maxActive

8

最大连接池数量

maxIdle

8

已经不再使用,配置了也没效果

minIdle

最小连接池数量

maxWait

获取连接时最大等待时间,单位毫秒。配置了maxWait之后,缺省启用公平锁,并发效率会有所下降,如果需要可以通过配置useUnfairLock属性为true使用非公平锁。

poolPreparedStatements

false

是否缓存preparedStatement,也就是PSCache。PSCache对支持游标的数据库性能提升巨大,比如说oracle。在mysql下建议关闭。

maxPoolPreparedStatementPerConnectionSize

-1

要启用PSCache,必须配置大于0,当大于0时,poolPreparedStatements自动触发修改为true。在Druid中,不会存在Oracle下PSCache占用内存过多的问题,可以把这个数值配置大一些,比如说100

validationQuery

用来检测连接是否有效的sql,要求是一个查询语句,常用select 'x'。如果validationQuery为null,testOnBorrow、testOnReturn、testWhileIdle都不会起作用。

validationQueryTimeout

单位:秒,检测连接是否有效的超时时间。底层调用jdbc Statement对象的void setQueryTimeout(int seconds)方法

testOnBorrow

true

申请连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能。

testOnReturn

false

归还连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能。

testWhileIdle

false

建议配置为true,不影响性能,并且保证安全性。申请连接的时候检测,如果空闲时间大于timeBetweenEvictionRunsMillis,执行validationQuery检测连接是否有效。

keepAlive

false (1.0.28)

连接池中的minIdle数量以内的连接,空闲时间超过minEvictableIdleTimeMillis,则会执行keepAlive操作。

timeBetweenEvictionRunsMillis

1分钟(1.0.14)

有两个含义: 1) Destroy线程会检测连接的间隔时间,如果连接空闲时间大于等于minEvictableIdleTimeMillis则关闭物理连接。 2) testWhileIdle的判断依据,详细看testWhileIdle属性的说明

numTestsPerEvictionRun

30分钟(1.0.14)

不再使用,一个DruidDataSource只支持一个EvictionRun

minEvictableIdleTimeMillis

连接保持空闲而不被驱逐的最小时间

connectionInitSqls

物理连接初始化的时候执行的sql

exceptionSorter

根据dbType自动识别

当数据库抛出一些不可恢复的异常时,抛弃连接

filters

属性类型是字符串,通过别名的方式配置扩展插件,常用的插件有: 监控统计用的filter:stat 日志用的filter:log4j 防御sql注入的filter:wall

proxyFilters

类型是List<com.alibaba.druid.filter.Filter>,如果同时配置了filters和proxyFilters,是组合关系,并非替换关系

🌾 配置Druid

🍁 环境准备
  • 创建新模块,选择Spring Initializr:

  • 配置好项目的基础信息:

  • 选择当前模块所需要使用到的技术集(Spring web ,Mybatis,Mysql)

  • 在pom文件中添加druid相关依赖
<dependency>
	<groupId>com.alibaba</groupId>
	<artifactId>druid-spring-boot-starter</artifactId>
	<version>1.2.6</version>
</dependency>

pom.xml 文件内容如下:

<dependencies>
  <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
  </dependency>
  <dependency>
    <groupId>org.mybatis.spring.boot</groupId>
    <artifactId>mybatis-spring-boot-starter</artifactId>
    <version>3.0.2</version>
  </dependency>

  <dependency>
    <groupId>com.mysql</groupId>
    <artifactId>mysql-connector-j</artifactId>
    <scope>runtime</scope>
  </dependency>
  <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-test</artifactId>
    <scope>test</scope>
  </dependency>
  <dependency>
    <groupId>org.mybatis.spring.boot</groupId>
    <artifactId>mybatis-spring-boot-starter-test</artifactId>
    <version>3.0.2</version>
    <scope>test</scope>
  </dependency>

  <dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
  </dependency>

<dependency>
	<groupId>com.alibaba</groupId>
	<artifactId>druid-spring-boot-starter</artifactId>
	<version>1.2.6</version>
</dependency>
</dependencies>

🍁 配置文件

我们需要在配置文件里面配置连接数据库的相关信息,比如:

spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/study?characterEncoding=utf8&serverTimezone=Asia/Shanghai
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.druid.initial-size=5
spring.datasource.druid.min-idle=5
spring.datasource.druid.max-active=20
spring.datasource.druid.max-wait=60000
spring.datasource.druid.time-between-eviction-runs-millis=60000
spring.datasource.druid.min-evictable-idle-time-millis=300000
spring.datasource.druid.test-while-idle=true

#durid monitor(过滤器,wall表示防火墙)
spring.datasource.druid.filters=stat,wall,slf4j
# 对所有的请求进行过滤
spring.datasource.druid.web-stat-filter.url-pattern=/*
# 排除一些不必要的过滤文件
spring.datasource.druid.web-stat-filter.exclusions=*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*

#druid servlet(开启数据监控)
spring.datasource.druid.stat-view-servlet.enabled=true
# 配置数据监控控制台访问地址:localhost:8080/druid/index.html
spring.datasource.druid.stat-view-servlet.url-pattern=/druid/*
# 是否允许重置
spring.datasource.druid.stat-view-servlet.reset-enable=false
# 开启慢sql写入日志功能
spring.datasource.druid.filter.stat.log-slow-sql=true
# 当sql语句执行超过1秒钟时写入日志
spring.datasource.druid.filter.stat.slow-sql-millis=1000
# 配置登录控制台的账号和密码
spring.datasource.druid.stat-view-servlet.login-username=admin
spring.datasource.druid.stat-view-servlet.login-password=123456

🌲 整合Mybatis

🌾 导入依赖

整合Mybatis时,需要添加以下依赖:

<dependency>
    <groupId>org.mybatis.spring.boot</groupId>
    <artifactId>mybatis-spring-boot-starter</artifactId>
    <version>3.0.2</version>
</dependency>

前面新建项目的时候我们已经勾选过mybatis framework,会帮我们自动添加整合mybatis的依赖,此处无需再引入。

这个依赖包下包含了mybatis依赖,Spring整合mybatis的依赖,Springboot相关的依赖

🌾 搭建项目环境

在项目中建立好相关的包环境

🌾 配置Mybatis

在application.yml中添加mybatis相关配置

mybatis.type-aliases-package=com.moxuan.demo.entity
mybatis.mapper-locations=classpath:mappers/*.xml

上面的配置中:

  • mapper-locations: classpath:mappers/*.xml,表示我们会将mybatis的映射文件放入到resources下的mappers目录中。
  • type-aliases-package: com.moxuan.demo.entity,表示我们会将实体类放入到这个配置的包中,这样在映射文件中使用实体类时可以无需再写这个包名。

🌲 测试准备

🌿 数据库脚本

DROP TABLE IF EXISTS `hero`;
CREATE TABLE `hero` (
  `id` int NOT NULL AUTO_INCREMENT,
  `hname` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL,
  `job` varchar(255) DEFAULT NULL,
  `level` int DEFAULT NULL,
  `sex` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=16 DEFAULT CHARSET=utf8mb3;

-- ----------------------------
-- Records of hero
-- ----------------------------
INSERT INTO `hero` VALUES ('1', '夏侯惇', '战士', '2', '男');
INSERT INTO `hero` VALUES ('3', '甄姬', '法师', '2', '女');
INSERT INTO `hero` VALUES ('4', '安琪拉', '法师', '3', '女');
INSERT INTO `hero` VALUES ('5', '廉颇', '辅助', '1', '男');
INSERT INTO `hero` VALUES ('6', '张飞', '辅助', '1', '男');
INSERT INTO `hero` VALUES ('7', '后羿', '射手', '3', '男');
INSERT INTO `hero` VALUES ('8', '虞姬', '射手', '3', '女');
INSERT INTO `hero` VALUES ('9', '阿珂', '刺客', '3', '女');
INSERT INTO `hero` VALUES ('10', '孙悟空', '刺客', '3', '男');
INSERT INTO `hero` VALUES ('12', '王昭君', '法师', '3', '女');
INSERT INTO `hero` VALUES ('13', '王昭君', '法师', '3', '女');
INSERT INTO `hero` VALUES ('15', '花木兰', '战士', '12', '女');

🌿 实体类

package com.moxuan.boot_04_mybatis.entity;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@NoArgsConstructor
@AllArgsConstructor
public class Hero {
    private Integer id;
    private String hname;
    private String job;
    private Integer level;
    private String sex;
}

🌿 定义dao接口

  • 编写dao映射器接口:
package com.moxuan.boot_04_mybatis.dao;

import com.moxuan.boot_04_mybatis.entity.Hero;
import org.apache.ibatis.annotations.*;
import org.springframework.stereotype.Repository;

import java.util.List;

@Mapper
public interface HeroDao {
    @Select("select * from hero")
    List<Hero> findAllHeros();

}

Repository和Mapper的本质区别在于它们实现持久化数据访问的方式不同。Repository基于ORM框架封装了一些常用的CRUD操作和查询方法,使用方便;Mapper基于注解或XML配置,提供了更细粒度的SQL控制能力,更加灵活。

此外,Repository和Mapper的接口定义和实现方式也不同。Repository是一个接口,继承JpaRepository或其他Repository接口,Spring Data会动态生成它的实现类;Mapper则是一个Java类,使用@Mapper注解后,MyBatis会基于注解或XML配置生成和维护它的实现类。

🌿编写业务层

  • 封装业务层返回数据Result类
package com.moxuan.boot_04_mybatis.config;

import lombok.Data;

/**
 * Created with IntelliJ IDEA.
 *
 * @Author: moxuan
 * @Date: 2023/08
 * @Description: 对返回数据进行统一封装
 */
@Data
public class Result {

    private int code;// 状态码
    private String msg;// 消息
    private Object data;// 数据源

    public static final int SUCCESS_CODE=200;
    public static final int ERROR_CODE=-1;
    public  static final String SUCCESS_MSG="请求成功";
    public  static final String ERROR_MSG="请求失败";

    public static Result success(){
        Result result = new Result();
        result.setCode(SUCCESS_CODE);
        result.setMsg(SUCCESS_MSG);
        return result;
    }
    public static Result error(){
        Result result = new Result();
        result.setCode(ERROR_CODE);
        result.setMsg(ERROR_MSG);
        return result;
    }
    
    public static Result sendResult(int code ,String msg){
        Result result =  new Result();
        result.setMsg(msg);
        result.setCode(code);
        return result;
    }

    public static Result sendResult(int code ,String msg,Object obj){
        Result result =  new Result();
        result.setData(obj);
        result.setMsg(msg);
        result.setCode(code);
        return result;
    }

}
  • 业务层接口
package com.moxuan.boot_04_mybatis.service;


import com.moxuan.boot_04_mybatis.config.Result;
import com.moxuan.boot_04_mybatis.entity.Hero;

public interface HeroService {
    Result getAllHeros();

}
  • 业务层接口实现类
package com.moxuan.boot_04_mybatis.service.impl;


import com.moxuan.boot_04_mybatis.config.Result;
import com.moxuan.boot_04_mybatis.dao.HeroDao;
import com.moxuan.boot_04_mybatis.entity.Hero;
import com.moxuan.boot_04_mybatis.service.HeroService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
public class HeroServiceImpl implements HeroService {
    @Autowired
    private HeroDao dao;

    @Override
    public Result getAllHeros() {
        List<Hero> heroList = dao.findAllHeros();
        if (heroList.size()==0){
            return Result.sendResult(Result.ERROR_CODE,"未查询到数据");
        }
        return Result.sendResult(Result.SUCCESS_CODE,"操作成功",heroList);

    }

}

🌿编写测试类

package com.moxuan.boot_04_mybatis;

import com.moxuan.boot_04_mybatis.config.Result;
import com.moxuan.boot_04_mybatis.service.HeroService;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

@SpringBootTest
class Boot04MybatisApplicationTests {


    @Autowired
    HeroService heroService;

    @Test
    public void test(){
        Result result = heroService.getAllHeros();
        System.out.println(result);
    }
}

🌲 启动Druid监控控制台

这里需要注意的是,Druid监控控制台,截至笔者编写本教程时,仅支持SpringBoot2.x版本,SpringBoot3.x版本需要待Druid相应版本更新后才能使用。

  • 在前面的案例中,我们其实已经添加过启动控制台的配置,配置信息如下:
spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/study?characterEncoding=utf8&serverTimezone=Asia/Shanghai
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.druid.initial-size=5
spring.datasource.druid.min-idle=5
spring.datasource.druid.max-active=20
spring.datasource.druid.max-wait=60000
spring.datasource.druid.time-between-eviction-runs-millis=60000
spring.datasource.druid.min-evictable-idle-time-millis=300000
spring.datasource.druid.test-while-idle=true

#durid monitor(过滤器,wall表示防火墙)
spring.datasource.druid.filters=stat,wall,slf4j
# 对所有的请求进行过滤
spring.datasource.druid.web-stat-filter.url-pattern=/*
# 排除一些不必要的过滤文件
spring.datasource.druid.web-stat-filter.exclusions=*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*

#druid servlet(开启数据监控)
spring.datasource.druid.stat-view-servlet.enabled=true
# 配置数据监控控制台访问地址:localhost:8080/druid/index.html
spring.datasource.druid.stat-view-servlet.url-pattern=/druid/*
# 是否允许重置
spring.datasource.druid.stat-view-servlet.reset-enable=false
# 开启慢sql写入日志功能
spring.datasource.druid.filter.stat.log-slow-sql=true
# 当sql语句执行超过1秒钟时写入日志
spring.datasource.druid.filter.stat.slow-sql-millis=1000
# 配置登录控制台的账号和密码
spring.datasource.druid.stat-view-servlet.login-username=admin
spring.datasource.druid.stat-view-servlet.login-password=123456

# mybatis相关配置
mybatis.type-aliases-package=com.moxuan.demo.entity
mybatis.mapper-locations=classpath:mappers/*.xml
  • 启动程序,在地址栏输入:http://localhost:8080/druid/

  • 进入登录界面后,此时输入在配置文件配置的用户名admin和密码123456,即可打开主页

  • 编写控制器类进行测试
package com.moxuan.demo.controller;


import com.moxuan.demo.config.Result;
import com.moxuan.demo.service.HeroService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class WebController {
    @Autowired
    HeroService service;

    @RequestMapping("heros")
    public Result getAllHeros(){
        Result result =service.getAllHeros();
        return result;
    }

}
  • 启动程序,打开浏览器输入如下地址:

  • 进入druid控制台,点击SQL监控,可以查看监控信息

都到这里了:动动手点个关注呗!!^_^

往期系列专题文章:

 【SpringBoot详细教程】-01-SpringBoot入门【持续更新】-CSDN博客

 【SpringBoot详细教程】-02-SpringBoot配置【持续更新】-CSDN博客

 【SpringBoot详细教程】-03-整合Junit【持续更新】-CSDN博客

 【SpringBoot详细教程】-04-整合开发日志功能【持续更新】-CSDN博客

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

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

相关文章

Python实现:时间序列趋势外推法应用-龚珀兹曲线拟合

龚珀兹曲线 下表数据为某跨国公司1989-2021年的年销售量数据&#xff0c;使用适合的模型预测该公司2022年的销售额&#xff0c;并得出理由。 部分数据如下表&#xff08;具体数据从主页资源下载&#xff09;&#xff1a; 年份时序&#xff08;t&#xff09;总额&#xff08;y…

Spring JDBC及声明式事务

目录 Spring JDBC基础概念 Spring声明式事务 事务传播方式 Spring JDBC基础概念 Spring JDBC 封装了原生的JDBC API&#xff0c;使得处理关系型数据库更加简单。Spring JDBC的核心是JdbcTemplate&#xff0c;里面封装了大量数据库CRUD的操作。使用Spring JDBC…

八大核心能力铸就销售精英:解锁成功销售的密钥

成功销售&#xff0c;既是精妙绝伦的艺术展现&#xff0c;也是融汇多元技能的卓越实践。无论企业处于初创的萌芽阶段&#xff0c;还是屹立行业的巅峰之列&#xff0c;跨越销售高峰的征途上&#xff0c;销售人员所掌握的八大核心能力&#xff0c;如同星辰指引&#xff0c;不可或…

高性能、高可靠,MK SD卡让数据存储无忧!

文章目录 SD卡&#xff08;Secure Digital Memory Card&#xff09;&#xff0c;作为当代数字生活中不可或缺的存储媒介&#xff0c;凭借其卓越的数据传输效率、灵活的热插拔功能以及惊人的存储容量&#xff0c;在多个领域大放异彩。从日常使用的智能手机、平板电脑到追求极致体…

【ARM】解决ArmDS Fast Models 中部分内核无法上电的问题

【更多软件使用问题请点击亿道电子官方网站】 1、 文档目标 解决ArmDS Fast Models 中部分内核无法上电的问题。 2、 问题场景 在调用ArmDS的Fast Models中的Cortex-A55的模型&#xff0c;只有Core 0是上电状态&#xff0c;而Core 1处于掉电状态&#xff0c;如图2-1所示&…

美国林氏集团宣布全面进军Web3领域

吉隆坡&#xff0c;马来西亚——近日举行的第六界博览会上&#xff0c;美国林氏集团董事局主席林建中先生宣布&#xff0c;集团将通过旗下的大东亚银行创建一个全新的、合规的区块链交易所&#xff0c;并正式进军Web3、元宇宙及AI领域。同时&#xff0c;美国林氏集团将利用其在…

物流的总结

pc端&#xff08;商家端到仓、冷链&#xff0c;管理端冷链数据&#xff09;、H5、小程序&#xff08;冷链&#xff09; 冷链快运系统介绍文档 1. 系统概述 冷链快运系统致力于确保温控产品在运输过程中的安全与质量&#xff0c;通过高效的运单管理、异常处理及预约服务&#…

彻底解决找不到vcomp140.dll,无法继续执行代码问题

1. msvcp140.dll 简介 1.1 定义与作用 msvcp140.dll 是 Microsoft Visual C 2015 Redistributable Package 的一部分&#xff0c;它是一个动态链接库&#xff08;DLL&#xff09;文件&#xff0c;包含了运行使用 Visual C 2015 编译的应用程序所必需的 C 运行时库函数。这个文…

【web阅读记录】web相关概念及知识整理

刷到了一篇web相关的入门贴。解答了一些多年来的疑惑。这是一些在阅读过程中的笔记记录. 参考链接&#xff1a; https://www.jianshu.com/nb/4686146 服务器/客户机 ---->浏览器 JavaScript与Java没有任何关系 Node.js:一个javaScript运行环境 框架(FrameWork):由基本原…

Angular由一个bug说起之十:npm Unsupported engine

我们在用npm下载包的时候&#xff0c;有时候会碰到这样的提示 这是npm的警告&#xff0c;说我们使用的nodejs版本与下载的包所要求的nodejs版本不一致。 这是因为有些包它对nodejs的版本有要求&#xff0c;然后就会在package.json文件里的engines字段里声明它所要求的nodejs版本…

ElasticSearch的安装与使用

ElasticSearch的安装与使用 docker安装 docker进行安装Elasticsearch 1.拉取镜像 docker pull elasticsearch:7.6.22.创建实例 mkdir -p /docker/elasticsearch/config mkdir -p /docker/elasticsearch/data echo "http.host: 0.0.0.0" >> /docker/elastic…

【C++】红黑树的封装——同时实现map和set

目录 红黑树的完善默认成员函数迭代器的增加 红黑树的封装红黑树模板参数的控制仿函数解决取K问题对Key的非法操作 insert的调整map的[]运算符重载 在list模拟实现一文中&#xff0c;介绍了如何使用同一份代码封装出list的普通迭代器和const迭代器。今天学习STL中两个关联式容器…

DTH11温湿度传感器

DHT11 是一款温湿度复合传感器&#xff0c;常用于单片机系统中进行环境温湿度的测量。以下是对 DHT11 温湿度传感器的详细讲解&#xff1a; 一、传感器概述 DHT11 数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器。它应用专用的数字模块采集技术和温湿度传感…

如何在Unity WebGL上实现一套全流程简易的TextureStreaming方案

项目介绍 《云境》是一款使用Unity引擎开发的WebGL产品&#xff0c;有展厅&#xff0c;剧本&#xff0c;Avatar换装&#xff0c;画展&#xff0c;语音聊天等功能&#xff0c;运行在微信小程序和PC&#xff0c;移动端网页&#xff0c;即开即用。 当前问题和现状 当前项目…

Qt-QTableWidget多元素控件(37)

目录 描述 QTableWidget 方法 QTableWidgetItem 信号 QTableWidgetItem 方法 使用 图形化界面操作 代码操作 描述 这是一个表格控件&#xff0c;表格中的每一个单元格&#xff0c;都是一个 QTableWidgetItem 对象 QTableWidget 方法 item(int row,int column)根据⾏数…

[半导体检测-7]:半导体检测技术:无图案晶圆检测与图案晶圆检测

前言&#xff1a; 半导体检测技术中&#xff0c;无图案晶圆检测与图案晶圆检测是两种重要的检测方式&#xff0c;它们在检测原理、应用场景及挑战等方面存在显著差异。以下是对这两种检测技术的详细分析&#xff1a; 一、无图案晶圆检测 1. 检测原理 无图案晶圆检测主要关注…

DRF实操学习——收货地址的设计

DRF实操学习——收货地址的设计 1.行政区划表的设计2. 行政区划表接口演示1.返回所有的省份2. 查询指定上级行政区划的所有子区划&#xff0c;以及展示自身区划 3.行政区划表接口重写补充&#xff1a;前端请求逻辑4. 优化5.收货地址的设计6. 收货地址表接口重写7.优化1. 优化返…

Android 12系统源码_输入系统(三)输入事件的加工和分发

前言 上一篇文章我们具体分析了InputManagerService的构造方法和start方法&#xff0c;知道IMS的start方法经过层层调用&#xff0c;最终会触发Navite层InputDispatcher的start方法和InputReader的start方法。InputDispatcher的start方法会启动一个名为InputDispatcher的线程&…

混拨动态IP代理的优势是什么

在当今互联网时代&#xff0c;隐私保护和网络安全成为了人们关注的焦点。无论是个人用户还是企业&#xff0c;都希望能够在网络上自由、安全地进行各种活动。混拨动态IP代理作为一种新兴的技术手段&#xff0c;正逐渐受到大家的青睐。那么&#xff0c;混拨动态IP代理到底有哪些…

【工具】JDK版本不好管理,SDKMAN来帮你

前言 &#x1f34a;缘由 SDKMAN真是好&#xff0c;JDK切换没烦恼 &#x1f423; 闪亮主角 大家好&#xff0c;我是JavaDog程序狗 今天跟大家能分享一个JDK版本管理工具SDKMAN 当你同时使用JDK 1.8的和JDK 17并行维护两个项目时。每次在两个项目之间并行开发&#xff0c;切…