SSM框架中的数据库调用

Posted on By Guanzhou Song

在公司需要用到ssm框架,于是从头开始学习。Sping框架对我来说可以算是比较神奇的,非常多的自动注入以及接口配置,一开始看项目还真有点云里雾里。

作为一个半吊子,我也只是依样画葫芦,按照前辈写好的方法复制过来进行修改。今天把controller,service之类的写好, 需要把数据库接入,于是仔细研究了一下神奇的mybatis。

MyBatis是一个支持普通SQL查询,存储过程和高级映射的优秀持久层框架。 MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及对结果集的检索封装。 MyBatis可以使用简单的XML或注解用于配置和原始映射, 将接口和Java的POJO(Plain Old Java Objects,普通的Java对象)映射成数据库中的记录。

简单的说就是,用了Mybatis,不需要在程序内部反复写JDBC代码了,而是单独储存在一个XML文件里,需要修改的时候改一个xml配置文件就好了。 然而用起来简单,配置起来还真的不简单。就以公司项目为例写一下ssm框架里面是怎么读取数据库里的数据的。

因为对ssm理解尚浅,所以想从头到尾把ssm调用的整个过程模拟一下

spring与spring mvc的调用请求

首先是页面请求,生成页面的时候请求 d3.json("/data/ywclnode/doGetNodeAndLink.json?type=" + type, function (energy) 于是spring就吭哧吭哧去所有的Controller里面查找这个链接对应的函数,并把type传递给函数。

找到了!在这个Controller中有个函数对应的是/data/ywclnode

然后有一个方法对应doGetNodeAndLink.json,加起来就是网页想要的函数的地址啦。

之后Controller就要调用相应的Service,以doGetAllNodesJsonArray为例,在Service里找到这个方法

发现需要调用doGetDtYwclNodesDtoList,也就是从数据库取到的数据来源,查找发现这个函数返回的其实是Mapper里的一个函数:

Mapper其实只是一个接口,真正起作用的是mapper.xml

真正起作用的mapper.xml中的SQL语句

Mapper其实就是一个接口,也没有特殊的声明,怎么就突然能调用mapper.xml了呢?其实这就是Spring与Mybatis的配置文件在起作用。

下面看一下Mybatis与Spring是怎么交流的。

Mybatis读取数据库

从最开始查看,首先去web.xml文件,发现spring配置文件调用的其实是spring-entry.xml而不是spring.xml。

在spring-entry.xml中,可以看见首先定义了一个路径为spring.properties的文件,在最后又import了整个spring.xml文件。

而spring.properties里面定义了众多的参数,包括数据库的链接,用户名以及密码。调用的时候直接读取这里的参数就可以了。

链接Spring与Mybatis的终极大BOSS其实就是通用接口包扫描:

<bean class="com.icinfo.framework.mybatis.spring.mapper.MapperScannerConfigurer">
        <property name="basePackage" value="com.icinfo.frk.*.mapper"/>
        <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
</bean>

通过通用接口包,MapperScannerConfigurer扫描basePackage下的mapper接口,封装为MapperFactoryBean注册给spring容器,当调用mapper接口时去DefaultSqlSessionFactory->Configuration获得接口类的代理类.

而SqlSessionFactoryBean第一是解析mapper.xml配置,根据name组装Configuration对象,包装为DefaultSqlSessionFactory.

同时SqlSessionFactory也解析Datasource,也就是主数据库,其中的参数spring.jdbc.jdbcUrl等均来自spring.properties。

SqlSessionFactoryBean通过将Datasource与mapper.xml结合,完成数据库的读写。

结论

  • Spring的组成

Spring.xml+Spring.properties=Spring-entry.xml->web.xml

  • 关于请求

页面->Controller->Service->Mapper->DataBase

  • Mybatis连接

MapperFactoryBean(Mapper接口)+SqlSessionFactoryBean(Mapper.xml)=DefaultSqlSessionFactory。

当调用mapper接口时只需要去DefaultSqlSessionFactory->Configuration获得接口类的代理类.

因为对Spring的理解还很浅显,可能上面的东西还存在问题。以后深入之后记得来更新改正。