【Lazy ORM 框架学习】
Gitee
点赞关注不迷路 项目地址
快速入门
模块 | 所属层级 | 描述 | 快照版本 | 正式版本 |
---|---|---|---|---|
wu-database-lazy-lambda | lambda | 针对不同数据源 | ![]() | ![]() |
wu-database-lazy-orm-core | orm 核心 | orm核心处理 | ![]() | ![]() |
wu-database-lazy-sql | sql核心处理成 | 处理sql解析、sql执行、sql映射 | ![]() | ![]() |
wu-elasticsearch-starter | ES | ES | ![]() | ![]() |
wu-hbase-starter | hbase | hbase | ![]() | ![]() |
wu-database-lazy-datasource-starter | 数据源处理 | 数据源处理 | ![]() | ![]() |
简介
特性
- 强大的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 表,其表结构如下:
id | name | annual_salary | |
---|---|---|---|
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 |
其对应的数据库 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;
}
属性 | 类型 | 必须指定 | 默认值 | 描述 |
---|---|---|---|---|
tableName | String | 否 | “” | 表名 |
schema | String | 否 | “” | schema |
comment | String | 否 | “” | 表注释 |
perfectTable | boolean | 否 | “false” | 完善表 |
smartFillField | boolean | 否 | false | 智能填充bean属性 针对数据源 如mysql查询结果、http请求结果中包含的数据字段不再当前对象中 |
@LazyTableFieldId
@LazyTable(tableName = "sys_user")
public class User {@LazyTableFieldIdprivate Long id;private String name;private Integer annualSalary;private String email;
}
属性 | 类型 | 必须指定 | 默认值 | 描述 |
---|---|---|---|---|
value | String | 否 | “” | 字段名 |
name | String | 否 | “” | 字段名 |
comment | String | 否 | “” | 字段注释 |
type | String | 否 | “” | 字段了类型(varchar、int等) |
indexType | LayerField.LayerFieldType | 否 | LayerField.LayerFieldType.ID | 索引类型 |
idType | IdType | 否 | AUTOMATIC_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;
}
属性 | 类型 | 必须指定 | 默认值 | 描述 |
---|---|---|---|---|
value | String | 否 | “” | 字段名 |
name | String | 否 | “” | 字段名 |
comment | String | 否 | “” | 字段注释 |
columnType | String | 否 | “” | 字段了类型(varchar、int等) |
exist | boolean | 否 | true | 是否存在 |
indexType | LayerField.LayerFieldType | 否 | LayerField.LayerFieldType.ID | 索引类型 |
idType | IdType | 否 | AUTOMATIC_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);
参数说明
类型 | 参数名 | 描述 |
---|---|---|
T | t | 实体对象 |
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);
参数说明
类型 | 参数名 | 描述 |
---|---|---|
Page | lazyPage | 分页对象 |
Class | returnType | 返回数据类型 |
String | sql | 执行的sql语句 |
Object… | params | sql执行参数 |
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);
参数说明
类型 | 参数名 | 描述 |
---|---|---|
Class | t | 返回数据类型 |
String | sql | 执行的sql语句 |
Object… | params | sql执行参数 |
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);
参数说明
类型 | 参数名 | 描述 |
---|---|---|
Class | t | 返回数据类型 |
String | sql | 执行的sql语句 |
Object… | params | sql执行参数 |
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);
参数说明
类型 | 参数名 | 描述 |
---|---|---|
PersistenceRepository | persistenceRepository | 预执行SQL需要的属性 |
execute 案例
// 使用相当灵活、想咋玩就咋玩
executeOne
/*** 执行操作** @param persistenceRepository* @return*/
Object executeOne(PersistenceRepository persistenceRepository);
参数说明
类型 | 参数名 | 描述 |
---|---|---|
PersistenceRepository | persistenceRepository | 预执行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);
参数说明
类型 | 参数名 | 描述 |
---|---|---|
String | nameDatabase | 数据库名 默认当前连接数据 |
saveSoftSqlFile
/*** @param nameDatabase 数据库名 默认当前连接数据* System.getProperty("user.dir") 数据文件地址* @return 保存数据到本地数据* description 柔和形 数据库数据存储到sql文件(表存在不删除 数据使用upsert)* @author Jiawei Wu* @date 2021/1/31 6:40 下午**/
void saveSoftSqlFile(String nameDatabase);
参数说明
类型 | 参数名 | 描述 |
---|---|---|
String | nameDatabase | 数据库名 默认当前连接数据 |
saveUpsertSqlFile
/*** describe 导出增量式更新数据** @param nameDatabase 数据库名 默认当前连接数据* System.getProperty("user.dir") 数据文件地址* @return 保存数据到本地数据* @author Jia wei Wu* @date 2022/4/9 22:57**/
void saveUpsertSqlFile(String nameDatabase);
参数说明
类型 | 参数名 | 描述 |
---|---|---|
String | nameDatabase | 数据库名 默认当前连接数据 |
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);
参数说明
类型 | 参数名 | 描述 |
---|---|---|
String | schema | 数据库名 |
String | table | 表名 |
Long | num | 数量 |
stuffedAll
/*** 塞入所有数据** @param num*/
void stuffedAll(Long num);
参数说明
类型 | 参数名 | 描述 |
---|---|---|
Long | num | 存储数据数量 |
stuffedJava
/*** describe 根据表明创建出Java文件** @param schema 数据库* @param tableName 表名* @return* @author Jia wei Wu* @date 2022/1/23 12:23 上午**/
void stuffedJava(String schema, String tableName);
参数说明
类型 | 参数名 | 描述 |
---|---|---|
String | schema | 数据库 |
String | tableName | 表名 |
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…...

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

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

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等,这些算法容易理解,适用各种数据,在解决各种问题时都有良好表现,尤其是以树模型为核心的各种集成算法,在各个行业和领域都有广泛的…...

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发送邮件如何做配置?使用AWS SES发信的限制? 在使用AWS SES发送邮件时,可能会遇到一些常见的错误。AokSend将介绍一些常见的AWS SES发送邮件错误及其相应的解决方法,帮助用户更好地利用AWS SES进行邮件发送。 AWS SES发送…...

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

Spring(详细介绍)
目录 一、简介 1、什么是Spring? 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 用户名:system 密码:****** 端口号:30015 Oracle环境 192.168.xx.xx 用户名 HANA_TEST 密码 ****** 端口号:31001 配置java环境变量 因为本次数据转换测试为将HANA数据转换到Or…...

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

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

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

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

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

鱼眼相机的测距流程及误差分析[像素坐标系到空间一点以及测距和误差分析]
由于最近在整理单目测距的内容,顺手也总结下鱼眼相机的测距流程和误差分析,如果有错误,还请不吝赐教。 参考链接: 鱼眼镜头的成像原理到畸变矫正(完整版) 相机模型总结(针孔、鱼眼、全景) 三维…...

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

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

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

【嵌入式智能产品开发实战】(十二)—— 政安晨:通过ARM-Linux掌握基本技能【C语言程序的安装运行】
目录 程序的安装 程序安装的本质 在Linux下制作软件安装包 政安晨的个人主页:政安晨 欢迎 👍点赞✍评论⭐收藏 收录专栏: 嵌入式智能产品开发实战 希望政安晨的博客能够对您有所裨益,如有不足之处,欢迎在评论区提出指正…...

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

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

设计模式,装修模式,Php代码演示,优缺点,注意事项
装饰模式(Decorator Pattern)是一种结构型设计模式,它允许动态地向一个现有对象添加新的功能或行为,而不改变其原始结构。在 PHP 中,可以使用类的继承和组合来实现装饰模式。下面是一个简单的 PHP 装饰模式示例代码&am…...

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

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

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

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

BM19 寻找峰值(二分查找)
import java.util.*; public class Solution {/*** 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可** * 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…...