目录
4.spring-mybatis---mybatis与spring整合文件
5.spring-context---spring上下文配置
Spring MVC是一种基于Java的Web框架,它提供了一种简单而强大的方式来构建Web应用程序。在本文中,我们将详细讲解如何使用Spring MVC来实现增删改查功能。我们将从基本概念开始,逐步介绍每个步骤,并提供示例代码来帮助您更好地理解和应用这些概念。
先创建一个maven工程
将相关依赖于插件进行添加,并将
- "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.0modelVersion>
-
- <groupId>com.ctbgroupId>
- <artifactId>ctbssmartifactId>
- <version>1.0-SNAPSHOTversion>
- <packaging>warpackaging>
-
- <name>ctbssm Maven Webappname>
-
- <url>http://www.example.comurl>
-
- <properties>
- <project.build.sourceEncoding>UTF-8project.build.sourceEncoding>
- <maven.compiler.source>1.8maven.compiler.source>
- <maven.compiler.target>1.8maven.compiler.target>
- <maven.compiler.plugin.version>3.7.0maven.compiler.plugin.version>
-
-
-
- <spring.version>5.0.2.RELEASEspring.version>
-
- <mybatis.version>3.4.5mybatis.version>
-
- <mysql.version>5.1.44mysql.version>
-
- <pagehelper.version>5.1.2pagehelper.version>
-
- <mybatis.spring.version>1.3.1mybatis.spring.version>
-
- <commons.dbcp2.version>2.1.1commons.dbcp2.version>
- <commons.pool2.version>2.4.3commons.pool2.version>
-
- <log4j2.version>2.9.1log4j2.version>
- <log4j2.disruptor.version>3.2.0log4j2.disruptor.version>
- <slf4j.version>1.7.13slf4j.version>
-
- <junit.version>4.12junit.version>
- <servlet.version>4.0.0servlet.version>
- <lombok.version>1.18.2lombok.version>
-
- <mybatis.ehcache.version>1.1.0mybatis.ehcache.version>
- <ehcache.version>2.10.0ehcache.version>
-
- <redis.version>2.9.0redis.version>
- <redis.spring.version>1.7.1.RELEASEredis.spring.version>
- <jackson.version>2.9.3jackson.version>
- <jstl.version>1.2jstl.version>
- <standard.version>1.1.2standard.version>
- <tomcat-jsp-api.version>8.0.47tomcat-jsp-api.version>
- <commons-fileupload.version>1.3.3commons-fileupload.version>
- <hibernate-validator.version>5.0.2.Finalhibernate-validator.version>
-
- <shiro.version>1.3.2shiro.version>
- properties>
-
-
- <dependencies>
-
- <dependency>
- <groupId>org.springframeworkgroupId>
- <artifactId>spring-coreartifactId>
- <version>${spring.version}version>
- dependency>
- <dependency>
- <groupId>org.springframeworkgroupId>
- <artifactId>spring-beansartifactId>
- <version>${spring.version}version>
- dependency>
- <dependency>
- <groupId>org.springframeworkgroupId>
- <artifactId>spring-contextartifactId>
- <version>${spring.version}version>
- dependency>
- <dependency>
- <groupId>org.springframeworkgroupId>
- <artifactId>spring-ormartifactId>
- <version>${spring.version}version>
- dependency>
- <dependency>
- <groupId>org.springframeworkgroupId>
- <artifactId>spring-txartifactId>
- <version>${spring.version}version>
- dependency>
- <dependency>
- <groupId>org.springframeworkgroupId>
- <artifactId>spring-aspectsartifactId>
- <version>${spring.version}version>
- dependency>
- <dependency>
- <groupId>org.springframeworkgroupId>
- <artifactId>spring-webartifactId>
- <version>${spring.version}version>
- dependency>
-
- <dependency>
- <groupId>org.springframeworkgroupId>
- <artifactId>spring-testartifactId>
- <version>${spring.version}version>
- dependency>
-
-
-
- <dependency>
- <groupId>org.mybatisgroupId>
- <artifactId>mybatisartifactId>
- <version>${mybatis.version}version>
- dependency>
-
- <dependency>
- <groupId>mysqlgroupId>
- <artifactId>mysql-connector-javaartifactId>
- <version>${mysql.version}version>
- dependency>
-
- <dependency>
- <groupId>com.github.pagehelpergroupId>
- <artifactId>pagehelperartifactId>
- <version>${pagehelper.version}version>
- dependency>
-
- <dependency>
- <groupId>org.mybatisgroupId>
- <artifactId>mybatis-springartifactId>
- <version>${mybatis.spring.version}version>
- dependency>
-
- <dependency>
- <groupId>org.springframeworkgroupId>
- <artifactId>spring-context-supportartifactId>
- <version>${spring.version}version>
- dependency>
-
-
- <dependency>
- <groupId>org.mybatis.cachesgroupId>
- <artifactId>mybatis-ehcacheartifactId>
- <version>${mybatis.ehcache.version}version>
- dependency>
-
- <dependency>
- <groupId>net.sf.ehcachegroupId>
- <artifactId>ehcacheartifactId>
- <version>${ehcache.version}version>
- dependency>
-
- <dependency>
- <groupId>redis.clientsgroupId>
- <artifactId>jedisartifactId>
- <version>${redis.version}version>
- dependency>
- <dependency>
- <groupId>org.springframework.datagroupId>
- <artifactId>spring-data-redisartifactId>
- <version>${redis.spring.version}version>
- dependency>
- <dependency>
- <groupId>com.fasterxml.jackson.coregroupId>
- <artifactId>jackson-databindartifactId>
- <version>${jackson.version}version>
- dependency>
- <dependency>
- <groupId>com.fasterxml.jackson.coregroupId>
- <artifactId>jackson-coreartifactId>
- <version>${jackson.version}version>
- dependency>
- <dependency>
- <groupId>com.fasterxml.jackson.coregroupId>
- <artifactId>jackson-annotationsartifactId>
- <version>${jackson.version}version>
- dependency>
-
-
- <dependency>
- <groupId>org.apache.commonsgroupId>
- <artifactId>commons-dbcp2artifactId>
- <version>${commons.dbcp2.version}version>
- <exclusions>
- <exclusion>
- <artifactId>commons-pool2artifactId>
- <groupId>org.apache.commonsgroupId>
- exclusion>
- exclusions>
- dependency>
- <dependency>
- <groupId>org.apache.commonsgroupId>
- <artifactId>commons-pool2artifactId>
- <version>${commons.pool2.version}version>
- dependency>
-
-
- <dependency>
- <groupId>org.springframeworkgroupId>
- <artifactId>spring-webmvcartifactId>
- <version>${spring.version}version>
- dependency>
-
-
-
-
-
-
- <dependency>
- <groupId>org.slf4jgroupId>
- <artifactId>slf4j-apiartifactId>
- <version>${slf4j.version}version>
- dependency>
- <dependency>
- <groupId>org.slf4jgroupId>
- <artifactId>jcl-over-slf4jartifactId>
- <version>${slf4j.version}version>
- <scope>runtimescope>
- dependency>
-
-
- <dependency>
- <groupId>org.apache.logging.log4jgroupId>
- <artifactId>log4j-apiartifactId>
- <version>${log4j2.version}version>
- dependency>
- <dependency>
- <groupId>org.apache.logging.log4jgroupId>
- <artifactId>log4j-coreartifactId>
- <version>${log4j2.version}version>
- dependency>
-
- <dependency>
- <groupId>org.apache.logging.log4jgroupId>
- <artifactId>log4j-slf4j-implartifactId>
- <version>${log4j2.version}version>
- dependency>
-
- <dependency>
- <groupId>org.apache.logging.log4jgroupId>
- <artifactId>log4j-webartifactId>
- <version>${log4j2.version}version>
- <scope>runtimescope>
- dependency>
-
-
- <dependency>
- <groupId>com.lmaxgroupId>
- <artifactId>disruptorartifactId>
- <version>${log4j2.disruptor.version}version>
- dependency>
-
-
- <dependency>
- <groupId>junitgroupId>
- <artifactId>junitartifactId>
- <version>${junit.version}version>
-
- dependency>
- <dependency>
- <groupId>javax.servletgroupId>
- <artifactId>javax.servlet-apiartifactId>
- <version>${servlet.version}version>
- <scope>providedscope>
- dependency>
- <dependency>
- <groupId>org.projectlombokgroupId>
- <artifactId>lombokartifactId>
- <version>${lombok.version}version>
- <scope>providedscope>
- dependency>
- <dependency>
- <groupId>jstlgroupId>
- <artifactId>jstlartifactId>
- <version>${jstl.version}version>
- dependency>
- <dependency>
- <groupId>taglibsgroupId>
- <artifactId>standardartifactId>
- <version>${standard.version}version>
- dependency>
- <dependency>
- <groupId>org.apache.tomcatgroupId>
- <artifactId>tomcat-jsp-apiartifactId>
- <version>${tomcat-jsp-api.version}version>
- dependency>
- <dependency>
- <groupId>commons-fileuploadgroupId>
- <artifactId>commons-fileuploadartifactId>
- <version>${commons-fileupload.version}version>
- dependency>
-
- <dependency>
- <groupId>org.hibernategroupId>
- <artifactId>hibernate-validatorartifactId>
- <version>${hibernate-validator.version}version>
- dependency>
-
-
- <dependency>
- <groupId>org.apache.shirogroupId>
- <artifactId>shiro-coreartifactId>
- <version>${shiro.version}version>
- dependency>
- <dependency>
- <groupId>org.apache.shirogroupId>
- <artifactId>shiro-webartifactId>
- <version>${shiro.version}version>
- dependency>
- <dependency>
- <groupId>org.apache.shirogroupId>
- <artifactId>shiro-springartifactId>
- <version>${shiro.version}version>
- dependency>
- dependencies>
-
- <build>
- <finalName>ctbssmfinalName>
- <resources>
-
- <resource>
- <directory>src/main/javadirectory>
- <includes>
- <include>**/*.xmlinclude>
- includes>
- resource>
-
- <resource>
- <directory>src/main/resourcesdirectory>
- <includes>
- <include>jdbc.propertiesinclude>
- <include>*.xmlinclude>
- includes>
- resource>
- resources>
- <plugins>
- <plugin>
- <groupId>org.apache.maven.pluginsgroupId>
- <artifactId>maven-compiler-pluginartifactId>
- <version>${maven.compiler.plugin.version}version>
- <configuration>
- <source>${maven.compiler.source}source>
- <target>${maven.compiler.target}target>
- <encoding>${project.build.sourceEncoding}encoding>
- configuration>
- plugin>
- <plugin>
- <groupId>org.mybatis.generatorgroupId>
- <artifactId>mybatis-generator-maven-pluginartifactId>
- <version>1.3.2version>
- <dependencies>
-
- <dependency>
- <groupId>mysqlgroupId>
- <artifactId>mysql-connector-javaartifactId>
- <version>${mysql.version}version>
- dependency>
- dependencies>
- <configuration>
- <overwrite>trueoverwrite>
- configuration>
- plugin>
-
- <plugin>
- <artifactId>maven-clean-pluginartifactId>
- <version>3.1.0version>
- plugin>
-
- <plugin>
- <artifactId>maven-resources-pluginartifactId>
- <version>3.0.2version>
- plugin>
- <plugin>
- <artifactId>maven-compiler-pluginartifactId>
- <version>3.8.0version>
- plugin>
- <plugin>
- <artifactId>maven-surefire-pluginartifactId>
- <version>2.22.1version>
- plugin>
- <plugin>
- <artifactId>maven-war-pluginartifactId>
- <version>3.2.2version>
- plugin>
- <plugin>
- <artifactId>maven-install-pluginartifactId>
- <version>2.5.2version>
- plugin>
- <plugin>
- <artifactId>maven-deploy-pluginartifactId>
- <version>2.8.2version>
- plugin>
- plugins>
- build>
- project>
数据库驱动---数据库连接路径---数据库登录用户名---数据库登录密码
- jdbc.driver=com.mysql.jdbc.Driver
- jdbc.url=jdbc:mysql://localhost:3306/mybatis_ssm?useUnicode=true&characterEncoding=UTF-8
- jdbc.username=root
- jdbc.password=123456
用于记录日志
- <?xml version="1.0" encoding="UTF-8"?>
-
- <!-- status : 指定log4j本身的打印日志的级别.ALL< Trace < DEBUG < INFO < WARN < ERROR
- < FATAL < OFF。 monitorInterval : 用于指定log4j自动重新配置的监测间隔时间,单位是s,最小是5s. -->
- <Configuration status="WARN" monitorInterval="30">
- <Properties>
- <!-- 配置日志文件输出目录 ${sys:user.home} -->
- <Property name="LOG_HOME">/root/workspace/lucenedemo/logs</Property>
- <property name="ERROR_LOG_FILE_NAME">/root/workspace/lucenedemo/logs/error</property>
- <property name="WARN_LOG_FILE_NAME">/root/workspace/lucenedemo/logs/warn</property>
- <property name="PATTERN">%d{yyyy-MM-dd HH:mm:ss.SSS} [%t-%L] %-5level %logger{36} - %msg%n</property>
- </Properties>
-
- <Appenders>
- <!--这个输出控制台的配置 -->
- <Console name="Console" target="SYSTEM_OUT">
- <!-- 控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch) -->
- <ThresholdFilter level="trace" onMatch="ACCEPT"
- onMismatch="DENY" />
- <!-- 输出日志的格式 -->
- <!-- %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 name="log" fileName="logs/test.log" append="false">
- <PatternLayout
- pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" />
- </File>
- <!-- 这个会打印出所有的info及以下级别的信息,每次大小超过size, 则这size大小的日志会自动存入按年份-月份建立的文件夹下面并进行压缩,作为存档 -->
- <RollingFile name="RollingFileInfo" fileName="${LOG_HOME}/info.log"
- filePattern="${LOG_HOME}/$${date:yyyy-MM}/info-%d{yyyy-MM-dd}-%i.log">
- <!--控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch) -->
- <ThresholdFilter level="info" onMatch="ACCEPT"
- onMismatch="DENY" />
- <PatternLayout
- pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" />
- <Policies>
- <!-- 基于时间的滚动策略,interval属性用来指定多久滚动一次,默认是1 hour。 modulate=true用来调整时间:比如现在是早上3am,interval是4,那么第一次滚动是在4am,接着是8am,12am...而不是7am. -->
- <!-- 关键点在于 filePattern后的日期格式,以及TimeBasedTriggeringPolicy的interval, 日期格式精确到哪一位,interval也精确到哪一个单位 -->
- <!-- log4j2的按天分日志文件 : info-%d{yyyy-MM-dd}-%i.log -->
- <TimeBasedTriggeringPolicy interval="1"
- modulate="true" />
- <!-- SizeBasedTriggeringPolicy:Policies子节点, 基于指定文件大小的滚动策略,size属性用来定义每个日志文件的大小. -->
- <!-- <SizeBasedTriggeringPolicy size="2 kB" /> -->
- </Policies>
- </RollingFile>
-
- <RollingFile name="RollingFileWarn" fileName="${WARN_LOG_FILE_NAME}/warn.log"
- filePattern="${WARN_LOG_FILE_NAME}/$${date:yyyy-MM}/warn-%d{yyyy-MM-dd}-%i.log">
- <ThresholdFilter level="warn" onMatch="ACCEPT"
- onMismatch="DENY" />
- <PatternLayout
- pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" />
- <Policies>
- <TimeBasedTriggeringPolicy />
- <SizeBasedTriggeringPolicy size="2 kB" />
- </Policies>
- <!-- DefaultRolloverStrategy属性如不设置,则默认为最多同一文件夹下7个文件,这里设置了20 -->
- <DefaultRolloverStrategy max="20" />
- </RollingFile>
-
- <RollingFile name="RollingFileError" fileName="${ERROR_LOG_FILE_NAME}/error.log"
- filePattern="${ERROR_LOG_FILE_NAME}/$${date:yyyy-MM}/error-%d{yyyy-MM-dd-HH-mm}-%i.log">
- <ThresholdFilter level="error" onMatch="ACCEPT"
- onMismatch="DENY" />
- <PatternLayout
- pattern="%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 interval="1"
- modulate="true" />
- <!-- <SizeBasedTriggeringPolicy size="10 MB" /> -->
- </Policies>
- </RollingFile>
-
- </Appenders>
-
- <!--然后定义logger,只有定义了logger并引入的appender,appender才会生效 -->
- <Loggers>
- <!--过滤掉spring和mybatis的一些无用的DEBUG信息 -->
- <logger name="org.springframework" level="INFO"></logger>
- <logger name="org.mybatis" level="INFO"></logger>
-
- <!-- 第三方日志系统 -->
- <logger name="org.springframework" level="ERROR" />
- <logger name="org.hibernate" level="ERROR" />
- <logger name="org.apache.struts2" level="ERROR" />
- <logger name="com.opensymphony.xwork2" level="ERROR" />
- <logger name="org.jboss" level="ERROR" />
-
-
- <!-- 配置日志的根节点 -->
- <root level="all">
- <appender-ref ref="Console" />
- <appender-ref ref="RollingFileInfo" />
- <appender-ref ref="RollingFileWarn" />
- <appender-ref ref="RollingFileError" />
- </root>
-
- </Loggers>
-
- </Configuration>
扫描包、数据源、sqlsessionfactory、mapper扫描、事务管理所、开启自动代理
- "1.0" encoding="UTF-8"?>
- <beans xmlns="http://www.springframework.org/schema/beans"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx"
- xmlns:aop="http://www.springframework.org/schema/aop"
- 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">
-
-
- <context:annotation-config/>
-
- <context:component-scan base-package="com.ctb"/>
-
- <context:property-placeholder location="classpath:jdbc.properties"/>
-
- <bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource"
- destroy-method="close">
- <property name="driverClassName" value="${jdbc.driver}"/>
- <property name="url" value="${jdbc.url}"/>
- <property name="username" value="${jdbc.username}"/>
- <property name="password" value="${jdbc.password}"/>
-
- <property name="initialSize" value="10"/>
-
- <property name="maxTotal" value="100"/>
-
- <property name="maxIdle" value="50"/>
-
- <property name="minIdle" value="10"/>
-
-
- <property name="maxWaitMillis" value="-1"/>
- bean>
-
-
-
- <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
-
- <property name="dataSource" ref="dataSource"/>
-
- <property name="mapperLocations" value="classpath*:com/ctb/**/mapper/*.xml"/>
-
- <property name="typeAliasesPackage" value="com/ctb/**/model"/>
-
- <property name="plugins">
- <array>
- <bean class="com.github.pagehelper.PageInterceptor">
- <property name="properties">
- <value>
- helperDialect=mysql
- value>
- property>
- bean>
- array>
- property>
- bean>
-
-
-
- <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
-
-
- <property name="basePackage" value="com/ctb/**/mapper"/>
- <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
- bean>
-
- <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
- <property name="dataSource" ref="dataSource" />
- bean>
- <tx:annotation-driven transaction-manager="transactionManager" />
- <aop:aspectj-autoproxy/>
- beans>
- "1.0" encoding="UTF-8"?>
- <beans xmlns="http://www.springframework.org/schema/beans"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
-
- <import resource="classpath:spirng-mybatis.xml">import>
- beans>
扫描包、视图解析器、静态资源处理、开启自动代理
- "1.0" encoding="UTF-8"?>
- <beans xmlns="http://www.springframework.org/schema/beans"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xmlns:context="http://www.springframework.org/schema/context"
- xmlns:aop="http://www.springframework.org/schema/aop"
- xmlns:mvc="http://www.springframework.org/schema/mvc"
- 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-4.3.xsd
- http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.3.xsd
- http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd">
-
- <context:component-scan base-package="com.ctb"/>
-
-
- <mvc:annotation-driven />
-
-
- <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
-
- <property name="viewClass"
- value="org.springframework.web.servlet.view.JstlView">property>
- <property name="prefix" value="/WEB-INF/jsp/"/>
- <property name="suffix" value=".jsp"/>
- bean>
-
-
-
- <aop:aspectj-autoproxy/>
- beans>
主要生成model/mapper接口/mapper.xml
- "1.0" encoding="UTF-8" ?>
- generatorConfiguration PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
- "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd" >
- <generatorConfiguration>
-
- <properties resource="jdbc.properties"/>
-
-
- <classPathEntry location="D:\\software\\maven\\mvn_protetis\\mysql\\mysql-connector-java\\5.1.44\\mysql-connector-java-5.1.44.jar"/>
-
-
- <context id="infoGuardian">
-
- <commentGenerator>
- <property name="suppressAllComments" value="true"/>
- <property name="suppressDate" value="true"/>
- commentGenerator>
-
-
- <jdbcConnection driverClass="${jdbc.driver}"
- connectionURL="${jdbc.url}" userId="${jdbc.username}" password="${jdbc.password}"/>
-
-
- <javaTypeResolver>
-
- <property name="forceBigDecimals" value="false"/>
- javaTypeResolver>
-
-
-
-
- <javaModelGenerator targetPackage="com.ctb.model"
- targetProject="src/main/java">
-
- <property name="enableSubPackages" value="false"/>
-
- <property name="constructorBased" value="true"/>
-
- <property name="trimStrings" value="false"/>
-
- <property name="immutable" value="false"/>
- javaModelGenerator>
-
-
- <sqlMapGenerator targetPackage="com.ctb.mapper"
- targetProject="src/main/java">
-
- <property name="enableSubPackages" value="false"/>
- sqlMapGenerator>
-
-
-
-
-
- <javaClientGenerator targetPackage="com.ctb.mapper"
- targetProject="src/main/java" type="XMLMAPPER">
-
- <property name="enableSubPackages" value="false"/>
- javaClientGenerator>
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- <table schema="" tableName="t_mvc_book" domainObjectName="Book"
- enableCountByExample="false" enableDeleteByExample="false"
- enableSelectByExample="false" enableUpdateByExample="false">
- table>
-
- context>
- generatorConfiguration>
- <?xml version="1.0" encoding="UTF-8"?>
- <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
- version="3.1">
- <display-name>Archetype Created Web Application</display-name>
- <!-- Spring和web项目集成start -->
- <!-- spring上下文配置文件 -->
- <context-param>
- <param-name>contextConfigLocation</param-name>
- <param-value>classpath:spring-context.xml</param-value>
- </context-param>
- <!-- 读取Spring上下文的监听器 -->
- <listener>
- <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
- </listener>
- <!-- Spring和web项目集成end -->
-
- <!-- 中文乱码处理 -->
- <filter>
- <filter-name>encodingFilter</filter-name>
- <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
- <async-supported>true</async-supported>
- <init-param>
- <param-name>encoding</param-name>
- <param-value>UTF-8</param-value>
- </init-param>
- </filter>
- <filter-mapping>
- <filter-name>encodingFilter</filter-name>
- <url-pattern>/*</url-pattern>
- </filter-mapping>
-
- <!-- Spring MVC servlet -->
- <servlet>
- <servlet-name>SpringMVC</servlet-name>
- <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
- <!--此参数可以不配置,默认值为:/WEB-INF/springmvc-servlet.xml-->
- <init-param>
- <param-name>contextConfigLocation</param-name>
- <param-value>classpath:spring-mvc.xml</param-value>
- </init-param>
- <load-on-startup>1</load-on-startup>
- <!--web.xml 3.0的新特性,是否支持异步-->
- <async-supported>true</async-supported>
- </servlet>
- <servlet-mapping>
- <servlet-name>SpringMVC</servlet-name>
- <url-pattern>/</url-pattern>
- </servlet-mapping>
- </web-app>
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);
-
- List
selectPager(Book book); -
- }
BookMapper.xml
- <?xml version="1.0" encoding="UTF-8" ?>
- <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
- <mapper namespace="com.ctb.mapper.BookMapper" >
- <resultMap id="BaseResultMap" type="com.ctb.model.Book" >
- <constructor >
- <idArg column="bid" jdbcType="INTEGER" javaType="java.lang.Integer" />
- <arg column="bname" jdbcType="VARCHAR" javaType="java.lang.String" />
- <arg column="price" jdbcType="REAL" javaType="java.lang.Float" />
- </constructor>
- </resultMap>
- <sql id="Base_Column_List" >
- bid, bname, price
- </sql>
- <select id="selectByPrimaryKey" resultMap="BaseResultMap" parameterType="java.lang.Integer" >
- select
- <include refid="Base_Column_List" />
- from t_mvc_book
- where bid = #{bid,jdbcType=INTEGER}
- </select>
- <select id="selectPager" resultType="com.ctb.model.Book" parameterType="com.ctb.model.Book" >
- select
- <include refid="Base_Column_List" />
- from t_mvc_book
- <where>
- <if test="bname != null">
- and bname like concat('%',#{bname},'%')
- </if>
- </where>
- </select>
-
- <delete id="deleteByPrimaryKey" parameterType="java.lang.Integer" >
- delete from t_mvc_book
- where bid = #{bid,jdbcType=INTEGER}
- </delete>
- <insert id="insert" parameterType="com.ctb.model.Book" >
- insert into t_mvc_book (bid, bname, price
- )
- values (#{bid,jdbcType=INTEGER}, #{bname,jdbcType=VARCHAR}, #{price,jdbcType=REAL}
- )
- </insert>
- <insert id="insertSelective" parameterType="com.ctb.model.Book" >
- insert into t_mvc_book
- <trim prefix="(" suffix=")" suffixOverrides="," >
- <if test="bid != null" >
- bid,
- </if>
- <if test="bname != null" >
- bname,
- </if>
- <if test="price != null" >
- price,
- </if>
- </trim>
- <trim prefix="values (" suffix=")" suffixOverrides="," >
- <if test="bid != null" >
- #{bid,jdbcType=INTEGER},
- </if>
- <if test="bname != null" >
- #{bname,jdbcType=VARCHAR},
- </if>
- <if test="price != null" >
- #{price,jdbcType=REAL},
- </if>
- </trim>
- </insert>
- <update id="updateByPrimaryKeySelective" parameterType="com.ctb.model.Book" >
- update t_mvc_book
- <set >
- <if test="bname != null" >
- bname = #{bname,jdbcType=VARCHAR},
- </if>
- <if test="price != null" >
- price = #{price,jdbcType=REAL},
- </if>
- </set>
- where bid = #{bid,jdbcType=INTEGER}
- </update>
- <update id="updateByPrimaryKey" parameterType="com.ctb.model.Book" >
- update t_mvc_book
- set bname = #{bname,jdbcType=VARCHAR},
- price = #{price,jdbcType=REAL}
- where bid = #{bid,jdbcType=INTEGER}
- </update>
- </mapper>
PagerAspect
- package com.ctb.aspect;
-
- import com.ctb.utils.PageBean;
- import com.github.pagehelper.PageHelper;
- import com.github.pagehelper.PageInfo;
- import org.aspectj.lang.ProceedingJoinPoint;
- import org.aspectj.lang.annotation.Around;
- import org.aspectj.lang.annotation.Aspect;
- import org.springframework.stereotype.Component;
-
- import java.util.List;
-
- /**
- *
- * * *..*Service.*Pager(..)
- * * :任意返回值类型
- * *..:任意包,不限层级 com.ctb com.biao.ctb
- * *Service:以Service结尾的类/接口
- * *Pager:以Pager结尾的方法
- * ..:任意参数
- * 符合上述条件,即为目标类或者目标方法
- *
- */
- @Aspect //代表当前类为切面类
- @Component // 代表当前类交给spring进行管理
- public class PagerAspect {
-
- @Around("execution(* *..*Biz.*Pager(..))")
- public Object invoke(ProceedingJoinPoint args) throws Throwable {
- PageBean pageBean = null;
- // 获取目标方法中的所有参数
- Object[] ags = args.getArgs();
- for (Object param : ags) {
- if(param instanceof PageBean){
- pageBean = (PageBean) param;
- break;
- }
- }
- if(pageBean != null && pageBean.isPagination())
- PageHelper.startPage(pageBean.getPage(),pageBean.getRows());
- 执行目标方法
- Object lst = args.proceed();
- if(pageBean != null && pageBean.isPagination()){
- PageInfo info = new PageInfo((List) lst);
- pageBean.setTotal((int)info.getTotal());
- }
- return lst;
- }
- }
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 {
- @Autowired
- private BookMapper bookMapper;
- @Override
- public int deleteByPrimaryKey(Integer bid) {
- return bookMapper.deleteByPrimaryKey(bid);
- }
-
- @Override
- public int insert(Book record) {
- return bookMapper.insert(record);
- }
-
- @Override
- public int insertSelective(Book record) {
- return bookMapper.insertSelective(record);
- }
-
- @Override
- public Book selectByPrimaryKey(Integer bid) {
- return bookMapper.selectByPrimaryKey(bid);
- }
-
- @Override
- public int updateByPrimaryKeySelective(Book record) {
- return bookMapper.updateByPrimaryKeySelective(record);
- }
-
- @Override
- public int updateByPrimaryKey(Book record) {
- return bookMapper.updateByPrimaryKey(record);
- }
-
- @Override
- public List
listPager(Book book, PageBean pageBean) { - return bookMapper.selectPager(book);
- }
- }
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 page=1;
- //每页显示记录数
- private int rows=10;
- //总记录数
- private int total=0;
- //是否分页
- private boolean isPagination=true;
- //上一次的请求路径
- private String url;
- //获取所有的请求参数
- private Map<String,String[]> map;
-
- public PageBean() {
- super();
- }
-
- //设置请求参数
- public void setRequest(HttpServletRequest req) {
- String page=req.getParameter("page");
- String rows=req.getParameter("rows");
- String pagination=req.getParameter("pagination");
- this.setPage(page);
- this.setRows(rows);
- this.setPagination(pagination);
- this.url=req.getContextPath()+req.getServletPath();
- this.map=req.getParameterMap();
- }
- public String getUrl() {
- return url;
- }
-
- public void setUrl(String url) {
- this.url = url;
- }
-
- public Map<String, String[]> getMap() {
- return map;
- }
-
- public void setMap(Map<String, 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 totalpage=this.total/this.rows;
- if(this.total%this.rows!=0)
- totalpage++;
- return totalpage;
- }
-
- /**
- * 下一页
- * @return
- */
- public int getNextPage() {
- int nextPage=this.page+1;
- if(this.page>=this.getMaxPage())
- nextPage=this.getMaxPage();
- return nextPage;
- }
-
- /**
- * 上一页
- * @return
- */
- public int getPreivousPage() {
- int previousPage=this.page-1;
- if(previousPage<1)
- previousPage=1;
- return previousPage;
- }
-
- @Override
- public 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;
- }
-
- @Override
- public 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表单---这个就是上一次请求下次重新发的奥义所在
- // 上一次请求的URL
- sb.append(");
- sb.append(" ");
- // 上一次请求的参数
- Map<String, String[]> paramMap = pageBean.getMap();
- if(paramMap != null && paramMap.size() > 0) {
- Set<Entry<String, String[]>> entrySet = paramMap.entrySet();
- for (Entry<String, String[]> entry : entrySet) {
- // 参数名
- String key = entry.getKey();
- // 参数值
- for (String value : entry.getValue()) {
- // 上一次请求的参数,再一次组装成了新的Form表单
- // 注意:page参数每次都会提交,我们需要避免
- if(!"page".equals(key)) {
- sb.append(" ");
- }
- }
- }
- }
- sb.append("");
-
- // 分页条
- sb.append("
"
); - sb.append("
- );
- sb.append(" href='javascript:gotoPage(1)'>首页");
- sb.append("
- );
- sb.append(" href='javascript:gotoPage("+pageBean.getPreivousPage()+")'><");// less than 小于号
- sb.append("
- >
"); - sb.append("
- 尾页
"); - sb.append("
- 到第);
- sb.append(" type='text' id='skipPage' name='' />页");
- sb.append("
- );
- sb.append(" href='javascript:skipPage()'>确定");
- sb.append("
- 共"
+pageBean.getTotal()+"条"); - sb.append("");
-
- // 分页执行的JS代码
- sb.append("");
-
- return sb.toString();
- }
- }
ctb.tld---自定义标签配置
- <?xml version="1.0" encoding="UTF-8" ?>
-
- <taglib xmlns="http://java.sun.com/xml/ns/j2ee"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"
- version="2.0">
-
- <description>ctb 1.1 core library</description>
- <display-name>ctb core</display-name>
- <tlib-version>1.1</tlib-version>
- <short-name>ctb</short-name>
- <uri>http://jsp.veryedu.cn</uri>
-
-
- <tag>
- <name>page</name>
- <tag-class>com.ctb.tag.PageTag</tag-class>
- <body-content>JSP</body-content>
- <attribute>
- <name>pageBean</name>
- <required>true</required>
- <rtexprvalue>true</rtexprvalue>
- </attribute>
- </tag>
-
- </taglib>
responseutil---返回结果显示
- 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;charset=utf-8");
- PrintWriter out=response.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));
- }
- }
- 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 {
- @Autowired
- private 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);
- List<Book> 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来实现增删改查功能。我们从基本概念开始,逐步介绍了每个步骤,并提供了示例代码来帮助您更好地理解和应用这些概念。希望本文对您有所帮助,谢谢阅读!