寒假实习(一)——神通数据库下多数据源问题

寒假实习(一)——神通数据库下多数据源问题,第1张

寒假实习(一)——神通数据库下多数据源问题

这里写目录标题

建立项目的整体框架结构

这几层的关系 各文件源码

一、 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




    
        select * from student
    

可以根据此代码写出类似的TeacherMapper.xml,只需要修改namespace,指向~.db2.TeacherDao即可,在此不再赘述。

三、StudentDao
@Repository
public interface StudentDao {
    List selectAll();
}

就是要注意调用的函数名要从xml文件中的id属性中取。Teacher同理。

四、StudentService与StudentServiceImpl
public interface StudentService {
    List selectAll();
}


@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 List selectAll(){
        List 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注解注明了要扫描哪一个包。如上文所示,扫描到了daodb1文件,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的鞭策下,我只能尽我所能快速了解我不熟悉甚至没有接触过的内容,尽量跟上前辈们的思路。
但作为实习生,也没有太多的期待。闲了半个星期之后才有了这个活儿,最后我还没有独立做出来……所以说学校内学的东西与工程的实践差距还是不小的,需要我学习的东西还是有很多的,加油吧!

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5708417.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存