1 前言
本demo是基于SSM框架完成的一个小项目,用于初学者进行基本的框架熟练度练习。源码获取方式在文末,以下是程序运行的几个页面:
2 环境搭建
2.1 基本架构
1. 添加依赖包,可以通过properties统一框架版本
1 | xml复制代码<properties> |
1 | xml复制代码<dependencies> |
如果遇到声明式事务报错,需要添加下面的依赖包
1 | xml复制代码<dependency> |
2. 添加spring配置文件
实现8个关键步骤
1 | xml复制代码<?xml version="1.0" encoding="UTF-8"?> |
3. 配置web.xml文件,同时加载spring配置文件
1 | xml复制代码<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" |
4. 创建数据表,添加项目包结构,包括实体类等
给dao,service,web(controller)包下使用注解创建对象,给service,web中的属性注入对象
dao:
1 | java复制代码public interface BooksDao { |
1 | java复制代码@Repository |
service:
1 | java复制代码public interface BooksService { |
1 | java复制代码@Service |
web(controller):
1 | java复制代码@Controller |
5. 配置文件代码mybatis.xml 及相应的 BooksMapper.xml
mybatis.xml
1 | xml复制代码<?xml version="1.0" encoding="UTF-8"?> |
BooksMapper.xml:
1 | xml复制代码<?xml version="1.0" encoding="UTF-8"?> |
6. 配置controller文件
使用的注解:
@Controller
@RequestMapping
@AutoWired
@Qualifier(“empBiz”)
(同上面的步骤4)
7. 添加service,dao层
使用的注解:
@Service
@AutoWired
(1) dao层省略了实现类
(2) dao 层只定义接口,由小树叶创建dao层对象以及扫描mapper文件
注:当添加了spring-jdbc的jar包后,会自动提交事务
8. 前端测试网页
index.jsp:
1 | html复制代码<html> |
show.jsp:
1 | html复制代码<%@ page contentType="text/html;charset=UTF-8" language="java" %> |
关于其中的配置文件:
当项目启动时加载web.xml文件,web.xml文件加载spring.xml文件,spring的配置文件又去加载了mybatis的配置文件与mapper文件。
2.2 省略dao实现类
先将上面的dao实现类删掉
使用MapperScannerConfigurer替代SqlSessionTemplate
1 | xml复制代码<!--省略实现类--> |
注意:此时也可以测试使用属性文件的方式来加载数据源(支持属性文件链接数据源)
2.3 ssm整合mybatis反向生成工具
依赖包:
1 | xml复制代码<dependency> |
加载插件:
1 | xml复制代码<build> |
根据插件中的内容,在resource文件夹下创建generatorConfig.xml文件:
1 | xml复制代码<?xml version="1.0" encoding="UTF-8"?> |
maven类型的web项目加载mybatis-generator插件:
注意:反向生成后,最好把该指令删除,否则不小心点了之后,又会生成一遍代码,尤其是mapper.xml文件中sql语句又会生成一遍,运行时会报错。
3 记账项目
3.1 需求分析
3.1.1 记账管理
其中,查询条件中类型为下拉列表,可选值有“不限,支出,收入,转账,借出,借入,还入,还出”。日期输入框需要输入“yyyy-MM-dd”格式的日期字符串,点击“搜索”按钮提交表单,提交时如果输入项不符合输入要求,则显示相应提示信息。列表中根据记账类别在金额前添加相应的“+,-”符号,如果类别为“支出,借出,还出”时在金额前添加“-”。
如果类别为“收入,借入,还入”时在金额前添加“+”。如果根据输入项进行查询后没有找到账单数据,则给出提示信息,如图所示:
点击“记账”按钮后,进入记账页面。
3.1.2 记账
- 类型属性是单选框, 标题输入框最长输入不能超过25 字符, 日期输入框需要输入“yyyy-MM-dd”格式的日期字符串,金额输入框必须为大于0 的数,说明输入框中最大输入长度为250 字符。
- 点击“重置”按钮则恢复初始值
- 点击“保存”按钮执行保存功能。提交数据至Controller 前必须使用JS 验证。如果各属性输入值不符合要求则需提示用户。
- 点击“返回”按钮放弃当前记账操作。并返回首页。
功能补充:在“说明”列后加一列,叫“操作”。用户可以删除或修改数据。
分页显示:上一页 下一页 首页 尾页 当前页码 总页数 总条数
3.1.3 参考数据库
1 | sql复制代码create table bills( |
3.2 环境搭建
先创建基本的目录
然后按照上面的步骤配置pom.xml、spring.xml、mybatis.xml、generatorConfig.xml,接着使用mybatis的自动生成功能自动生成
3.3 查询数据
配置web.xml中的请求分发器,以及处理post乱码
1 | xml复制代码<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" |
3.3.1 展示下拉列表和基本信息
dao:
BillsMapper
1 | java复制代码package com.wangjiawei.dao; |
在BillsMapper.xml中添加对应实现:
1 | xml复制代码<resultMap id="BaseResultMap" type="com.wangjiawei.bean.Bills"> |
BillTypeMapper
1 | java复制代码package com.wangjiawei.dao; |
在BillTypeMapper.xml中添加对应实现:
1 | xml复制代码<resultMap id="BaseResultMap" type="com.wangjiawei.bean.Billtype"> |
service层:
BillsService接口:
1 | java复制代码public interface BillsService { |
BillsServiceImpl实现类:
1 | java复制代码@Service |
BillTypesService接口:
1 | java复制代码public interface BillTypesService { |
BillTypesService实现类:
1 | java复制代码@Service |
controller层:
BillsController
1 | java复制代码@Controller |
相应的前端界面:
index.jsp
1 | html复制代码<html> |
show.jsp
1 | html复制代码<%-- |
3.3.2 前端页面【类别】部分的显示
这里需要两表联查:
1 | sql复制代码select * from bills b, billtype t where b.typeid = t.id; |
先添加实体类的一对多关系:
Bills类中添加属性
1 | java复制代码private Billtype billtype; |
BillType中添加属性
1 | java复制代码private List<Bills> billsList; |
相应的要修改mapper.xml:
BillsMapper.xml(要展示类别只用修改这一个就行了)
1 | xml复制代码<resultMap id="rs1" type="bills"> |
修改前端show.jsp:
3.3.3 前端页面【金额】部分的显示
支出,借出时金额应该有一个负号
只用在前端界面中使用choose when即可
1 | html复制代码<c:forEach items="${bills}" var="bill"> |
3.3.4 通过时间和类型模糊查询
实际上,查询所有的语句和模糊查询的语句是同一种语句,只不过模糊查询的语句是在查询所有语句的基础上进行一些拼接,这两种查询可以调用同一个接口。
前端页面:
为搜索这一部分添加一个form
1 | html复制代码<form action="/getAllBills" method="post"> |
controller层:
添加查询所有的方法 getAllBills。
其中添加了回显操作,由于回显操作也要根据type的id进行匹配展示(见前端界面),所以这里也要查询一下所有的type。
1 | java复制代码/** |
service层:
dao接口:
1 | java复制代码public List<Bills> getBills(int typeid, String begin, String end); |
dao实现类:
1 | java复制代码/** |
dao:
修改BillsMapper的getBills方法
1 | java复制代码public List<Bills> getBills(Map map); |
相应的配置文件BillsMapper.xml
1 | xml复制代码<resultMap id="rs1" type="bills"> |
3.3.5 分页展示
使用工具类PageHelper进行分页操作,在service层进行这个操作。
service:
分页查询需要接收新的参数,当前页数:index和每页显示条数size
接口
1 | java复制代码public PageInfo<Bills> getBills(int typeid, String begin, String end, int index, int size); |
实现类:
1 | java复制代码@Service |
controller层:
controller中修改查询操作的调用,传入一个size和index,并且返回给前端的数据变成PageInfo对象
1 | java复制代码@RequestMapping("/gettypes") |
1 | java复制代码@RequestMapping("/getAllBills") |
其中index被定义为一个常量3
1 | java复制代码public interface PageUtil { |
前端页面:
后台返回给前端的数据变成PageInfo对象;
要控制点击上一页,下一页时显示的范围;
分页查询的时候记得要带上模糊查询的参数;
1 | html复制代码<%-- |
3.4 记账功能(新增数据)
前端页面:
注意,页面中的name要和后台Bill类的属性名一致
1 | html复制代码<%-- |
dao层的代码是自动生成的,所以已经有了insert方法,直接从service层开始写:
BillsService中添加:
1 | java复制代码public int insert(Bills record); |
实现类,注意要开启事务:
1 | java复制代码@Override |
controller:
1 | java复制代码@RequestMapping("/insertBill") |
测试的时候需要注意,由于采用的是默认springMVC日期输入格式,所以需要的是2020/2/2这种以斜杠分割的方式。
3.5 更新账单
更新账单其实分了两个操作,一个是查询账单,一个是修改账单
3.5.1 查询账单
show.jsp中为修改操作添加a标签
1 | html复制代码<a href="/findById?bid=${bill.id}">修改</a> |
controller定义对应方法:
1 | java复制代码@RequestMapping("/findById") |
service层:
接口:
1 | java复制代码Bills selectByPrimaryKey(Integer id); |
实现类:
1 | java复制代码@Override |
dao是自动生成的:
1 | sql复制代码<sql id="Base_Column_List"> |
前端界面:
controller会返回一个update.jsp页面
1 | html复制代码<%@ page contentType="text/html;charset=UTF-8" language="java" %> |
3.5.2 修改操作
controller:
1 | java复制代码@RequestMapping("/updateBill") |
修改成功返回show页面,修改失败返回update页面。
service层:
1 | java复制代码@Override |
dao也是自动生成的:
1 | sql复制代码<update id="updateByPrimaryKey" parameterType="com.wangjiawei.bean.Bills"> |
3.5.3 删除操作
show.jsp中为删除添加一个按钮
1 | html复制代码<a href="/deleteById?bid=${bill.id}">删除</a> |
controller层:
添加删除方法
1 | java复制代码@RequestMapping("/deleteById") |
service层:
接口
1 | java复制代码public int deleteByPrimaryKey(Integer id); |
实现类
1 | java复制代码@Override |
关于源码:
大家可以通过我的下载主业进行下载,或者公众号里由有我个人的联系方式
本文转载自: 掘金