神通数据库下多数据源问题"/>
寒假实习(一)——神通数据库下多数据源问题
这里写目录标题
- 建立项目的整体框架结构
- 这几层的关系
- 各文件源码
- 一、 application.yml
- 二、StudentMapper.xml
- 三、StudentDao
- 四、StudentService与StudentServiceImpl
- 五、StudentController
- 六、DataSourceConfig1
- 理解与感悟
- 一、定位数据源
- 二、config文件的复用
- 三、各种annotation
- 四、小结
实习的第一个任务是来为一个项目链接两个数据库(即多数据源问题)。
我的实战能力确实不强,这个“小任务”对我来说其实有些挑战性,也卡了一段时间几乎毫无进展,不过最后通过前辈的帮助下完成了。
记录一下内容,为以后的学习打基础。
建立项目的整体框架结构
dao, service, controller, model, config(用来手动配置数据库),resources/mapper用来写xml配置文件
这几层的关系
Mapper里的xml文件与dao层里的文件一一对应,dao中的接口调用的是xml文件里编写好的SQL语句。二者通过xml文件中的namespace参数相互绑定,接口中的函数与xml里的id参数应当一致。
Service包中的接口impl文件定义函数接口,函数方法的实现调用dao层的函数,controller层是具体的控制层,通过URL输出结果。(最基本的三层框架的内容)
Config包对多个数据源进行手动配置,是多数据源适配的重要文件。
Model包中含有各种实体内容,实体的各种属性以及各种set和get函数等。
上图为整体的demo内容架构。
各文件源码
一、 application.yml
由于是demo,不需要其他功能,便只配置上面的内容即可。
另外本项目用的是国产神通数据库,驱动器根据具体的项目来配置。
二、StudentMapper.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis//DTD Mapper 3.0//EN" ".dtd">
<mapper namespace="com.example.demo.dao.db1.StudentDao"><select id="selectAll" resultType="com.example.demo.model.Student">select * from student</select>
</mapper>
可以根据此代码写出类似的TeacherMapper.xml,只需要修改namespace,指向~.db2.TeacherDao即可,在此不再赘述。
三、StudentDao
@Repository
public interface StudentDao {List<Student> selectAll();
}
就是要注意调用的函数名要从xml文件中的id属性中取。Teacher同理。
四、StudentService与StudentServiceImpl
public interface StudentService {List<Student> selectAll();
}@Service
public class StudentServiceImpl implements StudentService {@Resourceprivate StudentDao studentDao;@Overridepublic List<Student> selectAll() {List<Student> list = studentDao.selectAll();return list;}
}
Teacher同理。
五、StudentController
@RestController
@RequestMapping("student")
public class StudentController {@Resourceprivate StudentService studentService;@RequestMapping("/selectAll")public List<Student> selectAll(){List<Student> list = studentService.selectAll();return list;}
}
@RestCntroller标明是一个controller
Teacher同理
六、DataSourceConfig1
@Configuration
@MapperScan(basePackages = "com.example.demo.dao.db1", sqlSessionFactoryRef = "db1SqlSessionFactory")
public class DataSourceConfig1 {@Primary // 表示这个数据源是默认数据源, 这个注解必须要加,因为不加的话spring将分不清楚那个为主数据源(默认数据源)@Bean("db1DataSource")@ConfigurationProperties(prefix = "spring.datasource.db1") //读取application.yml中的配置参数映射成为一个对象public DataSource getDb1DataSource(){return DataSourceBuilder.create().build();}@Primary@Bean("db1SqlSessionFactory")public SqlSessionFactory db1SqlSessionFactory(@Qualifier("db1DataSource") DataSource dataSource) throws Exception {SqlSessionFactoryBean bean = new SqlSessionFactoryBean();bean.setDataSource(dataSource);// mapper的xml形式文件位置必须要配置,不然将报错:no statement (这种错误也可能是mapper的xml中,namespace与项目的路径不一致导致)bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath*:mapper/db1/*.xml"));return bean.getObject();}@Primary@Bean("db1SqlSessionTemplate")public SqlSessionTemplate db1SqlSessionTemplate(@Qualifier("db1SqlSessionFactory") SqlSessionFactory sqlSessionFactory){return new SqlSessionTemplate(sqlSessionFactory);}
}
@MapperScan注解注明了要扫描哪一个包。如上文所示,扫描到了dao\db1文件,springboot就知道连接上了数据库db1,下文具体的配置内容也就配置的是db1数据源而不是别的某个数据源。
多个数据源的时候要区分主数据库。主数据库要打上@Primary的注解,否则springboot不知道该扫描哪一个数据库。
其他的数据库去掉@Primary,其他一样。
理解与感悟
一、定位数据源
对于多数据源的处理问题,最重要的就是要定位所操作的数据源。哪些操作或配置是用来配置哪个数据源的,一定要给springboot说明白,操作才能不出错。
私认为@MapperScan较为重要,通过扫描的具体的包,来定位数据源,进而对数据源进行手动配置。
网上定位数据源的方法似乎不少(?),有用@Trasactional定位的(?),还有用Template来定位的(?)。可能是我理解的不够深入,其他的方法我并没有试验成功。
二、config文件的复用
多数据源问题中上文的config文件应该可以拿来就用。
“三步走”:
1、 初始化,建立数据源
DataSourceBuilder.create().build()
2、 建立会话,SqlSessionFactory的使用:
① bean=new SqlSessionFactoryBean
② setDataSource(dataSource)
③ setMapperLocations(xml文件的路径)
最后返回bean.getObect()
3、 new SqlSessionTemplate
网上关于此配置文件的写法也有很多中,有创建一个事务Transaction对象的(?)等等……
本身对于springboot的理解就没有多深入,有关Mybatis的SqlSessionFactory功能更是一知半解,比着葫芦画瓢倒腾函数,一直也没成功。前辈加上了setMapperLocations,就能跑通了。
通过setMapperLocations,可以配置一个数据源的多个路径,设置好该数据源所对应的xml文件,就可以访问多个数据源了。
三、各种annotation
平时在学校编程的时候最多偶尔使用一下@Override,别的注解几乎没有接触过。
在springboot编程中,需要使用到大量的注解,而且各种注解的位置、用法、语法都有具体的规范。
@Configuration,@MapperScan,@RestController等一些注解在大量的阅读中差不多能够理解其含义,但同时还是有不少的内容一知半解,只能照着打代码。
通过各种查资料和阅读学习,渐渐地对这些有了一点理解,但也不能说能掌握。在下面的工作中慢慢熟悉内容吧。
四、小结
快速上手什么东西都是不太现实的。在项目ddl的鞭策下,我只能尽我所能快速了解我不熟悉甚至没有接触过的内容,尽量跟上前辈们的思路。
但作为实习生,也没有太多的期待。闲了半个星期之后才有了这个活儿,最后我还没有独立做出来……所以说学校内学的东西与工程的实践差距还是不小的,需要我学习的东西还是有很多的,加油吧!
更多推荐
寒假实习(一)——神通数据库下多数据源问题
发布评论