【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下制作软件安装包 政安晨的个人主页:政安晨 欢迎 👍点赞✍评论⭐收藏 收录专栏: 嵌入式智能产品开发实战 希望政安晨的博客能够对您有所裨益,如有不足之处,欢迎在评论区提出指正…...

大话软工笔记—需求分析概述
需求分析,就是要对需求调研收集到的资料信息逐个地进行拆分、研究,从大量的不确定“需求”中确定出哪些需求最终要转换为确定的“功能需求”。 需求分析的作用非常重要,后续设计的依据主要来自于需求分析的成果,包括: 项目的目的…...

Appium+python自动化(十六)- ADB命令
简介 Android 调试桥(adb)是多种用途的工具,该工具可以帮助你你管理设备或模拟器 的状态。 adb ( Android Debug Bridge)是一个通用命令行工具,其允许您与模拟器实例或连接的 Android 设备进行通信。它可为各种设备操作提供便利,如安装和调试…...

.Net框架,除了EF还有很多很多......
文章目录 1. 引言2. Dapper2.1 概述与设计原理2.2 核心功能与代码示例基本查询多映射查询存储过程调用 2.3 性能优化原理2.4 适用场景 3. NHibernate3.1 概述与架构设计3.2 映射配置示例Fluent映射XML映射 3.3 查询示例HQL查询Criteria APILINQ提供程序 3.4 高级特性3.5 适用场…...

如何在看板中体现优先级变化
在看板中有效体现优先级变化的关键措施包括:采用颜色或标签标识优先级、设置任务排序规则、使用独立的优先级列或泳道、结合自动化规则同步优先级变化、建立定期的优先级审查流程。其中,设置任务排序规则尤其重要,因为它让看板视觉上直观地体…...

STM32F4基本定时器使用和原理详解
STM32F4基本定时器使用和原理详解 前言如何确定定时器挂载在哪条时钟线上配置及使用方法参数配置PrescalerCounter ModeCounter Periodauto-reload preloadTrigger Event Selection 中断配置生成的代码及使用方法初始化代码基本定时器触发DCA或者ADC的代码讲解中断代码定时启动…...
MVC 数据库
MVC 数据库 引言 在软件开发领域,Model-View-Controller(MVC)是一种流行的软件架构模式,它将应用程序分为三个核心组件:模型(Model)、视图(View)和控制器(Controller)。这种模式有助于提高代码的可维护性和可扩展性。本文将深入探讨MVC架构与数据库之间的关系,以…...

听写流程自动化实践,轻量级教育辅助
随着智能教育工具的发展,越来越多的传统学习方式正在被数字化、自动化所优化。听写作为语文、英语等学科中重要的基础训练形式,也迎来了更高效的解决方案。 这是一款轻量但功能强大的听写辅助工具。它是基于本地词库与可选在线语音引擎构建,…...

Unsafe Fileupload篇补充-木马的详细教程与木马分享(中国蚁剑方式)
在之前的皮卡丘靶场第九期Unsafe Fileupload篇中我们学习了木马的原理并且学了一个简单的木马文件 本期内容是为了更好的为大家解释木马(服务器方面的)的原理,连接,以及各种木马及连接工具的分享 文件木马:https://w…...

HarmonyOS运动开发:如何用mpchart绘制运动配速图表
##鸿蒙核心技术##运动开发##Sensor Service Kit(传感器服务)# 前言 在运动类应用中,运动数据的可视化是提升用户体验的重要环节。通过直观的图表展示运动过程中的关键数据,如配速、距离、卡路里消耗等,用户可以更清晰…...

浪潮交换机配置track检测实现高速公路收费网络主备切换NQA
浪潮交换机track配置 项目背景高速网络拓扑网络情况分析通信线路收费网络路由 收费汇聚交换机相应配置收费汇聚track配置 项目背景 在实施省内一条高速公路时遇到的需求,本次涉及的主要是收费汇聚交换机的配置,浪潮网络设备在高速项目很少,通…...