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。 |
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
?
因为这里用到了mybatis,所以需要配置mybatis核心文件,在
recources文件夹里新建
mybatis-config.xml文件。
使用自增主键 使用列别名 开启驼峰命名转换 create_time -> createTime
mybatis-config.xml
?
spring文件夹里新建
spring-service.xml文件。
扫描service包所有注解 @Service 配置事务管理器,把事务管理交由spring来完成 配置基于注解的声明式事务,可以直接在方法上@Transaction
spring-service.xml
?
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
?
resources文件夹里新建
logback.xml文件,所给出的日志输出格式也是最基本的控制台s呼出,大家有兴趣查看logback官方文档。
logback.xml
?
图书管理系统">SSM框架应用实例(图书管理系统)
一开始想就这样结束教程,但是发现其实很多人都还不会把这个SSM框架用起来,特别是mybatis部分。那我现在就以最常见的“图书管理系统”中【查询图书】和【预约图书】业务来做一个demo吧!首先新建数据库名为
ssm,再创建两张表:图书表
book和预约图书表
appointment,并且为
book表初始化一些数据,sql如下。
schema.sql
?
entity包中添加两个对应的实体,图书实体
Book.java和预约图书实体
Appointment.java。
Book.java
?
?
dao包新建接口
BookDao.java和
Appointment.java
BookDao.java
?
?
@Param注解呢?是因为该方法有两个或以上的参数,一定要加,不然mybatis识别不了。上面的
BookDao接口的
queryById方法和
reduceNumber方法只有一个参数
book_id,所以可以不用加
@Param注解,当然加了也无所谓~
注意,这里不需要实现dao接口不用编写daoImpl, mybatis会给我们动态实现,但是我们需要编写相应的mapper。
在
mapper目录里新建两个文件
BookDao.xml和
AppointmentDao.xml,分别对应上面两个dao接口,代码如下。
BookDao.xml
?
?
19 |
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测试结果
testQueryByIdtestQueryAll
testReduceNumber
AppointmentDaoTest.java
?
AppointmentDaoTest测试结果
testInsertAppointmenttestQueryByKeyWithBook
嗯,到这里一切到很顺利~那么我们继续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包下新建
BookController.java文件。
BookController.java
?