Mybatis-Plus配置
# mybatis-plus输出sql语句
mybatis-plus:
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
Collectors.groupingBy
Stream Collectors.groupingBy的四种用法 解决分组统计(计数、求和、平均数等)、范围统计、分组合并、分组结果自定义映射等问题
java8中 Collectors.groupingBy用法collector.groupingby炎升的博客-CSDN博客
Collectors.groupingBy是Java 8中引入的一个静态方法,它是用于对元素进行分组操作的Collector(收集器)。它接受一个Function作为参数,用于根据指定的条件对元素进行分组,并返回一个Map对象,其中键是分组条件的结果,值是属于该分组的元素列表。
具体来说,Collectors.groupingBy方法有两种重载形式:
groupingBy(Function<? super T, ? extends K> classifier)该方法接受一个Function对象classifier,用于定义元素的分组条件。此时,在生成的Map中,键类型为分类器函数的返回类型,值类型为属于该分组的元素的列表。groupingBy(Function<? super T, ? extends K> classifier, Collector<? super T, A, D> downstream)该方法除了接受一个Function对象classifier之外,还接受一个Collector对象downstream作为参数。downstream用于对每个分组中的元素进行进一步的操作,例如聚合、计数或转换等。在生成的Map中,值类型由downstream的结果决定。
下面是一个示例代码,展示如何使用Collectors.groupingBy方法对一组整数进行分组:
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
Map<Integer, List<Integer>> groups = numbers.stream()
.collect(Collectors.groupingBy(number -> number % 2));
System.out.println(groups);
输出结果为:
{0=[2, 4, 6, 8, 10], 1=[1, 3, 5, 7, 9]}
在上述示例中,我们使用Collectors.groupingBy方法根据整数的奇偶性进行分组。结果是一个Map对象,其中键为0和1,分别对应偶数和奇数。相应的值则是属于每个分组的整数列表。
这就是Collectors.groupingBy方法的简要介绍。它是Java中非常有用的工具,可以轻松地进行元素分组操作。
concat、concat_ws、group_concat
group_concat用法详解_码说TM的博客-CSDN博客
SQL 函数:concat函数、concat_ws()函数、group_concat()函数_小小白2333的博客-CSDN博客
concat和 concat_ws 区别以及踩出来的坑_小白想做科技宅的博客-CSDN博客
concat(str1, str2,...)
返回结果为连接参数产生的字符串,如果有任何一个参数为null,则返回值为null。
concat_ws()
1、功能:和concat()一样,将多个字符串连接成一个字符串,但是可以一次性指定分隔符(concat_ws就是concat with separator)
2、语法:concat_ws(separator, str1, str2, ...)。第一个参数指定分隔符。需要注意的是分隔符不能为null,如果为null,则返回结果为null。
两者区别
1. 能否拼接INT类型
- concat(1, ‘,’, 2) -> 可以
- concat_ws(1, ‘,’, 2) -> 不可以
2. 拼接NULL
- concat(1, null, 2) -> 结果: null
- concat_ws(’,’, ‘1’, null, ‘2’) -> 结果:1,2
COALESCE 函数
MySQL 技巧:COALESCE 函数的使用 | Specs' Blog-就爱PHP (9iphp.com)
COALESCE() 函数可以接收多个参数,并返回第一个非 NULL 的参数。如果所有参数都为 NULL,则 COALESCE() 函数返回 NULL。
IFNULL 函数接受两个参数,如果不为 NULL 则返回第一个参数,否则返回第二个参数;而 COALESCE 函数使用 n 个参数。如果参数的数量为 2,则两个函数都相同。
ROW_NUMBER函数
功能: 简单的说row_number()从1开始,为每一条分组记录返回一个数字。
Row_number是一个在数据库中用来给查询结果进行编号的函数。它可以用来给每条记录分配一个唯一的数值,并且可以根据指定的排序方式来排序。
以下是一个示例查询,演示如何使用Row_number函数:
SELECT
ROW_NUMBER() OVER (ORDER BY column_name) AS row_num,
column_name
FROM table_name;
在上述查询中,我们使用了ROW_NUMBER函数和OVER子句。ROW_NUMBER函数在每个记录上生成一个递增的唯一编号,而ORDER BY子句则指定了根据哪个字段进行排序。
请注意,column_name和table_name是根据具体的数据库表来确定的。根据需要可以进行适当的替换。
ROW_NUMBER() OVER (ORDER BY xlh DESC)是先把xlh列降序,再为降序以后的每条xlh记录返回一个序号。 ROW_NUMBER() OVER (PARTITION BY COL1 ORDER BY COL2)表示先根据COL1分组,在分组内部根据 COL2排序,而此函数计算的值就表示每组内部排序后的顺序编号(组内编号连续的唯一的)。
PARTITION
SQL中Partition的相关用法sql partition空花缱绻三分的博客-CSDN博客
用于在分区内进行计算。它可以在每个分区内对数据进行排序、聚合、分组等操作。
SELECT id, name, age, salary,
AVG(salary) OVER (PARTITION BY age) AS avg_salary
FROM employees;
根据age列对employees表进行分区。然后,使用AVG()函数计算每个分区内的平均工资
RANK
用于为每一行分配一个排名。它可以根据指定的排序规则,为每个分区内的行进行排名。
SELECT id, name, age, salary,
RANK() OVER (PARTITION BY age ORDER BY salary DESC) AS rank
FROM employees;
根据age列对employees表进行分区。然后,使用RANK()函数为每个分区内的行分配一个排名,按照salary列的降序进行排序。
DENSE_RANK
与RANK()类似,但它不会跳过排名。即如果有两个行具有相同的排序值,则它们将被分配相同的排名。
SELECT id, name, age, salary,
DENSE_RANK() OVER (PARTITION BY age ORDER BY salary DESC) AS dense_rank
FROM employees;
根据age列对employees表进行分区。然后,使用DENSE_RANK()函数为每个分区内的行分配一个排名,按照salary列的降序进行排序
NTILE
用于将数据分成指定数量的桶或分区。它可以将数据均匀分布到每个分区中。
SELECT id, name, age, salary,
NTILE(4) OVER (ORDER BY salary DESC) AS ntile
FROM employees;
将employees表的数据分成4个分区,按照salary列的降序进行分区。然后,使用NTILE()函数为每个分区分配一个编号
MP自定义分页,ipage作为入参
IPage<AssignMarkingTaskExt> ipage = new Page<>(pageNo, pageSize);
List<AssignMarkingTaskExt> tasks =
assignMarkingTaskExtMapper.getAssignMarkingTasks(ipage, assignMarkingGroupId);
注意:方法的返回值为IPage对象,只有这样,在使用时,查询出来的结果才会自动赋值给IPage对象。
MyBatisPlus XML 自定义分页 #yyds干货盘点#51CTO博客mybatisplus自定义sql分页
Sql处理树形结构
Sql中对于树形结构的处理sql树形结构改变世界的猿的博客-CSDN博客
@Data
@ToString
public class TeachplanNode implements Serializable {
private String id;
private String pname;
}
@Data
@ToString
public class TeachplanTree extends TeachplanNode {
List<TeachplanTree> children;
}
@Mapper
public interface TeachplanMapper {
TeachplanTree findTeachplanTree(@Param("courseId") String courseId);
}
<!--使用resultMap来定义接收的类型-->
<resultMap id="teachplanMap" type="com.example.rep.TeachplanTree">
<id property="id" column="one_id"/>
<result property="pname" column="one_name"/>
<collection property="children" ofType="com.example.rep.TeachplanTree">
<id property="id" column="two_id"/>
<result property="pname" column="two_name"/>
<collection property="children" ofType="com.example.rep.TeachplanTree">
<id property="id" column="three_id"/>
<result property="pname" column="three_name"/>
</collection>
</collection>
</resultMap>
<!--使用自连接查询来查询数据结果-->
<select id="findTeachplanTree" resultMap="teachplanMap" parameterType="java.lang.String">
SELECT t1.id one_id,t1.pname one_name,
t2.id two_id,t2.pname two_name,
t3.id three_id,t3.pname three_name
FROM teachplan t1
LEFT JOIN teachplan t2 ON t1.id = t2.parentid
LEFT JOIN teachplan t3 ON t2.id = t3.parentid
WHERE t1.parentid = '0'
<if test="courseId != null and courseId != '' ">
AND t1.courseId = #{courseId}
</if>
ORDER BY t1.orderby,t2.orderby,t3.orderby
</select>
MySQL性能优化
- 当只需要获取一行数据时,使用
LIMIT 1。 - 为搜索字段创建索引。
- 在Join表时,使用相同类型的字段,并为其创建索引。
- 绝对不要使用"
ORDER BY RAND()"语句。 - 避免使用SELECT *,而是明确列出需要查询的字段。
- 使用ENUM而不是
VARCHAR类型。 - 尽可能使用
NOT NULL约束。 - 固定长度的表会更快。
- 拆分大的
DELETE或INSERT语句。 - 越小的列会越快。
基本数据库对象命名
| 数据库对象 | 前缀 |
|---|---|
| 表 (Table) | tbl_ |
| 字段(Column) | 无 |
| 视图 (View) | viw_ |
| 存储过程 (Stored procedure) | prd_ |
| 触发器(Trigger) | trg_ |
| 索引(Index) | idx_ |
| 主键(Primary key) | pk_ |
| 外键(Foreign key) | fk_ |
| Check 约束(Check Constraint) | ck_ |
| Default 约束(Default Constraint) | df_ |
| 用户定义数据类型 (User-defined data type) | udt_ |
| 用户定义函数 (User-defined function) | fun_ |