Java2

获取登录用户信息

// 获取登录用户信息
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 表达式由六个或七个字段组成,每个字段代表不同的时间单位。从左到右,这些字段依次表示:

  1.  (0-59)
  2. 分钟 (0-59)
  3. 小时 (0-23)
  4.  (1-31)
  5. 月份 (1-12)
  6. 星期 (1-7 或 SUN-SAT0 也可以表示 SUN)
  7. 年份 (* 表示任意年份)
//每天凌晨 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 的主要方法

  1. eq: 等于 (=) 条件。
  2. ne: 不等于 (!=) 条件。
  3. gt: 大于 (>) 条件。
  4. ge: 大于等于 (>=) 条件。
  5. lt: 小于 (<) 条件。
  6. le: 小于等于 (<=) 条件。
  7. like: 包含 (LIKE '%value%') 条件。
  8. likeLeft: 左侧匹配 (LIKE 'value%') 条件。
  9. likeRight: 右侧匹配 (LIKE '%value') 条件。
  10. in: 在集合中 (IN (value1, value2, ...)) 条件。
  11. notIn: 不在集合中 (NOT IN (value1, value2, ...)) 条件。
  12. isNull: 判断字段是否为空 (IS NULL)。
  13. isNotNull: 判断字段是否不为空 (IS NOT NULL)。
  14. between: 在某个区间内 (BETWEEN value1 AND value2)。
  15. notBetween: 不在某个区间内 (NOT BETWEEN value1 AND value2)。
  16. orderByAsc: 升序排序。
  17. orderByDesc: 降序排序。
  18. and: 逻辑与。
  19. 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);
    }
}

  • 7
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值