前言
在上期内容中,我们详细探讨了 MyBatis Plus 的多数据源配置。通过多数据源配置,我们可以连接多个数据库,并在运行时动态切换数据源,显著提高应用程序的灵活性和扩展性。我们详细介绍了多数据源配置的实现方法,并通过实例演示了如何在项目中应用这些技术。
本期内容将深入探讨 MyBatis Plus 的高级功能,包括自定义 SQL 注解、批量操作以及数据加密与解密。通过这些高级功能,你将学会如何实现更复杂的数据操作和安全性措施,进一步提升项目的开发效率和安全性。
一、自定义 SQL 注解
MyBatis Plus 提供了丰富的自定义 SQL 注解,允许我们直接在 Mapper 接口中编写 SQL 语句,灵活应对各种复杂查询需求。
-
使用 @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); }
- 在
-
使用 @Insert 注解:
- 在
UserMapper
接口中使用@Insert
注解自定义插入语句:import org.apache.ibatis.annotations.Insert; @Insert("INSERT INTO user(name, age, email) VALUES(#{name}, #{age}, #{email})") int insertUser(User user);
- 在
-
使用 @Update 注解:
- 在
UserMapper
接口中使用@Update
注解自定义更新语句:import org.apache.ibatis.annotations.Update; @Update("UPDATE user SET age = #{age} WHERE name = #{name}") int updateUserAgeByName(Integer age, String name);
- 在
-
使用 @Delete 注解:
- 在
UserMapper
接口中使用@Delete
注解自定义删除语句:import org.apache.ibatis.annotations.Delete; @Delete("DELETE FROM user WHERE name = #{name}") int deleteUserByName(String name);
- 在
二、批量操作
MyBatis Plus 提供了便捷的批量操作方法,可以显著提高批量数据操作的效率。
-
批量插入:
-
在
UserService
接口中定义批量插入方法:boolean saveBatch(List<User> userList);
-
在
UserServiceImpl
类中实现批量插入方法:@Override public boolean saveBatch(List<User> userList) { return super.saveBatch(userList); }
-
-
批量更新:
-
在
UserService
接口中定义批量更新方法:boolean updateBatchById(List<User> userList);
-
在
UserServiceImpl
类中实现批量更新方法:@Override public boolean updateBatchById(List<User> userList) { return super.updateBatchById(userList); }
-
-
批量删除:
-
在
UserService
接口中定义批量删除方法:boolean removeBatchByIds(List<Long> idList);
-
在
UserServiceImpl
类中实现批量删除方法:@Override public boolean removeBatchByIds(List<Long> idList) { return super.removeBatchByIds(idList); }
-
三、数据加密与解密
为了保证数据的安全性,我们需要对敏感数据进行加密存储,并在使用时进行解密。
-
定义加密解密工具类:
- 创建
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); } }
- 创建
-
在实体类中应用加密解密:
- 在
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 { @TableId private 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; } } }
- 在
四、在服务和控制层中的应用
-
在服务层中使用自定义 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); }
-
-
在控制器中提供接口:
- 在
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 的各项功能,从基础到高级,从理论到实践,全面提升你的开发技能。希望你在学习过程中能够有所收获,并应用到实际项目中。让我们继续这段学习之旅吧!
标签:12,return,String,age,Plus,MyBatis,import,public,name From: https://blog.csdn.net/weixin_43970743/article/details/141028662