获取登录用户信息
// 获取登录用户信息
LoginUser loginUser = SecurityUtils.getLoginUser();
// 获取用户ID
String userId = loginUser.getUser().getUserId();
非空判断
//最基础的非空检查,只检查是否为 null
!= null
//检查是否为 null 或者空字符串
.length() > 0 或 .isEmpty()
//检查是否为 null、空字符串或仅包含空白字符
.trim().isEmpty()
//检查是否非 null 并且非空字符串
StringUtils.isNotEmpty
//检查是否非 null、非空字符串且非空白字符串。
StringUtils.isNotBlank
Optional.ofNullable方法用于创建一个可以包含也可以不包含值的Optional对象,如果传入的值为null,返回一个空的Optional对象
Integer num = 10;
Optional<Integer> optionalFull = Optional.ofNullable(num);
System.out.println(optionalFull.isPresent()); // 输出 true
System.out.println(optionalFull.get()); // 输出 10
//方法来检查集合是否为空
Collection.isEmpty()
//用于检查一个对象是否为 null
Objects.isNull
BeanUtils.copyProperties
BeanUtils.copyProperties
方法通常用于以下场景:
- 在不同的 JavaBean 之间复制属性值。
- 在对象之间传递数据时,减少手动复制属性的工作量。
- 在 DTO 和 VO 之间进行转换时,简化代码。
//将 SourceBean 的属性值复制到 TargetBean 中
BeanUtils.copyProperties(targetBean, sourceBean);
时间操作
// 获取当前时间
Date nowTime = new Date();
时间类型转换
1. LocalDateTime
到 Date
public class LocalDateTimeToDateExample {
public static void main(String[] args) {
LocalDateTime localDateTime = LocalDateTime.now();
Date date = dateFromLocalDateTime(localDateTime);
System.out.println("Converted Date: " + date);
}
public static Date dateFromLocalDateTime(LocalDateTime localDateTime) {
ZonedDateTime zonedDateTime = localDateTime.atZone(ZoneId.systemDefault());
return Date.from(zonedDateTime.toInstant());
}
}
2. Date
到 LocalDateTime
public class DateToLocalDateTimeExample {
public static void main(String[] args) {
Date date = new Date();
LocalDateTime localDateTime = localDateTimeFromDate(date);
System.out.println("Converted LocalDateTime: " + localDateTime);
}
public static LocalDateTime localDateTimeFromDate(Date date) {
Instant instant = date.toInstant();
ZoneId zoneId = ZoneId.systemDefault();
return instant.atZone(zoneId).toLocalDateTime();
}
}
3. LocalDate
到 Date
public class LocalDateToDateExample {
public static void main(String[] args) {
LocalDate localDate = LocalDate.now();
Date date = dateFromLocalDate(localDate);
System.out.println("Converted Date: " + date);
}
public static Date dateFromLocalDate(LocalDate localDate) {
ZonedDateTime zonedDateTime = localDate.atStartOfDay().atZone(ZoneId.systemDefault());
return Date.from(zonedDateTime.toInstant());
}
}
4. Date
到 LocalDate
public class DateToLocalDateExample {
public static void main(String[] args) {
Date date = new Date();
LocalDate localDate = localDateFromDate(date);
System.out.println("Converted LocalDate: " + localDate);
}
public static LocalDate localDateFromDate(Date date) {
Instant instant = date.toInstant();
ZoneId zoneId = ZoneId.systemDefault();
return instant.atZone(zoneId).toLocalDate();
}
}
定义日期格式通常使用 SimpleDateFormat 类或 DateTimeFormatter 类
// 创建一个日期对象
Date currentDate = new Date();
// 定义日期格式
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
// 格式化日期
String formattedDate = sdf.format(currentDate);
// 输出格式化后的日期
System.out.println("Formatted Date: " + formattedDate);
// 定义日期格式
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMM");
// 获取当前日期
LocalDate today = LocalDate.now();
// 获取这个月的月初日期
LocalDateTime startOfMonth = today.withDayOfMonth(1).atStartOfDay();
// 获取这个月的月末日期并设置时间为23:59:59
LocalDateTime endOfMonth = today.withDayOfMonth(today.lengthOfMonth()).atTime(23, 59, 59);
// 获取年初日期
LocalDateTime startOfYear = today.withDayOfYear(1).atStartOfDay();
设置一个具体的日期和时间(包括小时、分钟和秒)
1. 使用 LocalDateTime
LocalDateTime dateTime = LocalDateTime.of(2022, 1, 1, 10, 30, 45);
2. 使用 LocalDate
和 atTime()
// 已有的日期
LocalDate existingDate = LocalDate.now();
// 设置具体的时间
LocalTime specificTime = LocalTime.of(14, 30, 0);
LocalDateTime dateTime = existingDate.atTime(specificTime);
3. 使用 LocalDateTime
的 withHour()
, withMinute()
, withSecond()
// 当前的时间
LocalDateTime now = LocalDateTime.now();
// 设置具体的时间
LocalDateTime specificDateTime = now.withHour(14).withMinute(30).withSecond(0);
4.使用java.util.Calendar
类
Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.YEAR, 2022);
calendar.set(Calendar.MONTH, Calendar.JANUARY); // 月份从0开始,所以1月是0
calendar.set(Calendar.DAY_OF_MONTH, 1);
calendar.set(Calendar.HOUR_OF_DAY, 10);
calendar.set(Calendar.MINUTE, 30);
calendar.set(Calendar.SECOND, 45);
按照逗号分隔符进行分割,得到两个字符串数组
String input = "apple,banana,orange";
String[] splitStrings = input.split(",");
String.join 使用示例
String[] fruits = {"apple", "banana", "orange"};
String joinedFruits = String.join(", ", fruits);
常用的循环方式
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
// foreach 循环
System.out.println("Foreach loop:");
for (Integer number : numbers) {
System.out.println(number);
}
// 传统的 for 循环
System.out.println("Traditional for loop:");
for (int i = 0; i < numbers.size(); i++) {
System.out.println(numbers.get(i));
}
// 使用 Stream 和 Lambda 表达式的循环
System.out.println("Stream with Lambda:");
numbers.stream().forEach(number -> System.out.println(number));
总结
foreach
循环:适用于简单遍历,不需要索引。- 传统的
for
循环:适用于需要索引的场景,更灵活。 - 使用 Stream 和 Lambda 表达式:适用于需要对集合进行复杂操作的情况,代码更加简洁。
Stream 的常见操作
中间操作
filter(Predicate<T> predicate)
: 过滤流中的元素。map(Function<T, R> mapper)
: 映射流中的元素。flatMap(Function<T, Stream<R>> mapper)
: 将流中的元素映射为新的流。sorted()
: 对流中的元素进行排序。
终端操作
forEach(Consumer<T> action)
: 对流中的每个元素执行一个动作。collect(Collector<T, A, R> collector)
: 将流中的元素收集到集合或其他容器。reduce(BinaryOperator<T> accumulator)
: 将流中的元素累积起来。count()
: 返回流中的元素数量。max(Comparator<T> comparator)
: 返回流中的最大值。min(Comparator<T> comparator)
: 返回流中的最小值。findFirst()
: 返回流中的第一个元素。anyMatch(Predicate<T> predicate)
: 测试是否至少有一个元素满足条件。allMatch(Predicate<T> predicate)
: 测试是否所有的元素都满足条件。noneMatch(Predicate<T> predicate)
: 测试是否没有任何元素满足条件。
//示例:过滤和映射
List<String> names = Arrays.asList("Alice", "Bob", "Charlie", "David");
List<String> filteredNames = names.stream()
.filter(name -> name.startsWith("A"))
.map(String::toUpperCase)
.collect(Collectors.toList());
System.out.println(filteredNames); // 输出: [ALICE]
//示例:排序和收集
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
List<Integer> sortedNumbers = numbers.stream()
.sorted(Comparator.reverseOrder())
.collect(Collectors.toList());
System.out.println(sortedNumbers); // 输出: [5, 4, 3, 2, 1]
//示例:使用 Lambda 表达式进行过滤
List<String> names = Arrays.asList("Alice", "Bob", "Charlie", "David");
names.stream()
.filter(name -> name.startsWith("A"))
.forEach(System.out::println);
三元运算符:
int age = 18;
// 使用三元运算符判断年龄是否达到法定投票年龄
String canVote = (age >= 18) ? "可以投票" : "不可以投票";
//如果 mt 为 null 或者为空字符串,那么 mt 的值将被设置为 wt 的值;
//如果 mt 不为 null 且不为空字符串,那么 mt 的值保持不变
mt = mt == null || mt.isEmpty() ? wt : mt;
常用的 BigDecimal
方法
常用构造方法
// 使用字符串创建 BigDecimal
BigDecimal bd1 = new BigDecimal("123.456");
// 使用 double 创建 BigDecimal (可能有精度损失)
BigDecimal bd2 = new BigDecimal(123.456);
// 使用 long 创建 BigDecimal
BigDecimal bd3 = new BigDecimal(123L);
基本算术运算
BigDecimal num1 = new BigDecimal("10.5");
BigDecimal num2 = new BigDecimal("5.5");
// 加法
BigDecimal sum = num1.add(num2); // 16.0
// 减法
BigDecimal diff = num1.subtract(num2); // 5.0
// 乘法
BigDecimal product = num1.multiply(num2); // 57.75
// 除法
BigDecimal quotient = num1.divide(num2, 2, RoundingMode.HALF_UP); // 1.91 (保留两位小数)
舍入模式
BigDecimal num = new BigDecimal("10.555");
// 设置标度并舍入
BigDecimal rounded = num.setScale(2, RoundingMode.HALF_UP); // 10.56
比较方法
BigDecimal num1 = new BigDecimal("10.5");
BigDecimal num2 = new BigDecimal("5.5");
// 比较大小
int comparison = num1.compareTo(num2); // 1 (num1 > num2)
// 判断是否相等
boolean isEqual = num1.equals(num2); // false
转换方法
BigDecimal num = new BigDecimal("10.5");
// 转换为整数类型
int intValue = num.intValue(); // 10
long longValue = num.longValue(); // 10
// 转换为浮点类型
double doubleValue = num.doubleValue(); // 10.5
float floatValue = num.floatValue(); // 10.5
// 转换为字符串
String str = num.toString();
@Scheduled
设置定时任务
Cron 表达式由六个或七个字段组成,每个字段代表不同的时间单位。从左到右,这些字段依次表示:
- 秒 (
0-59
) - 分钟 (
0-59
) - 小时 (
0-23
) - 天 (
1-31
) - 月份 (
1-12
) - 星期 (
1-7
或SUN-SAT
,0
也可以表示SUN
) - 年份 (
*
表示任意年份)
//每天凌晨 3 点执行一次
@Scheduled(cron = "0 0 3 * * ?")
UserMapper.xml
文件的对应的 SQL 语句
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.mapper.UserMapper">
<insert id="insert" parameterType="com.example.model.User">
INSERT INTO users (username, password, email)
VALUES (#{username}, #{password}, #{email})
</insert>
<select id="selectById" resultType="com.example.model.User">
SELECT *
FROM users
WHERE id = #{id}
</select>
<!-- 添加排序 -->
<select id="selectAllWithSort" resultType="com.example.model.User">
SELECT *
FROM users
ORDER BY id DESC
</select>
<!-- 分页查询 -->
<select id="selectAllWithPagination" resultType="com.example.model.User">
SELECT *
FROM users
LIMIT #{offset}, #{limit}
</select>
<!-- 条件查询 -->
<select id="selectByCriteria" resultType="com.example.model.User">
SELECT *
FROM users
<where>
<if test="username != null">
AND username = #{username}
</if>
<if test="email != null">
AND email = #{email}
</if>
</where>
</select>
<!-- 多表关联查询 -->
<select id="selectUserWithAddress" resultType="com.example.model.UserWithAddress">
SELECT u.*, a.address_line_1, a.address_line_2, a.city, a.state, a.postal_code
FROM users u
LEFT JOIN addresses a ON u.id = a.user_id
WHERE u.id = #{userId}
</select>
<update id="update" parameterType="com.example.model.User">
UPDATE users
SET username = #{username},
password = #{password},
email = #{email}
WHERE id = #{id}
</update>
<delete id="deleteById" parameterType="int">
DELETE FROM users
WHERE id = #{id}
</delete>
</mapper>
LambdaQueryWrapperX 的主要方法
eq
: 等于 (=
) 条件。ne
: 不等于 (!=
) 条件。gt
: 大于 (>
) 条件。ge
: 大于等于 (>=
) 条件。lt
: 小于 (<
) 条件。le
: 小于等于 (<=
) 条件。like
: 包含 (LIKE '%value%'
) 条件。likeLeft
: 左侧匹配 (LIKE 'value%'
) 条件。likeRight
: 右侧匹配 (LIKE '%value'
) 条件。in
: 在集合中 (IN (value1, value2, ...)
) 条件。notIn
: 不在集合中 (NOT IN (value1, value2, ...)
) 条件。isNull
: 判断字段是否为空 (IS NULL
)。isNotNull
: 判断字段是否不为空 (IS NOT NULL
)。between
: 在某个区间内 (BETWEEN value1 AND value2
)。notBetween
: 不在某个区间内 (NOT BETWEEN value1 AND value2
)。orderByAsc
: 升序排序。orderByDesc
: 降序排序。and
: 逻辑与。or
: 逻辑或。
@Service
public class UserService {
private final UserMapper userMapper;
@Autowired
public UserService(UserMapper userMapper) {
this.userMapper = userMapper;
}
public List<User> getUsersByNameAndAge(String name, Integer minAge, Integer maxAge) {
LambdaQueryWrapperX<User> queryWrapper = new LambdaQueryWrapperX<User>()
.eq(User::getName, name)
.between(User::getAge, minAge, maxAge)
.orderByDesc(User::getAge); // 降序排序
return userMapper.selectList(queryWrapper);
}
public List<User> getUsersByCriteria(User criteria) {
LambdaQueryWrapperX<User> queryWrapper = new LambdaQueryWrapperX<User>()
.eq(User::getId, criteria.getId())
.eq(User::getName, criteria.getName())
.eq(User::getAge, criteria.getAge())
.eq(User::getEmail, criteria.getEmail());
return userMapper.selectList(queryWrapper);
}
}