• SpringMVC增删改查(CRUD)的实现


    目录

    前言

    一、前期准备

    1.pom.xml---依赖与插件的导入

    2.jdbc.properties---数据库连接

     3.log4j2.xml---日志文件

    4.spring-mybatis---mybatis与spring整合文件

    5.spring-context---spring上下文配置

    6.spring-mvc

    7.generatorConfig.xml---代码生成器

    8.web.xml

    二、增删改查的实现

    1.model与mapper层的生成

    2.biz层与切面

    3.工具类

    4.controller层

    三、测试结果

    总结

    【参考资料】


    前言

            Spring MVC是一种基于Java的Web框架,它提供了一种简单而强大的方式来构建Web应用程序。在本文中,我们将详细讲解如何使用Spring MVC来实现增删改查功能。我们将从基本概念开始,逐步介绍每个步骤,并提供示例代码来帮助您更好地理解和应用这些概念。

    一、前期准备

    先创建一个maven工程

    1.pom.xml---依赖与插件的导入

    将相关依赖于插件进行添加,并将标签内将标签删除(解除版本锁定)

    • spring
    • springMVC
    • mybatis
    • spring-web
    • mybatis-spring
    • log4j/slf4j
    • jackson
    • servlet   jstl   jsp-api
    1. "1.0" encoding="UTF-8"?>
    2. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    3. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    4. <modelVersion>4.0.0modelVersion>
    5. <groupId>com.ctbgroupId>
    6. <artifactId>ctbssmartifactId>
    7. <version>1.0-SNAPSHOTversion>
    8. <packaging>warpackaging>
    9. <name>ctbssm Maven Webappname>
    10. <url>http://www.example.comurl>
    11. <properties>
    12. <project.build.sourceEncoding>UTF-8project.build.sourceEncoding>
    13. <maven.compiler.source>1.8maven.compiler.source>
    14. <maven.compiler.target>1.8maven.compiler.target>
    15. <maven.compiler.plugin.version>3.7.0maven.compiler.plugin.version>
    16. <spring.version>5.0.2.RELEASEspring.version>
    17. <mybatis.version>3.4.5mybatis.version>
    18. <mysql.version>5.1.44mysql.version>
    19. <pagehelper.version>5.1.2pagehelper.version>
    20. <mybatis.spring.version>1.3.1mybatis.spring.version>
    21. <commons.dbcp2.version>2.1.1commons.dbcp2.version>
    22. <commons.pool2.version>2.4.3commons.pool2.version>
    23. <log4j2.version>2.9.1log4j2.version>
    24. <log4j2.disruptor.version>3.2.0log4j2.disruptor.version>
    25. <slf4j.version>1.7.13slf4j.version>
    26. <junit.version>4.12junit.version>
    27. <servlet.version>4.0.0servlet.version>
    28. <lombok.version>1.18.2lombok.version>
    29. <mybatis.ehcache.version>1.1.0mybatis.ehcache.version>
    30. <ehcache.version>2.10.0ehcache.version>
    31. <redis.version>2.9.0redis.version>
    32. <redis.spring.version>1.7.1.RELEASEredis.spring.version>
    33. <jackson.version>2.9.3jackson.version>
    34. <jstl.version>1.2jstl.version>
    35. <standard.version>1.1.2standard.version>
    36. <tomcat-jsp-api.version>8.0.47tomcat-jsp-api.version>
    37. <commons-fileupload.version>1.3.3commons-fileupload.version>
    38. <hibernate-validator.version>5.0.2.Finalhibernate-validator.version>
    39. <shiro.version>1.3.2shiro.version>
    40. properties>
    41. <dependencies>
    42. <dependency>
    43. <groupId>org.springframeworkgroupId>
    44. <artifactId>spring-coreartifactId>
    45. <version>${spring.version}version>
    46. dependency>
    47. <dependency>
    48. <groupId>org.springframeworkgroupId>
    49. <artifactId>spring-beansartifactId>
    50. <version>${spring.version}version>
    51. dependency>
    52. <dependency>
    53. <groupId>org.springframeworkgroupId>
    54. <artifactId>spring-contextartifactId>
    55. <version>${spring.version}version>
    56. dependency>
    57. <dependency>
    58. <groupId>org.springframeworkgroupId>
    59. <artifactId>spring-ormartifactId>
    60. <version>${spring.version}version>
    61. dependency>
    62. <dependency>
    63. <groupId>org.springframeworkgroupId>
    64. <artifactId>spring-txartifactId>
    65. <version>${spring.version}version>
    66. dependency>
    67. <dependency>
    68. <groupId>org.springframeworkgroupId>
    69. <artifactId>spring-aspectsartifactId>
    70. <version>${spring.version}version>
    71. dependency>
    72. <dependency>
    73. <groupId>org.springframeworkgroupId>
    74. <artifactId>spring-webartifactId>
    75. <version>${spring.version}version>
    76. dependency>
    77. <dependency>
    78. <groupId>org.springframeworkgroupId>
    79. <artifactId>spring-testartifactId>
    80. <version>${spring.version}version>
    81. dependency>
    82. <dependency>
    83. <groupId>org.mybatisgroupId>
    84. <artifactId>mybatisartifactId>
    85. <version>${mybatis.version}version>
    86. dependency>
    87. <dependency>
    88. <groupId>mysqlgroupId>
    89. <artifactId>mysql-connector-javaartifactId>
    90. <version>${mysql.version}version>
    91. dependency>
    92. <dependency>
    93. <groupId>com.github.pagehelpergroupId>
    94. <artifactId>pagehelperartifactId>
    95. <version>${pagehelper.version}version>
    96. dependency>
    97. <dependency>
    98. <groupId>org.mybatisgroupId>
    99. <artifactId>mybatis-springartifactId>
    100. <version>${mybatis.spring.version}version>
    101. dependency>
    102. <dependency>
    103. <groupId>org.springframeworkgroupId>
    104. <artifactId>spring-context-supportartifactId>
    105. <version>${spring.version}version>
    106. dependency>
    107. <dependency>
    108. <groupId>org.mybatis.cachesgroupId>
    109. <artifactId>mybatis-ehcacheartifactId>
    110. <version>${mybatis.ehcache.version}version>
    111. dependency>
    112. <dependency>
    113. <groupId>net.sf.ehcachegroupId>
    114. <artifactId>ehcacheartifactId>
    115. <version>${ehcache.version}version>
    116. dependency>
    117. <dependency>
    118. <groupId>redis.clientsgroupId>
    119. <artifactId>jedisartifactId>
    120. <version>${redis.version}version>
    121. dependency>
    122. <dependency>
    123. <groupId>org.springframework.datagroupId>
    124. <artifactId>spring-data-redisartifactId>
    125. <version>${redis.spring.version}version>
    126. dependency>
    127. <dependency>
    128. <groupId>com.fasterxml.jackson.coregroupId>
    129. <artifactId>jackson-databindartifactId>
    130. <version>${jackson.version}version>
    131. dependency>
    132. <dependency>
    133. <groupId>com.fasterxml.jackson.coregroupId>
    134. <artifactId>jackson-coreartifactId>
    135. <version>${jackson.version}version>
    136. dependency>
    137. <dependency>
    138. <groupId>com.fasterxml.jackson.coregroupId>
    139. <artifactId>jackson-annotationsartifactId>
    140. <version>${jackson.version}version>
    141. dependency>
    142. <dependency>
    143. <groupId>org.apache.commonsgroupId>
    144. <artifactId>commons-dbcp2artifactId>
    145. <version>${commons.dbcp2.version}version>
    146. <exclusions>
    147. <exclusion>
    148. <artifactId>commons-pool2artifactId>
    149. <groupId>org.apache.commonsgroupId>
    150. exclusion>
    151. exclusions>
    152. dependency>
    153. <dependency>
    154. <groupId>org.apache.commonsgroupId>
    155. <artifactId>commons-pool2artifactId>
    156. <version>${commons.pool2.version}version>
    157. dependency>
    158. <dependency>
    159. <groupId>org.springframeworkgroupId>
    160. <artifactId>spring-webmvcartifactId>
    161. <version>${spring.version}version>
    162. dependency>
    163. <dependency>
    164. <groupId>org.slf4jgroupId>
    165. <artifactId>slf4j-apiartifactId>
    166. <version>${slf4j.version}version>
    167. dependency>
    168. <dependency>
    169. <groupId>org.slf4jgroupId>
    170. <artifactId>jcl-over-slf4jartifactId>
    171. <version>${slf4j.version}version>
    172. <scope>runtimescope>
    173. dependency>
    174. <dependency>
    175. <groupId>org.apache.logging.log4jgroupId>
    176. <artifactId>log4j-apiartifactId>
    177. <version>${log4j2.version}version>
    178. dependency>
    179. <dependency>
    180. <groupId>org.apache.logging.log4jgroupId>
    181. <artifactId>log4j-coreartifactId>
    182. <version>${log4j2.version}version>
    183. dependency>
    184. <dependency>
    185. <groupId>org.apache.logging.log4jgroupId>
    186. <artifactId>log4j-slf4j-implartifactId>
    187. <version>${log4j2.version}version>
    188. dependency>
    189. <dependency>
    190. <groupId>org.apache.logging.log4jgroupId>
    191. <artifactId>log4j-webartifactId>
    192. <version>${log4j2.version}version>
    193. <scope>runtimescope>
    194. dependency>
    195. <dependency>
    196. <groupId>com.lmaxgroupId>
    197. <artifactId>disruptorartifactId>
    198. <version>${log4j2.disruptor.version}version>
    199. dependency>
    200. <dependency>
    201. <groupId>junitgroupId>
    202. <artifactId>junitartifactId>
    203. <version>${junit.version}version>
    204. dependency>
    205. <dependency>
    206. <groupId>javax.servletgroupId>
    207. <artifactId>javax.servlet-apiartifactId>
    208. <version>${servlet.version}version>
    209. <scope>providedscope>
    210. dependency>
    211. <dependency>
    212. <groupId>org.projectlombokgroupId>
    213. <artifactId>lombokartifactId>
    214. <version>${lombok.version}version>
    215. <scope>providedscope>
    216. dependency>
    217. <dependency>
    218. <groupId>jstlgroupId>
    219. <artifactId>jstlartifactId>
    220. <version>${jstl.version}version>
    221. dependency>
    222. <dependency>
    223. <groupId>taglibsgroupId>
    224. <artifactId>standardartifactId>
    225. <version>${standard.version}version>
    226. dependency>
    227. <dependency>
    228. <groupId>org.apache.tomcatgroupId>
    229. <artifactId>tomcat-jsp-apiartifactId>
    230. <version>${tomcat-jsp-api.version}version>
    231. dependency>
    232. <dependency>
    233. <groupId>commons-fileuploadgroupId>
    234. <artifactId>commons-fileuploadartifactId>
    235. <version>${commons-fileupload.version}version>
    236. dependency>
    237. <dependency>
    238. <groupId>org.hibernategroupId>
    239. <artifactId>hibernate-validatorartifactId>
    240. <version>${hibernate-validator.version}version>
    241. dependency>
    242. <dependency>
    243. <groupId>org.apache.shirogroupId>
    244. <artifactId>shiro-coreartifactId>
    245. <version>${shiro.version}version>
    246. dependency>
    247. <dependency>
    248. <groupId>org.apache.shirogroupId>
    249. <artifactId>shiro-webartifactId>
    250. <version>${shiro.version}version>
    251. dependency>
    252. <dependency>
    253. <groupId>org.apache.shirogroupId>
    254. <artifactId>shiro-springartifactId>
    255. <version>${shiro.version}version>
    256. dependency>
    257. dependencies>
    258. <build>
    259. <finalName>ctbssmfinalName>
    260. <resources>
    261. <resource>
    262. <directory>src/main/javadirectory>
    263. <includes>
    264. <include>**/*.xmlinclude>
    265. includes>
    266. resource>
    267. <resource>
    268. <directory>src/main/resourcesdirectory>
    269. <includes>
    270. <include>jdbc.propertiesinclude>
    271. <include>*.xmlinclude>
    272. includes>
    273. resource>
    274. resources>
    275. <plugins>
    276. <plugin>
    277. <groupId>org.apache.maven.pluginsgroupId>
    278. <artifactId>maven-compiler-pluginartifactId>
    279. <version>${maven.compiler.plugin.version}version>
    280. <configuration>
    281. <source>${maven.compiler.source}source>
    282. <target>${maven.compiler.target}target>
    283. <encoding>${project.build.sourceEncoding}encoding>
    284. configuration>
    285. plugin>
    286. <plugin>
    287. <groupId>org.mybatis.generatorgroupId>
    288. <artifactId>mybatis-generator-maven-pluginartifactId>
    289. <version>1.3.2version>
    290. <dependencies>
    291. <dependency>
    292. <groupId>mysqlgroupId>
    293. <artifactId>mysql-connector-javaartifactId>
    294. <version>${mysql.version}version>
    295. dependency>
    296. dependencies>
    297. <configuration>
    298. <overwrite>trueoverwrite>
    299. configuration>
    300. plugin>
    301. <plugin>
    302. <artifactId>maven-clean-pluginartifactId>
    303. <version>3.1.0version>
    304. plugin>
    305. <plugin>
    306. <artifactId>maven-resources-pluginartifactId>
    307. <version>3.0.2version>
    308. plugin>
    309. <plugin>
    310. <artifactId>maven-compiler-pluginartifactId>
    311. <version>3.8.0version>
    312. plugin>
    313. <plugin>
    314. <artifactId>maven-surefire-pluginartifactId>
    315. <version>2.22.1version>
    316. plugin>
    317. <plugin>
    318. <artifactId>maven-war-pluginartifactId>
    319. <version>3.2.2version>
    320. plugin>
    321. <plugin>
    322. <artifactId>maven-install-pluginartifactId>
    323. <version>2.5.2version>
    324. plugin>
    325. <plugin>
    326. <artifactId>maven-deploy-pluginartifactId>
    327. <version>2.8.2version>
    328. plugin>
    329. plugins>
    330. build>
    331. project>

    2.jdbc.properties---数据库连接

    数据库驱动---数据库连接路径---数据库登录用户名---数据库登录密码

    1. jdbc.driver=com.mysql.jdbc.Driver
    2. jdbc.url=jdbc:mysql://localhost:3306/mybatis_ssm?useUnicode=true&characterEncoding=UTF-8
    3. jdbc.username=root
    4. jdbc.password=123456

     3.log4j2.xml---日志文件

    用于记录日志

    1. <?xml version="1.0" encoding="UTF-8"?>
    2. <!-- status : 指定log4j本身的打印日志的级别.ALL< Trace < DEBUG < INFO < WARN < ERROR
    3. < FATAL < OFF。 monitorInterval : 用于指定log4j自动重新配置的监测间隔时间,单位是s,最小是5s. -->
    4. <Configuration status="WARN" monitorInterval="30">
    5. <Properties>
    6. <!-- 配置日志文件输出目录 ${sys:user.home} -->
    7. <Property name="LOG_HOME">/root/workspace/lucenedemo/logs</Property>
    8. <property name="ERROR_LOG_FILE_NAME">/root/workspace/lucenedemo/logs/error</property>
    9. <property name="WARN_LOG_FILE_NAME">/root/workspace/lucenedemo/logs/warn</property>
    10. <property name="PATTERN">%d{yyyy-MM-dd HH:mm:ss.SSS} [%t-%L] %-5level %logger{36} - %msg%n</property>
    11. </Properties>
    12. <Appenders>
    13. <!--这个输出控制台的配置 -->
    14. <Console name="Console" target="SYSTEM_OUT">
    15. <!-- 控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch) -->
    16. <ThresholdFilter level="trace" onMatch="ACCEPT"
    17. onMismatch="DENY" />
    18. <!-- 输出日志的格式 -->
    19. <!-- %d{yyyy-MM-dd HH:mm:ss, SSS} : 日志生产时间 %p : 日志输出格式 %c : logger的名称
    20. %m : 日志内容,即 logger.info("message") %n : 换行符 %C : Java类名 %L : 日志输出所在行数 %M
    21. : 日志输出所在方法名 hostName : 本地机器名 hostAddress : 本地ip地址 -->
    22. <PatternLayout pattern="${PATTERN}" />
    23. </Console>
    24. <!--文件会打印出所有信息,这个log每次运行程序会自动清空,由append属性决定,这个也挺有用的,适合临时测试用 -->
    25. <!--append为TRUE表示消息增加到指定文件中,false表示消息覆盖指定的文件内容,默认值是true -->
    26. <File name="log" fileName="logs/test.log" append="false">
    27. <PatternLayout
    28. pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" />
    29. </File>
    30. <!-- 这个会打印出所有的info及以下级别的信息,每次大小超过size, 则这size大小的日志会自动存入按年份-月份建立的文件夹下面并进行压缩,作为存档 -->
    31. <RollingFile name="RollingFileInfo" fileName="${LOG_HOME}/info.log"
    32. filePattern="${LOG_HOME}/$${date:yyyy-MM}/info-%d{yyyy-MM-dd}-%i.log">
    33. <!--控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch) -->
    34. <ThresholdFilter level="info" onMatch="ACCEPT"
    35. onMismatch="DENY" />
    36. <PatternLayout
    37. pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" />
    38. <Policies>
    39. <!-- 基于时间的滚动策略,interval属性用来指定多久滚动一次,默认是1 hour。 modulate=true用来调整时间:比如现在是早上3am,interval是4,那么第一次滚动是在4am,接着是8am,12am...而不是7am. -->
    40. <!-- 关键点在于 filePattern后的日期格式,以及TimeBasedTriggeringPolicy的interval, 日期格式精确到哪一位,interval也精确到哪一个单位 -->
    41. <!-- log4j2的按天分日志文件 : info-%d{yyyy-MM-dd}-%i.log -->
    42. <TimeBasedTriggeringPolicy interval="1"
    43. modulate="true" />
    44. <!-- SizeBasedTriggeringPolicy:Policies子节点, 基于指定文件大小的滚动策略,size属性用来定义每个日志文件的大小. -->
    45. <!-- <SizeBasedTriggeringPolicy size="2 kB" /> -->
    46. </Policies>
    47. </RollingFile>
    48. <RollingFile name="RollingFileWarn" fileName="${WARN_LOG_FILE_NAME}/warn.log"
    49. filePattern="${WARN_LOG_FILE_NAME}/$${date:yyyy-MM}/warn-%d{yyyy-MM-dd}-%i.log">
    50. <ThresholdFilter level="warn" onMatch="ACCEPT"
    51. onMismatch="DENY" />
    52. <PatternLayout
    53. pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" />
    54. <Policies>
    55. <TimeBasedTriggeringPolicy />
    56. <SizeBasedTriggeringPolicy size="2 kB" />
    57. </Policies>
    58. <!-- DefaultRolloverStrategy属性如不设置,则默认为最多同一文件夹下7个文件,这里设置了20 -->
    59. <DefaultRolloverStrategy max="20" />
    60. </RollingFile>
    61. <RollingFile name="RollingFileError" fileName="${ERROR_LOG_FILE_NAME}/error.log"
    62. filePattern="${ERROR_LOG_FILE_NAME}/$${date:yyyy-MM}/error-%d{yyyy-MM-dd-HH-mm}-%i.log">
    63. <ThresholdFilter level="error" onMatch="ACCEPT"
    64. onMismatch="DENY" />
    65. <PatternLayout
    66. pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" />
    67. <Policies>
    68. <!-- log4j2的按分钟 分日志文件 : warn-%d{yyyy-MM-dd-HH-mm}-%i.log -->
    69. <TimeBasedTriggeringPolicy interval="1"
    70. modulate="true" />
    71. <!-- <SizeBasedTriggeringPolicy size="10 MB" /> -->
    72. </Policies>
    73. </RollingFile>
    74. </Appenders>
    75. <!--然后定义logger,只有定义了logger并引入的appender,appender才会生效 -->
    76. <Loggers>
    77. <!--过滤掉spring和mybatis的一些无用的DEBUG信息 -->
    78. <logger name="org.springframework" level="INFO"></logger>
    79. <logger name="org.mybatis" level="INFO"></logger>
    80. <!-- 第三方日志系统 -->
    81. <logger name="org.springframework" level="ERROR" />
    82. <logger name="org.hibernate" level="ERROR" />
    83. <logger name="org.apache.struts2" level="ERROR" />
    84. <logger name="com.opensymphony.xwork2" level="ERROR" />
    85. <logger name="org.jboss" level="ERROR" />
    86. <!-- 配置日志的根节点 -->
    87. <root level="all">
    88. <appender-ref ref="Console" />
    89. <appender-ref ref="RollingFileInfo" />
    90. <appender-ref ref="RollingFileWarn" />
    91. <appender-ref ref="RollingFileError" />
    92. </root>
    93. </Loggers>
    94. </Configuration>

    4.spring-mybatis---mybatis与spring整合文件

    扫描包、数据源、sqlsessionfactory、mapper扫描、事务管理所、开启自动代理

    1. "1.0" encoding="UTF-8"?>
    2. <beans xmlns="http://www.springframework.org/schema/beans"
    3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    4. xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx"
    5. xmlns:aop="http://www.springframework.org/schema/aop"
    6. xsi:schemaLocation="http://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">
    7. <context:annotation-config/>
    8. <context:component-scan base-package="com.ctb"/>
    9. <context:property-placeholder location="classpath:jdbc.properties"/>
    10. <bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource"
    11. destroy-method="close">
    12. <property name="driverClassName" value="${jdbc.driver}"/>
    13. <property name="url" value="${jdbc.url}"/>
    14. <property name="username" value="${jdbc.username}"/>
    15. <property name="password" value="${jdbc.password}"/>
    16. <property name="initialSize" value="10"/>
    17. <property name="maxTotal" value="100"/>
    18. <property name="maxIdle" value="50"/>
    19. <property name="minIdle" value="10"/>
    20. <property name="maxWaitMillis" value="-1"/>
    21. bean>
    22. <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
    23. <property name="dataSource" ref="dataSource"/>
    24. <property name="mapperLocations" value="classpath*:com/ctb/**/mapper/*.xml"/>
    25. <property name="typeAliasesPackage" value="com/ctb/**/model"/>
    26. <property name="plugins">
    27. <array>
    28. <bean class="com.github.pagehelper.PageInterceptor">
    29. <property name="properties">
    30. <value>
    31. helperDialect=mysql
    32. value>
    33. property>
    34. bean>
    35. array>
    36. property>
    37. bean>
    38. <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
    39. <property name="basePackage" value="com/ctb/**/mapper"/>
    40. <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
    41. bean>
    42. <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    43. <property name="dataSource" ref="dataSource" />
    44. bean>
    45. <tx:annotation-driven transaction-manager="transactionManager" />
    46. <aop:aspectj-autoproxy/>
    47. beans>

    5.spring-context---spring上下文配置

    1. "1.0" encoding="UTF-8"?>
    2. <beans xmlns="http://www.springframework.org/schema/beans"
    3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    4. xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
    5. <import resource="classpath:spirng-mybatis.xml">import>
    6. beans>

    6.spring-mvc

    扫描包、视图解析器、静态资源处理、开启自动代理

    1. "1.0" encoding="UTF-8"?>
    2. <beans xmlns="http://www.springframework.org/schema/beans"
    3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    4. xmlns:context="http://www.springframework.org/schema/context"
    5. xmlns:aop="http://www.springframework.org/schema/aop"
    6. xmlns:mvc="http://www.springframework.org/schema/mvc"
    7. xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
    8. http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd
    9. http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.3.xsd
    10. http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd">
    11. <context:component-scan base-package="com.ctb"/>
    12. <mvc:annotation-driven />
    13. <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    14. <property name="viewClass"
    15. value="org.springframework.web.servlet.view.JstlView">property>
    16. <property name="prefix" value="/WEB-INF/jsp/"/>
    17. <property name="suffix" value=".jsp"/>
    18. bean>
    19. <aop:aspectj-autoproxy/>
    20. beans>

    7.generatorConfig.xml---代码生成器

    主要生成model/mapper接口/mapper.xml

    1. "1.0" encoding="UTF-8" ?>
    2. generatorConfiguration PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
    3. "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd" >
    4. <generatorConfiguration>
    5. <properties resource="jdbc.properties"/>
    6. <classPathEntry location="D:\\software\\maven\\mvn_protetis\\mysql\\mysql-connector-java\\5.1.44\\mysql-connector-java-5.1.44.jar"/>
    7. <context id="infoGuardian">
    8. <commentGenerator>
    9. <property name="suppressAllComments" value="true"/>
    10. <property name="suppressDate" value="true"/>
    11. commentGenerator>
    12. <jdbcConnection driverClass="${jdbc.driver}"
    13. connectionURL="${jdbc.url}" userId="${jdbc.username}" password="${jdbc.password}"/>
    14. <javaTypeResolver>
    15. <property name="forceBigDecimals" value="false"/>
    16. javaTypeResolver>
    17. <javaModelGenerator targetPackage="com.ctb.model"
    18. targetProject="src/main/java">
    19. <property name="enableSubPackages" value="false"/>
    20. <property name="constructorBased" value="true"/>
    21. <property name="trimStrings" value="false"/>
    22. <property name="immutable" value="false"/>
    23. javaModelGenerator>
    24. <sqlMapGenerator targetPackage="com.ctb.mapper"
    25. targetProject="src/main/java">
    26. <property name="enableSubPackages" value="false"/>
    27. sqlMapGenerator>
    28. <javaClientGenerator targetPackage="com.ctb.mapper"
    29. targetProject="src/main/java" type="XMLMAPPER">
    30. <property name="enableSubPackages" value="false"/>
    31. javaClientGenerator>
    32. <table schema="" tableName="t_mvc_book" domainObjectName="Book"
    33. enableCountByExample="false" enableDeleteByExample="false"
    34. enableSelectByExample="false" enableUpdateByExample="false">
    35. table>
    36. context>
    37. generatorConfiguration>

    8.web.xml

    • spring和web项目集成---监听器
    • dispatchServlet---springMVC servlet
    • 中文乱码处理过滤器
    1. <?xml version="1.0" encoding="UTF-8"?>
    2. <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
    3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    4. xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
    5. version="3.1">
    6. <display-name>Archetype Created Web Application</display-name>
    7. <!-- Spring和web项目集成start -->
    8. <!-- spring上下文配置文件 -->
    9. <context-param>
    10. <param-name>contextConfigLocation</param-name>
    11. <param-value>classpath:spring-context.xml</param-value>
    12. </context-param>
    13. <!-- 读取Spring上下文的监听器 -->
    14. <listener>
    15. <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    16. </listener>
    17. <!-- Spring和web项目集成end -->
    18. <!-- 中文乱码处理 -->
    19. <filter>
    20. <filter-name>encodingFilter</filter-name>
    21. <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
    22. <async-supported>true</async-supported>
    23. <init-param>
    24. <param-name>encoding</param-name>
    25. <param-value>UTF-8</param-value>
    26. </init-param>
    27. </filter>
    28. <filter-mapping>
    29. <filter-name>encodingFilter</filter-name>
    30. <url-pattern>/*</url-pattern>
    31. </filter-mapping>
    32. <!-- Spring MVC servlet -->
    33. <servlet>
    34. <servlet-name>SpringMVC</servlet-name>
    35. <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    36. <!--此参数可以不配置,默认值为:/WEB-INF/springmvc-servlet.xml-->
    37. <init-param>
    38. <param-name>contextConfigLocation</param-name>
    39. <param-value>classpath:spring-mvc.xml</param-value>
    40. </init-param>
    41. <load-on-startup>1</load-on-startup>
    42. <!--web.xml 3.0的新特性,是否支持异步-->
    43. <async-supported>true</async-supported>
    44. </servlet>
    45. <servlet-mapping>
    46. <servlet-name>SpringMVC</servlet-name>
    47. <url-pattern>/</url-pattern>
    48. </servlet-mapping>
    49. </web-app>

    二、增删改查的实现

    1.model与mapper层的生成

    Book

    1. package com.ctb.model;
    2. import lombok.ToString;
    3. @ToString
    4. public class Book {
    5. private Integer bid;
    6. private String bname;
    7. private Float price;
    8. public Book(Integer bid, String bname, Float price) {
    9. this.bid = bid;
    10. this.bname = bname;
    11. this.price = price;
    12. }
    13. public Book() {
    14. super();
    15. }
    16. public Integer getBid() {
    17. return bid;
    18. }
    19. public void setBid(Integer bid) {
    20. this.bid = bid;
    21. }
    22. public String getBname() {
    23. return bname;
    24. }
    25. public void setBname(String bname) {
    26. this.bname = bname;
    27. }
    28. public Float getPrice() {
    29. return price;
    30. }
    31. public void setPrice(Float price) {
    32. this.price = price;
    33. }
    34. }

    BookMapper.java

    1. package com.ctb.mapper;
    2. import com.ctb.model.Book;
    3. import org.springframework.stereotype.Repository;
    4. import java.util.List;
    5. @Repository
    6. public interface BookMapper {
    7. int deleteByPrimaryKey(Integer bid);
    8. int insert(Book record);
    9. int insertSelective(Book record);
    10. Book selectByPrimaryKey(Integer bid);
    11. int updateByPrimaryKeySelective(Book record);
    12. int updateByPrimaryKey(Book record);
    13. List selectPager(Book book);
    14. }

    BookMapper.xml

    1. <?xml version="1.0" encoding="UTF-8" ?>
    2. <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
    3. <mapper namespace="com.ctb.mapper.BookMapper" >
    4. <resultMap id="BaseResultMap" type="com.ctb.model.Book" >
    5. <constructor >
    6. <idArg column="bid" jdbcType="INTEGER" javaType="java.lang.Integer" />
    7. <arg column="bname" jdbcType="VARCHAR" javaType="java.lang.String" />
    8. <arg column="price" jdbcType="REAL" javaType="java.lang.Float" />
    9. </constructor>
    10. </resultMap>
    11. <sql id="Base_Column_List" >
    12. bid, bname, price
    13. </sql>
    14. <select id="selectByPrimaryKey" resultMap="BaseResultMap" parameterType="java.lang.Integer" >
    15. select
    16. <include refid="Base_Column_List" />
    17. from t_mvc_book
    18. where bid = #{bid,jdbcType=INTEGER}
    19. </select>
    20. <select id="selectPager" resultType="com.ctb.model.Book" parameterType="com.ctb.model.Book" >
    21. select
    22. <include refid="Base_Column_List" />
    23. from t_mvc_book
    24. <where>
    25. <if test="bname != null">
    26. and bname like concat('%',#{bname},'%')
    27. </if>
    28. </where>
    29. </select>
    30. <delete id="deleteByPrimaryKey" parameterType="java.lang.Integer" >
    31. delete from t_mvc_book
    32. where bid = #{bid,jdbcType=INTEGER}
    33. </delete>
    34. <insert id="insert" parameterType="com.ctb.model.Book" >
    35. insert into t_mvc_book (bid, bname, price
    36. )
    37. values (#{bid,jdbcType=INTEGER}, #{bname,jdbcType=VARCHAR}, #{price,jdbcType=REAL}
    38. )
    39. </insert>
    40. <insert id="insertSelective" parameterType="com.ctb.model.Book" >
    41. insert into t_mvc_book
    42. <trim prefix="(" suffix=")" suffixOverrides="," >
    43. <if test="bid != null" >
    44. bid,
    45. </if>
    46. <if test="bname != null" >
    47. bname,
    48. </if>
    49. <if test="price != null" >
    50. price,
    51. </if>
    52. </trim>
    53. <trim prefix="values (" suffix=")" suffixOverrides="," >
    54. <if test="bid != null" >
    55. #{bid,jdbcType=INTEGER},
    56. </if>
    57. <if test="bname != null" >
    58. #{bname,jdbcType=VARCHAR},
    59. </if>
    60. <if test="price != null" >
    61. #{price,jdbcType=REAL},
    62. </if>
    63. </trim>
    64. </insert>
    65. <update id="updateByPrimaryKeySelective" parameterType="com.ctb.model.Book" >
    66. update t_mvc_book
    67. <set >
    68. <if test="bname != null" >
    69. bname = #{bname,jdbcType=VARCHAR},
    70. </if>
    71. <if test="price != null" >
    72. price = #{price,jdbcType=REAL},
    73. </if>
    74. </set>
    75. where bid = #{bid,jdbcType=INTEGER}
    76. </update>
    77. <update id="updateByPrimaryKey" parameterType="com.ctb.model.Book" >
    78. update t_mvc_book
    79. set bname = #{bname,jdbcType=VARCHAR},
    80. price = #{price,jdbcType=REAL}
    81. where bid = #{bid,jdbcType=INTEGER}
    82. </update>
    83. </mapper>

    2.biz层与切面

    PagerAspect

    1. package com.ctb.aspect;
    2. import com.ctb.utils.PageBean;
    3. import com.github.pagehelper.PageHelper;
    4. import com.github.pagehelper.PageInfo;
    5. import org.aspectj.lang.ProceedingJoinPoint;
    6. import org.aspectj.lang.annotation.Around;
    7. import org.aspectj.lang.annotation.Aspect;
    8. import org.springframework.stereotype.Component;
    9. import java.util.List;
    10. /**
    11. *
    12. * * *..*Service.*Pager(..)
    13. * * :任意返回值类型
    14. * *..:任意包,不限层级 com.ctb com.biao.ctb
    15. * *Service:以Service结尾的类/接口
    16. * *Pager:以Pager结尾的方法
    17. * ..:任意参数
    18. * 符合上述条件,即为目标类或者目标方法
    19. *
    20. */
    21. @Aspect //代表当前类为切面类
    22. @Component // 代表当前类交给spring进行管理
    23. public class PagerAspect {
    24. @Around("execution(* *..*Biz.*Pager(..))")
    25. public Object invoke(ProceedingJoinPoint args) throws Throwable {
    26. PageBean pageBean = null;
    27. // 获取目标方法中的所有参数
    28. Object[] ags = args.getArgs();
    29. for (Object param : ags) {
    30. if(param instanceof PageBean){
    31. pageBean = (PageBean) param;
    32. break;
    33. }
    34. }
    35. if(pageBean != null && pageBean.isPagination())
    36. PageHelper.startPage(pageBean.getPage(),pageBean.getRows());
    37. 执行目标方法
    38. Object lst = args.proceed();
    39. if(pageBean != null && pageBean.isPagination()){
    40. PageInfo info = new PageInfo((List) lst);
    41. pageBean.setTotal((int)info.getTotal());
    42. }
    43. return lst;
    44. }
    45. }

    BookBizImpl

    1. package com.ctb.biz.impl;
    2. import com.ctb.biz.BookBiz;
    3. import com.ctb.mapper.BookMapper;
    4. import com.ctb.model.Book;
    5. import com.ctb.utils.PageBean;
    6. import org.springframework.beans.factory.annotation.Autowired;
    7. import org.springframework.stereotype.Service;
    8. import java.util.List;
    9. /**
    10. * @author
    11. * @remark
    12. * @create  2023-09-07 16:55
    13. */
    14. @Service
    15. public class BookBizImpl implements BookBiz {
    16. @Autowired
    17. private BookMapper bookMapper;
    18. @Override
    19. public int deleteByPrimaryKey(Integer bid) {
    20. return bookMapper.deleteByPrimaryKey(bid);
    21. }
    22. @Override
    23. public int insert(Book record) {
    24. return bookMapper.insert(record);
    25. }
    26. @Override
    27. public int insertSelective(Book record) {
    28. return bookMapper.insertSelective(record);
    29. }
    30. @Override
    31. public Book selectByPrimaryKey(Integer bid) {
    32. return bookMapper.selectByPrimaryKey(bid);
    33. }
    34. @Override
    35. public int updateByPrimaryKeySelective(Book record) {
    36. return bookMapper.updateByPrimaryKeySelective(record);
    37. }
    38. @Override
    39. public int updateByPrimaryKey(Book record) {
    40. return bookMapper.updateByPrimaryKey(record);
    41. }
    42. @Override
    43. public List listPager(Book book, PageBean pageBean) {
    44. return bookMapper.selectPager(book);
    45. }
    46. }

    3.工具类

    pagebean---分页

    1. package com.ctb.utils;
    2. import javax.servlet.http.HttpServletRequest;
    3. import java.io.Serializable;
    4. import java.util.Map;
    5. public class PageBean implements Serializable {
    6. private static final long serialVersionUID = 2422581023658455731L;
    7. //页码
    8. private int page=1;
    9. //每页显示记录数
    10. private int rows=10;
    11. //总记录数
    12. private int total=0;
    13. //是否分页
    14. private boolean isPagination=true;
    15. //上一次的请求路径
    16. private String url;
    17. //获取所有的请求参数
    18. private Map<String,String[]> map;
    19. public PageBean() {
    20. super();
    21. }
    22. //设置请求参数
    23. public void setRequest(HttpServletRequest req) {
    24. String page=req.getParameter("page");
    25. String rows=req.getParameter("rows");
    26. String pagination=req.getParameter("pagination");
    27. this.setPage(page);
    28. this.setRows(rows);
    29. this.setPagination(pagination);
    30. this.url=req.getContextPath()+req.getServletPath();
    31. this.map=req.getParameterMap();
    32. }
    33. public String getUrl() {
    34. return url;
    35. }
    36. public void setUrl(String url) {
    37. this.url = url;
    38. }
    39. public Map<String, String[]> getMap() {
    40. return map;
    41. }
    42. public void setMap(Map<String, String[]> map) {
    43. this.map = map;
    44. }
    45. public int getPage() {
    46. return page;
    47. }
    48. public void setPage(int page) {
    49. this.page = page;
    50. }
    51. public void setPage(String page) {
    52. if(null!=page&&!"".equals(page.trim()))
    53. this.page = Integer.parseInt(page);
    54. }
    55. public int getRows() {
    56. return rows;
    57. }
    58. public void setRows(int rows) {
    59. this.rows = rows;
    60. }
    61. public void setRows(String rows) {
    62. if(null!=rows&&!"".equals(rows.trim()))
    63. this.rows = Integer.parseInt(rows);
    64. }
    65. public int getTotal() {
    66. return total;
    67. }
    68. public void setTotal(int total) {
    69. this.total = total;
    70. }
    71. public void setTotal(String total) {
    72. this.total = Integer.parseInt(total);
    73. }
    74. public boolean isPagination() {
    75. return isPagination;
    76. }
    77. public void setPagination(boolean isPagination) {
    78. this.isPagination = isPagination;
    79. }
    80. public void setPagination(String isPagination) {
    81. if(null!=isPagination&&!"".equals(isPagination.trim()))
    82. this.isPagination = Boolean.parseBoolean(isPagination);
    83. }
    84. /**
    85. * 获取分页起始标记位置
    86. * @return
    87. */
    88. public int getStartIndex() {
    89. //(当前页码-1)*显示记录数
    90. return (this.getPage()-1)*this.rows;
    91. }
    92. /**
    93. * 末页
    94. * @return
    95. */
    96. public int getMaxPage() {
    97. int totalpage=this.total/this.rows;
    98. if(this.total%this.rows!=0)
    99. totalpage++;
    100. return totalpage;
    101. }
    102. /**
    103. * 下一页
    104. * @return
    105. */
    106. public int getNextPage() {
    107. int nextPage=this.page+1;
    108. if(this.page>=this.getMaxPage())
    109. nextPage=this.getMaxPage();
    110. return nextPage;
    111. }
    112. /**
    113. * 上一页
    114. * @return
    115. */
    116. public int getPreivousPage() {
    117. int previousPage=this.page-1;
    118. if(previousPage<1)
    119. previousPage=1;
    120. return previousPage;
    121. }
    122. @Override
    123. public String toString() {
    124. return "PageBean [page=" + page + ", rows=" + rows + ", total=" + total + ", isPagination=" + isPagination
    125. + "]";
    126. }
    127. }

    pagetag---自定义分页标签

    1. package com.ctb.tag;
    2. import com.ctb.utils.PageBean;
    3. import javax.servlet.jsp.JspException;
    4. import javax.servlet.jsp.JspWriter;
    5. import javax.servlet.jsp.tagext.BodyTagSupport;
    6. import java.io.IOException;
    7. import java.util.Map;
    8. import java.util.Map.Entry;
    9. import java.util.Set;
    10. public class PageTag extends BodyTagSupport{
    11. private PageBean pageBean;// 包含了所有分页相关的元素
    12. public PageBean getPageBean() {
    13. return pageBean;
    14. }
    15. public void setPageBean(PageBean pageBean) {
    16. this.pageBean = pageBean;
    17. }
    18. @Override
    19. public int doStartTag() throws JspException {
    20. // 没有标签体,要输出内容
    21. JspWriter out = pageContext.getOut();
    22. try {
    23. out.print(toHTML());
    24. } catch (IOException e) {
    25. e.printStackTrace();
    26. }
    27. return super.doStartTag();
    28. }
    29. private String toHTML() {
    30. StringBuffer sb = new StringBuffer();
    31. // 隐藏的form表单---这个就是上一次请求下次重新发的奥义所在
    32. // 上一次请求的URL
    33. sb.append("
      ");
    34. sb.append(" ");
    35. // 上一次请求的参数
    36. Map<String, String[]> paramMap = pageBean.getMap();
    37. if(paramMap != null && paramMap.size() > 0) {
    38. Set<Entry<String, String[]>> entrySet = paramMap.entrySet();
    39. for (Entry<String, String[]> entry : entrySet) {
    40. // 参数名
    41. String key = entry.getKey();
    42. // 参数值
    43. for (String value : entry.getValue()) {
    44. // 上一次请求的参数,再一次组装成了新的Form表单
    45. // 注意:page参数每次都会提交,我们需要避免
    46. if(!"page".equals(key)) {
    47. sb.append(" ");
    48. }
    49. }
    50. }
    51. }
    52. sb.append("");
    53. // 分页条
    54. sb.append("
        ");
    55. sb.append("
    56. );
  • ");
  • sb.append("
  • );
  • ");// less than 小于号
  • // sb.append("
  • 1
  • ");
  • // sb.append("
  • 2
  • ");
  • sb.append("
  • "+pageBean.getPage()+"
  • ");
  • sb.append("
  • >
  • ");
  • sb.append("
  • 尾页
  • ");
  • sb.append("
  • 到第);
  • sb.append(" type='text' id='skipPage' name='' />
  • ");
  • sb.append("
  • );
  • ");
  • sb.append("
  • 共"+pageBean.getTotal()+"条
  • ");
  • sb.append("");
  • // 分页执行的JS代码
  • sb.append("");
  • return sb.toString();
  • }
  • }
  • ctb.tld---自定义标签配置

    1. <?xml version="1.0" encoding="UTF-8" ?>
    2. <taglib xmlns="http://java.sun.com/xml/ns/j2ee"
    3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    4. xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"
    5. version="2.0">
    6. <description>ctb 1.1 core library</description>
    7. <display-name>ctb core</display-name>
    8. <tlib-version>1.1</tlib-version>
    9. <short-name>ctb</short-name>
    10. <uri>http://jsp.veryedu.cn</uri>
    11. <tag>
    12. <name>page</name>
    13. <tag-class>com.ctb.tag.PageTag</tag-class>
    14. <body-content>JSP</body-content>
    15. <attribute>
    16. <name>pageBean</name>
    17. <required>true</required>
    18. <rtexprvalue>true</rtexprvalue>
    19. </attribute>
    20. </tag>
    21. </taglib>

    responseutil---返回结果显示

    1. package com.ctb.utils;
    2. import com.fasterxml.jackson.databind.ObjectMapper;
    3. import javax.servlet.http.HttpServletResponse;
    4. import java.io.PrintWriter;
    5. public class ResponseUtil {
    6. public static void write(HttpServletResponse response,Object o)throws Exception{
    7. response.setContentType("text/html;charset=utf-8");
    8. PrintWriter out=response.getWriter();
    9. out.println(o.toString());
    10. out.flush();
    11. out.close();
    12. }
    13. public static void writeJson(HttpServletResponse response,Object o)throws Exception{
    14. ObjectMapper om = new ObjectMapper();
    15. // om.writeValueAsString(o)代表了json串
    16. write(response, om.writeValueAsString(o));
    17. }
    18. }

    4.controller层

    1. package com.ctb.controller;
    2. import com.ctb.biz.BookBiz;
    3. import com.ctb.model.Book;
    4. import com.ctb.utils.PageBean;
    5. import org.springframework.beans.factory.annotation.Autowired;
    6. import org.springframework.stereotype.Controller;
    7. import org.springframework.ui.Model;
    8. import org.springframework.web.bind.annotation.PathVariable;
    9. import org.springframework.web.bind.annotation.RequestMapping;
    10. import javax.servlet.http.HttpServletRequest;
    11. import java.util.List;
    12. @Controller
    13. @RequestMapping("/book")
    14. public class BookController {
    15. @Autowired
    16. private BookBiz bookBiz;
    17. // 增
    18. @RequestMapping("/add")
    19. public String add(Book Book){
    20. int i = bookBiz.insertSelective(Book);
    21. return "redirect:list";
    22. }
    23. // 删
    24. @RequestMapping("/del/{bid}")
    25. public String del(@PathVariable("bid") Integer bid){
    26. bookBiz.deleteByPrimaryKey(bid);
    27. return "redirect:/book/list";
    28. }
    29. // 改
    30. @RequestMapping("/edit")
    31. public String edit(Book Book){
    32. bookBiz.updateByPrimaryKeySelective(Book);
    33. return "redirect:list";
    34. }
    35. // 查
    36. @RequestMapping("/list")
    37. public String list(Book Book, HttpServletRequest request){
    38. PageBean pageBean = new PageBean();
    39. pageBean.setRequest(request);
    40. List<Book> Books = bookBiz.listPager(Book, pageBean);
    41. request.setAttribute("lst",Books);
    42. request.setAttribute("pageBean",pageBean);
    43. return "book/list";
    44. }
    45. // 查询单个
    46. @RequestMapping("/detail")
    47. public String preSave(Book Book, Model model){
    48. if(Book != null && Book.getBid() != null && Book.getBid() != 0){
    49. Book b = bookBiz.selectByPrimaryKey(Book.getBid());
    50. model.addAttribute("b",b);
    51. }
    52. return "book/edit";
    53. }
    54. }

    三、测试结果

    1.查

    2.模糊查询

    3.删

    4.改

    5.增

    总结

    在本文中,我们详细讲解了如何使用Spring MVC来实现增删改查功能。我们从基本概念开始,逐步介绍了每个步骤,并提供了示例代码来帮助您更好地理解和应用这些概念。希望本文对您有所帮助,谢谢阅读!

    【参考资料】

  • 相关阅读:
    C#的反射Reflection
    Vue项目实战——【基于 Vue3.x + Vant UI】实现一个多功能记账本(开发导航栏及公共部分)
    VMP3.6的反调试和反虚拟机
    Cega在Solana上推出主网,为加密货币散户投资者提供更加安全的高收益机遇
    JavaScript常用工具函数汇总(一)
    Siri怎么打开
    Bundle结构入门
    CV相关 - 文献地址地址、数据集地址
    HTML小游戏16 —— 消除游戏《魔法石》源码(附完整源码)
    力扣LeetCode算法题 第6题-Z 字形变换
  • 原文地址:https://blog.csdn.net/weixin_74268571/article/details/132768876