网站搜索排名优化,临沂网站设计培训班,北京网络推广平台,自己做的网站如何上首页目录 前言
一、前期准备
1.pom.xml---依赖与插件的导入
2.jdbc.properties---数据库连接 3.log4j2.xml---日志文件
4.spring-mybatis
5.spring-context
6.spring-mvc
二、增删改查的实现
1.model与mapper层的生成
2.biz层
3.工具类
4.controller层
三、测试结果
总…目录 前言
一、前期准备
1.pom.xml---依赖与插件的导入
2.jdbc.properties---数据库连接 3.log4j2.xml---日志文件
4.spring-mybatis
5.spring-context
6.spring-mvc
二、增删改查的实现
1.model与mapper层的生成
2.biz层
3.工具类
4.controller层
三、测试结果
总结
【参考资料】 前言 Spring MVC是一种基于Java的Web框架它提供了一种简单而强大的方式来构建Web应用程序。在本文中我们将详细讲解如何使用Spring MVC来实现增删改查功能。我们将从基本概念开始逐步介绍每个步骤并提供示例代码来帮助您更好地理解和应用这些概念。
一、前期准备
先创建一个maven工程
1.pom.xml---依赖与插件的导入
将相关依赖于插件进行添加并将build标签内将pluginManagement标签删除解除版本锁定
?xml version1.0 encodingUTF-8?project xmlnshttp://maven.apache.org/POM/4.0.0 xmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsdmodelVersion4.0.0/modelVersiongroupIdcom.ctb/groupIdartifactIdctbssm/artifactIdversion1.0-SNAPSHOT/versionpackagingwar/packagingnamectbssm Maven Webapp/name!-- FIXME change it to the projects website --urlhttp://www.example.com/urlpropertiesproject.build.sourceEncodingUTF-8/project.build.sourceEncodingmaven.compiler.source1.8/maven.compiler.sourcemaven.compiler.target1.8/maven.compiler.targetmaven.compiler.plugin.version3.7.0/maven.compiler.plugin.version!--添加jar包依赖--!--1.spring 5.0.2.RELEASE相关--spring.version5.0.2.RELEASE/spring.version!--2.mybatis相关--mybatis.version3.4.5/mybatis.version!--mysql--mysql.version5.1.44/mysql.version!--pagehelper分页jar依赖--pagehelper.version5.1.2/pagehelper.version!--mybatis与spring集成jar依赖--mybatis.spring.version1.3.1/mybatis.spring.version!--3.dbcp2连接池相关 druid--commons.dbcp2.version2.1.1/commons.dbcp2.versioncommons.pool2.version2.4.3/commons.pool2.version!--4.log日志相关--log4j2.version2.9.1/log4j2.versionlog4j2.disruptor.version3.2.0/log4j2.disruptor.versionslf4j.version1.7.13/slf4j.version!--5.其他--junit.version4.12/junit.versionservlet.version4.0.0/servlet.versionlombok.version1.18.2/lombok.versionmybatis.ehcache.version1.1.0/mybatis.ehcache.versionehcache.version2.10.0/ehcache.versionredis.version2.9.0/redis.versionredis.spring.version1.7.1.RELEASE/redis.spring.versionjackson.version2.9.3/jackson.versionjstl.version1.2/jstl.versionstandard.version1.1.2/standard.versiontomcat-jsp-api.version8.0.47/tomcat-jsp-api.versioncommons-fileupload.version1.3.3/commons-fileupload.versionhibernate-validator.version5.0.2.Final/hibernate-validator.versionshiro.version1.3.2/shiro.version/propertiesdependencies!--1.spring相关--dependencygroupIdorg.springframework/groupIdartifactIdspring-core/artifactIdversion${spring.version}/version/dependencydependencygroupIdorg.springframework/groupIdartifactIdspring-beans/artifactIdversion${spring.version}/version/dependencydependencygroupIdorg.springframework/groupIdartifactIdspring-context/artifactIdversion${spring.version}/version/dependencydependencygroupIdorg.springframework/groupIdartifactIdspring-orm/artifactIdversion${spring.version}/version/dependencydependencygroupIdorg.springframework/groupIdartifactIdspring-tx/artifactIdversion${spring.version}/version/dependencydependencygroupIdorg.springframework/groupIdartifactIdspring-aspects/artifactIdversion${spring.version}/version/dependencydependencygroupIdorg.springframework/groupIdartifactIdspring-web/artifactIdversion${spring.version}/version/dependencydependencygroupIdorg.springframework/groupIdartifactIdspring-test/artifactIdversion${spring.version}/version/dependency!--2.mybatis相关--dependencygroupIdorg.mybatis/groupIdartifactIdmybatis/artifactIdversion${mybatis.version}/version/dependency!--mysql--dependencygroupIdmysql/groupIdartifactIdmysql-connector-java/artifactIdversion${mysql.version}/version/dependency!--pagehelper分页插件jar包依赖--dependencygroupIdcom.github.pagehelper/groupIdartifactIdpagehelper/artifactIdversion${pagehelper.version}/version/dependency!--mybatis与spring集成jar包依赖--dependencygroupIdorg.mybatis/groupIdartifactIdmybatis-spring/artifactIdversion${mybatis.spring.version}/version/dependencydependencygroupIdorg.springframework/groupIdartifactIdspring-context-support/artifactIdversion${spring.version}/version/dependency!--mybatis与ehcache整合--dependencygroupIdorg.mybatis.caches/groupIdartifactIdmybatis-ehcache/artifactIdversion${mybatis.ehcache.version}/version/dependency!--ehcache依赖--dependencygroupIdnet.sf.ehcache/groupIdartifactIdehcache/artifactIdversion${ehcache.version}/version/dependencydependencygroupIdredis.clients/groupIdartifactIdjedis/artifactIdversion${redis.version}/version/dependencydependencygroupIdorg.springframework.data/groupIdartifactIdspring-data-redis/artifactIdversion${redis.spring.version}/version/dependencydependencygroupIdcom.fasterxml.jackson.core/groupIdartifactIdjackson-databind/artifactIdversion${jackson.version}/version/dependencydependencygroupIdcom.fasterxml.jackson.core/groupIdartifactIdjackson-core/artifactIdversion${jackson.version}/version/dependencydependencygroupIdcom.fasterxml.jackson.core/groupIdartifactIdjackson-annotations/artifactIdversion${jackson.version}/version/dependency!--3.dbcp2连接池相关--dependencygroupIdorg.apache.commons/groupIdartifactIdcommons-dbcp2/artifactIdversion${commons.dbcp2.version}/versionexclusionsexclusionartifactIdcommons-pool2/artifactIdgroupIdorg.apache.commons/groupId/exclusion/exclusions/dependencydependencygroupIdorg.apache.commons/groupIdartifactIdcommons-pool2/artifactIdversion${commons.pool2.version}/version/dependency!--springmvc依赖--dependencygroupIdorg.springframework/groupIdartifactIdspring-webmvc/artifactIdversion${spring.version}/version/dependency!--4.log日志相关依赖--!-- log4j2日志相关依赖 --!-- log配置Log4j2 Slf4j --!-- slf4j核心包--dependencygroupIdorg.slf4j/groupIdartifactIdslf4j-api/artifactIdversion${slf4j.version}/version/dependencydependencygroupIdorg.slf4j/groupIdartifactIdjcl-over-slf4j/artifactIdversion${slf4j.version}/versionscoperuntime/scope/dependency!--核心log4j2jar包--dependencygroupIdorg.apache.logging.log4j/groupIdartifactIdlog4j-api/artifactIdversion${log4j2.version}/version/dependencydependencygroupIdorg.apache.logging.log4j/groupIdartifactIdlog4j-core/artifactIdversion${log4j2.version}/version/dependency!--用于与slf4j保持桥接--dependencygroupIdorg.apache.logging.log4j/groupIdartifactIdlog4j-slf4j-impl/artifactIdversion${log4j2.version}/version/dependency!--web工程需要包含log4j-web非web工程不需要--dependencygroupIdorg.apache.logging.log4j/groupIdartifactIdlog4j-web/artifactIdversion${log4j2.version}/versionscoperuntime/scope/dependency!--需要使用log4j2的AsyncLogger需要包含disruptor--dependencygroupIdcom.lmax/groupIdartifactIddisruptor/artifactIdversion${log4j2.disruptor.version}/version/dependency!--5.其他--dependencygroupIdjunit/groupIdartifactIdjunit/artifactIdversion${junit.version}/version!-- scopetest/scope--/dependencydependencygroupIdjavax.servlet/groupIdartifactIdjavax.servlet-api/artifactIdversion${servlet.version}/versionscopeprovided/scope/dependencydependencygroupIdorg.projectlombok/groupIdartifactIdlombok/artifactIdversion${lombok.version}/versionscopeprovided/scope/dependencydependencygroupIdjstl/groupIdartifactIdjstl/artifactIdversion${jstl.version}/version/dependencydependencygroupIdtaglibs/groupIdartifactIdstandard/artifactIdversion${standard.version}/version/dependencydependencygroupIdorg.apache.tomcat/groupIdartifactIdtomcat-jsp-api/artifactIdversion${tomcat-jsp-api.version}/version/dependencydependencygroupIdcommons-fileupload/groupIdartifactIdcommons-fileupload/artifactIdversion${commons-fileupload.version}/version/dependencydependencygroupIdorg.hibernate/groupIdartifactIdhibernate-validator/artifactIdversion${hibernate-validator.version}/version/dependency!--shiro依赖--dependencygroupIdorg.apache.shiro/groupIdartifactIdshiro-core/artifactIdversion${shiro.version}/version/dependencydependencygroupIdorg.apache.shiro/groupIdartifactIdshiro-web/artifactIdversion${shiro.version}/version/dependencydependencygroupIdorg.apache.shiro/groupIdartifactIdshiro-spring/artifactIdversion${shiro.version}/version/dependency/dependenciesbuildfinalNamectbssm/finalNameresources!--解决mybatis-generator-maven-plugin运行时没有将XxxMapper.xml文件放入target文件夹的问题--resourcedirectorysrc/main/java/directoryincludesinclude**/*.xml/include/includes/resource!--解决mybatis-generator-maven-plugin运行时没有将jdbc.properites文件放入target文件夹的问题--resourcedirectorysrc/main/resources/directoryincludesincludejdbc.properties/includeinclude*.xml/include/includes/resource/resourcespluginsplugingroupIdorg.apache.maven.plugins/groupIdartifactIdmaven-compiler-plugin/artifactIdversion${maven.compiler.plugin.version}/versionconfigurationsource${maven.compiler.source}/sourcetarget${maven.compiler.target}/targetencoding${project.build.sourceEncoding}/encoding/configuration/pluginplugingroupIdorg.mybatis.generator/groupIdartifactIdmybatis-generator-maven-plugin/artifactIdversion1.3.2/versiondependencies!--使用Mybatis-generator插件不能使用太高版本的mysql驱动 --dependencygroupIdmysql/groupIdartifactIdmysql-connector-java/artifactIdversion${mysql.version}/version/dependency/dependenciesconfigurationoverwritetrue/overwrite/configuration/pluginpluginartifactIdmaven-clean-plugin/artifactIdversion3.1.0/version/plugin!-- see http://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_war_packaging --pluginartifactIdmaven-resources-plugin/artifactIdversion3.0.2/version/pluginpluginartifactIdmaven-compiler-plugin/artifactIdversion3.8.0/version/pluginpluginartifactIdmaven-surefire-plugin/artifactIdversion2.22.1/version/pluginpluginartifactIdmaven-war-plugin/artifactIdversion3.2.2/version/pluginpluginartifactIdmaven-install-plugin/artifactIdversion2.5.2/version/pluginpluginartifactIdmaven-deploy-plugin/artifactIdversion2.8.2/version/plugin/plugins/build
/project2.jdbc.properties---数据库连接
数据库驱动---数据库连接路径---数据库登录用户名---数据库登录密码
jdbc.drivercom.mysql.jdbc.Driver
jdbc.urljdbc:mysql://localhost:3306/mybatis_ssm?useUnicodetruecharacterEncodingUTF-8
jdbc.usernameroot
jdbc.password1234563.log4j2.xml---日志文件
用于记录日志
?xml version1.0 encodingUTF-8?!-- status : 指定log4j本身的打印日志的级别.ALL Trace DEBUG INFO WARN ERROR FATAL OFF。 monitorInterval : 用于指定log4j自动重新配置的监测间隔时间单位是s,最小是5s. --
Configuration statusWARN monitorInterval30Properties!-- 配置日志文件输出目录 ${sys:user.home} --Property nameLOG_HOME/root/workspace/lucenedemo/logs/Propertyproperty nameERROR_LOG_FILE_NAME/root/workspace/lucenedemo/logs/error/propertyproperty nameWARN_LOG_FILE_NAME/root/workspace/lucenedemo/logs/warn/propertyproperty namePATTERN%d{yyyy-MM-dd HH:mm:ss.SSS} [%t-%L] %-5level %logger{36} - %msg%n/property/PropertiesAppenders!--这个输出控制台的配置 --Console nameConsole targetSYSTEM_OUT!-- 控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch) --ThresholdFilter leveltrace onMatchACCEPTonMismatchDENY /!-- 输出日志的格式 --!-- %d{yyyy-MM-dd HH:mm:ss, SSS} : 日志生产时间 %p : 日志输出格式 %c : logger的名称 %m : 日志内容即 logger.info(message) %n : 换行符 %C : Java类名 %L : 日志输出所在行数 %M : 日志输出所在方法名 hostName : 本地机器名 hostAddress : 本地ip地址 --PatternLayout pattern${PATTERN} //Console!--文件会打印出所有信息这个log每次运行程序会自动清空由append属性决定这个也挺有用的适合临时测试用 --!--append为TRUE表示消息增加到指定文件中false表示消息覆盖指定的文件内容默认值是true --File namelog fileNamelogs/test.log appendfalsePatternLayoutpattern%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n //File!-- 这个会打印出所有的info及以下级别的信息每次大小超过size 则这size大小的日志会自动存入按年份-月份建立的文件夹下面并进行压缩作为存档 --RollingFile nameRollingFileInfo fileName${LOG_HOME}/info.logfilePattern${LOG_HOME}/$${date:yyyy-MM}/info-%d{yyyy-MM-dd}-%i.log!--控制台只输出level及以上级别的信息onMatch其他的直接拒绝onMismatch --ThresholdFilter levelinfo onMatchACCEPTonMismatchDENY /PatternLayoutpattern%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n /Policies!-- 基于时间的滚动策略interval属性用来指定多久滚动一次默认是1 hour。 modulatetrue用来调整时间比如现在是早上3aminterval是4那么第一次滚动是在4am接着是8am12am...而不是7am. --!-- 关键点在于 filePattern后的日期格式以及TimeBasedTriggeringPolicy的interval 日期格式精确到哪一位interval也精确到哪一个单位 --!-- log4j2的按天分日志文件 : info-%d{yyyy-MM-dd}-%i.log --TimeBasedTriggeringPolicy interval1modulatetrue /!-- SizeBasedTriggeringPolicy:Policies子节点 基于指定文件大小的滚动策略size属性用来定义每个日志文件的大小. --!-- SizeBasedTriggeringPolicy size2 kB / --/Policies/RollingFileRollingFile nameRollingFileWarn fileName${WARN_LOG_FILE_NAME}/warn.logfilePattern${WARN_LOG_FILE_NAME}/$${date:yyyy-MM}/warn-%d{yyyy-MM-dd}-%i.logThresholdFilter levelwarn onMatchACCEPTonMismatchDENY /PatternLayoutpattern%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n /PoliciesTimeBasedTriggeringPolicy /SizeBasedTriggeringPolicy size2 kB //Policies!-- DefaultRolloverStrategy属性如不设置则默认为最多同一文件夹下7个文件这里设置了20 --DefaultRolloverStrategy max20 //RollingFileRollingFile nameRollingFileError fileName${ERROR_LOG_FILE_NAME}/error.logfilePattern${ERROR_LOG_FILE_NAME}/$${date:yyyy-MM}/error-%d{yyyy-MM-dd-HH-mm}-%i.logThresholdFilter levelerror onMatchACCEPTonMismatchDENY /PatternLayoutpattern%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n /Policies!-- log4j2的按分钟 分日志文件 : warn-%d{yyyy-MM-dd-HH-mm}-%i.log --TimeBasedTriggeringPolicy interval1modulatetrue /!-- SizeBasedTriggeringPolicy size10 MB / --/Policies/RollingFile/Appenders!--然后定义logger只有定义了logger并引入的appenderappender才会生效 --Loggers!--过滤掉spring和mybatis的一些无用的DEBUG信息 --logger nameorg.springframework levelINFO/loggerlogger nameorg.mybatis levelINFO/logger!-- 第三方日志系统 --logger nameorg.springframework levelERROR /logger nameorg.hibernate levelERROR /logger nameorg.apache.struts2 levelERROR /logger namecom.opensymphony.xwork2 levelERROR /logger nameorg.jboss levelERROR /!-- 配置日志的根节点 --root levelallappender-ref refConsole /appender-ref refRollingFileInfo /appender-ref refRollingFileWarn /appender-ref refRollingFileError //root/Loggers/Configuration
4.spring-mybatis
?xml version1.0 encodingUTF-8?
beans xmlnshttp://www.springframework.org/schema/beansxmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexmlns:contexthttp://www.springframework.org/schema/context xmlns:txhttp://www.springframework.org/schema/txxmlns:aophttp://www.springframework.org/schema/aopxsi:schemaLocationhttp://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd!--1. 注解式开发 --!-- 注解驱动 --context:annotation-config/!-- 用注解方式注入bean并指定查找范围com.javaxl.ssm及子子孙孙包--context:component-scan base-packagecom.ctb/context:property-placeholder locationclasspath:jdbc.properties/bean iddataSource classorg.apache.commons.dbcp2.BasicDataSourcedestroy-methodcloseproperty namedriverClassName value${jdbc.driver}/property nameurl value${jdbc.url}/property nameusername value${jdbc.username}/property namepassword value${jdbc.password}/!--初始连接数--property nameinitialSize value10/!--最大活动连接数--property namemaxTotal value100/!--最大空闲连接数--property namemaxIdle value50/!--最小空闲连接数--property nameminIdle value10/!--设置为-1时如果没有可用连接连接池会一直无限期等待直到获取到连接为止。--!--如果设置为N毫秒则连接池会等待N毫秒等待不到则抛出异常--property namemaxWaitMillis value-1//bean!--4. spring和MyBatis整合 --!--1) 创建sqlSessionFactory--bean idsqlSessionFactory classorg.mybatis.spring.SqlSessionFactoryBean!-- 指定数据源 --property namedataSource refdataSource/!-- 自动扫描XxxMapping.xml文件**任意路径com.plb.wh.mapper.BookMapper.xmlcom.plb.xw.mapper.BookMapper.xmlcom.plb.bg.mapper.BookMapper.xmlcom.ctb.mapper.BookMapper.xml--property namemapperLocations valueclasspath*:com/ctb/**/mapper/*.xml/!-- 指定别名 --property nametypeAliasesPackage valuecom/ctb/**/model/!--配置pagehelper插件--property namepluginsarraybean classcom.github.pagehelper.PageInterceptorproperty namepropertiesvaluehelperDialectmysql/value/property/bean/array/property/bean!--2) 自动扫描com/javaxl/ssm/**/mapper下的所有XxxMapper接口(其实就是DAO接口)并实现这些接口--!-- 即可直接在程序中使用dao接口不用再获取sqlsession对象--bean classorg.mybatis.spring.mapper.MapperScannerConfigurer!--basePackage 属性是映射器接口文件的包路径。--!--你可以使用分号或逗号 作为分隔符设置多于一个的包路径com.ctb.mapper.BookMapper--property namebasePackage valuecom/ctb/**/mapper/property namesqlSessionFactoryBeanName valuesqlSessionFactory//beanbean idtransactionManager classorg.springframework.jdbc.datasource.DataSourceTransactionManagerproperty namedataSource refdataSource //beantx:annotation-driven transaction-managertransactionManager /aop:aspectj-autoproxy/
/beans5.spring-context
?xml version1.0 encodingUTF-8?
beans xmlnshttp://www.springframework.org/schema/beansxmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd!-- spring框架与mybatis整合的配置文件加载倒spring的上下文中--import resourceclasspath:spirng-mybatis.xml/import
/beans
6.spring-mvc
?xml version1.0 encodingUTF-8?
beans xmlnshttp://www.springframework.org/schema/beansxmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexmlns:contexthttp://www.springframework.org/schema/contextxmlns:aophttp://www.springframework.org/schema/aopxmlns:mvchttp://www.springframework.org/schema/mvcxsi:schemaLocationhttp://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsdhttp://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.3.xsdhttp://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd!--1) 扫描com.ctb.zf及子子孙孙包下的控制器(扫描范围过大耗时)--context:component-scan base-packagecom.ctb/!--2) 此标签默认注册DefaultAnnotationHandlerMapping和AnnotationMethodHandlerAdapter --mvc:annotation-driven /!--3) 创建ViewResolver视图解析器 --bean classorg.springframework.web.servlet.view.InternalResourceViewResolver!-- viewClass需要在pom中引入两个包standard.jar and jstl.jar --property nameviewClassvalueorg.springframework.web.servlet.view.JstlView/propertyproperty nameprefix value/WEB-INF/jsp//property namesuffix value.jsp//bean!--4) 单独处理图片、样式、js等资源 --
!-- mvc:resources location/css/ mapping/css/**/--
!-- mvc:resources location/js/ mapping/js/**/--
!-- mvc:resources locationWEB-INF/images/ mapping/images/**/--
!-- mvc:resources location/static/ mapping/static/**/--!-- 处理controller层发送请求到biz会经过切面的拦截处理 --aop:aspectj-autoproxy/
/beans
二、增删改查的实现
1.model与mapper层的生成
Book
package com.ctb.model;import lombok.ToString;ToString
public class Book {private Integer bid;private String bname;private Float price;public Book(Integer bid, String bname, Float price) {this.bid bid;this.bname bname;this.price price;}public Book() {super();}public Integer getBid() {return bid;}public void setBid(Integer bid) {this.bid bid;}public String getBname() {return bname;}public void setBname(String bname) {this.bname bname;}public Float getPrice() {return price;}public void setPrice(Float price) {this.price price;}
}
BookMapper.java
package com.ctb.mapper;import com.ctb.model.Book;
import org.springframework.stereotype.Repository;import java.util.List;
Repository
public interface BookMapper {int deleteByPrimaryKey(Integer bid);int insert(Book record);int insertSelective(Book record);Book selectByPrimaryKey(Integer bid);int updateByPrimaryKeySelective(Book record);int updateByPrimaryKey(Book record);ListBook selectPager(Book book);}
BookMapper.xml
?xml version1.0 encodingUTF-8 ?
!DOCTYPE mapper PUBLIC -//mybatis.org//DTD Mapper 3.0//EN http://mybatis.org/dtd/mybatis-3-mapper.dtd
mapper namespacecom.ctb.mapper.BookMapper resultMap idBaseResultMap typecom.ctb.model.Book constructor idArg columnbid jdbcTypeINTEGER javaTypejava.lang.Integer /arg columnbname jdbcTypeVARCHAR javaTypejava.lang.String /arg columnprice jdbcTypeREAL javaTypejava.lang.Float //constructor/resultMapsql idBase_Column_List bid, bname, price/sqlselect idselectByPrimaryKey resultMapBaseResultMap parameterTypejava.lang.Integer select include refidBase_Column_List /from t_mvc_bookwhere bid #{bid,jdbcTypeINTEGER}/selectselect idselectPager resultTypecom.ctb.model.Book parameterTypecom.ctb.model.Book selectinclude refidBase_Column_List /from t_mvc_bookwhereif testbname ! nulland bname like concat(%,#{bname},%)/if/where/selectdelete iddeleteByPrimaryKey parameterTypejava.lang.Integer delete from t_mvc_bookwhere bid #{bid,jdbcTypeINTEGER}/deleteinsert idinsert parameterTypecom.ctb.model.Book insert into t_mvc_book (bid, bname, price)values (#{bid,jdbcTypeINTEGER}, #{bname,jdbcTypeVARCHAR}, #{price,jdbcTypeREAL})/insertinsert idinsertSelective parameterTypecom.ctb.model.Book insert into t_mvc_booktrim prefix( suffix) suffixOverrides, if testbid ! null bid,/ifif testbname ! null bname,/ifif testprice ! null price,/if/trimtrim prefixvalues ( suffix) suffixOverrides, if testbid ! null #{bid,jdbcTypeINTEGER},/ifif testbname ! null #{bname,jdbcTypeVARCHAR},/ifif testprice ! null #{price,jdbcTypeREAL},/if/trim/insertupdate idupdateByPrimaryKeySelective parameterTypecom.ctb.model.Book update t_mvc_bookset if testbname ! null bname #{bname,jdbcTypeVARCHAR},/ifif testprice ! null price #{price,jdbcTypeREAL},/if/setwhere bid #{bid,jdbcTypeINTEGER}/updateupdate idupdateByPrimaryKey parameterTypecom.ctb.model.Book update t_mvc_bookset bname #{bname,jdbcTypeVARCHAR},price #{price,jdbcTypeREAL}where bid #{bid,jdbcTypeINTEGER}/update
/mapper
2.biz层
BookBizImpl
package com.ctb.biz.impl;import com.ctb.biz.BookBiz;
import com.ctb.mapper.BookMapper;
import com.ctb.model.Book;
import com.ctb.utils.PageBean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;import java.util.List;/*** author 彪* remark* create 2023-09-07 16:55*/
Service
public class BookBizImpl implements BookBiz {Autowiredprivate BookMapper bookMapper;Overridepublic int deleteByPrimaryKey(Integer bid) {return bookMapper.deleteByPrimaryKey(bid);}Overridepublic int insert(Book record) {return bookMapper.insert(record);}Overridepublic int insertSelective(Book record) {return bookMapper.insertSelective(record);}Overridepublic Book selectByPrimaryKey(Integer bid) {return bookMapper.selectByPrimaryKey(bid);}Overridepublic int updateByPrimaryKeySelective(Book record) {return bookMapper.updateByPrimaryKeySelective(record);}Overridepublic int updateByPrimaryKey(Book record) {return bookMapper.updateByPrimaryKey(record);}Overridepublic ListBook listPager(Book book, PageBean pageBean) {return bookMapper.selectPager(book);}
}3.工具类
pagebean---分页
package com.ctb.utils;import javax.servlet.http.HttpServletRequest;
import java.io.Serializable;
import java.util.Map;public class PageBean implements Serializable {private static final long serialVersionUID 2422581023658455731L;//页码private int page1;//每页显示记录数private int rows10;//总记录数private int total0;//是否分页private boolean isPaginationtrue;//上一次的请求路径private String url;//获取所有的请求参数private MapString,String[] map;public PageBean() {super();}//设置请求参数public void setRequest(HttpServletRequest req) {String pagereq.getParameter(page);String rowsreq.getParameter(rows);String paginationreq.getParameter(pagination);this.setPage(page);this.setRows(rows);this.setPagination(pagination);this.urlreq.getContextPath()req.getServletPath();this.mapreq.getParameterMap();}public String getUrl() {return url;}public void setUrl(String url) {this.url url;}public MapString, String[] getMap() {return map;}public void setMap(MapString, String[] map) {this.map map;}public int getPage() {return page;}public void setPage(int page) {this.page page;}public void setPage(String page) {if(null!page!.equals(page.trim()))this.page Integer.parseInt(page);}public int getRows() {return rows;}public void setRows(int rows) {this.rows rows;}public void setRows(String rows) {if(null!rows!.equals(rows.trim()))this.rows Integer.parseInt(rows);}public int getTotal() {return total;}public void setTotal(int total) {this.total total;}public void setTotal(String total) {this.total Integer.parseInt(total);}public boolean isPagination() {return isPagination;}public void setPagination(boolean isPagination) {this.isPagination isPagination;}public void setPagination(String isPagination) {if(null!isPagination!.equals(isPagination.trim()))this.isPagination Boolean.parseBoolean(isPagination);}/*** 获取分页起始标记位置* return*/public int getStartIndex() {//(当前页码-1)*显示记录数return (this.getPage()-1)*this.rows;}/*** 末页* return*/public int getMaxPage() {int totalpagethis.total/this.rows;if(this.total%this.rows!0)totalpage;return totalpage;}/*** 下一页* return*/public int getNextPage() {int nextPagethis.page1;if(this.pagethis.getMaxPage())nextPagethis.getMaxPage();return nextPage;}/*** 上一页* return*/public int getPreivousPage() {int previousPagethis.page-1;if(previousPage1)previousPage1;return previousPage;}Overridepublic String toString() {return PageBean [page page , rows rows , total total , isPagination isPagination ];}
}pagetag---自定义分页标签
package com.ctb.tag;import com.ctb.utils.PageBean;import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.tagext.BodyTagSupport;
import java.io.IOException;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;public class PageTag extends BodyTagSupport{private PageBean pageBean;// 包含了所有分页相关的元素public PageBean getPageBean() {return pageBean;}public void setPageBean(PageBean pageBean) {this.pageBean pageBean;}Overridepublic int doStartTag() throws JspException {
// 没有标签体要输出内容JspWriter out pageContext.getOut();try {out.print(toHTML());} catch (IOException e) {e.printStackTrace();}return super.doStartTag();}private String toHTML() {StringBuffer sb new StringBuffer();
// 隐藏的form表单---这个就是上一次请求下次重新发的奥义所在
// 上一次请求的URLsb.append(form actionpageBean.getUrl() idpageBeanForm methodpost);sb.append( input typehidden namepage);
// 上一次请求的参数MapString, String[] paramMap pageBean.getMap();if(paramMap ! null paramMap.size() 0) {SetEntryString, String[] entrySet paramMap.entrySet();for (EntryString, String[] entry : entrySet) {
// 参数名String key entry.getKey();
// 参数值for (String value : entry.getValue()) {
// 上一次请求的参数再一次组装成了新的Form表单
// 注意page参数每次都会提交我们需要避免if(!page.equals(key)) {sb.append( input typehidden namekey valuevalue );}}}}sb.append(/form);// 分页条sb.append(ul classpagination justify-content-center);sb.append( li classpage-item (pageBean.getPage() 1 ? disabled : )a classpage-link);sb.append( hrefjavascript:gotoPage(1)首页/a/li);sb.append( li classpage-item (pageBean.getPage() 1 ? disabled : )a classpage-link);sb.append( hrefjavascript:gotoPage(pageBean.getPreivousPage())lt;/a/li);// less than 小于号
// sb.append( li classpage-itema classpage-link href#1/a/li);
// sb.append( li classpage-itema classpage-link href#2/a/li);sb.append( li classpage-item activea classpage-link href#pageBean.getPage()/a/li);sb.append( li classpage-item (pageBean.getPage() pageBean.getMaxPage() ? disabled : )a classpage-link hrefjavascript:gotoPage(pageBean.getNextPage())gt;/a/li);sb.append( li classpage-item (pageBean.getPage() pageBean.getMaxPage() ? disabled : )a classpage-link hrefjavascript:gotoPage(pageBean.getMaxPage())尾页/a/li);sb.append( li classpage-item go-inputb到第/binput classpage-link);sb.append( typetext idskipPage name /b页/b/li);sb.append( li classpage-item goa classpage-link);sb.append( hrefjavascript:skipPage()确定/a/li);sb.append( li classpage-itemb共pageBean.getTotal()条/b/li);sb.append(/ul);// 分页执行的JS代码sb.append(script typetext/javascript);sb.append( function gotoPage(page) {);sb.append( document.getElementById(pageBeanForm).page.value page;);sb.append( document.getElementById(pageBeanForm).submit(););sb.append( });sb.append( function skipPage() {);sb.append( var page document.getElementById(skipPage).value;);sb.append( if (!page || isNaN(page) || parseInt(page) 1 || parseInt(page) pageBean.getMaxPage()) {);sb.append( alert(请输入1~pageBean.getMaxPage()的数字););sb.append( return;);sb.append( });sb.append( gotoPage(page););sb.append( });sb.append(/script);return sb.toString();}
}ctb.tld---自定义标签配置
?xml version1.0 encodingUTF-8 ?taglib xmlnshttp://java.sun.com/xml/ns/j2eexmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsdversion2.0descriptionctb 1.1 core library/descriptiondisplay-namectb core/display-nametlib-version1.1/tlib-versionshort-namectb/short-nameurihttp://jsp.veryedu.cn/uritagnamepage/nametag-classcom.ctb.tag.PageTag/tag-classbody-contentJSP/body-contentattributenamepageBean/namerequiredtrue/requiredrtexprvaluetrue/rtexprvalue/attribute/tag/taglibresponseutil---返回结果显示
package com.ctb.utils;import com.fasterxml.jackson.databind.ObjectMapper;import javax.servlet.http.HttpServletResponse;
import java.io.PrintWriter;public class ResponseUtil {public static void write(HttpServletResponse response,Object o)throws Exception{response.setContentType(text/html;charsetutf-8);PrintWriter outresponse.getWriter();out.println(o.toString());out.flush();out.close();}public static void writeJson(HttpServletResponse response,Object o)throws Exception{ObjectMapper om new ObjectMapper();
// om.writeValueAsString(o)代表了json串write(response, om.writeValueAsString(o));}
}4.controller层
package com.ctb.controller;import com.ctb.biz.BookBiz;
import com.ctb.model.Book;
import com.ctb.utils.PageBean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;import javax.servlet.http.HttpServletRequest;
import java.util.List;Controller
RequestMapping(/book)
public class BookController {Autowiredprivate BookBiz bookBiz;
// 增RequestMapping(/add)public String add(Book Book){int i bookBiz.insertSelective(Book);return redirect:list;}
// 删RequestMapping(/del/{bid})public String del(PathVariable(bid) Integer bid){bookBiz.deleteByPrimaryKey(bid);return redirect:/book/list;}// 改RequestMapping(/edit)public String edit(Book Book){bookBiz.updateByPrimaryKeySelective(Book);return redirect:list;}
// 查RequestMapping(/list)public String list(Book Book, HttpServletRequest request){PageBean pageBean new PageBean();pageBean.setRequest(request);ListBook Books bookBiz.listPager(Book, pageBean);request.setAttribute(lst,Books);request.setAttribute(pageBean,pageBean);return book/list;}
// 查询单个RequestMapping(/detail)public String preSave(Book Book, Model model){if(Book ! null Book.getBid() ! null Book.getBid() ! 0){Book b bookBiz.selectByPrimaryKey(Book.getBid());model.addAttribute(b,b);}return book/edit;}
}三、测试结果
1.查 2.模糊查询 3.删 4.改 5.增 总结
在本文中我们详细讲解了如何使用Spring MVC来实现增删改查功能。我们从基本概念开始逐步介绍了每个步骤并提供了示例代码来帮助您更好地理解和应用这些概念。希望本文对您有所帮助谢谢阅读
【参考资料】
Spring MVC官方文档https://docs.spring.io/spring-framework/docs/current/reference/html/web.html#mvc 文章转载自: http://www.morning.ynlbj.cn.gov.cn.ynlbj.cn http://www.morning.rqqct.cn.gov.cn.rqqct.cn http://www.morning.rlxnc.cn.gov.cn.rlxnc.cn http://www.morning.tcfhs.cn.gov.cn.tcfhs.cn http://www.morning.bpmdn.cn.gov.cn.bpmdn.cn http://www.morning.xdlwm.cn.gov.cn.xdlwm.cn http://www.morning.pznhn.cn.gov.cn.pznhn.cn http://www.morning.jfjbl.cn.gov.cn.jfjbl.cn http://www.morning.rtmqy.cn.gov.cn.rtmqy.cn http://www.morning.ntqjh.cn.gov.cn.ntqjh.cn http://www.morning.wtrjq.cn.gov.cn.wtrjq.cn http://www.morning.xrsqb.cn.gov.cn.xrsqb.cn http://www.morning.jtfsd.cn.gov.cn.jtfsd.cn http://www.morning.mrlls.cn.gov.cn.mrlls.cn http://www.morning.ie-comm.com.gov.cn.ie-comm.com http://www.morning.thjqk.cn.gov.cn.thjqk.cn http://www.morning.cpqqf.cn.gov.cn.cpqqf.cn http://www.morning.ysnbq.cn.gov.cn.ysnbq.cn http://www.morning.dnmgr.cn.gov.cn.dnmgr.cn http://www.morning.ljhnn.cn.gov.cn.ljhnn.cn http://www.morning.zybdj.cn.gov.cn.zybdj.cn http://www.morning.rjhts.cn.gov.cn.rjhts.cn http://www.morning.dmlsk.cn.gov.cn.dmlsk.cn http://www.morning.srkzd.cn.gov.cn.srkzd.cn http://www.morning.pbsfq.cn.gov.cn.pbsfq.cn http://www.morning.qgghr.cn.gov.cn.qgghr.cn http://www.morning.lrmts.cn.gov.cn.lrmts.cn http://www.morning.mhmdx.cn.gov.cn.mhmdx.cn http://www.morning.fjshyc.com.gov.cn.fjshyc.com http://www.morning.rrdch.cn.gov.cn.rrdch.cn http://www.morning.gkdhf.cn.gov.cn.gkdhf.cn http://www.morning.jqbmj.cn.gov.cn.jqbmj.cn http://www.morning.cnkrd.cn.gov.cn.cnkrd.cn http://www.morning.fjglf.cn.gov.cn.fjglf.cn http://www.morning.cfqyx.cn.gov.cn.cfqyx.cn http://www.morning.jhrkm.cn.gov.cn.jhrkm.cn http://www.morning.vjdofuj.cn.gov.cn.vjdofuj.cn http://www.morning.mfzyn.cn.gov.cn.mfzyn.cn http://www.morning.lwnb.cn.gov.cn.lwnb.cn http://www.morning.hbjqn.cn.gov.cn.hbjqn.cn http://www.morning.wjfzp.cn.gov.cn.wjfzp.cn http://www.morning.lwwnq.cn.gov.cn.lwwnq.cn http://www.morning.dndjx.cn.gov.cn.dndjx.cn http://www.morning.ktrzt.cn.gov.cn.ktrzt.cn http://www.morning.ckzjl.cn.gov.cn.ckzjl.cn http://www.morning.gbrdx.cn.gov.cn.gbrdx.cn http://www.morning.pqhfx.cn.gov.cn.pqhfx.cn http://www.morning.wptdg.cn.gov.cn.wptdg.cn http://www.morning.ffgbq.cn.gov.cn.ffgbq.cn http://www.morning.jjmrx.cn.gov.cn.jjmrx.cn http://www.morning.mrfgy.cn.gov.cn.mrfgy.cn http://www.morning.rbxsk.cn.gov.cn.rbxsk.cn http://www.morning.lhrcr.cn.gov.cn.lhrcr.cn http://www.morning.sfwfk.cn.gov.cn.sfwfk.cn http://www.morning.xpqyf.cn.gov.cn.xpqyf.cn http://www.morning.fdsbs.cn.gov.cn.fdsbs.cn http://www.morning.rxnr.cn.gov.cn.rxnr.cn http://www.morning.cwknc.cn.gov.cn.cwknc.cn http://www.morning.mdplm.cn.gov.cn.mdplm.cn http://www.morning.bkylg.cn.gov.cn.bkylg.cn http://www.morning.jzykw.cn.gov.cn.jzykw.cn http://www.morning.cnfxr.cn.gov.cn.cnfxr.cn http://www.morning.bzpwh.cn.gov.cn.bzpwh.cn http://www.morning.zrdhd.cn.gov.cn.zrdhd.cn http://www.morning.wdpt.cn.gov.cn.wdpt.cn http://www.morning.divocn.com.gov.cn.divocn.com http://www.morning.bflws.cn.gov.cn.bflws.cn http://www.morning.xnwjt.cn.gov.cn.xnwjt.cn http://www.morning.gwwky.cn.gov.cn.gwwky.cn http://www.morning.sfnjr.cn.gov.cn.sfnjr.cn http://www.morning.rkmsm.cn.gov.cn.rkmsm.cn http://www.morning.xjkr.cn.gov.cn.xjkr.cn http://www.morning.qdxtj.cn.gov.cn.qdxtj.cn http://www.morning.czlzn.cn.gov.cn.czlzn.cn http://www.morning.wqtzs.cn.gov.cn.wqtzs.cn http://www.morning.ttvtv.cn.gov.cn.ttvtv.cn http://www.morning.wjrq.cn.gov.cn.wjrq.cn http://www.morning.dycbp.cn.gov.cn.dycbp.cn http://www.morning.xbptx.cn.gov.cn.xbptx.cn http://www.morning.rnnwd.cn.gov.cn.rnnwd.cn