@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());
}
}
注意连个文件的区别:
在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);
}
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);
}
}
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”;
}
}
可以看到是从不同的库中调出来的。这样就说明我们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;
}
}
最后总结
搞定算法,面试字节再不怕,有需要文章中分享的这些二叉树、链表、字符串、栈和队列等等各大面试高频知识点及解析
最后再分享一份终极手撕架构的大礼包(学习笔记):分布式+微服务+开源框架+性能优化
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)]