SSM整合练习:记账管理
目錄
需求分析
數據庫設計
環境搭建
首頁數據展示
展示全部賬單和類型
顯示具體類型
金額顯示正負
根據類型和時間段查詢
分頁
新增
更新
刪除
需求分析
其中,查詢條件中類型為下拉列表,可選值有“不限,支出,收入,轉賬,借出,借入,還入,還出”。日期輸入框需要輸入“yyyy-MM-dd”格式的日期字符串,點擊“搜索”按鈕提交表單,提交時如果輸入項不符合輸入要求,則顯示相應提示信息。列表中根據記賬類別在金額前添加相應的“+,-”符號,如果類別為“支出,借出,還出”時在金額前添加“-”。如果類別為“收入,借入,還入”時在金額前添加“+”。如果根據輸入項進行查詢后沒有找到賬單數據,則給出提示信息
點擊“記賬”按鈕后,進入記賬頁面,如圖
?
數據庫設計
create table bills (id int primary key auto_increment,title varchar(50) not null,billtime date not null,typeid int not null,price double not null,explains varchar(500) );create table bill_type (id int primary key auto_increment,bname varchar(50) not null );?
環境搭建
pom.xml
<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.vv</groupId><artifactId>SSMDemo</artifactId><version>1.0-SNAPSHOT</version><packaging>war</packaging><name>SSMDemo Maven Webapp</name><!-- FIXME change it to the project's website --><url>http://www.example.com</url><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><maven.compiler.source>1.7</maven.compiler.source><maven.compiler.target>1.7</maven.compiler.target><springversion>5.0.8.RELEASE</springversion></properties><dependencies><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.11</version><scope>test</scope></dependency><!-- 加入ServletAPI --><dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version>3.1.0</version><scope>provided</scope></dependency><!-- MySQL依賴 start --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.38</version></dependency><!-- 加入MyBatis 依賴 start --><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.2.8</version></dependency><!-- 引入Spring(包含SpringMVC) 依賴 start --><dependency><groupId>org.springframework</groupId><artifactId>spring-core</artifactId><version>${springversion}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-web</artifactId><version>${springversion}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-oxm</artifactId><version>${springversion}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-tx</artifactId><version>${springversion}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-jdbc</artifactId><version>${springversion}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>${springversion}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-aop</artifactId><version>${springversion}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-context-support</artifactId><version>${springversion}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-test</artifactId><version>${springversion}</version></dependency><!-- 引用插件依賴:MyBatis整合Spring,如果mybatis版本在3.4及以上版本 mybatis-spring的版本要在1.3以上 --><dependency><groupId>org.mybatis</groupId><artifactId>mybatis-spring</artifactId><version>1.2.2</version></dependency><!-- JSTL --><dependency><groupId>jstl</groupId><artifactId>jstl</artifactId><version>1.2</version></dependency><!-- 德魯伊數據連接池 --><dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>1.0.9</version></dependency><!-- pagehelper --><dependency><groupId>com.github.pagehelper</groupId><artifactId>pagehelper</artifactId><version>4.1.6</version></dependency><!--處理json--><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.9.5</version></dependency><!--javaee--><dependency><groupId>javax</groupId><artifactId>javaee-api</artifactId><version>7.0</version><scope>provided</scope></dependency><!--文件上傳下載--><dependency><groupId>commons-fileupload</groupId><artifactId>commons-fileupload</artifactId><version>1.3.1</version></dependency><dependency><groupId>commons-io</groupId><artifactId>commons-io</artifactId><version>2.4</version></dependency><dependency><groupId>org.mybatis.generator</groupId><artifactId>mybatis-generator-core</artifactId><version>1.3.5</version></dependency></dependencies><build><finalName>SSMDemo</finalName><pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) --><plugins><plugin><artifactId>maven-clean-plugin</artifactId><version>3.1.0</version></plugin><!-- see http://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_war_packaging --><plugin><artifactId>maven-resources-plugin</artifactId><version>3.0.2</version></plugin><plugin><artifactId>maven-compiler-plugin</artifactId><version>3.8.0</version></plugin><plugin><artifactId>maven-surefire-plugin</artifactId><version>2.22.1</version></plugin><plugin><artifactId>maven-war-plugin</artifactId><version>3.2.2</version></plugin><plugin><artifactId>maven-install-plugin</artifactId><version>2.5.2</version></plugin><plugin><artifactId>maven-deploy-plugin</artifactId><version>2.8.2</version></plugin><plugin><groupId>org.mybatis.generator</groupId><artifactId>mybatis-generator-maven-plugin</artifactId><version>1.3.5</version><configuration><!--配置?件的路徑--><configurationFile>src/main/resources/generatorConfig.xml</configurationFile><overwrite>true</overwrite></configuration><dependencies><dependency><groupId>org.mybatis.generator</groupId><artifactId>mybatis-generator-core</artifactId><version>1.3.5</version></dependency></dependencies></plugin></plugins></pluginManagement></build> </project>web.xml
<web-appxmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns="http://java.sun.com/xml/ns/javaee"xsi:schemaLocation="http://java.sun.com/xml/ns/javaeehttp://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5"><!--1、配置前端控制器--><servlet><servlet-name>mvc</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><init-param><param-name>contextConfigLocation</param-name><param-value>classpath:spring.xml</param-value></init-param></servlet><servlet-mapping><servlet-name>mvc</servlet-name><url-pattern>/</url-pattern></servlet-mapping><!--處理post亂碼--><filter><filter-name>aa</filter-name><filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class><init-param><param-name>encoding</param-name><param-value>utf-8</param-value></init-param></filter><filter-mapping><filter-name>aa</filter-name><url-pattern>/*</url-pattern></filter-mapping> </web-app>spring.xml
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:p="http://www.springframework.org/schema/p"xmlns:context="http://www.springframework.org/schema/context"xmlns:tx="http://www.springframework.org/schema/tx"xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:rx="http://www.springframework.org/schema/cache"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsdhttp://www.springframework.org/schema/txhttp://www.springframework.org/schema/tx/spring-tx.xsdhttp://www.springframework.org/schema/mvchttp://www.springframework.org/schema/mvc/spring-mvc.xsdhttp://www.springframework.org/schema/cachehttp://www.springframework.org/schema/cache/spring-cache.xsd"><!--配置數據源--><bean id="db" class="com.alibaba.druid.pool.DruidDataSource"><property name="driverClassName" value="com.mysql.jdbc.Driver"/><property name="url" value="jdbc:mysql://localhost:3306/test"/><property name="username" value="root"/><property name="password" value=""/></bean> <!--創建sqlSessionFactory--><bean id="fac" class="org.mybatis.spring.SqlSessionFactoryBean"><property name="dataSource" ref="db"/><property name="configLocation" value="classpath:Mybatis.xml"></property><!--指定mybatis的路徑--><property name="mapperLocations" value="classpath:mapper/*"></property><!--指定mybatis的mapper的路徑--></bean> <!--創建MapperScannerConfigurer,用于省略dao實現類--><bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"><property name="sqlSessionFactoryBeanName" value="fac"/><property name="basePackage" value="com.vv.dao"/><!--接口全路徑--></bean> <!--配置事務--><bean id="mytx" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"><property name="dataSource" ref="db"/></bean><tx:annotation-driven transaction-manager="mytx"/> <!--啟用springmvc注解--><mvc:annotation-driven/> <!--配置視圖解析器--><bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"><property name="prefix" value="/"/><property name="suffix" value=".jsp"/></bean> <!--掃描注解包--><context:component-scan base-package="com.vv"/> <!--配置靜態資源訪問--><mvc:default-servlet-handler/> </beans>Mybatis.xml?
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration> <!--指定別名--><typeAliases><package name="com.vv.bean"/></typeAliases> <!--分頁插件--><plugins> <!-- PageHelper4.1.6 --><plugin interceptor="com.github.pagehelper.PageHelper"><property name="dialect" value="mysql"/></plugin></plugins> </configuration>generatorConfig.xml
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE generatorConfigurationPUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN""http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd"> <!-- 配置?成器 --> <generatorConfiguration><!--數據庫驅動jar(在maven中找) --><classPathEntrylocation="D:\maven-repo\mysql\mysql-connector-java\5.1.40\mysql-connector-java-5.1.40.jar"/><context id="MyBatis" targetRuntime="MyBatis3"><!--去除注釋 --><commentGenerator><property name="suppressAllComments" value="true" /></commentGenerator><!--數據庫連接 --><jdbcConnection driverClass="com.mysql.jdbc.Driver"connectionURL="jdbc:mysql://localhost:3306/test"userId="root"password=""></jdbcConnection><!--?成實體類 指定包名 以及?成的地址 (可以?定義地址,但是路徑不存在不會?動創建使?Maven?成在target?錄下,會?動創建) --><javaModelGenerator targetPackage="com.vv.bean"targetProject="D:\IDEA\SSMDemo\src\main\java"><property name="trimStrings" value="true" /></javaModelGenerator><!--?成SQLmapper?件 --><sqlMapGenerator targetPackage="mapper"targetProject="D:\IDEA\SSMDemo\src\main\resources"></sqlMapGenerator><!--?成Dao?件,?成接? --><javaClientGenerator type="XMLMAPPER"targetPackage="com.vv.dao"targetProject="D:\IDEA\SSMDemo\src\main\java"></javaClientGenerator><!--指定表--><table tableName="bill_type" enableCountByExample="false"enableUpdateByExample="false" enableDeleteByExample="false"enableSelectByExample="false" selectByExampleQueryId="false"></table><table tableName="bills" enableCountByExample="false"enableUpdateByExample="false" enableDeleteByExample="false"enableSelectByExample="false" selectByExampleQueryId="false"></table></context> </generatorConfiguration>?
首頁數據展示
展示全部賬單和類型
我們需要展示的數據有兩個,分別是所有的賬單和所有的賬單類型,所有我們要寫賬單和賬單類型兩個接口及其實現類
@Service public class BillsServiceImpl implements BillsService {@Resourceprivate BillsMapper billsMapper;@Overridepublic List<Bills> getBills() {//在BillsMapper中新增getBills的接口,并且在BillsMapper.xml中增加sql語句return billsMapper.getBills();} } @Service public class BillTypesImpl implements BillTypesService {@Resourceprivate BillTypeMapper typeMapper;@Overridepublic List<BillType> getTypes() {//在BillTypeMapper中新增getTypes的接口,并且在BillTypeMapper.xml中增加sql語句return typeMapper.getTypes();} }然后再在Controller來調取方法,返回數據給前臺
@Controller public class BillsController {@Resourceprivate BillsService billsService;@Resourceprivate BillTypesService typesService;@RequestMapping("/getTypes")public String getTypes(ModelMap map){//查詢所有的類型List<BillType> types = typesService.getTypes();//查詢所有的賬單List<Bills> bills = billsService.getBills();//返回數據給前臺map.addAttribute("types",types);map.addAttribute("bills",bills);return "show";} }在前臺的時候,我們在加載index.jsp的時候,發送個getTypes請求,然后再在show.jsp展示數據
show.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> <html> <head><title>展示數據</title> </head> <body> <h1>記賬管理</h1> <p><form>類型:<select><%--value 屬性規定在表單被提交時被發送到服務器的值,如果沒有指定 value 屬性,選項的值將設置為 <option> 標簽中的內容--%><option value="-1">不限</option><c:forEach items="${types}" var="type"><option value="${type.id}">${type.bname}</option></c:forEach></select>時間:從<input type="text" name="begin">到<input type="text" name="end"><input type="submit" value="搜索"></form><input type="button" value="記賬"> </p> <table border="1" width="500"><tr><td>標題</td><td>記賬時間</td><td>類型</td><td>金額</td><td>說明</td><td>操作</td></tr><c:forEach items="${bills}" var="bill"><tr><td>${bill.title}</td><td><fmt:formatDate value="${bill.billtime}" pattern="yyyy-MM-dd"/></td><td>${bill.typeid}</td><td>${bill.price}</td><td>${bill.explains}</td><td>刪除 修改</td></tr></c:forEach> </table> </body> </html>?
顯示具體類型
但是這里的類型只顯示的是數字,我們希望顯示具體的類型,所有在查詢的時候我們需要用兩表連查。兩表表查詢的時候,易知這是個一對多的關系,所有在Bills對象中新增BillType類型的對象,BillType對象中新增List<Bills>集合。并且要修改BillsMapper.xml的SQL語句和resultMap
?
金額顯示正負
如果類別為“支出,借出,還出”時在金額前添加“-”。 如果類別為“收入,借入,還入”時在金額前添加“+”
?
?
根據類型和時間段查詢
我們可以把查詢所有和模糊查詢用同一個方法,用動態sql實現。
首先改一下表單
Controller
@RequestMapping("/search") public String getTypes(Integer typeid,String begin,String end,ModelMap map) {List<Bills> bills = billsService.getBills(typeid, begin, end);List<BillType> types = typesService.getTypes();map.addAttribute("bills",bills);map.addAttribute("types",types);//數據回顯map.addAttribute("tid",typeid);map.addAttribute("begintime",begin);map.addAttribute("endtime",end);return "show"; }并且還要修改一下,查詢所有的方法參數
修改SQL語句
<select id="getBills" resultMap="rs1">select * from bills b,bill_type t where b.typeid = t.id<if test="tid!=-1">and t.id=#{tid}</if><if test="begin!=null and begin!=''">and b.billtime>=#{begin}</if><if test="end!=null and end!=''">and b.billtime <![CDATA[ <= ]]> #{end}</if> </select>回顯信息
查詢不到,顯示‘無結果’
?
分頁
首先我們需要修改一下getBills方法的參數,增加當前頁碼和頁面大小的參數,并且使用分頁插件,返回PageInfo<Bills>集合
@Override public PageInfo<Bills> getBills(int typeid,String begin,String end,int index,int size) {Map map = new HashMap();map.put("tid",typeid);map.put("begin",begin);map.put("end",end);//使用分頁插件分頁PageHelper.startPage(index,size);List<Bills> bills = billsMapper.getBills(map);//創建分頁工具類PageInfo<Bills> info = new PageInfo<>(bills);return info; }并且修改傳遞到前臺的參數
在頁面最下方加分頁欄,但是在使用模糊查詢的時候,無法進行數據回顯,所有需要在請求后面加參數
<tr><td colspan="6"><a href="/search?typeid=${tid}&begin=${begintime}&end=${endtime}">首頁</a><a href="/search?index=${info.prePage==0?1:info.prePage}&typeid=${tid}&begin=${begintime}&end=${endtime}">上一頁</a><a href="/search?index=${info.nextPage==0?info.pages:info.nextPage}&typeid=${tid}&begin=${begintime}&end=${endtime}">下一頁</a><a href="/search?index=${info.pages}&typeid=${tid}&begin=${begintime}&end=${endtime}">尾頁</a>總頁數:${info.pages}總條數:${info.total}</td> </tr>?
新增
首先我們需要獲得所有的類型,用于在新增的時候展示
controller
@RequestMapping("/getBillType") public String getBillType(ModelMap map) {//得到所有賬單類型,用于添加,然后跳轉到添加頁面List<BillType> types = typesService.getTypes();map.addAttribute("types",types);return "add"; }add.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <html> <head><title>新增</title> </head> <body><h1>記賬</h1><form action="/insert" method="post"><p>類型:<c:forEach items="${types}" var="type"><input type="radio" value="${type.id}" name="typeid">${type.bname}</c:forEach></p><p>標題:<input type="text" name="title"></p><p>日期:<input type="text" name="billtime"></p><p>金額:<input type="text" name="price"></p><p>說明:<textarea cols="50" rows="4" name="explains"></textarea></p><input type="reset" value="重置"><input type="submit" value="提交"></form> </body> </html>name屬性要和bills對象的屬性一致,只要傳到后臺就可以直接用一個對象接收,并且接口實現方法
@RequestMapping("/insert") public String insert(Bills bill) {int insert = billsService.insert(bill);if(insert>0) {return "redirect:/getTypes";//回到主頁面}return "redirect:/getBillType";//新增失敗回到新增頁面,但是不能直接去 }更新
更新和新增差不多,用的頁面差不多。更新需要調用獲取所有類型和主鍵查詢,查詢出來結果用于在頁面回顯數據,然后再進行修改。
@RequestMapping("/findById") public String findById(int id,ModelMap map) {Bills bills = billsService.selectByPrimaryKey(id);List<BillType> types = typesService.getTypes();map.addAttribute("types",types);map.addAttribute("bill",bills);return "update"; } <%@ page contentType="text/html;charset=UTF-8" language="java" %> <%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> <html> <head><title>Title</title> </head> <body> <h1>更新</h1> <form action="/updateBill" method="post"><input type="hidden" name="id" value="${bill.id}"><!--這里隱藏域用來提交id--><p>類型:<c:forEach items="${types}" var="type"><input type="radio" value="${type.id}" ${type.id==bill.typeid?'checked':''} name="typeid">${type.bname}</c:forEach></p><p>標題:<input type="text" name="title" value="${bill.title}"></p><p>日期:<input type="text" name="billtime" value="<fmt:formatDate value="${bill.billtime}" pattern="yyyy/MM/dd"/>"></p><p>金額:<input type="text" name="price" value="${bill.price}"></p><p>說明:<textarea cols="50" rows="4" name="explains">${bill.explains}</textarea></p><input type="reset" value="重置"><input type="submit" value="保存"> </form> </body> </html> @RequestMapping("/updateBill") public String updateBill(Bills bills) {int update = billsService.updateByPrimaryKey(bills);if(update>0) {return "redirect:/getTypes";//回到主頁面}return "redirect:/findById?id="+bills.getId(); }刪除
刪除是所有功能中最簡單的
@RequestMapping("/deleteById") public void deleteById(int id, HttpServletResponse response) {int delete = billsService.deleteByPrimaryKey(id);response.setContentType("text/html;charset=utf-8");PrintWriter writer = null;try {writer = response.getWriter();if(delete>0) {writer.print("<script>alert('刪除成功');location.href='/getTypes'</script>");return;}writer.print("<script>alert('刪除失敗');location.href='/getTypes'</script>");} catch (IOException e) {e.printStackTrace();} }?
總結
以上是生活随笔為你收集整理的SSM整合练习:记账管理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Ubuntu18.04基于ROS和PX4
- 下一篇: 大数据开发 电脑内存大小