这节课把我们上节课注解方式配合类文件实现用户增删改查api改成xml映射的方式
![](https://img.haomeiwen.com/i2509361/76a6cfba9f37a3cf.png)
上节课我们在UserMapper中写入了sql语句 如果sql是简单的一两句 使用注解的方式没什么问题 而且比较方便 但是上节课的动态SQL构建起来却不是很方便 如果此时把代码写在xml映射文件里面就更加方便
接下来我们顺着这个思路往下学习
首先我们来看下如何把我们之前的注解改成扫描配置
因为我们上节课在spring配置文件中加入了MapperFactoryBean配置 并且把我们创建的UserMapper接口放入了mapperInterface里面
如下
![](https://img.haomeiwen.com/i2509361/c2b7ef8b71a77783.png)
这时如果我们在来一个别的接口(mapper文件) 我们还要在spring中进行关联
如果有多个接口 这样做是不现实的
因此接下来我们首先注释掉spring中这部分配置内容 改用其他方式进行关联
注释内容如下
![](https://img.haomeiwen.com/i2509361/70959cca6e3f0e11.png)
官方告诉我们有一种扫描的方式自动会帮助我们扫描到我们所有的mapper
接下来我们看下官方文档http://www.mybatis.org/spring/zh/mappers.html(注入映射器)
可以看见官方有这样一段内容
![](https://img.haomeiwen.com/i2509361/137d5997b9a932b7.png)
可以使用MapperScannerConfigurer扫描到所有mappers
下面演示下
在spring配置文件中加入如下
![](https://img.haomeiwen.com/i2509361/127929e698f5050c.png)
接下来在mappers包下面创建个NewsMapper
目录如下
![](https://img.haomeiwen.com/i2509361/d0b6461d1033e119.png)
然后我们创建一张新闻表jt_news
内容如下
![](https://img.haomeiwen.com/i2509361/0c67d438bd3c8b6c.png)
然后这节课用到我们之前创建的实体类NewsInfo
在里面定义一个私有属性newsid 使其和数据库表中字段对应
![](https://img.haomeiwen.com/i2509361/f1827e178d28f327.png)
接下来来到NewsMapper
首先获取新闻列表
代码如下
![](https://img.haomeiwen.com/i2509361/dd78ee80a6ceb014.png)
由于我们在spring配置文件中加入了扫描mapper的配置 这样在mappers下面有多个文件都可以扫描到
但是官方还告诉我们要配置下sqlSessionFactoryBeanName
官方说明如下
![](https://img.haomeiwen.com/i2509361/3a4d4c29d413f56f.png)
由于我们之前配置了sqlSessionFactory
![](https://img.haomeiwen.com/i2509361/389d56137e542df5.png)
需要加入如下属性
![](https://img.haomeiwen.com/i2509361/4e2967b9f8078b04.png)
接下来我们改下NewsController代码
代码如下
![](https://img.haomeiwen.com/i2509361/2d4067297c0776fb.png)
自动注入代码如下
![](https://img.haomeiwen.com/i2509361/63bab3c84a3e5787.png)
可以看见我们的自动注入newsMapper报红了 我们过会再解决这个问题
写好代码后 我们编译发布下代码 测试下我们spring中配置文件是否起到作用(是否能自动扫描mappers包下面的所有文件)
浏览器访问localhost:8080/users
![](https://img.haomeiwen.com/i2509361/2947a6a82727f3db.png)
浏览器访问localhost:8080/users/3
![](https://img.haomeiwen.com/i2509361/1b579026a56727ac.png)
可以发现我们之前的用户api是好用的
接下来测试新加入的新闻api
浏览器访问localhost:8080/news
![](https://img.haomeiwen.com/i2509361/03a1918aff7925e6.png)
也是好用的 说明我们的spring配置起到了作用 能够帮助我们扫描 自动的将我们mappers包下面的类加载进去
下面我们解决下自动注入newMapper报红的信息
![](https://img.haomeiwen.com/i2509361/2b6072c65b32b2aa.png)
这时可以在我们的NewsMapper中打入注解@Repository
如下
![](https://img.haomeiwen.com/i2509361/5a90ac5067ea60f7.png)
在看我们newsController中自动注入部分红色消失了 如下
![](https://img.haomeiwen.com/i2509361/6f8d74e7502b4473.png)
同理也要在我们UserMapper中打入@Repository注解 否则也会报红
打入了这个注解 编辑器就会认识 便可以自动注入了
接下来看下如何将上节课学的注解的形式改成xml配置文件的形式
![](https://img.haomeiwen.com/i2509361/634efa51a924853d.png)
首先在资源文件夹下创建一个mappers文件夹 在里面创建个NewsMapper.xml文件
目录如下
![](https://img.haomeiwen.com/i2509361/bbec4bdcaa4c17b6.png)
根据官网可知 这个xml文件里的命名空间需要根据官方文档格式写 不能随便写
官方说明如下
将命名空间内容直接拷贝到newsmapper.xml中
代码如下
![](https://img.haomeiwen.com/i2509361/894f5db74ccad129.png)
其中的namespace需要映射到我们的接口文件(里面填写对应的接口文件名也就是映射类) 里面写入sql语句 由于我们在配置文件中写入了sql语句 所以在接口中就可以把sql注解注释掉了
NewsMapper中注释如下
![](https://img.haomeiwen.com/i2509361/0dd74cf5166b33aa.png)
代表其内部的配置(就是sql语句)是映射到我们哪一个接口文件中的 而id是对应我们接口里面的方法名(映射到我们的接口里的getNews方法)
resultType如果返回的是一个集合(List)类型 官方明确告诉我们 里面要填入对应的集合实体类
配置好了之后 还需要加入下面的配置
需要告诉我们的sqlSessionFactory我们的xml文件在哪 否则不会进行映射
![](https://img.haomeiwen.com/i2509361/27bcf9aed29f63e5.png)
所以在我们的spring配置文件中加入如下
之前我们配置好了sqlSessionFactory 接下来为其加入属性
![](https://img.haomeiwen.com/i2509361/d0f5b5d529993f41.png)
这样写编译后会放到我们的target目录下 因为我们配置的路径是classpath下的
配置好后我们重新编译运行项目
浏览器访问localhost:8080/news
结果如下
![](https://img.haomeiwen.com/i2509361/7525e6fafc3f3703.png)
我们已经把NewsMapper中@Select注解去掉了
从结果可以看出我们配置文件生效了 正常的显示我们的新闻列表了(说明我们是以xml方式获取的)
同时我们也可以把xml方式和注解的方式混用
如果sql语句比较复杂可以放在xml配置文件中 如果sql很简单 可以直接放在接口中以注解方式实现
接下来看下二者混用方式
在NewsMapper中获取新闻详细
代码如下
![](https://img.haomeiwen.com/i2509361/1835c4792e6349b6.png)
采用注解的方式 获取新闻详细
然后来到NewsController中修改如下
![](https://img.haomeiwen.com/i2509361/7f4508e7f8dfffdb.png)
发布编译下代码
首先浏览器访问localhost:8080/news 访问新闻列表
![](https://img.haomeiwen.com/i2509361/d2e9ba8d33d7d1b1.png)
可以看见依然是可以访问的
接下来访问新闻详细(传入新闻id)
localhost:8080/news/4
![](https://img.haomeiwen.com/i2509361/2fbb59d145d318d8.png)
以上就是我们采用注解和xml的方式来完成我们的api功能 更多内容到官方文档详细阅读
网友评论