SpringBoot最简单好用的导出导入功能,拿来即用

2023-11-13

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


拿来吧你

提示:粘贴即可用

SpringBoot 项目整合的导入导出接口。


一、接口说明

项目pom.xml 文件添加依赖,编写封装类即可。依赖、导入导出的封装类以及使用方法,以下文章都会一一列举,十分方便,已经经过测试,复制粘贴用起来吧。

二、依赖

提示:这里给的是关于导出导出的依赖。

代码如下(示例):


	 <!--实体类属性注解-->
        <dependency>
            <groupId>javax.persistence</groupId>
            <artifactId>javax.persistence-api</artifactId>
            <version>2.2</version>
        </dependency>

        <!--导出导入-->
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi</artifactId>
            <version>4.1.2</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.apache.poi/poi-ooxml -->
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml</artifactId>
            <version>4.1.2</version>
        </dependency>
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-lang3</artifactId>
            <version>3.12.0</version>
        </dependency>
        <!--JSON-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>2.0.21</version>
        </dependency>


三、导出工具类

提示: 复制即可用

exportData()方法有三个参数:

  1. response :请求接口浏览器直接新开窗口下载导出的文件
  2. List dataList : 用户数据,比如导出User表数据,那么将从数据库查询的用户数据作为这第二个参数
  3. Class EntityClass : 实体类字节码,导出工具类直接根据实体类的字段和数据库的字段一一映射,将User.class作为这第三个参数。

代码如下(示例):

import org.apache.poi.ss.usermodel.*;

import javax.persistence.Column;
import javax.persistence.Table;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.lang.reflect.Field;
import java.net.URLEncoder;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Date;
import java.util.List;
import java.util.Locale;
import java.util.Objects;

public class ExportUtils {

    public static <T> void exportData(HttpServletResponse response, List<T> dataList, Class<T> EntityClass) throws IOException {
        // 创建Excel工作簿
        Workbook workbook = WorkbookFactory.create(true);

        // 创建工作表
//        Sheet sheet = workbook.createSheet("数据表");
        Sheet sheet = workbook.createSheet(EntityClass.getSimpleName());

        // 设置标题行的字体样式
        Font font = workbook.createFont();
        font.setBold(true); // 将字体设置为加粗样式

        // 获取表名
        Table tableAnnotation = EntityClass.getAnnotation(Table.class);
//        String tableName = EntityClass.getSimpleName(); // 获取的是UserDO(类的名字)
        String tableName = "data";
        if (tableAnnotation != null) {
            tableName = tableAnnotation.name();
        }

        /**
         *    创建标题行
         * 1. 要根据实体类的 @Column(name = "姓名") 注解中的 name 值来设置标题行,
         * 2. 你可以通过反射获取实体类的字段名称。
         * 3. 可以使用 Class.getDeclaredFields() 方法来获取所有的字段,
         * 4. 然后使用 Field.getAnnotation() 方法获取 @Column 注解,最后通过 name() 方法获取注解中设置的名称。
         */
        Row headerRow = sheet.createRow(0);
        Field[] fields = EntityClass.getDeclaredFields();

        // 数据不为空,写数据,为空,下载模板,模板无序号
        int columnIndex = 0;
        for (Field field : fields) {
            Column columnAnnotation = field.getAnnotation(Column.class);
            if (columnAnnotation != null) {
                String columnName = columnAnnotation.name();
                
                // 排除id、createTime、updateTime、isDeleted等属性的导出
                if (Objects.isNull(dataList)) {
                    if (!("id".equals(field.getName()) || "createTime".equals(field.getName())
                            || "updateTime".equals(field.getName()) || "status".equals(field.getName())
                            || "isDeleted".equals(field.getName()) || "icon".equals(field.getName()) )) {
                        Cell headerCell = headerRow.createCell(columnIndex);
                        headerCell.setCellValue(columnName);

                        // 应用字体样式到标题单元格
                        CellStyle cellStyle = workbook.createCellStyle();
                        cellStyle.setFont(font);
                        headerCell.setCellStyle(cellStyle);

                        columnIndex++;
                    }
                } else {

                        Cell headerCell = headerRow.createCell(columnIndex);
                        headerCell.setCellValue(columnName);

                        // 应用字体样式到标题单元格
                        CellStyle cellStyle = workbook.createCellStyle();
                        cellStyle.setFont(font);
                        headerCell.setCellStyle(cellStyle);

                        columnIndex++;

                }
            }
        }
        /**
         * 1. 可以使用反射获取实体类的字段数量,
         * 2. 然后在循环中根据字段数来创建单元格
         */
        // 数据不为空-填充数据到Excel表格
        // 数据为空,下载模板
        if (Objects.nonNull(dataList)) {
            int rowNumber = 1;
            for (T data : dataList) {
                Row row = sheet.createRow(rowNumber);

                for (int i = 0; i < fields.length; i++) {
                    Field field = fields[i];
                    Column columnAnnotation = field.getAnnotation(Column.class);
                    if (columnAnnotation != null) {
                        Cell cell = row.createCell(i);
                        setCellValue(cell, data, field);
                    }
                }

                rowNumber++;
            }
        }

        // 设置响应头信息
        response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
        response.setCharacterEncoding("UTF-8");

        String encodedTableName = URLEncoder.encode(tableName, "UTF-8");
        String filename = encodedTableName + ".xlsx";
        response.setHeader("Content-Disposition", "attachment; filename=" + filename);

        // 将Excel写入响应输出流
        workbook.write(response.getOutputStream());

        // 关闭工作簿
        workbook.close();
    }

    // 调用方法 setCellValue() 在 setCellValue() 方法中根据字段的类型来设置单元格的值
    private static <T> void setCellValue(Cell cell, T data, Field field) {
        field.setAccessible(true);
        try {
            Object value = field.get(data);

            // 根据属性的类型来设置单元格的值
            if (value instanceof Integer) {
                cell.setCellValue((Integer) value);
            } else if (value instanceof String) {
                cell.setCellValue((String) value);
            } else if (value instanceof Boolean) {
                cell.setCellValue((Boolean) value);
            } else if (value instanceof Date) {
                DateTimeFormatter sourceFormatter = DateTimeFormatter.ofPattern("EEE MMM dd HH:mm:ss zzz yyyy", Locale.ENGLISH);
                DateTimeFormatter targetFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
                LocalDateTime dateTime = LocalDateTime.parse(value.toString(), sourceFormatter);
                String convertedTime = dateTime.format(targetFormatter);
                cell.setCellValue(convertedTime);

            } else if (value instanceof Double) {
                cell.setCellValue(value.toString());
            } else {
                // 处理其他类型的值
            }
        } catch (IllegalAccessException e) {
            // 处理异常情况
            e.printStackTrace();
        }
    }
}

四、导入工具类

提示:导入即是上传文件xlsx文件,根据导入的数据转为Java语言,再做其他的操作,比如插入数据库。

参数解析:

  1. MultipartFile file : 上传到导入接口的文件
  2. Class entityClass : 比如是导入User类,则传入 User.class 作为参数


import org.apache.poi.ss.usermodel.*;
import org.springframework.web.multipart.MultipartFile;

import javax.persistence.Column;
import java.lang.reflect.Field;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.*;

public class ImportUtil {

    public static <T> List<T> importEntities(MultipartFile file, Class<T> entityClass) throws Exception {
        // 创建Excel工作簿
        Workbook workbook = WorkbookFactory.create(file.getInputStream());

        // 获取第一个工作表
        Sheet sheet = workbook.getSheetAt(0);

        // 获取标题行的列名
        Row titleRow = sheet.getRow(0);
        List<String> columnNames = getColumnNames(titleRow);

        // 创建实体对象列表
        List<T> entities = new ArrayList<>();

        // 迭代每一行(跳过标题行)
        Iterator<Row> iterator = sheet.iterator();
        iterator.next(); // 跳过标题行
        while (iterator.hasNext()) {
            Row row = iterator.next();

            // 读取单元格数据并创建实体对象
            T entity = createEntityFromRow(row, columnNames, entityClass);
            entities.add(entity);
        }

        // 关闭工作簿
        workbook.close();

        return entities;
    }

    // 获取列名
    private static List<String> getColumnNames(Row row) {
        List<String> columnNames = new ArrayList<>();
        for (Cell cell : row) {
            columnNames.add(getStringCellValue(cell));
        }
        return columnNames;
    }


    // 根据行数据创建实体对象
    // 对
    private static <T> T createEntityFromRow(Row row, List<String> columnNames, Class<T> entityClass) throws Exception {
        T entity = entityClass.getDeclaredConstructor().newInstance();
        Field[] fields = entityClass.getDeclaredFields();

        for (int i = 0; i < columnNames.size(); i++) {
            String columnName = columnNames.get(i);
            String cellValue = getStringCellValue(row.getCell(i));

            for (Field field : fields) {
                field.setAccessible(true);
                Column columnAnnotation = field.getAnnotation(Column.class);
                if (columnAnnotation != null && columnAnnotation.name().equals(columnName)) {
                    setFieldValue(entity, field, cellValue);
                    break;
                }
            }
        }

        return entity;
    }


    // 获取单元格的字符串值
    private static String getStringCellValue(Cell cell) {
        if (cell == null) {
            return null;
        }

        String cellValue;
        // 根据单元格类型进行值转换
        switch (cell.getCellType()) {
            case STRING:
                cellValue = cell.getStringCellValue();
                break;
            case NUMERIC:
                // 判断是否为日期类型
                if (DateUtil.isCellDateFormatted(cell)) {
                    DateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
                    cellValue = sdf.format(cell.getDateCellValue());
                } else {
                    // 将数字类型转换为字符串类型
                    cell.setCellType(CellType.STRING);
                    cellValue = cell.getStringCellValue();
                }
                break;
            case BOOLEAN:
                cellValue = String.valueOf(cell.getBooleanCellValue());
                break;
            case FORMULA:
                // 如果公式计算结果为字符串类型,则获取字符串值
                if (cell.getCachedFormulaResultType() == CellType.STRING) {
                    cellValue = cell.getRichStringCellValue().getString();
                }
                // 如果公式计算结果为数字类型,则获取数字值并转换为字符串
                else if (cell.getCachedFormulaResultType() == CellType.NUMERIC) {
                    cellValue = String.valueOf(cell.getNumericCellValue());
                }
                // 如果公式计算结果为布尔类型,则获取布尔值并转换为字符串
                else if (cell.getCachedFormulaResultType() == CellType.BOOLEAN) {
                    cellValue = String.valueOf(cell.getBooleanCellValue());
                } else {
                    cellValue = "";
                }
                break;
            default:
                cellValue = "";
                break;
        }

        return cellValue;
    }


    // 设置实体类属性的值
    private static <T> void setFieldValue(T entity, Field field, String cellValue) throws Exception {
        field.setAccessible(true);
        Class<?> fieldType = field.getType();

        // 根据属性的类型进行赋值
        if (fieldType == String.class) {
            field.set(entity, cellValue);
        } else if (fieldType == Integer.class) {
            field.set(entity, Integer.valueOf(cellValue));
        } else if (fieldType == Double.class) {
//            field.set(entity, Double.valueOf(cellValue));
            field.set(entity, cellValue);

        }
        // 在此处可以根据需要添加其他类型的赋值判断
        else {
            field.set(entity, null);
        }
    }
}


五、实体类的改造

这一步和导入导出息息相关,因为得根据实体类属性的注解来决定导出的列名是什么,表名是什么。以User类为例,看我操作。

  • 主要看@Table(name = “用户信息表”)和@Column(name = “姓名”)
  • @Data是lombok的,@TableName(“tb_user”)是mybatisplus指定数据库表的,这里只是解释一下,与导出导入无关,避免不知道的博友。
  • 还有细心的朋友看见我实体类继承 BaseEntity.java,这是我写的一个公共实体类,主要写表中公共有的字段,避免在多张表重复写相同的属性。可以在下面了解一下。


import javax.persistence.Column;
import javax.persistence.Table;

@Data
@TableName("tb_user")
@Table(name = "用户信息表")
public class UserDO extends BaseEntity {

    @Column(name = "姓名")
    private String username;

    @Column(name = "性别")
    private String sex;

    @Column(name = "密码")
    private String password;

    @Column(name = "邮箱")
    private String email;

    @Column(name = "地址")
    private String address;

}

BaseEntity.java

继承这个类之后,User实体类就有id 的属性了,也有其他的字段,比如status, create_time等。这个类也要用@Column(name = “序号”) 标注。



import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import lombok.Data;

import javax.persistence.Column;
import java.io.Serializable;


@Data
public class BaseEntity implements Serializable {

    @TableId(type = IdType.AUTO)
    @Column(name = "序号")
    private Integer id;

}


六、控制层使用

准备工作做好之后,就是调用接口了,还是以User实体类为例,看我操作。

@RestController
@RequestMapping("/api/users")
@ResponseBody
public class UserController {

	/**
     * 下载数据模板
     * 模块的原因是根据模板填写数据,上传的数据才不会出差错
     * 为什么这样?具体原因你懂的
     */

    @Transactional
    @GetMapping("/download/template")
    public void downloadTemplate(HttpServletResponse response) throws IOException {
    	// 调用接口,并传入空数据,在导出已经做出判断,
    	// 说明这个接口是下载模板,不会往表格里面写数据
        ExportUtils.exportData(response, null , UserDO.class);
    }



    /**
     * 导出
     */

    @Transactional
    @GetMapping("/export")
    public void exportRole(HttpServletResponse response) throws IOException {
    	// 数据库获取数据,Mybatis-plus的方法,不知道的可以学习学习MP
        List<UserDO> userDOList = userService.list();
		// 调用导出工具类的方法,传入对应的参数,简单吧
        ExportUtils.exportData(response, userDOList , UserDO.class);
    }

    /**
     * 导入
     */

    @Transactional
    @PostMapping("/import")
    public void importsEntity(@RequestParam("file") MultipartFile file) throws Exception {
        // 调用ImportUtil工具类来获取实体对象列表
        // 传入接口获取的文件和实体类,就可以获取到数据,简单吧
        List<UserDO> entities = ImportUtil.importEntities(file, UserDO.class);
        // 在这里处理导入数据的逻辑
        for (UserDO entity : entities) {
            // 执行对数据的操作,例如保存到数据库等
            System.out.println("导入的数据:" + entity);
            boolean save = userService.save(entity);
            if (save) {
               System.out.println("插入  " + entity + "   成功!");
           } else {
               System.out.println("插入  " + entity + "   失败!");
           }
        }
    }



}


七、效果

数据库表

在这里插入图片描述

1. 下载模板

  • 浏览器 URL 输入地址并回车

在这里插入图片描述
在这里插入图片描述

  • 查看模板并没有id的属性打印,导出工具类判断了。测试正确。

在这里插入图片描述


2. 导出

  • URL输入地址并回车

在这里插入图片描述

在这里插入图片描述

  • 查看内容:数据正确,且与数据库表字段对应。而且注意一点,id只是在下载模板的时候不打印,导出我并没有设置不打印,看个人需求,你也可以自己改一下。

![在这里插入图片描述](https://img-blog.csdnimg.cn/befd7234c6bb4999a84d0c200faffa2d.pn


3. 导入

  • 接下来用下载的模板进行写入数据,然后调用导入接口,获取数据。

  • 数据这样测试,测试在后端接口是否能够正确接收空值,是否有错位。
    在这里插入图片描述

  • 清空控制台:方便查看打印的数据,无意义,只是表演需要
    在这里插入图片描述

  • 我这里使用 postman 工具请求:注意我框起来的点即可
    在这里插入图片描述

  • 铛铛铛铛:看这么几条,空的值都为空,对应的值都对应上
    在这里插入图片描述

  • 再看数据库:完美!!!扣 666

在这里插入图片描述
![在这里插入图片描述](https://img-blog.csdnimg.cn/602c547646c04d7a9d66013738ce7362.png

总结

提示:觉得

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SpringBoot最简单好用的导出导入功能,拿来即用 的相关文章

  • eclipse行号状态行贡献项是如何实现的?

    我需要更新状态行编辑器特定的信息 我已经有了自己的实现 但我想看看 eclipse 贡献项是如何实现的 它显示状态行中的行号 列位置 谁能指点一下 哪里可以找到源代码 提前致谢 亚历克斯 G 我一直在研究它 它非常复杂 我不确定我是否了解完
  • Android中如何使用JNI获取设备ID?

    我想从 c 获取 IMEIJNI 我使用下面的代码 但是遇到了未能获取的错误cls 它总是返回NULL 我检查了环境和上下文 它们都没有问题 为什么我不能得到Context班级 我在网上搜索了一下 有人说我们应该使用java lang Ob
  • Visual Studio IDE 中功能后的空间

    如何设置 Visual Studio 中的设计以在我的 javascript 函数后面放置一个空格 目前 当我按下返回键时 我得到了这个 var myfunc function 当我想要这个的时候 var myfunc function 知
  • Python 的 mysqldb 晦涩文档

    Python 模块 mysqldb 中有许多转义函数 我不理解它们的文档 而且我努力查找它们也没有发现任何结果 gt gt gt print mysql escape doc escape obj dict escape any speci
  • 如何在 Spring 中使 @PropertyResource 优先于任何其他 application.properties ?

    我正在尝试在类路径之外添加外部配置属性资源 它应该覆盖任何现有的属性 但以下方法不起作用 SpringBootApplication PropertySource d app properties public class MyClass
  • Laravel Schema Builder 改变存储引擎

    我正在尝试更改表并将其存储引擎更改为InnoDb 当我跑步时php artisan migrate它完成且没有错误 然而 当我检查 Sequel Pro 中的存储引擎时 没有任何变化 public function up Schema ta
  • IN 子查询中的 GROUP_CONCAT

    SELECT A id A title FROM table as A WHERE A active 1 AND A id IN SELECT GROUP CONCAT B id from B where user 3 如果我启动子查询SE
  • 在Java中运行bat文件并等待

    您可能会认为从 Java 启动 bat 文件是一项简单的任务 但事实并非如此 我有一个 bat 文件 它对从文本文件读取的值循环执行一些 sql 命令 它或多或少是这样的 FOR F x in CD listOfThings txt do
  • 如何将“mysql source”命令与 mysql 变量一起使用?

    我需要从 mysql shell 执行一个基于如下条件的 SQL 文件 mysql gt 源 var 其中 var 包含文件名 这不可能 source是MySQL客户端程序在本地识别并执行的命令 变量存在于服务器上 因此客户端不知道什么 v
  • 如何将 HTML 链接放入电子邮件正文中?

    我有一个可以发送邮件的应用程序 用 Java 实现 我想在邮件中放置一个 HTML 链接 但该链接显示为普通字母 而不是 HTML 链接 我怎样才能将 HTML 链接放入字符串中 我需要特殊字符吗 太感谢了 Update 大家好你们好 感谢
  • 如何在JPanel中设置背景图片

    你好 我使用 JPanel 作为我的框架的容器 然后我真的想在我的面板中使用背景图片 我真的需要帮助 这是我到目前为止的代码 这是更新 请检查这里是我的代码 import java awt import javax swing import
  • 在 Java 中获取并存储子进程的输出

    我正在做一些需要我开始子处理 命令提示符 并在其上执行一些命令的事情 我需要从子进程获取输出并将其存储在文件或字符串中 这是我到目前为止所做的 但它不起作用 public static void main String args try R
  • 如何区分从 Saxon XPathSelector 返回的属性节点和元素节点

    给定 XML
  • 给出 5 个参数,但在终端中只得到 3 个参数

    我想将一个文件传递给一个c 程序 如果我在 IDE 中执行此操作 test string string lt test txt return argc 5 但在终端上我刚刚得到argc 3 看来 这是因为 什么是 lt 意思是 我正在使用
  • 为什么\0在java中不同系统中打印不同的输出

    下面的代码在不同的系统中打印不同的输出 String s hello vsrd replace 0 System out println s 当我在我的系统中尝试时 Linux Ubuntu Netbeans 7 1 它打印 When I
  • Spring @Cacheable 和 @Async 注解

    我需要缓存一些异步计算的结果 具体来说 为了克服这个问题 我尝试使用 Spring 4 3 缓存和异步计算功能 作为示例 我们采用以下代码 Service class AsyncService Async Cacheable users C
  • 在java中以原子方式获取多个锁

    我有以下代码 注意 为了可读性 我尽可能简化了代码 如果我忘记了任何关键部分 请告诉我 public class User private Relations relations public User relations new Rela
  • java 中的蓝牙 (J2SE)

    我是蓝牙新手 这就是我想做的事情 我想获取连接到我的电脑上的蓝牙的设备信息并将该信息写入文件中 我应该使用哪个 api 以及如何实现 我遇到了 bluecove 但经过几次搜索 我发现 bluecove 不能在 64 位电脑上运行 我现在应
  • Log4j2 ThreadContext 映射不适用于parallelStream()

    我有以下示例代码 public class Test static System setProperty isThreadContextMapInheritable true private static final Logger LOGG
  • Java RMI - 客户端超时

    我正在使用 Java RMI 构建分布式系统 它必须支持服务器丢失 如果我的客户端使用 RMI 连接到服务器 如果该服务器出现故障 例如电缆问题 我的客户端应该会收到异常 以便它可以连接到其他服务器 但是当服务器出现故障时 我的客户端什么也

随机推荐

  • layui option 动态添加_layui select 动态加载案例

    用到知识点 表单监听 form on 局部表单渲染 form render 动态加载的select表单 必须有默认的option项 第一个option 要不然layui 不会渲染出 select 组件 代码如下 添加数据 返回列表 查找所有
  • Vue中子组件通过v-model动态修改父组件中的值

    父子通信中的子传父 使用v model实现双向数据绑定 注意 vue组件是此组件的根组件 是该组件中所有注册的组件的父组件 现有需求 通过子组件中的输入框来动态绑定父组件中data中的数据 代码实现 父组件使用porps来向子组件传值 子组
  • 为什么浏览器中有些文件点击后是预览,有些是下载

    今天给大家分享两个比较有用的浏览器行为与预期不一致的现象 这两个问题其实并不是什么难题 但在工作中发现不少人被难住了 在我的印象中至少有三位同事在群里问这样的问题 上周又有同事被此现象困住了 所以我觉得这应该是个共性问题 在这里分享给大家
  • 物理服务器和云服务器的区别

    1 从概念上区分 云服务器 云主机 是在一组集群服务器商虚拟出多个类似独立服务器的部分 集群中每个服务器上都有该云服务器的一个镜像 形象地讲 集群服务器犹如一个大型的公共停车场 而云服务器的使用 则是卖给了你停车的权利 独立服务器 顾名思义
  • 如何做数据清洗?

    一 预处理阶段 预处理阶段主要做两件事情 一是将数据导入处理工具 通常来说 建议使用数据库 单机跑数搭建MySQL环境即可 如果数据量大 千万级以上 可以使用文本文件存储 python操作的方式 而是看数据 这里包含两个部分 一是看元数据
  • 第四章 索引和视图 总结

    第四章 索引和视图 1 索引 索引主要分为聚类索引和非聚类索引 聚类索引 表中数据行的物理存储顺序与索引顺序完全相同 每个表只能有一个聚类索引 物理的重拍表中的数据以符合索引约束 用于经常查找的列 非聚类索引 不改变表中数据行的物理存储位置
  • linux系统中解决docker: command not found

    新申请了一台阿里云的服务器 打算在上边部署一个容器服务 竟然发现机器上连docker都没安装 如果是mac OS系统 可以参考文章 mac系统中解决docker command not found 解决 针对这个问题 今天特意记录了一下 我
  • 网上总结的字节跳动前端面试题

    1 jQuery与Vue的区别是什么 Vue vue是一个兴起的前端js库 是一个精简的MVVM 从技术角度讲 Vue js 专注于 MVVM 模型的 ViewModel 层 它通过双向数据绑定把 View 层和 Model 层连接了起来
  • Python爬虫常见异常及解决办法

    文章目录 1 selenium common exceptions WebDriverException Message unknown error cannot find Chrome binary 方法一 配置参数 方法二 修改源文件
  • mysql学习-mysql数据类型学习01

    数据类型概览 数值类型 整数类型包括 TINYINT SMALLINT MEDIUMINT INT BIGINT 浮点数类型包括 FLOAT 和 DOUBLE 定点数类型为 DECIMAL tinyint smallint mediumin
  • 【MySQL】MYSQL内核:INNODB存储引擎 卷1pdf——百度网盘下载

    百度网盘地址 https pan baidu com s 1p4CsmBhYzrIawwUznmByYw 资源来之不易 需要获取密码 请关注公众号 全栈船长 并回复数字 0002
  • 前端开发:JS中截取字符串的用法总结,高级Android程序员必会

    var a 0123456789 a substring 5 2 4 start 和 stop 有字符串 但是最后的输出结果是 234 a substring 5 hh start 和 stop 有字符串 但是最后的输出结果是 234 二
  • 计算机在汽车设计方面的应用属于计算机的,计算机技术辅助设计在汽车设计中的应用.pdf...

    82 车辆与动力工程 Vehicles and Power Engineering 2017 年 2 月 计算机技术辅助设计在汽车设计中的应用 温 欣 汪 家宇 杨 海 南 沈 阳理工 大学 辽 宁 沈 阳 110159 摘 要 随着社会经
  • keil软件调试(Debug)仿真教程(软件调试和硬件调试的区别)及常用调试按键详解

    文章目录 前言 一 什么是软件调试 Debug 有什么用 二 keil Debug常用按钮 总结 前言 单片机的调试分为两种 一种是使用软件模拟调试 第二种是硬件调试 两种调试方式各有不同 软件模拟调试有误差 而硬件调试 借用仿真器调试是嵌
  • 新斗罗大陆手游服务器维护,《新斗罗大陆》新ss魂师天青龙牛天修复公告

    亲爱的魂师大人 新SS魂师天青龙牛天首发后 小舞收到了大量意见反馈 部分魂师大人认为牛天战斗结果异常 过高的伤害与其魂师定位不符 我们在接收到反馈的第一时间 进行了紧急核查 随后 我们发现该问题是由牛天的技能 龙魂觉醒 导致 当牛天施展该技
  • AQS原理解析及源码分析

    目录 1 介绍下AQS几个重要的组件 2 内部成员变量state 3 同步队列NODE 4 等待队列 condition AbstractQueuedSynchronizer又称为队列同步器 后面简称AQS AQS的核心思想是 如果被请求的
  • 对比梯度下降和正规方程解性能

    现在用导数的方式模拟线性回归中的梯度下降法 首先再来回顾一下梯度下降法的基础 梯度下降法不是一个机器学习算法 而是一个搜索算法 梯度下降法用在监督学习中 梯度下降法的过程 对比模型输出值和样本值的差异不断调整本省权重 直到最后模型输出值和样
  • Leetcode题解——26.树的子结构

    题目地址 剑指 Offer 26 树的子结构 力扣 LeetCode 目录 一 解题思路 一 大体思路 二 Search函数 三 Judge函数 二 代码实现 三 拓展思考 一 解题思路 一 大体思路 对于二叉树类的题目 一般会使用递归或层
  • YOLOv5 tensorRT C++代码详解之engine的读取

    在tensorRT中 engine模型是对yolov5序列化后的结果 在推理的时候需要进行反序列化才能进行推理 那么第一步就是读取engine文件 ifstream介绍 engine文件的读取需要用到ifstream 需要导入头文件 inc
  • SpringBoot最简单好用的导出导入功能,拿来即用

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 文章目录 拿来吧你 一 接口说明 二 依赖 三 导出工具类 四 导入工具类 五 实体类的改造 BaseEntity java 六 控制层使用 七 效果 数据库表 1 下载模板
Powered by Hwhale