官方网站开发哪家好温州网站建设钱
官方网站开发哪家好,温州网站建设钱,wordpress 更新问题,在线网站生成器视频看了几百小时还迷糊#xff1f;关注我#xff0c;几分钟让你秒懂#xff01;#xff08;发点评论可以给博主加热度哦#xff09; 一、为什么用 MyBatis-Plus#xff1f;真实痛点 vs 神器
很多开发者还在手写 CRUD#xff1a;
// 手写 Mapper XML#xff0c;重复又…视频看了几百小时还迷糊关注我几分钟让你秒懂发点评论可以给博主加热度哦一、为什么用 MyBatis-Plus真实痛点 vs 神器很多开发者还在手写 CRUD// 手写 Mapper XML重复又易错 select idselectUserByName resultTypeUser SELECT * FROM user WHERE name #{name} /selectMyBatis-PlusMP是什么✅ 它是 MyBatis 的增强工具在MyBatis 的基础上只做增强不做改变。✅ 自动注入通用 CRUD 方法无需写 SQL一行代码搞定增删改查 场景快速开发后台管理系统用户管理、商品管理、订单管理……每张表都要写 5~10 个基础接口时间紧、任务重、还要防 SQL 注入MP 方案// 继承 BaseMapper直接拥有 20 个方法 public interface UserMapper extends BaseMapperUser {}// 查询名字为 张三 的用户 ListUser users userMapper.selectList( new QueryWrapperUser().eq(name, 张三) );✅ 零 XML、零 SQL、类型安全、防注入二、Spring Boot MyBatis-Plus 快速集成正确姿势第一步添加依赖pom.xmldependency groupIdcom.baomidou/groupId artifactIdmybatis-plus-boot-starter/artifactId version3.5.5/version /dependency !-- 数据库驱动以 MySQL 为例 -- dependency groupIdmysql/groupId artifactIdmysql-connector-java/artifactId scoperuntime/scope /dependency⚠️ 注意不要同时引入mybatis-spring-boot-starterMP 已包含第二步配置application.ymlspring: datasource: url: jdbc:mysql://localhost:3306/test?useUnicodetruecharacterEncodingutf8serverTimezoneGMT%2B8 username: root password: 123456 driver-class-name: com.mysql.cj.jdbc.Driver mybatis-plus: configuration: log-impl: org.apache.ibatis.logging.stdout.StdOutImpl # 打印SQL日志 global-config: db-config: id-type: auto # 主键自增 table-prefix: t_ # 表名前缀如实体类 User 对应 t_user第三步定义实体类关键注解Data TableName(t_user) // 指定表名 public class User { TableId(type IdType.AUTO) // 主键策略 private Long id; TableField(user_name) // 字段映射数据库字段是 user_name private String userName; private Integer age; TableField(exist false) // 非数据库字段如密码确认 private String confirmPassword; }第四步Mapper 接口一行代码功能全有Mapper public interface UserMapper extends BaseMapperUser { // 无需写任何方法BaseMapper 已提供 // insert, deleteById, updateById, selectById, selectList... }第五步Service 层推荐使用 MP 的 IServiceService public class UserService implements IServiceUser { Autowired private UserMapper userMapper; // 可直接调用 getBaseMapper() 使用 CRUD public void demo() { // 插入 User user new User(); user.setUserName(李四); user.setAge(25); save(user); // 来自 IService // 查询 ListUser list list(new QueryWrapperUser() .ge(age, 18) .like(user_name, 李) ); } }✅ 优势IService提供更多便捷方法如saveBatch、updateBatchById等。三、高频反例 致命陷阱90% 新手都中招❌ 反例1滥用select *导致性能爆炸// 错误查询所有字段即使只需要 id 和 name ListUser users userMapper.selectList(null);✅ 正确只查需要的字段// 方式1QueryWrapper.select() ListUser users userMapper.selectList( new QueryWrapperUser().select(id, user_name) ); // 方式2自定义 DTO Select Select(SELECT id, user_name FROM t_user WHERE age #{age}) ListUserDTO selectSimpleUsers(Param(age) int age);❌ 反例2手动拼接 SQL引发注入漏洞// 危险用户输入 ; DROP TABLE t_user; -- 就完蛋了 String sql SELECT * FROM t_user WHERE name name ;✅ 正确永远使用 Wrapper 或参数绑定// 安全MP 自动参数化 userMapper.selectList(new QueryWrapperUser().eq(user_name, name));❌ 反例3批量操作不用 MP 的 batch 方法 → 慢如蜗牛// 错误循环单条插入1万条 1万次数据库交互 for (User user : userList) { userMapper.insert(user); }✅ 正确使用saveBatchuserService.saveBatch(userList, 1000); // 分批提交每批1000条 原理MP 内部使用ExecutorType.BATCH极大提升性能。❌ 反例4逻辑删除配置错误 → 数据“假删”变“真丢”// 实体类未加 TableLogic private Integer deleted; // 0-正常1-删除✅ 正确配置// 1. 实体类标注 TableLogic private Integer deleted; // 2. 全局配置application.yml mybatis-plus: global-config: db-config: logic-delete-value: 1 # 删除值 logic-not-delete-value: 0 # 未删除值 效果userMapper.deleteById(1)→ 实际执行UPDATE ... SET deleted 1userMapper.selectById(1)→ 自动追加WHERE deleted 0❌ 反例5分页插件未注册 → 分页失效// 直接调用 page 方法结果返回全部数据 IPageUser page userService.page(new Page(1, 10));✅ 正确必须注册分页插件Configuration public class MybatisPlusConfig { Bean public MybatisPlusInterceptor mybatisPlusInterceptor() { MybatisPlusInterceptor interceptor new MybatisPlusIntercepter(); // 注意拼写 interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL)); return interceptor; } }⚠️ 注意MP 3.4.0 使用MybatisPlusInterceptor旧版用PaginationInterceptor。四、高级技巧让 MP 更高效1. 自动填充创建/更新时间TableField(fill FieldFill.INSERT) private LocalDateTime createTime; TableField(fill FieldFill.INSERT_UPDATE) private LocalDateTime updateTime; Component public class MyMetaObjectHandler implements MetaObjectHandler { Override public void insertFill(MetaObject metaObject) { this.strictInsertFill(metaObject, createTime, LocalDateTime::now, LocalDateTime.class); this.strictUpdateFill(metaObject, updateTime, LocalDateTime::now, LocalDateTime.class); } Override public void updateFill(MetaObject metaObject) { this.strictUpdateFill(metaObject, updateTime, LocalDateTime::now, LocalDateTime.class); } }2. 乐观锁防止并发更新Version private Integer version; // 配置插件 interceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());五、总结MyBatis-Plus 使用 Checklist项目正确做法依赖只引mybatis-plus-boot-starter主键用TableId明确策略字段映射用TableField处理下划线查询用QueryWrapper禁止字符串拼接批量用saveBatch/updateBatchById分页注册PaginationInnerInterceptor逻辑删除配置TableLogic 全局规则性能避免select *只查必要字段MyBatis-Plus 不是“魔法”而是规范 约定。用对了开发效率翻倍用错了埋下性能炸弹视频看了几百小时还迷糊关注我几分钟让你秒懂发点评论可以给博主加热度哦