您的位置:首页 > 编程语言 > Java开发

SSM整合 最容易看懂的

2017-01-17 13:34 204 查看

SSM框架整合配置

首先我们打开IED eclipse,创建一个动态web项目,建立好相应的目录结构(重点!)



我说一下每个目录都有什么用吧(第一次画表格,我发现markdown的表格语法很不友好呀~)

这个目录结构同时也遵循maven的目录规范~

文件名作用
src根目录,没什么好说的,下面有main和test。
main主要目录,可以放java代码和一些资源文件。
java存放我们的java代码,这个文件夹要使用Build Path -> Use as Source Folder,这样看包结构会方便很多,新建的包就相当于在这里新建文件夹咯。
resources存放资源文件,譬如各种的spring,mybatis,log配置文件。
mapper存放dao中每个方法对应的sql,在这里配置,无需写daoImpl。
spring这里当然是存放spring相关的配置文件,有dao service web三层。
sql其实这个可以没有,但是为了项目完整性还是加上吧。
webapp这个貌似是最熟悉的目录了,用来存放我们前端的静态资源,如jsp js css。
resources这里的资源是指项目的静态资源,如js css images等。
WEB-INF很重要的一个目录,外部浏览器无法访问,只有羡慕内部才能访问,可以把jsp放在这里,另外就是web.xml了。你可能有疑问了,为什么上面java中的resources里面的配置文件不妨在这里,那么是不是会被外部窃取到?你想太多了,部署时候基本上只有webapp里的会直接输出到根目录,其他都会放入WEB-INF里面,项目内部依然可以使用classpath:XXX来访问,好像IDE里可以设置部署输出目录,这里扯远了~
test这里是测试分支。
java测试java代码,应遵循包名相同的原则,这个文件夹同样要使用Build Path -> Use as Source Folder,这样看包结构会方便很多。
resources没什么好说的,好像也很少用到,但这个是maven的规范。
我先新建好几个必要的,并为大家讲解一下每个包的作用,顺便理清一下后台的思路~



包名名称作用
dao数据访问层(接口)与数据打交道,可以是数据库操作,也可以是文件读写操作,甚至是redis缓存操作,总之与数据操作有关的都放在这里,也有人叫做dal或者数据持久层都差不多意思。为什么没有daoImpl,因为我们用的是mybatis,所以可以直接在配置文件中实现接口的每个方法。
entity实体类一般与数据库的表相对应,封装dao层取出来的数据为一个对象,也就是我们常说的pojo,一般只在dao层与service层之间传输。
dto数据传输层刚学框架的人可能不明白这个有什么用,其实就是用于service层与web层之间传输,为什么不直接用entity(pojo)?其实在实际开发中发现,很多时间一个entity并不能满足我们的业务需求,可能呈现给用户的信息十分之多,这时候就有了dto,也相当于vo,记住一定不要把这个混杂在entity里面,答应我好吗?
service业务逻辑(接口)写我们的业务逻辑,也有人叫bll,在设计业务接口时候应该站在“使用者”的角度。额,不要问我为什么这里没显示!IDE调皮我也拿它没办法~
serviceImpl业务逻辑(实现)实现我们业务接口,一般事务控制是写在这里,没什么好说的。
web控制器springmvc就是在这里发挥作用的,一般人叫做controller控制器,相当于struts中的action。
还有最后一步基础工作,导入我们相应的jar包,我使用的是maven来管理我们的jar,所以只需要在
poom.xml
中加入相应的依赖就好了,如果不使用maven的可以自己去官网下载相应的jar,放到项目WEB-INF/lib目录下。关于maven的学习大家可以看慕课网的视频教程,这里就不展开了。我把项目用到的jar都写在下面,版本都不是最新的,大家有经验的话可以自己调整版本号。另外,所有jar都会与项目一起打包放到我的github上,喜欢的给个star吧~

poom.xml

?
36

下面真的要开始进行编码工作了,坚持到这里辛苦大家了~

第一步:我们先在
spring
文件夹里新建
spring-dao.xml
文件,因为spring的配置太多,我们这里分三层,分别是dao service web。

读入数据库连接相关参数(可选) 配置数据连接池

配置连接属性,可以不读配置项文件直接在这里写死 配置c3p0,只配了几个常用的 配置SqlSessionFactory对象(mybatis) 扫描dao层接口,动态实现dao接口,也就是说不需要daoImpl,sql和参数都写在xml文件上
spring-dao.xml

?
因为数据库配置相关参数是读取配置文件,所以在
resources
文件夹里新建一个
jdbc.properties
文件,存放我们4个最常见的数据库连接属性,这是我本地的,大家记得修改呀~还有喜欢传到github上“大头虾们”记得删掉密码,不然别人就很容易得到你服务器的数据库配置信息,然后干一些羞羞的事情,你懂的!!

jdbc.properties

?
友情提示:配置文件中的jdbc.username,如果写成username,可能会与系统环境中的username变量冲突,所以到时候真正连接数据库的时候,用户名就被替换成系统中的用户名(有得可能是administrator),那肯定是连接不成功的,这里有个小坑,我被坑了一晚上!!

因为这里用到了mybatis,所以需要配置mybatis核心文件,在
recources
文件夹里新建
mybatis-config.xml
文件。

使用自增主键 使用列别名 开启驼峰命名转换 create_time -> createTime
mybatis-config.xml

?
第二步:刚弄好dao层,接下来到service层了。在
spring
文件夹里新建
spring-service.xml
文件。

扫描service包所有注解 @Service 配置事务管理器,把事务管理交由spring来完成 配置基于注解的声明式事务,可以直接在方法上@Transaction
spring-service.xml

?
第三步:配置web层,在
spring
文件夹里新建
spring-web.xml
文件。

开启SpringMVC注解模式,可以使用@RequestMapping,@PathVariable,@ResponseBody等 对静态资源处理,如js,css,jpg等 配置jsp 显示ViewResolver,例如在controller中某个方法返回一个string类型的”login”,实际上会返回”/WEB-INF/login.jsp”
扫描web层 @Controller
spring-web.xml

?
第四步:最后就是修改
web.xml
文件了,它在
webapp
WEB-INF
下。

web.xml

?
我们在项目中经常会使用到日志,所以这里还有配置日志xml,在
resources
文件夹里新建
logback.xml
文件,所给出的日志输出格式也是最基本的控制台s呼出,大家有兴趣查看logback官方文档

logback.xml

?
到目前为止,我们一共写了7个配置文件,我们一起来看下最终的配置文件结构图




图书管理系统">SSM框架应用实例(图书管理系统)

一开始想就这样结束教程,但是发现其实很多人都还不会把这个SSM框架用起来,特别是mybatis部分。那我现在就以最常见的“图书管理系统”中【查询图书】和【预约图书】业务来做一个demo吧!

首先新建数据库名为
ssm
,再创建两张表:图书表
book
和预约图书表
appointment
,并且为
book
表初始化一些数据,sql如下。

schema.sql

?
entity
包中添加两个对应的实体,图书实体
Book.java
和预约图书实体
Appointment.java


Book.java

?
Appointment.java

?
dao
包新建接口
BookDao.java
Appointment.java


BookDao.java

?
AppointmentDao.java

?
提示:这里为什么要给方法的参数添加
@Param
注解呢?是因为该方法有两个或以上的参数,一定要加,不然mybatis识别不了。上面的
BookDao
接口的
queryById
方法和
reduceNumber
方法只有一个参数
book_id
,所以可以不用加
@Param
注解,当然加了也无所谓~

注意,这里不需要实现dao接口不用编写daoImpl, mybatis会给我们动态实现,但是我们需要编写相应的mapper。

mapper
目录里新建两个文件
BookDao.xml
AppointmentDao.xml
,分别对应上面两个dao接口,代码如下。

BookDao.xml

?
AppointmentDao.xml

?
19

mapper总结
namespace
是该xml对应的接口全名,
select
update
中的
id
对应方法名,
resultType
是返回值类型,
parameterType
是参数类型(这个其实可选),最后
#{...}
中填写的是方法的参数,看懂了是不是很简单!!我也这么觉得~ 还有一个小技巧要交给大家,就是在返回
Appointment
对象包含了一个属性名为
book
的Book对象,那么可以使用
"book.属性名"
的方式来取值,看上面
queryByKeyWithBook
方法的sql。

dao
层写完了,接下来
test
对应的
package
写我们测试方法吧。

因为我们之后会写很多测试方法,在测试前需要让程序读入spring-dao和mybatis等配置文件,所以我这里就抽离出来一个
BaseTest
类,只要是测试方法就继承它,这样那些繁琐的重复的代码就不用写那么多了~

BaseTest.java

?
因为
spring-service
service
层的测试中会时候到,这里也一起引入算了!

新建
BookDaoTest.java
AppointmentDaoTest.java
两个dao测试文件。

BookDaoTest.java

?

BookDaoTest测试结果

testQueryById



testQueryAll



testReduceNumber



AppointmentDaoTest.java

?

AppointmentDaoTest测试结果

testInsertAppointment



testQueryByKeyWithBook



嗯,到这里一切到很顺利~那么我们继续service层的编码吧~可能下面开始信息里比较大,大家要做好心理准备~

首先,在写我们的业务之前,我们先定义几个预约图书操作返回码的数据字典,我们这类使用枚举类,没听过的小伙伴要好好恶补一下了(我也是最近才学到的= =)

预约业务操作返回码说明

返回码说明
1预约成功
0库存不足
-1重复预约
-2系统异常
新建一个包叫
enums
,在里面新建一个枚举类
AppointStateEnum.java
,用来定义预约业务的数据字典,没听懂没关系,我们直接看代码吧~是不是感觉有模有样了!

AppointStateEnum.java

?
接下来,在
dto
包下新建
AppointExecution.java
用来存储我们执行预约操作的返回结果。

AppointExecution.java

?
咱们终于可以编写业务代码了,在
service
包下新建
BookService.java
图书业务接口。

BookService.java

?
service.impl
包下新建
BookServiceImpl.java
使用
BookService
接口,并实现里面的方法。

BookServiceImpl

?
下面我们来测试一下我们的业务代码吧~因为查询图书的业务不复杂,所以这里只演示我们最重要的预约图书业务!!

BookServiceImplTest.java

?

BookServiceImplTest测试结果

testAppoint



首次执行是“预约成功”,如果再次执行的话,应该会出现“重复预约”,哈哈,我们所有的后台代码都通过单元测试啦~~是不是很开心~

咱们还需要在
dto
包里新建一个封装json返回结果的类
Result.java
,设计成泛型。

Result.java

?
最后,我们写web层,也就是controller,我们在
web
包下新建
BookController.java
文件。

BookController.java

?
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java 框架 eclipse maven