亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

JDK20?+?SpringBoot?3.1.0?+?JdbcTemplate?使用案例詳解

 更新時間:2023年09月16日 14:57:02   作者:豬悟道  
通過 JdbcTemplate 直接執(zhí)行 SQL 語句,結(jié)合源碼動態(tài)編譯即可方便實現(xiàn)動態(tài)修改代碼邏輯的效果,這篇文章主要介紹了JDK20?+?SpringBoot?3.1.0?+?JdbcTemplate?使用,需要的朋友可以參考下

通過 JdbcTemplate 直接執(zhí)行 SQL 語句,結(jié)合源碼動態(tài)編譯即可方便實現(xiàn)動態(tài)修改代碼邏輯的效果

一.測試數(shù)據(jù)庫 Postgres

在這里插入圖片描述

-- public.tb_rabbit_basic definition
-- Drop table
-- DROP TABLE public.tb_rabbit_basic;
CREATE TABLE public.tb_rabbit_basic (
	id int4 NULL,
	animal_name varchar NULL,
	country varchar NULL
);

二.SpringBoot項目

1.Pom 依賴

<?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>JdbcTemplateDemo</artifactId>
    <version>1.0-SNAPSHOT</version>
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>18</source>
                    <target>18</target>
                </configuration>
            </plugin>
        </plugins>
    </build>
    <properties>
        <maven.compiler.source>20</maven.compiler.source>
        <maven.compiler.target>20</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <spring-boot.version>3.1.0</spring-boot.version>
    </properties>
    <!--配置阿里云依賴包和插件倉庫-->
    <repositories>
        <repository>
            <id>aliyun</id>
            <url>https://maven.aliyun.com/repository/central/</url>
            <releases>
                <enabled>true</enabled>
            </releases>
            <snapshots>
                <enabled>true</enabled>
            </snapshots>
        </repository>
    </repositories>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <version>${spring-boot.version}</version>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.26</version>
        </dependency>
        <!--druid-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-starter</artifactId>
            <version>1.2.16</version>
            <exclusions>
                <exclusion>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-autoconfigure</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>org.slf4j</groupId>
                    <artifactId>slf4j-api</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <!--        mybatis-->
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>3.0.2</version>
            <exclusions>
                <exclusion>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-autoconfigure</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>org.slf4j</groupId>
                    <artifactId>slf4j-api</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <!-- pgsql -->
        <dependency>
            <groupId>org.postgresql</groupId>
            <artifactId>postgresql</artifactId>
            <version>42.6.0</version>
        </dependency>
    </dependencies>
</project>

2.配置文件

server:
  port: 8081
spring:
  datasource:
    postgres:
      readTimeout: 259200000 # 3 * 24 * 60 * 60 * 1000
    druid:
      username: postgres
      password: 123456
      url: jdbc:postgresql://127.0.0.1:5432/wiki_animal_db
      driverClassName: org.postgresql.Driver
      type: com.alibaba.druid.pool.DruidDataSource
      # 下面為連接池的補充設(shè)置,應(yīng)用到上面所有數(shù)據(jù)源中
      # 初始化大小,最小,最大
      initial-size: 5
      min-idle: 5
      max-active: 20
      # 配置獲取連接等待超時的時間
      max-wait: 60000
      # 配置間隔多久才進行一次檢測,檢測需要關(guān)閉的空閑連接,單位是毫秒
      time-between-eviction-runs-millis: 60000
      # 配置一個連接在池中最小生存的時間,單位是毫秒
      min-evictable-idle-time-millis: 300000
      validation-query: select version()
      test-while-idle: true
      test-on-borrow: false
      test-on-return: false
      # 打開PSCache,并且指定每個連接上PSCache的大小
      pool-prepared-statements: true
      #   配置監(jiān)控統(tǒng)計攔截的filters,去掉后監(jiān)控界面sql無法統(tǒng)計,wall用于防火墻
      max-pool-prepared-statement-per-connection-size: 20
      filters: stat,wall
      use-global-data-source-stat: true
      # 通過connectProperties屬性來打開mergeSql功能;慢SQL記錄
      connect-properties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000

3.啟動類

package org.example;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
/**
 * @author moon
 */
@SpringBootApplication
public class JdbcApp {
    public static void main(String[] args) {
        SpringApplication.run(JdbcApp.class, args);
    }
}

4.數(shù)據(jù)源配置類

package org.example.config;
import com.alibaba.druid.pool.DruidDataSource;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.jdbc.core.JdbcTemplate;
import java.sql.SQLException;
import java.util.Properties;
/**
 * @author moon
 * @date 2023-09-12 12:00
 * @since 1.8
 */
@Slf4j
@Configuration
public class PostgresDataSource {
    /**
     * Postgres readTimeout 超時 暫定 3D 可能導(dǎo)致存在大量 socket 死鏈接
     */
    @Value("${spring.datasource.postgres.readTimeout}")
    private int readTimeout;
    @Bean(name = "druidProperties")
    @ConfigurationProperties(prefix = "spring.datasource")
    public Properties druidProperties(){
        return new Properties();
    }
    /**
     * @description: 數(shù)據(jù)源
     * @params: [properties]
     * @return: com.alibaba.druid.pool.DruidDataSource
     * @create: 2023-09-12
     */
    @Primary
    @Bean(name = "druidDataSource")
    public DruidDataSource druidDataSource(@Qualifier("druidProperties") Properties properties){
        DruidDataSource druidDataSource = new DruidDataSource();
        druidDataSource.configFromPropety(properties);
        try {
            druidDataSource.setSocketTimeout(readTimeout);
            druidDataSource.init();
        } catch (SQLException e) {
            log.error("Postgres Datasource Init Exception:",e);
        }
        return druidDataSource;
    }
    /**
     * jdbc template
     * @param druidDataSource
     * @return
     */
    @Bean(name = "postgresTemplate")
    public JdbcTemplate postgresTemplate(@Qualifier("druidDataSource") DruidDataSource druidDataSource){
        return new JdbcTemplate(druidDataSource);
    }
}

5.實體對象類包裝類

用于配置實體對象類,方便解析 JdbcTemplate 查詢的返回值

package org.example.config;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.BeanWrapperImpl;
import org.springframework.beans.NotWritablePropertyException;
import org.springframework.beans.TypeMismatchException;
import org.springframework.dao.DataRetrievalFailureException;
import org.springframework.dao.InvalidDataAccessApiUsageException;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.jdbc.support.JdbcUtils;
import org.springframework.lang.Nullable;
import org.springframework.stereotype.Component;
import org.springframework.util.ClassUtils;
import org.springframework.util.StringUtils;
import java.beans.PropertyDescriptor;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.*;
import java.util.concurrent.Semaphore;
import java.util.concurrent.TimeUnit;
/**
 * @author moon
 * @date 2023-09-11 18:08
 * @since 1.8
 */
@Slf4j
@Component
public class ColumnRowMap {
    private Map<String,MultiColumnRowMapper> map = new HashMap<>(16);
    Semaphore semaphore = new Semaphore(1);
    /**
     * 獲取類包裝對象
     * @param clazz
     * @return
     */
    public MultiColumnRowMapper getColumnRowMap(Class<?> clazz) {
        while (true){
            boolean acquire = false;
            try {
                acquire = semaphore.tryAcquire(3, TimeUnit.SECONDS);
                if (acquire){
                    MultiColumnRowMapper mapper = map.get(clazz.getName());
                    if (null == mapper){
                        mapper = new MultiColumnRowMapper<>(clazz);
                        map.put(clazz.getName(),mapper);
                    }
                    //返回
                    return mapper;
                }
            } catch (InterruptedException e) {
                log.error("get column row map exception:",e);
            } finally {
                if (acquire){
                    semaphore.release();
                }
            }
        }
    }
    static class MultiColumnRowMapper<T> implements RowMapper<T> {
        /**
         * 日志
         */
        protected final Log logger = LogFactory.getLog(this.getClass());
        /**
         * 轉(zhuǎn)換類型
         */
        @Nullable
        private Class<T> requiredType;
        /**
         * 緩存類屬性
         */
        @Nullable
        private Map<String, PropertyDescriptor> mappedFields;
        @Nullable
        private Set<String> mappedProperties;
        private boolean primitivesDefaultedForNullValue = true;
        /**
         * 是否校驗屬性一致
         */
        private boolean checkFullyPopulated = false;
        public void setCheckFullyPopulated(boolean checkFullyPopulated) {
            this.checkFullyPopulated = checkFullyPopulated;
        }
        public boolean isCheckFullyPopulated() {
            return this.checkFullyPopulated;
        }
        public void setPrimitivesDefaultedForNullValue(boolean primitivesDefaultedForNullValue) {
            this.primitivesDefaultedForNullValue = primitivesDefaultedForNullValue;
        }
        public boolean isPrimitivesDefaultedForNullValue() {
            return this.primitivesDefaultedForNullValue;
        }
        /**
         * 構(gòu)造并解析目標(biāo)類屬性信息
         * @param requiredType
         */
        public MultiColumnRowMapper(Class<T> requiredType) {
            this.requiredType = requiredType;
            init();
        }
        /**
         * 解析屬性
         */
        private void init(){
            PropertyDescriptor[] var2 = BeanUtils.getPropertyDescriptors(requiredType);
            int var3 = var2.length;
            this.mappedFields = new HashMap(var3);
            this.mappedProperties = new HashSet(var3);
            for(int var4 = 0; var4 < var3; ++var4) {
                PropertyDescriptor pd = var2[var4];
                if (pd.getWriteMethod() != null) {
                    String lowerCaseName = this.lowerCaseName(pd.getName());
                    this.mappedFields.put(lowerCaseName, pd);
                    String underscoreName = this.underscoreName(pd.getName());
                    if (!lowerCaseName.equals(underscoreName)) {
                        this.mappedFields.put(underscoreName, pd);
                    }
                    this.mappedProperties.add(pd.getName());
                }
            }
        }
        /**
         * 將返回信息轉(zhuǎn)為指定類對象
         * @param rs
         * @param rowNumber
         * @return
         * @throws SQLException
         */
        @Nullable
        public T mapRow(ResultSet rs, int rowNumber) throws SQLException {
            ResultSetMetaData rsmd = rs.getMetaData();
            int columnCount = rsmd.getColumnCount();
            T mappedObject = BeanUtils.instantiateClass(requiredType);
            Set<String> populatedProperties = this.isCheckFullyPopulated() ? new HashSet() : null;
            BeanWrapperImpl bw = new BeanWrapperImpl();
            bw.setBeanInstance(mappedObject);
            PropertyDescriptor pd;
            for(int index = 1; index <= columnCount; ++index) {
                String column = JdbcUtils.lookupColumnName(rsmd, index);
                String field = this.lowerCaseName(StringUtils.delete(column, " "));
                pd = this.mappedFields != null ? this.mappedFields.get(field) : null;
                if (pd != null) {
                    try {
                        Object value = this.getColumnValue(rs, index, pd);
                        if (rowNumber == 0 && this.logger.isDebugEnabled()) {
                            this.logger.debug("Mapping column '" + column + "' to property '" + pd.getName() + "' of type '" + ClassUtils.getQualifiedName(pd.getPropertyType()) + "'");
                        }
                        try {
                            bw.setPropertyValue(pd.getName(), value);
                        } catch (TypeMismatchException var14) {
                            if (value != null || !this.primitivesDefaultedForNullValue) {
                                throw var14;
                            }
                            if (this.logger.isDebugEnabled()) {
                                this.logger.debug("Intercepted TypeMismatchException for row " + rowNumber + " and column '" + column + "' with null value when setting property '" + pd.getName() + "' of type '" + ClassUtils.getQualifiedName(pd.getPropertyType()) + "' on object: " + mappedObject, var14);
                            }
                        }
                        if (populatedProperties != null) {
                            populatedProperties.add(pd.getName());
                        }
                    } catch (NotWritablePropertyException var15) {
                        throw new DataRetrievalFailureException("Unable to map column '" + column + "' to property '" + pd.getName() + "'", var15);
                    }
                }
            }
            //校驗屬性一致性
            if (populatedProperties != null && !populatedProperties.equals(this.mappedProperties)) {
                throw new InvalidDataAccessApiUsageException("Given ResultSet does not contain all fields necessary to populate object of " + this.requiredType.getName() + ": " + this.mappedProperties);
            } else {
                return mappedObject;
            }
        }
        @Nullable
        protected Object getColumnValue(ResultSet rs, int index, PropertyDescriptor pd) throws SQLException {
            return JdbcUtils.getResultSetValue(rs, index, pd.getPropertyType());
        }
        protected String lowerCaseName(String name) {
            return name.toLowerCase(Locale.US);
        }
        protected String underscoreName(String name) {
            if (!StringUtils.hasLength(name)) {
                return "";
            } else {
                StringBuilder result = new StringBuilder();
                result.append(Character.toLowerCase(name.charAt(0)));
                for(int i = 1; i < name.length(); ++i) {
                    char c = name.charAt(i);
                    if (Character.isUpperCase(c)) {
                        result.append('_').append(Character.toLowerCase(c));
                    } else {
                        result.append(c);
                    }
                }
                return result.toString();
            }
        }
    }
}

6.測試用實體對象

1.基類

package org.example.entity;
import lombok.Data;
/**
 * @author moon
 * @date 2023-09-12 10:45
 * @since 1.8
 */
@Data
public class BaseAnimal {
    private int id;
    private String animalName;
    private String country;
}

2.擴展類

package org.example.entity;
/**
 * @author moon
 * @date 2023-09-12 10:48
 * @since 1.8
 */
public class Rabbit extends BaseAnimal{
}

7.測試類

package org.example.controller;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.example.config.ColumnRowMap;
import org.example.entity.Rabbit;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.support.rowset.SqlRowSet;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
/**
 * @author moon
 * @date 2023-09-12 11:52
 * @since 1.8
 */
@Slf4j
@RestController
@RequestMapping("/animal")
public class AnimalController {
    @Resource(name = "postgresTemplate")
    private JdbcTemplate postgresTemplate;
    @Autowired
    private ColumnRowMap columnRowMap;
    /**
     * 插入 通過 ? 參數(shù)占位符
     */
    @GetMapping("/insert")
    public void insert(){
        postgresTemplate.update("INSERT INTO PUBLIC.TB_RABBIT_BASIC (ID, ANIMAL_NAME, COUNTRY) VALUES (?,?,?)",18,"海棠兔","法國");
    }
    /**
     * 批量插入
     */
    @GetMapping("/batchInsert")
    public void batchInsert(){
        List<Object[]> list = new ArrayList<>(3);
        list.add(new Object[]{19,"海棠兔","法國"});
        list.add(new Object[]{20,"喜馬拉雅兔","中國"});
        list.add(new Object[]{30,"野兔","比利時"});
        postgresTemplate.batchUpdate("INSERT INTO PUBLIC.TB_RABBIT_BASIC (ID, ANIMAL_NAME, COUNTRY) VALUES (?,?,?)",list);
    }
    /**
     * 更新
     */
    @GetMapping("/update")
    public void update(){
        postgresTemplate.update("UPDATE PUBLIC.TB_RABBIT_BASIC SET COUNTRY = ? WHERE ID = ?","法國+",19);
    }
    /**
     * 更新
     */
    @GetMapping("/batchUpdate")
    public void batchUpdate(){
        List<Object[]> list = new ArrayList<>(3);
        list.add(new Object[]{"法國+++",19});
        list.add(new Object[]{"中國+++",20});
        list.add(new Object[]{"比利時+++",30});
        postgresTemplate.batchUpdate("UPDATE PUBLIC.TB_RABBIT_BASIC SET COUNTRY = ? WHERE ID = ?",list);
    }
    /**
     * 刪除
     */
    @GetMapping("/delete")
    public void delete(){
        postgresTemplate.update("DELETE FROM PUBLIC.TB_RABBIT_BASIC WHERE ID = ?",19);
    }
    /**
     * 批量刪除
     */
    @GetMapping("/batchDelete")
    public int[] batchDelete(){
        List<Object[]> list = new ArrayList<>();
        list.add(new Object[]{19});
        list.add(new Object[]{20});
        list.add(new Object[]{30});
        int[] result = postgresTemplate.batchUpdate("DELETE FROM PUBLIC.TB_RABBIT_BASIC WHERE ID = ?",list);
        return  result;
    }
    /**
     * 查詢 select *
     * @return
     */
    @GetMapping("/queryForMap")
    public Map<String, Object> queryForMap(){
        return postgresTemplate.queryForMap("SELECT * FROM PUBLIC.TB_RABBIT_BASIC WHERE ID = ?",18);
    }
    /**
     * 查詢 query for row set
     * @return
     */
    @GetMapping("/queryForRowSet")
    public void queryForRowSet(){
        SqlRowSet rowSet = postgresTemplate.queryForRowSet("SELECT * FROM PUBLIC.TB_RABBIT_BASIC WHERE ID = ?",18);
        while (rowSet.next()){
            int rowId = rowSet.getRow();
            Integer ID = rowSet.getInt("ID");
            String ANIMAL_NAME = rowSet.getString("ANIMAL_NAME");
            String COUNTRY = rowSet.getString("COUNTRY");
            log.info("rowId {} id {} animalName {} country {}",rowId,ID,ANIMAL_NAME,COUNTRY);
        }
    }
    /**
     * 查詢 query for object
     * @return
     */
    @GetMapping("/queryForObject")
    public Object queryForObject(){
        return postgresTemplate.queryForObject("SELECT ID AS id FROM PUBLIC.TB_RABBIT_BASIC WHERE ID = ?", Integer.class,18);
    }
    /**
     * 查詢 query for object
     * @return
     */
    @GetMapping("/queryForObjectMapper")
    public Object queryForObjectMapper(){
        return postgresTemplate.queryForObject("SELECT ID AS id, ANIMAL_NAME AS animalName, COUNTRY AS country FROM PUBLIC.TB_RABBIT_BASIC WHERE ID = ?",columnRowMap.getColumnRowMap(Rabbit.class),18);
    }
    /**
     * 查詢 query for object
     * @return
     */
    @GetMapping("/queryForList")
    public List<Map<String, Object>> queryForList(){
        return postgresTemplate.queryForList("SELECT ID AS id, ANIMAL_NAME AS animalName, COUNTRY AS country FROM PUBLIC.TB_RABBIT_BASIC");
    }
    /**
     * 查詢 query for object class
     * @return
     */
    @GetMapping("/queryForListClass")
    public List<Rabbit> queryForListClass(){
        return postgresTemplate.query("SELECT ID AS id, ANIMAL_NAME AS animalName, COUNTRY AS country FROM PUBLIC.TB_RABBIT_BASIC",columnRowMap.getColumnRowMap(Rabbit.class));
    }
}

以批量查詢?yōu)槔篽ttp://127.0.0.1:8081/animal/queryForListClass

在這里插入圖片描述

三.SpringBoot 封裝的工具類演示

import org.example.entity.Rabbit;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.BeanWrapperImpl;
/**
 * @author moon
 * @date 2023-09-13 20:38
 * @since 1.8
 */
public class Test {
    public static void main(String[] args) {
        Object t = BeanUtils.instantiateClass(Rabbit.class);
        BeanWrapperImpl bean = new BeanWrapperImpl(t);
        bean.setPropertyValue("id",1);
        System.out.println(t);
    }
}

在這里插入圖片描述

到此這篇關(guān)于JDK20 + SpringBoot 3.1.0 + JdbcTemplate 使用的文章就介紹到這了,更多相關(guān)JDK20 + SpringBoot 3.1.0 + JdbcTemplate 使用內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 一篇文章讓你三分鐘學(xué)會Java枚舉

    一篇文章讓你三分鐘學(xué)會Java枚舉

    這篇文章主要給大家介紹了如何通過三分鐘學(xué)會Java枚舉的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-12-12
  • Java Set集合去重的原理及實現(xiàn)

    Java Set集合去重的原理及實現(xiàn)

    這篇文章主要介紹了Java Set集合去重的原理及實現(xiàn),幫助大家更好的理解和學(xué)習(xí)Java,感興趣的朋友可以了解下
    2020-09-09
  • 在SpringBoot: SpringBoot里面創(chuàng)建導(dǎo)出Excel的接口教程

    在SpringBoot: SpringBoot里面創(chuàng)建導(dǎo)出Excel的接口教程

    這篇文章主要介紹了在SpringBoot: SpringBoot里面創(chuàng)建導(dǎo)出Excel的接口教程,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-10-10
  • java中xml進行報文發(fā)送和解析操作

    java中xml進行報文發(fā)送和解析操作

    這篇文章主要介紹了java中xml進行報文發(fā)送和解析操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-10-10
  • Java main方法String[]args原理實例解析

    Java main方法String[]args原理實例解析

    這篇文章主要介紹了Java main方法String[]args原理實例解析,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-06-06
  • JAVA實現(xiàn)301永久重定向方法

    JAVA實現(xiàn)301永久重定向方法

    本篇文章給大家總結(jié)了JAVA中實現(xiàn)永久重定向的方法以及詳細代碼,對此有需要的朋友可以參考學(xué)習(xí)下。
    2018-04-04
  • 詳解Spring Boot最新版優(yōu)雅停機的方法

    詳解Spring Boot最新版優(yōu)雅停機的方法

    這篇文章主要介紹了Spring Boot最新版優(yōu)雅停機的相關(guān)知識,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-10-10
  • 基于Java?Agent的premain方式實現(xiàn)方法耗時監(jiān)控問題

    基于Java?Agent的premain方式實現(xiàn)方法耗時監(jiān)控問題

    javaagent是在JDK5之后提供的新特性,也可以叫java代理,這篇文章主要介紹了基于Java?Agent的premain方式實現(xiàn)方法耗時監(jiān)控問題,需要的朋友可以參考下
    2022-10-10
  • Java中將List拆分為多個小list集合的實現(xiàn)代碼

    Java中將List拆分為多個小list集合的實現(xiàn)代碼

    這篇文章主要介紹了Java中如何將List拆分為多個小list集合,本文通過實例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-03-03
  • java使用電腦攝像頭識別二維碼

    java使用電腦攝像頭識別二維碼

    這篇文章主要為大家詳細介紹了java使用電腦攝像頭識別二維碼,從攝像頭獲取圖像,再根據(jù)圖片解析出二維碼信息,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-10-10

最新評論