当前位置: 首页 > news >正文

【Lazy ORM 框架学习】

Gitee

点赞关注不迷路 项目地址

快速入门

模块所属层级描述快照版本正式版本
wu-database-lazy-lambdalambda针对不同数据源MavenMaven
wu-database-lazy-orm-coreorm 核心orm核心处理MavenMaven
wu-database-lazy-sqlsql核心处理成处理sql解析、sql执行、sql映射MavenMaven
wu-elasticsearch-starterESESMavenMaven
wu-hbase-starterhbasehbaseMavenMaven
wu-database-lazy-datasource-starter数据源处理数据源处理MavenMaven

简介

特性
  • 强大的CRUD操作:内置通过注入 LazyLambdaStream 对象即可实现表单的大部分CRUD操作
  • 支持Lambda形式的调用: 通过Lambda表达式,方便的编写各类查询条件
  • 内置分页查询:通过构造分页对象查询数据统计分页总数
  • 支持多种数据库:支持MySQL
支持数据库

任何能使用 LazyLambdaStream进行CRUD,并且支持标准SQL的数据库,具体支持情况如下

  • MySQL
框架架构

在这里插入图片描述

代码托管

Gitee
|Github

参与贡献

欢迎各位同学一起参与完善wu-framework-lazy-orm-spring-starter

  • 贡献代码:代码地址wu-framework-lazy-orm-spring-starter,欢迎提交Issue或者Pull Requests
教程、案例、使用者名单
  • 暂无
版本功能
  • Lazy-ORM 是一款针对懒人快速开发的ORM框架

  • 支持实体类反射数据进行数据库CRUD操作

  • 新增灵性数据插入更新(自动过滤空值)

  • 新增配置导出数据忽略指定字段
    spring.datasource.ignore-exported-fields: - id

  • 新增配置声明导出数据中的特殊字符
    spring.datasource.special-fields: - ASC

  • 新增@LazyScan自动扫描实体创建表

  • 新增自动填充表数据

  • 新增创建表方法

  • 新增更新表字段方法

  • 修复数据插入布尔类型、数字类型字段 字符串更改为->原始数据类型

  • 新增逆向工程功能生成对应的Java class 支持mybatis 适配

  • 使用Spring 进行事物管理

  • 修复数据为null 时执行sql 数据为 “null” 问题

  • 新增自动过滤null字段的upsert接口

  • 新增字段自动关联转译

    • 注解方法入参数通过数据库转译@LazyTableArgsTranslation
    • 注解方法出参数转译@LazyTableTranslation
    • 通过一个字段管理其他表的一条数据@LazyTableTranslationOneField
    • 通过一个字段管理其他表的数据@LazyTableTranslationOneToManyField

快速开始

我们将通过一个简单的 Demo 来阐述 wu-framework-lazy-orm-spring-starter 的强大功能,在此之前,我们假设您已经:

  • 拥有 Java 开发环境以及相应 IDE
  • 熟悉 Spring Boot
  • 熟悉 Maven

现有一张 User 表,其表结构如下:

idnameannual_salaryemail
1吴小二18test1@lazy.com
2吴三20test2@lazy.com
3吴小四28test3@lazy.com
4吴小五21test4@lazy.com
5吴小六24test5@lazy.com

其对应的数据库 Schema 脚本如下:

DROP TABLE IF EXISTS user;CREATE TABLE user
(id            BIGINT(20) NOT NULL COMMENT '主键ID',name          VARCHAR(30) NULL DEFAULT NULL COMMENT '姓名',annual_salary INT(11) NULL DEFAULT NULL COMMENT '年薪',email         VARCHAR(50) NULL DEFAULT NULL COMMENT '邮箱',PRIMARY KEY (id)
);

其对应的数据库 Data 脚本如下:

DELETE
FROM user;INSERT INTO user (id, name, annual_salary, email)
VALUES (1, '吴小二', 18, 'test1@lazy.com'),(2, '吴三', 20, 'test2@lazy.com'),(3, '吴小四', 28, 'test3@lazy.com'),(4, '吴小五', 21, 'test4@lazy.com'),(5, '吴小六', 24, 'test5@lazy.com');
初始化工程

创建一个空的 Spring Boot 工程(工程将以 MySQL 作为默认数据库进行演示)

添加依赖

引入 Spring Boot Starter 父工程:

<parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.6.7</version><relativePath/>
</parent>

引入 spring-boot-starter、spring-boot-starter-test、wu-framework-lazy-orm-spring-starter、mysql 依赖

<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><!--懒人依赖--><dependency><groupId>top.wu2020</groupId><artifactId>wu-framework-lazy-orm-spring-starter</artifactId><version>1.2.5-JDK17-SNAPSHOT</version></dependency><!--mysql--><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId></dependency>
</dependencies>
配置

在 application.yml 配置文件中添加 mysql 数据库的相关配置:

# DataSource Config
spring:datasource:username: rootpassword: rooturl: jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghaidriver-class-name: com.mysql.cj.jdbc.Driver

Spring Boot 启动类:


@SpringBootApplication
public class Application {public static void main(String[] args) {SpringApplication.run(Application.class, args);}}
编码

编写实体类 User.java(此处使用了 Lombok 简化代码)


@Data
public class User {private Long id;private String name;private Integer annualSalary;private String email;
}
开始使用

添加测试类,进行功能测试:


@SpringBootTest
public class SampleTest {@AutowiredLazyLambdaStream lazyLambdaStream;@Testpublic void testSelect() {System.out.println(("----- selectAll method test ------"));// 等同于执行sql select * from sys_userCollection<User> userList = lazyLambdaStream.select(LazyWrappers.<User>lambdaWrapper()).collection();AssertFactory.assertEquals(5, userList.size());userList.forEach(System.out::println);}}
小结

通过以上几个简单的步骤,我们就实现了 User 表的 CRUD 功能,甚至连 XML 文件都不用编写!

安装

全新的 wu-framework-lazy-orm-spring-starter 1.2.5-JDK17-SNAPSHOT 版本基于 JDK17,提供了 lambda 形式的调用,所以安装集成
MP3.0 要求如下:

  • JDK 8+
  • Maven or Gradle
Spring Boot

Maven:

    <dependency><groupId>top.wu2020</groupId><artifactId>wu-framework-lazy-orm-spring-starter</artifactId><version>1.2.5-JDK17-SNAPSHOT</version></dependency>

配置

wu-framework-lazy-orm-spring-starter 的配置异常的简单,我们仅需要一些简单的配置即可使用
wu-framework-lazy-orm-spring-starter 的强大功能!

Spring Boot 工程

  • 配置yaml
# DataSource Config
spring:datasource:username: rootpassword: rooturl: jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghaidriver-class-name: com.mysql.cj.jdbc.Driver

注解

::: tip 本文将介绍 wu-framework-lazy-orm-spring-starter 注解包相关类详解(更多详细描述可点击查看源码注释)
:::

  • 描述
  • 使用位置对象
@LazyTable

@LazyTable(tableName = "sys_user")
public class User {private Long id;private String name;private Integer annualSalary;private String email;
}
属性类型必须指定默认值描述
tableNameString“”表名
schemaString“”schema
commentString“”表注释
perfectTableboolean“false”完善表
smartFillFieldbooleanfalse智能填充bean属性 针对数据源 如mysql查询结果、http请求结果中包含的数据字段不再当前对象中
@LazyTableFieldId

@LazyTable(tableName = "sys_user")
public class User {@LazyTableFieldIdprivate Long id;private String name;private Integer annualSalary;private String email;
}
属性类型必须指定默认值描述
valueString“”字段名
nameString“”字段名
commentString“”字段注释
typeString“”字段了类型(varchar、int等)
indexTypeLayerField.LayerFieldTypeLayerField.LayerFieldType.ID索引类型
idTypeIdTypeAUTOMATIC_ID主键自增类型
LayerFieldType
描述
FIELD_TYPE字段类型
ID数据库 ID
UNIQUE唯一性索引
AUTOMATIC自动的
IdType
描述
AUTOMATIC_ID主键ID 默认自增
INPUT_ID输入主键
@LazyTableField

@LazyTable(tableName = "sys_user")
public class User {private Long id;private String name;@LazyTableField("salary")private Integer annualSalary;private String email;
}
属性类型必须指定默认值描述
valueString“”字段名
nameString“”字段名
commentString“”字段注释
columnTypeString“”字段了类型(varchar、int等)
existbooleantrue是否存在
indexTypeLayerField.LayerFieldTypeLayerField.LayerFieldType.ID索引类型
idTypeIdTypeAUTOMATIC_ID主键自增类型

快速测试

自动导入 wu-framework-lazy-orm-spring-starter 测试所需相关配置。

示例工程


源码:👉 wu-framework-lazy-orm-spring-starter-simple(opens new window)

使用教程


添加测试依赖

Maven:

<dependency><groupId>top.wu2020</groupId><artifactId>wu-framework-lazy-orm-spring-starter</artifactId><version>1.2.5-JDK17-SNAPSHOT</version>
</dependency>

Gradle:

compile group: 'top.wu2020', name: 'wu-framework-lazy-orm-spring-starter', version: '1.2.5-JDK17-SNAPSHOT'

编写测试用例


@Autowired
private LazyOperation lazySqlOperation;/*** 用户信息简单插入*/
@ApiOperation("用户信息简单插入")
@PostMapping("/lazy/upsert")
public void lazyUpsert() {SysUser sysUser = new SysUser();sysUser.setUsername("小来");sysUser.setPassword("1234");sysUser.setId(1L);// 同执行sql insert into sys_user (user_name,password,id) values("小来","1234","1") ON DUPLICATE KEY UPDATE user_name=values (user_name),password=values (password),id=values (id)lazySqlOperation.upsert(sysUser);
}

核心功能

代码生成器

快速开始

安装
<dependency><groupId>top.wu2020</groupId><artifactId>wu-framework-lazy-orm-spring-starter</artifactId><version>1.2.5-JDK17-SNAPSHOT</version>
</dependency>

::: tip 直接使用maven引入项目,通过配置文件加载生成代码
:::

配置文件
spring:lazy:enable-reverse-engineering: true  # 允许逆向工程reverse-engineering:enable-lazy: false   # 不允许lazy系列注解enable-lombok-accessors: false # 不允许 lombok.accessorsenable-lombok-data: false  # 不允许 lombok.datapackage-name: org.wu.lazy  # 包名enable-swagger: false  # 不允许 swagger
使用

启动Spring-boot的启动类即可

成品

在这里插入图片描述

CRUD 接口

upsert
    /*** 批量更新或插入** @param objects* @param <T>*/
<T> void upsert(Object... objects);
参数说明
类型参数名描述
Object…objects任意实体对象
upsert 案例
    public static void main(String[] args) {LazyLambdaStream lazyLambdaStream = LazyLambdaStreamFactory.createLazyLambdaStream("127.0.0.1",3306,"acw","root","wujiawei");DataBaseUser dataBaseUser = new DataBaseUser();dataBaseUser.setUsername("username");dataBaseUser.setAddress("地址");dataBaseUser.setAge(18);// 同执行SQL: insert into user (id,username,birthday,sex,age,age_type,address_id) VALUES (null,'username',null,null,18,null,null)  ON DUPLICATE KEY UPDATE //id=values (id),username=values (username),birthday=values (birthday),sex=values (sex),age=values (age),age_type=values (age_type),address_id=values (address_id)lazyLambdaStream.upsert(dataBaseUser);}
insert
    /*** 插入 单个/list** @param t* @param <T>*/
<T> void insert(T t);
参数说明
类型参数名描述
Tt实体对象
insert 案例
    public static void main(String[] args) {LazyLambdaStream lazyLambdaStream = LazyLambdaStreamFactory.createLazyLambdaStream("127.0.0.1",3306,"acw","root","wujiawei");DataBaseUser dataBaseUser = new DataBaseUser();dataBaseUser.setUsername("username");dataBaseUser.setAddress("地址");dataBaseUser.setAge(18);// 同执行SQL: INSERT INTO user(username,birthday,sex,age,age_type,address_id)values(null,'username',null,null,'18',null,null)lazyLambdaStream.insert(dataBaseUser);}
upsertRemoveNull
  /*** 更新或者插入单个执行 去除空值* 多个数据性能会慢,不经常使用*/
Object upsertRemoveNull(Object... t);
参数说明
类型参数名描述
Object…t任意实体对象
upsertRemoveNull 案例
    public static void main(String[] args) {LazyLambdaStream lazyLambdaStream = LazyLambdaStreamFactory.createLazyLambdaStream("127.0.0.1",3306,"acw","root","wujiawei");Address address = new Address();address.setId(1L);address.setLongitude(1.2d);//  执行SQL: insert into address (id,latitude,longitude) VALUES (1,'0.0','1.2')  ON DUPLICATE KEY UPDATE // id=values (id),latitude=values (latitude),longitude=values (longitude)lazyLambdaStream.upsertRemoveNull(address);List<Address> addresses = new ArrayList<>();for (int i = 0; i < 10; i++) {Address addressa = new Address();address.setId(1L);address.setLongitude(1.2d);addresses.add(addressa);}// 执行SQL: insert into address (id,name,latitude,longitude) VALUES (null,null,'0.0','0.0'),(null,null,'0.0','0.0'),(null,null,'0.0','0.0'),(null,null,'0.0','0.0'),(null,null,'0.0','0.0'),(null,null,'0.0','0.0'),(null,null,'0.0','0.0'),(null,null,'0.0','0.0'),(null,null,'0.0','0.0'),(null,null,'0.0','0.0')  ON DUPLICATE KEY UPDATE// id=values (id),name=values (name),latitude=values (latitude),longitude=values (longitude)lazyLambdaStream.upsert(addresses);}
lazyPage
    /*** 分页查询** @param <T>* @return*/
<T> Page<T> lazyPage(@NonNull Page lazyPage, @NonNull Class returnType, String sql, Object... params);
参数说明
类型参数名描述
PagelazyPage分页对象
ClassreturnType返回数据类型
Stringsql执行的sql语句
Object…paramssql执行参数
lazyPage 案例
    public static void main(String[] args) {LazyLambdaStream lazyLambdaStream = LazyLambdaStreamFactory.createLazyLambdaStream("127.0.0.1",3306,"acw","root","wujiawei");//  执行SQL: select user.* from user where  user.age  >  18  and  user.sex  =  '男'Page<DataBaseUser> dataBaseUserLazyPage = lazyLambdaStream.selectPage(LazyWrappers.<DataBaseUser>lambdaWrapper().gt(DataBaseUser::getAge, 18).eq(DataBaseUser::getSex, "男"),new Page<>(1, 10));System.out.println(dataBaseUserLazyPage);
}
executeSQL

/*** @param sql* @param t* @param params* @param <T>* @return*/
<T> List<T> executeSQL(String sql, Class t, Object... params);
参数说明
类型参数名描述
Classt返回数据类型
Stringsql执行的sql语句
Object…paramssql执行参数
executeSQL 案例
    public static void main(String[] args) {LazyLambdaStream lazyLambdaStream = LazyLambdaStreamFactory.createLazyLambdaStream("127.0.0.1",3306,"acw","root","wujiawei");//  执行SQL: select user.* from user where  user.age  >  18  and  user.sex  =  '男'List<DataBaseUser> dataBaseUsers = lazyLambdaStream.executeSQL("select user.* from user where  user.age  >  %s  and  user.sex  =  '%s'", DataBaseUser.class, 18, "男");System.out.println(dataBaseUsers);
}
executeSQLForBean
      /*** description 执行SQL 返回指定类型** @param* @return* @exception/throws* @author Jiawei Wu* @date 2020/12/29 下午1:44*/
<T> T executeSQLForBean(String sql, Class<?> t, Object... params);
参数说明
类型参数名描述
Classt返回数据类型
Stringsql执行的sql语句
Object…paramssql执行参数
executeSQLForBean 案例
    public static void main(String[] args) {LazyLambdaStream lazyLambdaStream = LazyLambdaStreamFactory.createLazyLambdaStream("127.0.0.1",3306,"acw","root","wujiawei");//  执行SQL: select user.* from user where  user.age  >  18  and  user.sex  =  '男' limit 1DataBaseUser dataBaseUser = lazyLambdaStream.executeSQLForBean("select user.* from user where  user.age  >  %s  and  user.sex  =  '%s' limit 1",DataBaseUser.class,18,"男");System.out.println(dataBaseUser);
}
perfect
 /*** describe 完善表** @param entityClasses class 对象数组* @return* @author Jia wei Wu* @date 2022/1/2 5:05 下午**/
<T> T perfect(@NonNull Class... entityClasses);
参数说明
类型参数名描述
Class…entityClasses实体对象
perfect 案例
    public static void main(String[] args) {LazyLambdaStream lazyLambdaStream = LazyLambdaStreamFactory.createLazyLambdaStream("127.0.0.1",3306,"acw","root","wujiawei");LazyDatabaseJsonMessage.lazyDataSourceType = DataSourceType.MySQL;// 完善表结构lazyLambdaStream.perfect(Address.class);}
createTable
    /*** describe 创建表** @param* @return* @author Jia wei Wu* @date 2022/1/2 7:48 下午**/
<T> T createTable(@NonNull Class<?>... entityClasses);
参数说明
类型参数名描述
Class…entityClasses实体对象
createTable 案例
    public static void main(String[] args) {LazyLambdaStream lazyLambdaStream = LazyLambdaStreamFactory.createLazyLambdaStream("127.0.0.1",3306,"acw","root","wujiawei");LazyDatabaseJsonMessage.lazyDataSourceType = DataSourceType.MySQL;// 创建表lazyLambdaStream.createTable(Address.class);}
updateTable
    /*** describe 更新表** @param* @return* @author Jia wei Wu* @date 2022/1/2 7:48 下午**/
<T> T updateTable(@NonNull Class<?>... entityClasses);
参数说明
类型参数名描述
Class…entityClasses实体对象
updateTable 案例
    public static void main(String[] args) {LazyLambdaStream lazyLambdaStream = LazyLambdaStreamFactory.createLazyLambdaStream("127.0.0.1",3306,"acw","root","wujiawei");LazyDatabaseJsonMessage.lazyDataSourceType = DataSourceType.MySQL;// 更新表lazyLambdaStream.updateTable(Address.class);}
execute
    /*** 执行操作** @param persistenceRepository* @return*/
List<Object> execute(PersistenceRepository persistenceRepository);
参数说明
类型参数名描述
PersistenceRepositorypersistenceRepository预执行SQL需要的属性
execute 案例
// 使用相当灵活、想咋玩就咋玩
executeOne
    /*** 执行操作** @param persistenceRepository* @return*/
Object executeOne(PersistenceRepository persistenceRepository);
参数说明
类型参数名描述
PersistenceRepositorypersistenceRepository预执行SQL需要的属性
executeOne 案例
        public static void main(String[] args) {LazyLambdaStream lazyLambdaStream = LazyLambdaStreamFactory.createLazyLambdaStream("127.0.0.1",3306,"acw","root","wujiawei");PersistenceRepository persistenceRepository = PersistenceRepositoryFactory.create();persistenceRepository.setQueryString("select user.* from user where  user.age  >  18  and  user.sex  =  '男' limit 1");persistenceRepository.setExecutionType(LambdaTableType.SELECT);persistenceRepository.setResultClass(DataBaseUser.class);//  执行SQL: select user.* from user where  user.age  >  18  and  user.sex  =  '男' limit 1DataBaseUser dataBaseUser = (DataBaseUser) lazyLambdaStream.executeOne(persistenceRepository);System.out.println(dataBaseUser);
}

聪明懒人的操作接口

saveSqlFile
    /*** @param nameDatabase 数据库名 默认当前连接数据*                     System.getProperty("user.dir") 数据文件地址* @return 保存数据到本地数据* description 数据库数据存储到sql文件(删除表后、创建表 数据使用upsert)* @author Jiawei Wu* @date 2021/1/31 6:40 下午**/
void saveSqlFile(String nameDatabase);
参数说明
类型参数名描述
StringnameDatabase数据库名 默认当前连接数据
saveSoftSqlFile
    /*** @param nameDatabase 数据库名 默认当前连接数据*                     System.getProperty("user.dir") 数据文件地址* @return 保存数据到本地数据* description 柔和形 数据库数据存储到sql文件(表存在不删除 数据使用upsert)* @author Jiawei Wu* @date 2021/1/31 6:40 下午**/
void saveSoftSqlFile(String nameDatabase);
参数说明
类型参数名描述
StringnameDatabase数据库名 默认当前连接数据
saveUpsertSqlFile
    /*** describe  导出增量式更新数据** @param nameDatabase 数据库名 默认当前连接数据*                     System.getProperty("user.dir") 数据文件地址* @return 保存数据到本地数据* @author Jia wei Wu* @date 2022/4/9 22:57**/
void saveUpsertSqlFile(String nameDatabase);
参数说明
类型参数名描述
StringnameDatabase数据库名 默认当前连接数据
stuffed
    /*** 自动填充数据* SELECT* ** FROM* information_schema.COLUMNS* WHERE* TABLE_SCHEMA = 'lazy'* AND TABLE_NAME = 'sys_user';** @param schema 数据库* @param table  表* @param num    数量*/
void stuffed(String schema, String table, Long num);/*** 自动填充数据* SELECT* ** FROM* information_schema.COLUMNS* WHERE* TABLE_SCHEMA = 'lazy'* AND TABLE_NAME = 'sys_user';** @param table class 对应数据库结构的class* @param num   数量*/
void stuffed(Class table, Long num);
参数说明
类型参数名描述
Stringschema数据库名
Stringtable表名
Longnum数量
stuffedAll
    /*** 塞入所有数据** @param num*/
void stuffedAll(Long num);
参数说明
类型参数名描述
Longnum存储数据数量
stuffedJava
    /*** describe 根据表明创建出Java文件** @param schema    数据库* @param tableName 表名* @return* @author Jia wei Wu* @date 2022/1/23 12:23 上午**/
void stuffedJava(String schema, String tableName);
参数说明
类型参数名描述
Stringschema数据库
StringtableName表名
Gitee

点赞关注不迷路 项目地址

相关文章:

【Lazy ORM 框架学习】

Gitee 点赞关注不迷路 项目地址 快速入门 模块所属层级描述快照版本正式版本wu-database-lazy-lambdalambda针对不同数据源wu-database-lazy-orm-coreorm 核心orm核心处理wu-database-lazy-sqlsql核心处理成处理sql解析、sql执行、sql映射wu-elasticsearch-starterESESwu-hb…...

安科瑞路灯安全用电云平台解决方案【电不起火、电不伤人】

背景介绍 近年来 &#xff0c;随着城市规模的不断扩大 &#xff0c;路灯事业蓬勃发展。但有的地方因为观念、技术、管理等方面不完善 &#xff0c;由此引发了一系列安全问题。路灯点多面广 &#xff0c;一旦漏电就极容易造成严重的人身安全事故。不仅给受害者家庭带来痛苦 &am…...

MYSQL——索引概念索引结构

索引 索引是帮助数据库高效获取数据的排好序的数据结构。 有无索引时&#xff0c;查询的区别 主要区别在于查询速度和系统资源的消耗。 查询速度&#xff1a; 在没有索引的情况下&#xff0c;数据库需要对表中的所有记录进行扫描&#xff0c;以找到符合查询条件的记录&#…...

Linux(CentOS7)配置系统服务以及开机自启动

目录 前言 两种方式 /etc/systemd/system/ 进入 /etc/systemd/system/ 文件夹 创建 nginx.service 文件 重新加载 systemd 配置文件 ​编辑 配置开机自启 /etc/init.d/ 进入 /etc/init.d/ 文件夹 创建 mysql 文件 编写脚本内容 添加/删除系统服务 配置开机自启 …...

0 决策树基础

目录 1 绪论 2 模型 3 决策树面试总结 1 绪论 决策树算法包括ID3、C4.5以及C5.0等&#xff0c;这些算法容易理解&#xff0c;适用各种数据&#xff0c;在解决各种问题时都有良好表现&#xff0c;尤其是以树模型为核心的各种集成算法&#xff0c;在各个行业和领域都有广泛的…...

Linux速览(2)——环境基础开发工具篇(其一)

本章我们来介绍一些linux的常用工具 目录 一. Linux 软件包管理器 yum 1.什么是软件包? 2. 查看软件包 3. 如何安装软件 4. 如何卸载软件 5.yum补充 6. 关于 rzsz 二. Linux编辑器-vim使用 1. vim的基本概念 2. vim的基本操作 3. vim正常模式命令集 4. vim末行模式…...

AWS SES发送邮件时常见的错误及解决方法?

AWS SES发送邮件如何做配置&#xff1f;使用AWS SES发信的限制&#xff1f; 在使用AWS SES发送邮件时&#xff0c;可能会遇到一些常见的错误。AokSend将介绍一些常见的AWS SES发送邮件错误及其相应的解决方法&#xff0c;帮助用户更好地利用AWS SES进行邮件发送。 AWS SES发送…...

视频基础学习三——视频帧率、码率与分辨率

文章目录 前言一、介绍1.定义2.三者之间的关系 总结 前言 在之前的文章中详细介绍了一些关于图像的色彩与格式&#xff0c;而视频其实就是由一张张图片进行展示呈现出来的。 我们会经常说一段视频的质量好不好&#xff0c;而什么是视频的质量呢&#xff1f;博主的个人理解就是…...

Spring(详细介绍)

目录 一、简介 1、什么是Spring&#xff1f; 2、Spring框架的核心特性 3、优点 二、IOC容器 介绍 1、获取资源的传统方式 2、控制反转方式获取资源 3、DI 4、IOC容器在Spring中的实现 入门案例 1、创建Maven Module 2、引入依赖 3、创建HelloWorld类 4、在Spring的配…...

Kettle使用

1.准备工作 KETTLE-5.4.zip HANA环境192.168.xx.xx 用户名&#xff1a;system 密码&#xff1a;****** 端口号&#xff1a;30015 Oracle环境 192.168.xx.xx 用户名 HANA_TEST 密码 ****** 端口号&#xff1a;31001 配置java环境变量 因为本次数据转换测试为将HANA数据转换到Or…...

互联网摸鱼日报(2024-04-01)

互联网摸鱼日报(2024-04-01) 36氪新闻 「矽迪半导体」获数千万天使轮融资&#xff0c;提供高效功率半导体方案&#xff5c;硬氪首发 本周双碳大事&#xff1a;国资委即将发布央企ESG指导意见&#xff1b;上海发文推动建立产品碳足迹管理体系&#xff1b;隆基新硅片面世 数字…...

pnpm比npm、yarn好在哪里?

前言 pnpm对比npm/yarn的优点&#xff1a; 更快速的依赖下载更高效的利用磁盘空间更优秀的依赖管理 我们按照包管理工具的发展历史&#xff0c;从 npm2 开始讲起&#xff1a; npm2 使用早期的npm1/2安装依赖&#xff0c;node_modules文件会以递归的形式呈现&#xff0c;严格…...

大前端-postcss安装使用指南

PostCSS 是一款强大的 CSS 处理工具&#xff0c;可以用来自动添加浏览器前缀、代码合并、代码压缩等&#xff0c;提升代码的可读性&#xff0c;并支持使用最新的 CSS 语法。以下是一份简化的 PostCSS 安装使用指南&#xff1a; 一、安装 PostCSS 在你的项目目录中&#xff0c…...

全局UI方法-弹窗三-文本滑动选择器弹窗(TextPickDialog)

1、描述 根据指定的选择范围创建文本选择器&#xff0c;展示在弹窗上。 2、接口 TextPickDialog(options?: TextPickDialogOptions) 3、TextPickDialogOptions 参数名称 参数类型 必填 参数描述 rang string[] | Resource 是 设置文本选择器的选择范围。 selected nu…...

LibreOffice 将word,excel,PowerPoint文件转换PDF

安装LibreOffice并将Word和Excel文件转换为PDF文件&#xff0c;并设置文件存放路径的步骤如下&#xff1a; 1. 安装LibreOffice 如果尚未安装LibreOffice&#xff0c;可以通过以下命令在Ubuntu上安装&#xff1a; sudo apt update sudo apt install libreoffice 2. 使用Li…...

鱼眼相机的测距流程及误差分析[像素坐标系到空间一点以及测距和误差分析]

由于最近在整理单目测距的内容&#xff0c;顺手也总结下鱼眼相机的测距流程和误差分析&#xff0c;如果有错误&#xff0c;还请不吝赐教。 参考链接: 鱼眼镜头的成像原理到畸变矫正&#xff08;完整版&#xff09; 相机模型总结&#xff08;针孔、鱼眼、全景&#xff09; 三维…...

谈谈Python中的列表、元组、字典和集合的主要区别和用法

谈谈Python中的列表、元组、字典和集合的主要区别和用法 Python是一种功能强大且易于学习的编程语言&#xff0c;它提供了多种数据结构来支持各种编程需求。其中&#xff0c;列表&#xff08;list&#xff09;、元组&#xff08;tuple&#xff09;、字典&#xff08;dictionar…...

【WPF应用24】C#中的Image控件详解与应用示例

在C#应用程序开发中&#xff0c;图像显示是一个常见的需求。无论是创建图形界面还是处理图像数据&#xff0c;System.Windows.Controls.Image控件都是实现这一目标的重要工具。本文将详细介绍Image控件的功能、用法、优化技巧以及一些实际应用示例&#xff0c;帮助开发者更好地…...

CTF题型 php://filter特殊编码绕过小汇总

CTF题型 php://filter特殊编码绕过小汇总 文章目录 CTF题型 php://filter特殊编码绕过小汇总特殊编码base64编码string过滤器iconv字符集 例题1.[Newstarctf 2023 week2 include]2.[Ctfshow web 117] php://filter 是一个伪协议&#xff0c;它允许你读取经过过滤器处理的数据流…...

【嵌入式智能产品开发实战】(十二)—— 政安晨:通过ARM-Linux掌握基本技能【C语言程序的安装运行】

目录 程序的安装 程序安装的本质 在Linux下制作软件安装包 政安晨的个人主页&#xff1a;政安晨 欢迎 &#x1f44d;点赞✍评论⭐收藏 收录专栏: 嵌入式智能产品开发实战 希望政安晨的博客能够对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xf…...

网络编程的学习1

网络编程 在网络通信协议下&#xff0c;不同计算机上运行的程序&#xff0c;进行数据传输。 三要素 ip&#xff1a;设备在网络中的地址&#xff0c;是唯一的标识。 ipv4:采取32位地址长度&#xff0c;分成4组。 ipv6&#xff1a;采用128位地址长度&#xff0c;分成8组。 …...

spark log4j日志文件动态参数读取

需要在log4j xml文件中设置动态参数&#xff0c;并支持spark任务在集群模式下&#xff0c;动态参数读取正常&#xff1b; 1.log4j配置文件 log4j2.xml <?xml version"1.0" encoding"UTF-8"?> <Configuration status"info" name&quo…...

设计模式,装修模式,Php代码演示,优缺点,注意事项

装饰模式&#xff08;Decorator Pattern&#xff09;是一种结构型设计模式&#xff0c;它允许动态地向一个现有对象添加新的功能或行为&#xff0c;而不改变其原始结构。在 PHP 中&#xff0c;可以使用类的继承和组合来实现装饰模式。下面是一个简单的 PHP 装饰模式示例代码&am…...

ubuntu下vscode ctrl+tab松开ctrl后不自动选中文件

vscode用ctrltab切换文件时&#xff0c;松开ctrl键后会自动选中切换的文件。 但是在ubuntu下发现有时不能自动选中切换的文件&#xff0c;需要再次按enter键才能打开文件。 经过测试发现解决方法有两个&#xff1a; 方法1&#xff1a;确认wayland状态&#xff0c;关闭wayland…...

【云开发笔记No.19】关于中台架构(1)

在云开发领域&#xff0c;中台架构是一种至关重要的组织架构&#xff0c;它为企业提供了一种灵活且高效的方式来应对市场的快速变化。下面将详细阐述中台架构的定义、起源、定位和价值。 中台架构的定义 中台架构是指在企业信息系统中&#xff0c;将业务流程、数据和应用系统…...

对于提高Web安全,WAF能有什么作用

数字化时代&#xff0c;网络安全已经成为了一个不可忽视的重要议题。网络攻击事件频发&#xff0c;各种安全隐患层出不穷&#xff0c;如何有效地保护我们的网络空间&#xff0c;确保信息安全&#xff0c;已成为一项迫切的任务。而Web应用防火墙&#xff0c;正是守护网络安全的一…...

Go 源码之 gin 框架

Go 源码之 gin 框架 go源码之gin - Jxy 博客 一、总结 gin.New()初始化一个实例&#xff1a;gin.engine&#xff0c;该实例实现了http.Handler接口。实现了ServeHTTP方法 注册路由、注册中间件&#xff0c;调用addRoute将路由和中间件注册到 methodTree 前缀树&#xff08;节…...

BM19 寻找峰值(二分查找)

import java.util.*; public class Solution {/*** 代码中的类名、方法名、参数名已经指定&#xff0c;请勿修改&#xff0c;直接返回方法规定的值即可** * param nums int整型一维数组 * return int整型*/public int findPeakElement (int[] nums) {// write code hereint lef…...

4.数组和切片【go】

数组是具有固定数量的元素的序列,而切片是对数组的一个连续片段的引用。切片是Go中常用的数据结构 数组(Array) 数组是一个具有固定长度且元素类型相同的序列。在Go中,数组的长度是其类型的一部分,因此[5]int和[10]int是不同的数组类型。数组的长度在声明时必须指定,并…...

Abaqus周期性边界代表体单元Random Sphere RVE 3D (Mesh)插件

插件介绍 Random Sphere RVE 3D (Mesh) - AbyssFish 插件可在Abaqus生成三维具备周期性边界条件(Periodic Boundary Conditions, PBC)的随机球体骨料及骨料-水泥界面过渡区(Interfacial Transition Zone, ITZ)模型。即采用周期性代表性体积单元法(Periodic Representative Vol…...