首页 > 编程语言 >java实习日记(2)

java实习日记(2)

时间:2024-11-26 18:32:25浏览次数:5  
标签:java 创建 excel User new 实习 import com 日记

一、Mybatis plus

        让mapper类继承basemapper,然后泛型那里填要操作的实体类对象,就可以在代码中调用basemapper提供的方法对实体类对象增删查改

例如:
 

import com.baomidou.mybatisplus.core.mapper.BaseMapper; 
import com.example.demo.entity.User;

public interface UserMapper extends BaseMapper<User> {

// 可以在这里添加自定义的方法,除了BaseMapper提供的通用方法之外

}

如果数据库中的表名、字段名和实体类中的不一致,可以通过注解指定

@TableName:用来指定表名

@Tableld:用来指定表中的主键字段信息

@TableField:用来指定表中的普通字段信息

例如:

@TableName("tb_user")
public class User {

@TableId(value="id")
private Long id;
private String name;

}

 Wapper条件构造器

专门用来生成复杂的增删改查条件,我们常用链式编程构造条件对象

QueryWapper

举例学习:

//创建一个基于User实体类的条件对象
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("status", "active")   // 添加WHERE status = 'active'
             .lt("age", 30)           // 添加AND age < 30
             .like("username", "john"); // 添加AND username LIKE '%john%'
//把条件传进去让他执行
List<User> users = userMapper.selectList(queryWrapper);

相当于:

select * from user

where status = 'active'

and age<30

and username like '%john%'

赋值的update(第一个是更新的内容,第二个是更新的条件)

//1.要更新的数据
User user =new User():
user.setBalance(2000);
//2.更新的条件
QueryWrapper<User> wrapper = new QueryWrapper<User>()
                            .eq("username","jack")
//3.执行更新
userMapper.update(user,wrapper);

修改的update(因为修改的东西直接在条件写了,所以不需要更新的内容,填null即可)

List<Long>ids = List.of(1L,2L,4L);
UpdateWrapper<User>wrapper =new UpdateWrapper<User>()
                           .setSql("balance =balance-200")
                           .in( column: "id", ids);
userMapper.update(null, wrapper);

自定义sql(先存一波,慢慢消化)

IService

  MyBatis Plus 框架提供的一个接口,位于业务逻辑层(Service 层),主要用于定义一些通用的业务方法,简单的业务逻辑可以不需要编写impl层,调用IService的方法直接完成。

import com.baomidou.mybatisplus.extension.service.IService;
import com.example.demo.entity.User;
public interface UserService extends IService<User> {
    // 可以在这里添加自定义的业务方法,除了IService提供的通用方法之外
}
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.example.demo.entity.User;
import com.example.demo.mapper.UserMapper;
import com.example.demo.service.UserService;
import org.springframework.stereotype.Service;
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {
    // 可以在这里实现自定义的业务方法,或者重写IService中的方法来添加业务逻辑
}

二、Apache POI

①写入操作(在内存写入,传到流传给本地保存)

1. 创建文件

//在内存中创建一个空的excel文件
XSSFWorkbook workbook = new XSSFWorkbook();
//创建一个新标签页(用POI创建的文件默认没有标签页)
XSSFSheet sheet = workbook.createSheet("New Sheet"); //括号内指定标签页名称

 2. 创建行、创建单元格、写入数据

// 创建第一行(索引从0开始)
Row row = sheet.createRow(0);
// 创建第一个单元格并写入数据
Cell cell = row.createCell(0);
cell.setCellValue("Hello, World!");

3. 保存文件

首先创建一个文本流管道,连接xlsx文件,然后把内存中的excel表格写入流,流会写入xlsx,最后依次关闭管道流和内存的临时文件

try {
    FileOutputStream outputStream = new FileOutputStream("new_excel_file.xlsx");
    workbook.write(outputStream);
    outputStream.close();
    workbook.close();
} catch (IOException e) {
    e.printStackTrace();
}

②读取操作(从本地传入流,传到内存中,读取数据)

1. 读取文件

//创建流连接对应的文件
FileInputStream file = new FileInputStream(new File("your_excel_file.xlsx"));
//创建工作簿对象,通过流读取已有的文件到内存中
XSSFWorkbook workbook = new XSSFWorkbook(file);

2. 提取具体的内容

//读取Excel文件中的标签页,用索引可以,用name也行(getSheet方法)
XssFSheet sheet=excel.getSheetAt(0);
//获取标签页中最后一行的行号,从上而下,直到最后一行有数据的行
int lastRowNum= sheet.getLastRowNum();
for(int i=1;i<=lastRowNum ; i++){
//获得第i行
XSSFRow row=sheet.getRow(i);
//getcell获得单元格对象,getstringCellValue获取单元格中的值
String cellValue1 =row.getcell(1).getStringCellValue();
String cellValue2 =row.getcell(2).getStringcellValue();
System.out.println(cellValue1 +" "+ cellValue2);
}

3. 具体项目中的excel表读写操作通常不会再从内存中创建临时文件,而是调用模板excel文件,如果把数据库数据转成excel下载到本地,就把具体的数据写到对应的单元格中;如果把本地的excel导入到项目中,那就解析对应的单元格,取值写到数据库中即可

模板文件一般放在/resource/template文件夹下

//通过POI将数据写入到Excel文件中,用类加载器获取类路径下的excel文件
//this可改为显式的类名
Inputstream in = this.getClass().getClassLoader().getResourceAsstream("模板excel");
//放到内存中
XSSFWorkbook excel = new XSSFWorkbook(in);
//获取当前标签页
XSSFSheet sheet = excel.getsheet("sheet1");
//填充数据,获得第m行
XSSFRow row=sheet.getRow(m);
//m行n列修改值
row.getCell(n).setCellValue(businessDatav0.getTurnover());
row.getCell(n).setCellValue(businessDatavo.getOrderCompletionRate());
row.getcell(n).setcellValue(businessDatavo.getNewUsers());

如何返回浏览器请求下载:

导包,在方法上添加HttpServletResponse response作为参数

//通过输出流将Excel文件下载到客户端浏览器
ServletOutputstream out=response.getOutputstream();
excel.write(out);

三、杂七杂八

1. 特别的注入方法
       用构造函数注入比@Autowired要好,但是如果注入要的参数很多,构造函数很长不好看,可以用Lombok注解,在controller类上加@RequiredArgsConstructor注解,注入部分用final修饰,比如private final ItesmService itemservice

2.      User user =BeanUtil.copyProperties(userDTO,User.class);

         ↑ 这种是通过反射生成一个全新的类并复制

         BeanUtil.copyProperties(userDTO,user)

         ↑ 这个是复制到已有的类

3. SendSmsRequest是一个用于发送短信请求的类

常用参数:

PhoneNumbers:存储接收短信的手机号码

SignName:短信签名属性,短信内容开头显示的、用于标识短信发送方身份的一段文字

TemplateCode:短信模板id

TemplateParam:用于存储短信模板参数,通常是json格式

标签:java,创建,excel,User,new,实习,import,com,日记
From: https://blog.csdn.net/m0_62519278/article/details/144050953

相关文章

  • 高性能框架Aeron的BufferPool和Java的内存池有什么区别?
    关注我,持续分享逻辑思维&管理思维&面试题;可提供大厂面试辅导、及定制化求职/在职/管理/架构辅导;推荐专栏《10天学会使用asp.net编程AI大模型》,目前已完成所有内容。一顿烧烤不到的费用,让人能紧跟时代的浪潮。从普通网站,到公众号、小程序,再到AI大模型网站。干货满满。学成后可......
  • k8s容器中的Java进程经常自动被杀
    故事背景主角:低代码项目时间:2023-08-29背景:项目通过jenkins部署k8s容器到虚拟机,在一次部署之后,服务发生无限重启的现象,springboot项目起来后没多久(甚至有几次还没启动)就会被杀掉进程,服务宕机了一个晚上。排查过程查看日志通过 kubeletlogs 命令查看服务运行日志,未发现任......
  • 你不知道的javascript-4
    this的指向,绑定规则,作用域1.什么是this?this是在函数执行时用来指代那个当前执行上下文的对象也就能说明this的值是在函数被调用时确定的,而不是在函数被定义时确定的因为只有当函数执行的时候,才会创建对应的FEC(函数执行上下文)2.为啥需要this?在常见的编程语言中,几乎......
  • Java 异常处理
    目录:碎碎念:题目:问题描述原因分析:解决方案:碎碎念:    我知道我是低代码,但是只是完成个作业,所以就随便写了,能过测试点就行,没想到有个测试点死活过不去。题目:        设有一个整数数组a[],a有10个元素,其值依次为0到9。从键盘输入整数i的值,求a[......
  • JavaScript 类型转换
    基础概念什么是类型转换JavaScript是一种动态弱类型语言,其类型转换机制允许开发者灵活地处理不同数据类型之间的交互。类型转换是指将一个值从一种数据类型转换为另一种数据类型的过程,在JavaScript中主要分为两种方式:隐式类型转换:由JavaScript引擎自动执行,例如在算术运......
  • JavaScript 条件语句详解
    JavaScript条件语句概述条件语句的作用在JavaScript编程中,条件语句是控制程序流程的核心机制。它们使程序能够根据特定条件执行不同代码块,从而实现灵活的决策逻辑。通过使用if、if-else和switch等语句,开发者可以根据变量值或表达式结果动态地改变代码执行路径,使得程序能够......
  • Java中的final关键字详解
    在Java中,final关键字是一个非常重要的修饰符,用于控制变量、方法或类的不可变性或不可覆盖性。下面我将通过文字解释和代码示例详细讲解final关键字的用法。 1.final关键字概述final关键字可以用于以下三种场景:变量:用于声明常量,使其值在初始化后不能被修改。方法:用于......
  • 《刚刚问世》系列初窥篇-Java+Playwright自动化测试-6- 元素基础定位方式-上篇 (详细教
    1.简介从这篇文章开始,就开始要介绍UI自动化核心的内容,也是最困难的部分了,就是:定位元素,并去对定位到的元素进行一系列相关的操作。想要对元素进行操作,第一步,也是最重要的一步,就是要找到这个元素,如果连元素都定位不到,后续什么操作都是无用功,都是扯淡,因此宏哥建议小伙伴或者同学们从......
  • DolphinScheduler JavaTask动态传参秘籍:轻松实现任务间数据流动
    ApacheDolphinScheduler的JavaTask可以通过在任务执行日志中输出特定格式的参数来支持OUT参数的下游传输,通过捕捉日志并将其作为参数传递给下游任务。这种机制允许任务间的数据流动和通信,增强了工作流的灵活性和动态性。那具体要怎么做呢?本文将进行详细的讲解。0修改一行源码......
  • JavaScript 中的“造物”艺术:对象、构造函数与原型
    走进JS,走近讶语在JavaScript的世界里,对象和面向对象编程(OOP)是不可或缺的一部分。本文将带你深入了解JavaScript中对象的创建方式,特别是ES6中引入的class语法,以及传统的构造函数和原型的概念。希望通过这篇文章,你能对JavaScript的面向对象编程有一个更深入的理解。1.造对象......