三、SpringBoot 整合mybatis 多数据源以及分库分表

@Bean

@Primary

SqlSessionTemplate sqlSessionTemplate1() throws Exception{

return new SqlSessionTemplate(sqlSessionFactory1());

}

}

MyBatisConfigTwo 类

@Configuration

@MapperScan(basePackages = “com.quellan.zlflovemm.dao.mapper2”,sqlSessionFactoryRef = “sqlSessionFactory2”,sqlSessionTemplateRef = “sqlSessionTemplate2”)

public class MyBatisConfigTwo {

@Resource(name = “dbTwo”)

DataSource dbTwo;

@Bean

SqlSessionFactory sqlSessionFactory2()throws Exception {

SqlSessionFactoryBean bean = new SqlSessionFactoryBean();

bean.setDataSource(dbTwo);

return bean.getObject();

}

@Bean

SqlSessionTemplate sqlSessionTemplate2()throws Exception {

return new SqlSessionTemplate(sqlSessionFactory2());

}

}

注意连个文件的区别:

file

dao 层


在dao 层创建了两个包mapper1 和mapper2 .包里面的UserMapper类的内容是完全一样,放在不同的包中只是区分使用哪个数据源。和昨天是一样的。

public interface UserMapper {

@Select(“select id,username as userName,password,email,role_code as roleCode,gmt_create as gmtCreate,gmt_update as gmtUpdate,nickname as nickName,user_create as userCreate from sys_user”)

List findUserList();

@Insert({“insert into sys_user(username,password,email) values(‘ u s e r . u s e r N a m e ′ , ′ {user.userName}',' user.userName,{user.password}’,‘${user.email}’)”})

int add(@Param(“user”) UserEntry user);

@Delete(“delete from sys_user where id = #{id}”)

int delete(int id);

}

service 层


UserService接口

public interface UserService {

List findUserList();

int addUser(String userName,String password,String email);

int deleteUser(int id);

List findUserList2();

int addUser2(String userName,String password,String email);

int deleteUser2(int id);

}

UserServiceImpl类:

@Service

public class UserServiceImpl implements UserService {

@Autowired

protected UserMapper userMapper;

@Autowired

protected UserMapper2 userMapper2;

@Override

public List findUserList() {

return userMapper.findUserList();

}

@Override

public int addUser(String userName, String password, String email) {

UserEntry user=new UserEntry();

user.setUserName(userName);

user.setPassword(password);

user.setEmail(email);

return userMapper.add(user);

}

@Override

public int deleteUser(int id) {

return userMapper.delete(id);

}

@Override

public List findUserList2() {

return userMapper2.findUserList();

}

@Override

public int addUser2(String userName, String password, String email) {

UserEntry user=new UserEntry();

user.setUserName(userName);

user.setPassword(password);

user.setEmail(email);

return userMapper2.add(user);

}

@Override

public int deleteUser2(int id) {

return userMapper2.delete(id);

}

}

controller 层


userController

@Slf4j

@RestController

@RequestMapping(“/user”)

public class UserController {

@Autowired

private UserService userService;

@RequestMapping(value = “/list”,method = RequestMethod.GET)

public List findUserList(){

return userService.findUserList();

}

@RequestMapping(value = “/add”,method = RequestMethod.GET)

public String addUser(@RequestParam(value = “userName”)String uaserName,@RequestParam(value = “password”)String password,@RequestParam(value = “email”)String email){

int falg=userService.addUser(uaserName,password,email);

if(falg>0){

return “success”;

}

return “error”;

}

@RequestMapping(value = “/delete”,method = RequestMethod.GET)

public String deleteUser(@RequestParam(value = “id”)int id){

if(userService.deleteUser(id)>0){

return “success”;

}

return “error”;

}

@RequestMapping(value = “/list2”,method = RequestMethod.GET)

public List findUserList2(){

return userService.findUserList2();

}

@RequestMapping(value = “/add2”,method = RequestMethod.GET)

public String addUser2(@RequestParam(value = “userName”)String uaserName,@RequestParam(value = “password”)String password,@RequestParam(value = “email”)String email){

int falg= userService.addUser2(uaserName,password,email);

if(falg>0){

return “success”;

}

return “error”;

}

@RequestMapping(value = “/delete2”,method = RequestMethod.GET)

public String deleteUser2(@RequestParam(value = “id”)int id){

if(userService.deleteUser2(id)>0){

return “success”;

}

return “error”;

}

}

测试


file

file

可以看到是从不同的库中调出来的。这样就说明我们springboot配置多数据源整合mybatis 已经成功了。其实最主要就是config 包下的那三个配置类。其他的都是常见的业务逻辑,所以后面我就没有怎么讲了,代码会同步到github 上,想要实践的可以拿源码下来实践。

到此我们springboot整合mybatis 多数据源已经配置好了,但是我们配置下来可以发现,我们如果想要配置几个数据源就得在 dao 层创建多少个子包用来区分。那如果我们数据量足够大,要分库分表而不是几个库呢?

分库分表

===================================================================

背景


其实分库分表和多数据源是一样的,只不过是数据源更多了,多到在配置中配置所有的连接显得很臃肿,所以不得不另觅它法。分库分表就是 在项目中配置连接主库的连接,从主库中读取各个分库的连接,然后进行动态的加载,那个接口想调用那个分库就加载这个分库的连接。

我现在项目做的由于不用整合mybatis 直接使用jdbcTemplate ,所以实现起来不是很麻烦。

思路


主要就两个类;

GetDynamicJdbcTemplate类:手动的创建连接。

/**

  • @ClassName GetDynamicJdbcTemplate

  • @Description 获取动态的jdbcTemplate

  • @Author zhulinfeng

  • @Date 2019/9/20 14:35

  • @Version 1.0

*/

public class GetDynamicJdbcTemplate {

private String driverClassName;

private String url;

private String dbUsername;

private String dbPassword;

private JdbcTemplate jdbcTemplate;

public JdbcTemplate getJdbcTemplate() {

return jdbcTemplate;

}

public GetDynamicJdbcTemplate(String driverClassName, String url, String dbUsername, String dbPassword){

this.driverClassName=driverClassName;

this.url=url;

this.dbUsername=dbUsername;

this.dbPassword=dbPassword;

this.jdbcTemplate=new JdbcTemplate(getDataSource());

}

public DriverManagerDataSource getDataSource() {

DriverManagerDataSource dataSource = new DriverManagerDataSource();

dataSource.setDriverClassName(driverClassName);

dataSource.setUrl(url);

dataSource.setUsername(dbUsername);

dataSource.setPassword(dbPassword);

return dataSource;

}

}

最后总结

搞定算法,面试字节再不怕,有需要文章中分享的这些二叉树、链表、字符串、栈和队列等等各大面试高频知识点及解析

最后再分享一份终极手撕架构的大礼包(学习笔记):分布式+微服务+开源框架+性能优化

image

dbcTemplate(getDataSource());

}

public DriverManagerDataSource getDataSource() {

DriverManagerDataSource dataSource = new DriverManagerDataSource();

dataSource.setDriverClassName(driverClassName);

dataSource.setUrl(url);

dataSource.setUsername(dbUsername);

dataSource.setPassword(dbPassword);

return dataSource;

}

}

最后总结

搞定算法,面试字节再不怕,有需要文章中分享的这些二叉树、链表、字符串、栈和队列等等各大面试高频知识点及解析

最后再分享一份终极手撕架构的大礼包(学习笔记):分布式+微服务+开源框架+性能优化

[外链图片转存中…(img-hWSBiRig-1714548137612)]

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

  • 19
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值