开发者学堂课程【SpringBoot 实战教程: 区分多数据源实现(二)】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/651/detail/10802
区分多数据源实现(二)
6、针对第一个数据源写 mapper 和 service,针对第二个数据也写 mapper 和 service,这时需要通过包名进行区分,因为注解比较麻烦,建议使用包名,首先创建 mapper,对应的包要和 com. qi anfeng . db5 . mapper 一致,DataSource1.java 对应的包名是 com.qianfeng . db1 mapper,所以创建包,命名为 com.qianfeng . db1 mapper。
7、创建另外一个包,命名为 com.qianfeng . db5 mapper。通过包名进行区分。
8、Db1 里面是用户表,还需要 pojo。
9、因为是两个数据库中的两张表,一个是 users 表,一个是 user 表,把逆向工程生成的代码拷贝到 db5 数据库下的 user 表中,还有 users 表对应的实体类,先对 db1的 users 表写功能,用注解的方式,需要写一个接口,命名为 UsersMapper。
10、给用户指定姓名和密码,用注解 insert,直接写 sql 语句,向 users 表里面添加用户。
@Insert ("insert into users (name, password) values(#
{
name
}
, #
{
pass
word}
"
)
void addUser (@ Param ("name") String
name, @ Param ( "password" )String password) ;
}
11、实现 service,创建一个包,注意要通过包名进行区分,所以命名为 com.qianfeng.db1.service。
12、创建一个接口,命名为 UsersService。
添加用户的功能。
package com. qianfeng.db1. service;
import com. qianfeng.pojo.Users ;
public interface UsersService
{
Void
saveUser (Users user) ;
}
13、创建 service 实现类,创建 class,命名为 UsersServicelmpl。接口选择 UsersService。
14、针对 db1数据库的 users 表输入添加的功能。
package com. qianfeng .db1. service;
import org. springframework. stereotype . Service;
import com. qianfeng . db1. mapper . UserMapper ;
import com. qianfeng.pojo.Users;
@Service
public class UserServiceImpl implements UserService
{
@Autowired
private UserMapper usersMapper ;
@Override
public void saveUser (Users user)
{
userMapper.addUser(user.getName(),user .get
birthday
() ) ;
}
}
15、针对 db5 的 user 表创建 mapper,命名为 UserMapper。
输入添加用户的功能。查看表有哪些字段,指定 username 和 birthday 的值。
package com. qi anfeng . db5. mapper;
import java.util . Date;
import org. apache. ibatis . annotations . Insert;
import org . apache . ibatis . annotations . Param;
public interface UserMapper
{
@Insert ("insert into user (username, birthday) values (#
{
username
},#{
birthday
}
void addUser (@Param ("username") String username, @Param("birthday"
)
d
ate ("birthday"
);
}
16、需要注意 Usermapper 要用的 db1 数据源。UsersMapper 用的是 db5 数据源,如何指明用的是哪一个数据源呢?加注解 Qualifier 指明数据源即可。
@Qualifier ("db1SqlSessionFactory"
@Qualifier ("db
5
SqlSessionFactory"
17、写db5的service,创建一个包,命名为 com.qianfeng.db5.service。
写一个接口,命名为 UserService。
在 UserService.java 中输入:
Package
com. qianfeng.db5. service;
import com. qianfeng .pojo.User;
public interface UserService
{
Void
saveUser (User user) ;
}
创建一个实现类,命名为 UserServicelmpl,选择 UserService。
加注解 service,service 里面注入 mapper。代码如下:
Package
com. qianfeng.db5. service;
import org . springframework .beans . factory . annotation . Autowi red;
import org. springframework. stereotype . Service;
import com. qianfeng.db1. service .UsersService;
import com. qianfeng. db5. mapper . UserMapper;
import com. qianfeng .pojo.Users;
@Service
public class UserServiceImpl implements UsersService
{
@Autowired
private UserMapper userMapper;
@Override
public void ,saveUser (Users user)
{
userMapper . addUser (user . getName (), user . getBirthday ());
调用 usermapper 里面的 adduser 方法
18、通过包名方式区分不同的 mapper 和不同 service,创建 controller,命名为 IndexController。
写添加用户的功能。
package com. qianfeng . controller;
import org. springframework. stereotype . Controller;
import org. springframework. web.bind. annotation. RequestMapping;
@Controller
public class IndexController
{
@Autowi
r
ed
private UsersService usersService ;
操作 db1 向用户表中添加用户
@Autowired
private UserService userService ;
@RequestMapping("/ addUser")
@ResponseBody
public String addUser ( )
{
Users
u
=
neW
Users () ;
u. setName ("lisi") ;
u. setPassword ("000000") ;
usersService . saveUser (u )
;
return"ok";
最后希望得到字符串
}
}
19、扫描 Service 和 controller,有 db1 的 Service 和 db5 的 Service,在启动类中指定基础包,它们都有前缀,@SpringBootAppl ication ( scanBasePackages="com. qianfeng")
,
Service 和 controller 都会扫描到, mapper 已经在 DataSource1.java 中 mapperscan 进行了扫描,所以就不需要在启动类中去扫描 mapper。
20、启动,控制台提示发现两个数据源,就是它现在不能区分,现在有两个数据源,它在启动时不知道默认使用哪一个数据源,所以要指定一个默认的数据源,比如把 db1作为默认数据源,在每一个方法上加 @Primary,再重新启动,就没有发现问题,所以注意要指定默认的数据源。
上
@Primary
/ /指定默认的数据源
21、访问 controller,看是否能够正常向 db1的 users 表中添加用户,输入localhost:8080/addUser
,成功。
在 db1表中刷新,可以看到密码都是0的数据,证明成功。这就是通过不同的包名区分数据源。