笔记25.9.14(QueryWrapper,Builder ,Stream流处理,forEach)
一,MyBatis-Plus的主要功能
1,条件构造器查询
1,QueryWrapper示例
public List<User> complexQuery() {QueryWrapper<User> wrapper = new QueryWrapper<>();// 等于wrapper.eq("age", 25);// 大于wrapper.gt("age", 18);// 模糊查询wrapper.like("name", "张");// 范围查询wrapper.between("age", 18, 30);// 排序wrapper.orderByDesc("create_time");// 分组wrapper.groupBy("age");return userMapper.selectList(wrapper);
}
2,LambdaQueryWrapper(类型安全)
public List<User> lambdaQuery() {LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>();wrapper.eq(User::getAge, 25).like(User::getName, "张").orderByDesc(User::getCreateTime);return userMapper.selectList(wrapper);
}
2,乐观锁
@Version
@Data
@TableName("product")
public class Product {@TableIdprivate Long id;private String name;private Integer price;@Version // 乐观锁注解private Integer version;
}
3,逻辑删除
@Data
@TableName("user")
public class User {@TableIdprivate Long id;private String name;@TableLogic // 逻辑删除private Integer deleted;
}// 配置
mybatis-plus:global-config:db-config:logic-delete-value: 1 # 逻辑已删除值logic-not-delete-value: 0 # 逻辑未删除值
二,构建器模式(Builder Pattern)
1. 构建器模式基础概念
构建器模式是一种创建型设计模式,它允许你分步骤创建复杂对象,而不是通过一个庞大的构造函数。
// 传统方式 - 参数过多,难以维护
User user = new User("张三", 25, "zhangsan@email.com", "男", "北京", "13800138000");// 构建器模式 - 清晰易读
User user = User.builder().name("张三").age(25).email("zhangsan@email.com").gender("男").address("北京").phone("13800138000").build();
三. Stream流处理
1,什么是Stream?
Stream是Java 8引入的函数式编程特性,用于处理集合数据,支持链式操作。
List<String> names = Arrays.asList("张三", "李四", "王五", "赵六");// 传统方式
List<String> result = new ArrayList<>();
for (String name : names) {if (name.length() > 1) {result.add(name.toUpperCase());}
}// Stream方式
List<String> result = names.stream().filter(name -> name.length() > 1).map(String::toUpperCase).collect(Collectors.toList());
四,Java forEach详解
1. forEach基本概念
forEach
是Java中用于遍历集合元素的方法,它接受一个Consumer
函数式接口作为参数,对集合中的每个元素执行指定操作。
2. Iterable.forEach() - Java 8新特性
基本使用示例
List<String> names = Arrays.asList("张三", "李四", "王五", "赵六");// 传统for-each循环
for (String name : names) {System.out.println(name);
}// forEach方法
names.forEach(name -> System.out.println(name));// 方法引用
names.forEach(System.out::println);// 使用自定义方法
names.forEach(this::printName);
3. 不同集合类型的forEach
List.forEach()
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);// Lambda表达式
numbers.forEach(num -> System.out.println("数字: " + num));// 方法引用
numbers.forEach(System.out::println);// 匿名内部类
numbers.forEach(new Consumer<Integer>() {@Overridepublic void accept(Integer num) {System.out.println("数字: " + num);}
});
Map.forEach()
Map<String, Integer> scores = new HashMap<>();
scores.put("张三", 85);
scores.put("李四", 92);
scores.put("王五", 78);// Map特有的forEach,接受BiConsumer
scores.forEach((name, score) -> {System.out.println(name + "的分数是: " + score);
});// 等价的传统方式
for (Map.Entry<String, Integer> entry : scores.entrySet()) {System.out.println(entry.getKey() + "的分数是: " + entry.getValue());
}
Stream.forEach()
List<String> names = Arrays.asList("张三", "李四", "王五");// Stream中的forEach
names.stream().filter(name -> name.length() > 1).forEach(System.out::println);
实际应用示例
数据处理和转换
@Data
class User {private String name;private Integer age;private String email;public User(String name, Integer age, String email) {this.name = name;this.age = age;this.email = email;}
}List<User> users = Arrays.asList(new User("张三", 25, "zhangsan@example.com"),new User("李四", 30, "lisi@example.com"),new User("王五", 35, "wangwu@example.com")
);// 打印所有用户信息
users.forEach(user -> {System.out.println("姓名: " + user.getName() + ", 年龄: " + user.getAge() + ", 邮箱: " + user.getEmail());
});// 发送邮件给所有用户
users.forEach(user -> sendEmail(user.getEmail(), "系统通知"));private void sendEmail(String email, String message) {System.out.println("发送邮件到: " + email + ", 内容: " + message);
}