【Spring AOP + 自定义注解 + 动态数据源 实现主从库切换&读写分离】—— 案例实战(中):https://developer.aliyun.com/article/1390149?spm=a2c6h.13148508.setting.23.54b14f0eHMAggH
其他文件说明
UserController
💧这个文件是一个Spring Boot的控制器类,名为 UserController。它处理来自前端的HTTP请求,调用 UserService 中的方法来处理业务逻辑,并返回相应的结果。
package com.lxr.demo.controller; import com.lxr.demo.entity.UserEntity; import com.lxr.demo.service.UserService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.util.StringUtils; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import java.util.List; import java.util.Random; @RestController public class UserController { @Autowired UserService userService; @RequestMapping("/listUser") public List<UserEntity> listUser() { List<UserEntity> users = userService.findAll(); return users; } @RequestMapping("/insertUser") public void insertUser() { UserEntity userEntity = new UserEntity(); Random random = new Random(); userEntity.setUser_id(random.nextInt()); userEntity.setAccount("22222"); userEntity.setNickname("lxrlxrlxr"); userEntity.setPassword("123"); userService.insertUser(userEntity); } }
UserEntity
💧一个普通的实体类,使用了lombok的@Data注解。
package com.lxr.demo.entity; import lombok.Data; @Data public class UserEntity { private Integer user_id; private String account; private String nickname; private String password; private String headimage_url; private String introduce; }
UserMapper
💧一个简单的dao层。
package com.lxr.demo.mapper; import com.lxr.demo.entity.UserEntity; import org.apache.ibatis.annotations.*; import java.util.List; /** * Spring通过@Mapper注解实现动态代理,mybatis会自动创建Dao接口的实现类代理对象注入IOC容器进行管理,这样就不用编写Dao层的实现类 */ @Mapper public interface UserMapper { @Select("SELECT * FROM user2") List<UserEntity> findAll(); @Insert("insert into user2(user_id,account,nickname,password) values(#{user_id},#{account}, #{nickname}, #{password})") int insert(UserEntity user); // @Update("UPDATE user2 SET account=#{account},nickname=#{nickname} WHERE id =#{id}") // void update(UserEntity user); // // @Delete("DELETE FROM user2 WHERE id =#{id}") // void delete(Long id); }
UserService
💧一个简单的Service层。
package com.lxr.demo.service; import com.lxr.demo.entity.UserEntity; import com.lxr.demo.mapper.UserMapper; import com.lxr.demo.config.Master; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.List; @Service public class UserService { @Autowired UserMapper userMapper; public List<UserEntity> findAll() { return userMapper.findAll(); } @Master public int insertUser(UserEntity user) { return userMapper.insert(user); } // void update(UserEntity user); // // void delete(Long id); }
主启动类DemoApplication
package com.lxr.demo; import org.mybatis.spring.annotation.MapperScan; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication @MapperScan("com.lxr.demo.mapper") public class DemoApplication { public static void main(String[] args) { SpringApplication.run(DemoApplication.class,args); } }
功能演示
💧我们启动项目,打开浏览器或者postman等工具
💧分别访问:
从库
的读
操作 :http://localhost:8080/listUser
主库
的写
操作 :http://localhost:8080/insertUser
总结
💧通过本篇博客,我们学习了如何使用 Spring AOP
结合自定义注解和德鲁伊数据源来实现主从数据库切换
和方法的读写分离
。通过自定义注解 @Master
来区分主库还是从库,通过切点
来区分读写方法,我们成功地将读写操作路由到不同的数据源
,从而提高了应用程序的性能和可伸缩性
。读写分离是一个重要的数据库优化策略
,在实际的生产环境中非常有用。
💧希望本篇博客对您有所帮助,如果您有任何问题或建议,欢迎在评论区留言。谢谢阅读!