滚雪球学MyBatis-Plus(12):高级功能

2024-09-05 17:20

本文主要是介绍滚雪球学MyBatis-Plus(12):高级功能,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

前言

在上期内容中,我们详细探讨了 MyBatis Plus 的多数据源配置。通过多数据源配置,我们可以连接多个数据库,并在运行时动态切换数据源,显著提高应用程序的灵活性和扩展性。我们详细介绍了多数据源配置的实现方法,并通过实例演示了如何在项目中应用这些技术。

本期内容将深入探讨 MyBatis Plus 的高级功能,包括自定义 SQL 注解、批量操作以及数据加密与解密。通过这些高级功能,你将学会如何实现更复杂的数据操作和安全性措施,进一步提升项目的开发效率和安全性。

一、自定义 SQL 注解

MyBatis Plus 提供了丰富的自定义 SQL 注解,允许我们直接在 Mapper 接口中编写 SQL 语句,灵活应对各种复杂查询需求。

  1. 使用 @Select 注解

    • UserMapper 接口中使用 @Select 注解自定义查询语句:
      package com.example.mybatisplusdemo.mapper;import com.baomidou.mybatisplus.core.mapper.BaseMapper;
      import com.example.mybatisplusdemo.entity.User;
      import org.apache.ibatis.annotations.Mapper;
      import org.apache.ibatis.annotations.Select;@Mapper
      public interface UserMapper extends BaseMapper<User> {@Select("SELECT * FROM user WHERE age > #{age}")List<User> selectUsersOlderThan(Integer age);
      }
      
  2. 使用 @Insert 注解

    • UserMapper 接口中使用 @Insert 注解自定义插入语句:
      import org.apache.ibatis.annotations.Insert;@Insert("INSERT INTO user(name, age, email) VALUES(#{name}, #{age}, #{email})")
      int insertUser(User user);
      
  3. 使用 @Update 注解

    • UserMapper 接口中使用 @Update 注解自定义更新语句:
      import org.apache.ibatis.annotations.Update;@Update("UPDATE user SET age = #{age} WHERE name = #{name}")
      int updateUserAgeByName(Integer age, String name);
      
  4. 使用 @Delete 注解

    • UserMapper 接口中使用 @Delete 注解自定义删除语句:
      import org.apache.ibatis.annotations.Delete;@Delete("DELETE FROM user WHERE name = #{name}")
      int deleteUserByName(String name);
      
二、批量操作

MyBatis Plus 提供了便捷的批量操作方法,可以显著提高批量数据操作的效率。

  1. 批量插入

    • UserService 接口中定义批量插入方法:

      boolean saveBatch(List<User> userList);
      
    • UserServiceImpl 类中实现批量插入方法:

      @Override
      public boolean saveBatch(List<User> userList) {return super.saveBatch(userList);
      }
      
  2. 批量更新

    • UserService 接口中定义批量更新方法:

      boolean updateBatchById(List<User> userList);
      
    • UserServiceImpl 类中实现批量更新方法:

      @Override
      public boolean updateBatchById(List<User> userList) {return super.updateBatchById(userList);
      }
      
  3. 批量删除

    • UserService 接口中定义批量删除方法:

      boolean removeBatchByIds(List<Long> idList);
      
    • UserServiceImpl 类中实现批量删除方法:

      @Override
      public boolean removeBatchByIds(List<Long> idList) {return super.removeBatchByIds(idList);
      }
      
三、数据加密与解密

为了保证数据的安全性,我们需要对敏感数据进行加密存储,并在使用时进行解密。

  1. 定义加密解密工具类

    • 创建 EncryptUtil 工具类,使用 AES 算法进行加密和解密:
      package com.example.mybatisplusdemo.util;import javax.crypto.Cipher;
      import javax.crypto.KeyGenerator;
      import javax.crypto.SecretKey;
      import javax.crypto.spec.SecretKeySpec;
      import java.util.Base64;public class EncryptUtil {private static final String ALGORITHM = "AES";private static final String KEY = "MySecretKey12345"; // 16 字节密钥public static String encrypt(String data) throws Exception {SecretKeySpec keySpec = new SecretKeySpec(KEY.getBytes(), ALGORITHM);Cipher cipher = Cipher.getInstance(ALGORITHM);cipher.init(Cipher.ENCRYPT_MODE, keySpec);byte[] encrypted = cipher.doFinal(data.getBytes());return Base64.getEncoder().encodeToString(encrypted);}public static String decrypt(String encryptedData) throws Exception {SecretKeySpec keySpec = new SecretKeySpec(KEY.getBytes(), ALGORITHM);Cipher cipher = Cipher.getInstance(ALGORITHM);cipher.init(Cipher.DECRYPT_MODE, keySpec);byte[] original = cipher.doFinal(Base64.getDecoder().decode(encryptedData));return new String(original);}
      }
      
  2. 在实体类中应用加密解密

    • User 实体类中使用加密和解密方法:
      package com.example.mybatisplusdemo.entity;import com.baomidou.mybatisplus.annotation.TableId;
      import com.baomidou.mybatisplus.annotation.TableName;
      import com.baomidou.mybatisplus.annotation.Version;
      import com.example.mybatisplusdemo.util.EncryptUtil;
      import lombok.Data;@Data
      @TableName("user")
      public class User {@TableIdprivate Long id;private String name;private Integer age;private String email;public void setEmail(String email) {try {this.email = EncryptUtil.encrypt(email);} catch (Exception e) {e.printStackTrace();}}public String getEmail() {try {return EncryptUtil.decrypt(this.email);} catch (Exception e) {e.printStackTrace();return null;}}
      }
      
四、在服务和控制层中的应用
  1. 在服务层中使用自定义 SQL 和批量操作

    • UserService 接口中定义方法:

      List<User> selectUsersOlderThan(Integer age);
      int insertUser(User user);
      int updateUserAgeByName(Integer age, String name);
      int deleteUserByName(String name);
      
    • UserServiceImpl 类中实现方法:

      @Override
      public List<User> selectUsersOlderThan(Integer age) {return userMapper.selectUsersOlderThan(age);
      }@Override
      public int insertUser(User user) {return userMapper.insertUser(user);
      }@Override
      public int updateUserAgeByName(Integer age, String name) {return userMapper.updateUserAgeByName(age, name);
      }@Override
      public int deleteUserByName(String name) {return userMapper.deleteUserByName(name);
      }
      
  2. 在控制器中提供接口

    • UserController 类中编写接口,接收请求并调用服务层方法:
      @GetMapping("/olderThan")
      public List<User> getUsersOlderThan(@RequestParam Integer age) {return userService.selectUsersOlderThan(age);
      }@PostMapping("/add")
      public int addUser(@RequestBody User user) {return userService.insertUser(user);
      }@PutMapping("/updateAge")
      public int updateUserAge(@RequestParam Integer age, @RequestParam String name) {return userService.updateUserAgeByName(age, name);
      }@DeleteMapping("/delete")
      public int deleteUser(@RequestParam String name) {return userService.deleteUserByName(name);
      }
      
五、总结

通过本篇文章,你已经学会了如何在 MyBatis Plus 中使用自定义 SQL 注解、批量操作以及数据加密与解密。自定义 SQL 注解使得编写复杂查询更加灵活,批量操作显著提高了数据处理效率,而数据加密与解密则确保了数据的安全性。这些高级功能将帮助你进一步提升项目的开发效率和安全性。

下期预告

在下一期内容中,我们将探讨 MyBatis Plus 的测试与部署。我们将介绍如何编写单元测试和集成测试,以确保代码的正确性和可靠性。然后,我们将讨论项目的打包与部署流程,帮助你将开发的应用程序顺利发布到生产环境中。敬请期待!

通过本系列教程的学习,你将系统地掌握 MyBatis Plus 的各项功能,从基础到高级,从理论到实践,全面提升你的开发技能。希望你在学习过程中能够有所收获,并应用到实际项目中。让我们继续这段学习之旅吧!

这篇关于滚雪球学MyBatis-Plus(12):高级功能的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1139585

相关文章

mybatis的整体架构

mybatis的整体架构分为三层: 1.基础支持层 该层包括:数据源模块、事务管理模块、缓存模块、Binding模块、反射模块、类型转换模块、日志模块、资源加载模块、解析器模块 2.核心处理层 该层包括:配置解析、参数映射、SQL解析、SQL执行、结果集映射、插件 3.接口层 该层包括:SqlSession 基础支持层 该层保护mybatis的基础模块,它们为核心处理层提供了良好的支撑。

【C++ Primer Plus习题】13.4

大家好,这里是国中之林! ❥前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。有兴趣的可以点点进去看看← 问题: 解答: main.cpp #include <iostream>#include "port.h"int main() {Port p1;Port p2("Abc", "Bcc", 30);std::cout <<

C++11第三弹:lambda表达式 | 新的类功能 | 模板的可变参数

🌈个人主页: 南桥几晴秋 🌈C++专栏: 南桥谈C++ 🌈C语言专栏: C语言学习系列 🌈Linux学习专栏: 南桥谈Linux 🌈数据结构学习专栏: 数据结构杂谈 🌈数据库学习专栏: 南桥谈MySQL 🌈Qt学习专栏: 南桥谈Qt 🌈菜鸡代码练习: 练习随想记录 🌈git学习: 南桥谈Git 🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈�

让树莓派智能语音助手实现定时提醒功能

最初的时候是想直接在rasa 的chatbot上实现,因为rasa本身是带有remindschedule模块的。不过经过一番折腾后,忽然发现,chatbot上实现的定时,语音助手不一定会有响应。因为,我目前语音助手的代码设置了长时间无应答会结束对话,这样一来,chatbot定时提醒的触发就不会被语音助手获悉。那怎么让语音助手也具有定时提醒功能呢? 我最后选择的方法是用threading.Time

系统架构师考试学习笔记第三篇——架构设计高级知识(20)通信系统架构设计理论与实践

本章知识考点:         第20课时主要学习通信系统架构设计的理论和工作中的实践。根据新版考试大纲,本课时知识点会涉及案例分析题(25分),而在历年考试中,案例题对该部分内容的考查并不多,虽在综合知识选择题目中经常考查,但分值也不高。本课时内容侧重于对知识点的记忆和理解,按照以往的出题规律,通信系统架构设计基础知识点多来源于教材内的基础网络设备、网络架构和教材外最新时事热点技术。本课时知识

滚雪球学Java(87):Java事务处理:JDBC的ACID属性与实战技巧!真有两下子!

咦咦咦,各位小可爱,我是你们的好伙伴——bug菌,今天又来给大家普及Java SE啦,别躲起来啊,听我讲干货还不快点赞,赞多了我就有动力讲得更嗨啦!所以呀,养成先点赞后阅读的好习惯,别被干货淹没了哦~ 🏆本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,助你一臂之力,带你早日登顶🚀,欢迎大家关注&&收藏!持续更新中,up!up!up!! 环境说明:Windows 10

Spring框架5 - 容器的扩展功能 (ApplicationContext)

private static ApplicationContext applicationContext;static {applicationContext = new ClassPathXmlApplicationContext("bean.xml");} BeanFactory的功能扩展类ApplicationContext进行深度的分析。ApplicationConext与 BeanF

JavaFX应用更新检测功能(在线自动更新方案)

JavaFX开发的桌面应用属于C端,一般来说需要版本检测和自动更新功能,这里记录一下一种版本检测和自动更新的方法。 1. 整体方案 JavaFX.应用版本检测、自动更新主要涉及一下步骤: 读取本地应用版本拉取远程版本并比较两个版本如果需要升级,那么拉取更新历史弹出升级控制窗口用户选择升级时,拉取升级包解压,重启应用用户选择忽略时,本地版本标志为忽略版本用户选择取消时,隐藏升级控制窗口 2.

Android 10.0 mtk平板camera2横屏预览旋转90度横屏拍照图片旋转90度功能实现

1.前言 在10.0的系统rom定制化开发中,在进行一些平板等默认横屏的设备开发的过程中,需要在进入camera2的 时候,默认预览图像也是需要横屏显示的,在上一篇已经实现了横屏预览功能,然后发现横屏预览后,拍照保存的图片 依然是竖屏的,所以说同样需要将图片也保存为横屏图标了,所以就需要看下mtk的camera2的相关横屏保存图片功能, 如何实现实现横屏保存图片功能 如图所示: 2.mtk

Spring+MyBatis+jeasyui 功能树列表

java代码@EnablePaging@RequestMapping(value = "/queryFunctionList.html")@ResponseBodypublic Map<String, Object> queryFunctionList() {String parentId = "";List<FunctionDisplay> tables = query(parent