建立项目的整体框架结构
这几层的关系 各文件源码
一、 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,不需要其他功能,便只配置上面的内容即可。
另外本项目用的是国产神通数据库,驱动器根据具体的项目来配置。
select * from student
可以根据此代码写出类似的TeacherMapper.xml,只需要修改namespace,指向~.db2.TeacherDao即可,在此不再赘述。
三、StudentDao@Repository public interface StudentDao { ListselectAll(); }
就是要注意调用的函数名要从xml文件中的id属性中取。Teacher同理。
四、StudentService与StudentServiceImplpublic interface StudentService { ListselectAll(); } @Service public class StudentServiceImpl implements StudentService { @Resource private StudentDao studentDao; @Override public List selectAll() { List list = studentDao.selectAll(); return list; } }
Teacher同理。
五、StudentController@RestController @RequestMapping("student") public class StudentController { @Resource private StudentService studentService; @RequestMapping("/selectAll") public ListselectAll(){ List list = studentService.selectAll(); return list; } }
@RestCntroller标明是一个controller
Teacher同理
@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注解注明了要扫描哪一个包。如上文所示,扫描到了daodb1文件,springboot就知道连接上了数据库db1,下文具体的配置内容也就配置的是db1数据源而不是别的某个数据源。
多个数据源的时候要区分主数据库。主数据库要打上@Primary的注解,否则springboot不知道该扫描哪一个数据库。
其他的数据库去掉@Primary,其他一样。
理解与感悟 一、定位数据源对于多数据源的处理问题,最重要的就是要定位所 *** 作的数据源。哪些 *** 作或配置是用来配置哪个数据源的,一定要给springboot说明白, *** 作才能不出错。
私认为@MapperScan较为重要,通过扫描的具体的包,来定位数据源,进而对数据源进行手动配置。
网上定位数据源的方法似乎不少(?),有用@Trasactional定位的(?),还有用Template来定位的(?)。可能是我理解的不够深入,其他的方法我并没有试验成功。
多数据源问题中上文的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文件,就可以访问多个数据源了。
平时在学校编程的时候最多偶尔使用一下@Override,别的注解几乎没有接触过。
在springboot编程中,需要使用到大量的注解,而且各种注解的位置、用法、语法都有具体的规范。
@Configuration,@MapperScan,@RestController等一些注解在大量的阅读中差不多能够理解其含义,但同时还是有不少的内容一知半解,只能照着打代码。
通过各种查资料和阅读学习,渐渐地对这些有了一点理解,但也不能说能掌握。在下面的工作中慢慢熟悉内容吧。
快速上手什么东西都是不太现实的。在项目ddl的鞭策下,我只能尽我所能快速了解我不熟悉甚至没有接触过的内容,尽量跟上前辈们的思路。
但作为实习生,也没有太多的期待。闲了半个星期之后才有了这个活儿,最后我还没有独立做出来……所以说学校内学的东西与工程的实践差距还是不小的,需要我学习的东西还是有很多的,加油吧!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)