简单搭建一个前后台分离的增删改查-上
作者:快盘下载 人气:目录
一、先创建一个Maven项目
二、下载相关依赖及相关插件
1.依赖下载
2.插件下载
三、导入相关文件依赖
1.修改目录结构
2.导入相关依赖文件
2.1 相关文件代码
2.2 添加工具类
三、逆向生成
1.设置逆向生成指令
2.执行指令;逆向生成
3.开发代码
3.1 在BookMapper.xml里添加方法
3.2 在 BookMapper 里添加对应的方法
3.3 创建biz
3.4 实现biz中的方法
4.5 测试方法
一、先创建一个Maven项目
下一步
下一步
之后点击Finish;然后进入等待;下面加载完;即创建成功
二、下载相关依赖及相关插件
1.依赖下载
将下列一次添加或者覆盖进pom.xml文件中
①------------------------------------------------------------
<properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <maven.compiler.source>1.8</maven.compiler.source> <maven.compiler.target>1.8</maven.compiler.target> <maven.compiler.plugin.version>3.7.0</maven.compiler.plugin.version> <!--添加jar包依赖--> <!--1.spring 5.0.2.RELEASE相关--> <spring.version>5.0.2.RELEASE</spring.version> <!--2.mybatis相关--> <mybatis.version>3.4.5</mybatis.version> <!--mysql--> <mysql.version>5.1.44</mysql.version> <!--pagehelper分页jar依赖--> <pagehelper.version>5.1.2</pagehelper.version> <!--mybatis与spring集成jar依赖--> <mybatis.spring.version>1.3.1</mybatis.spring.version> <!--3.dbcp2连接池相关 druid--> <commons.dbcp2.version>2.1.1</commons.dbcp2.version> <commons.pool2.version>2.4.3</commons.pool2.version> <!--4.log日志相关--> <log4j2.version>2.9.1</log4j2.version> <!--5.其他--> <junit.version>4.12</junit.version> <servlet.version>4.0.0</servlet.version> <lombok.version>1.18.2</lombok.version> </properties>
②------------------------------------------------------------
<dependencies> <!--1.spring相关--> <dependency> <groupId>org.springFramework</groupId> <artifactId>spring-context</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-orm</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-tx</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-aspects</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-web</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-test</artifactId> <version>${spring.version}</version> </dependency> <!--2.mybatis相关--> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>${mybatis.version}</version> </dependency> <!--mysql--> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>${mysql.version}</version> </dependency> <!--pagehelper分页插件jar包依赖--> <dependency> <groupId>com.github.pagehelper</groupId> <artifactId>pagehelper</artifactId> <version>${pagehelper.version}</version> </dependency> <!--mybatis与spring集成jar包依赖--> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis-spring</artifactId> <version>${mybatis.spring.version}</version> </dependency> <!--3.dbcp2连接池相关--> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-dbcp2</artifactId> <version>${commons.dbcp2.version}</version> </dependency> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-pool2</artifactId> <version>${commons.pool2.version}</version> </dependency> <!--4.log日志相关依赖--> <!--核心log4j2jar包--> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-core</artifactId> <version>${log4j2.version}</version> </dependency> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-api</artifactId> <version>${log4j2.version}</version> </dependency> <!--web工程需要包含log4j-web;非web工程不需要--> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-web</artifactId> <version>${log4j2.version}</version> </dependency> <!--5.其他--> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>${junit.version}</version> <scope>test</scope> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>${servlet.version}</version> <scope>provided</scope> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>${lombok.version}</version> <scope>provided</scope> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>${spring.version}</version> </dependency> <!--jsp文件中c标签的使用--> <dependency> <groupId>jstl</groupId> <artifactId>jstl</artifactId> <version>1.2</version> </dependency> <dependency> <groupId>taglibs</groupId> <artifactId>standard</artifactId> <version>1.1.2</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.9.3</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-core</artifactId> <version>2.9.3</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-annotations</artifactId> <version>2.9.3</version> </dependency> </dependencies>
③------------------------------------------------------------
<resources> <resource> <directory>src/main/java</directory> <includes> <include>**/*.xml</include> </includes> </resource> <!--解决mybatis-generator-maven-plugin运行时没有将jdbc.properites文件放入target文件夹的问题--> <resource> <directory>src/main/resources</directory> <includes> <include>jdbc.properties</include> <include>*.xml</include> </includes> </resource> </resources>
④--------------------------------------------------------------
<pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) --> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <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.generator</groupId> <artifactId>mybatis-generator-maven-plugin</artifactId> <version>1.3.2</version> <dependencies> <!--使用Mybatis-generator插件不能使用太高版本的mysql驱动 --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>${mysql.version}</version> </dependency> </dependencies> <configuration> <overwrite>true</overwrite> </configuration> </plugin> </plugins> </pluginManagement>
2.插件下载
三、导入相关文件依赖
1.修改目录结构
2.导入相关依赖文件
2.1 相关文件代码
以下配置文件中有关于下列这类型的地址栏;请修改成util根目录的上一级
com/xx/**/mapper/*.xml;com.xx例如;com.hn.ssm.util 取com.hn.ssm
改为 com.hn.ssm
com/hn/ssm/**/mapper/*.xml;
applicationContext.xml
<?xml version=;1.0; encoding=;UTF-8;?>
<beans xmlns=;http://www.springframework.org/schema/beans;
xmlns:xsi=;http://www.w3.org/2001/XMLSchema-instance;
xmlns: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;>
<import resource=;applicationContext-mybatis.xml;></import>
</beans>
applicationContext-mybatis.xml
<?xml version=;1.0; encoding=;UTF-8;?>
<beans xmlns=;http://www.springframework.org/schema/beans;
xmlns:xsi=;http://www.w3.org/2001/XMLSchema-instance;
xmlns: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;>
<!--1. 注解式开发 -->
<!-- 注解驱动 -->
<context:annotation-config/>
<!-- 用注解方式注入bean;并指定查找范围;com.xx.ssm及子子孙孙包-->
<context:component-scan base-package=;com.xx;/>
<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;/>
<!--设置为-1时;如果没有可用连接;连接池会一直无限期等待;直到获取到连接为止。-->
<!--如果设置为N;毫秒;;则连接池会等待N毫秒;等待不到;则抛出异常-->
<property name=;maxWaitMillis; value=;-1;/>
</bean>
<!--4. spring和MyBatis整合 -->
<!--1) 创建sqlSessionFactory-->
<bean id=;sqlSessionFactory; class=;org.mybatis.spring.SqlSessionFactoryBean;>
<!-- 指定数据源 -->
<property name=;dataSource; ref=;dataSource;/>
<!-- 自动扫描XxxMapping.xml文件;**任意路径 -->
<property name=;mapperLocations; value=;classpath*:com/xx/**/mapper/*.xml;/>
<!-- 指定别名 -->
<property name=;typeAliasesPackage; value=;com/xx/**/model;/>
<!--配置pagehelper插件-->
<property name=;plugins;>
<array>
<bean class=;com.github.pagehelper.PageInterceptor;>
<property name=;properties;>
<value>
helperDialect=mysql
</value>
</property>
</bean>
</array>
</property>
</bean>
<!--2) 自动扫描com/javaxl/ssm/**/mapper下的所有XxxMapper接口(其实就是DAO接口);并实现这些接口;-->
<!-- 即可直接在程序中使用dao接口;不用再获取sqlsession对象-->
<bean class=;org.mybatis.spring.mapper.MapperScannerConfigurer;>
<!--basePackage 属性是映射器接口文件的包路径。-->
<!--你可以使用分号或逗号 作为分隔符设置多于一个的包路径-->
<property name=;basePackage; value=;com/xx/**/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>
generatorConfig.xml
注;此文件需要指定数据库jdbc驱动jar包的位置;以及配置表信息(看仔细点)
<?xml version=;1.0; encoding=;UTF-8; ?>
<!DOCTYPE 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;/>
<!--指定数据库jdbc驱动jar包的位置-->
<classPathEntry location=;E:toolsmavenmvn_repositorymysqlmysql-connector-java5.1.44mysql-connector-java-5.1.44.jar;/>
<!-- 一个数据库一个context -->
<context id=;infoGuardian;>
<!-- 注释 -->
<commentGenerator>
<property name=;suppressAllComments; value=;true;/><!-- 是否取消注释 -->
<property name=;suppressDate; value=;true;/> <!-- 是否生成注释代时间戳 -->
</commentGenerator>
<!-- jdbc连接 -->
<jdbcConnection driverClass=;${jdbc.driver};
connectionURL=;${jdbc.url}; userId=;${jdbc.username}; password=;${jdbc.password};/>
<!-- 类型转换 -->
<javaTypeResolver>
<!-- 是否使用bigDecimal; false可自动转化以下类型;Long, Integer, Short, etc.; -->
<property name=;forceBigDecimals; value=;false;/>
</javaTypeResolver>
<!-- 01 指定javaBean生成的位置 -->
<!-- targetPackage;指定生成的model生成所在的包名 -->
<!-- targetProject;指定在该项目下所在的路径 -->
<javaModelGenerator targetPackage=;com.xx.model;
targetProject=;src/main/java;>
<!-- 是否允许子包;即targetPackage.schemaName.tableName -->
<property name=;enableSubPackages; value=;false;/>
<!-- 是否对model添加构造函数 -->
<property name=;constructorBased; value=;true;/>
<!-- 是否针对string类型的字段在set的时候进行trim调用 -->
<property name=;trimStrings; value=;false;/>
<!-- 建立的Model对象是否 不可改变 即生成的Model对象不会有 setter方法;只有构造方法 -->
<property name=;immutable; value=;false;/>
</javaModelGenerator>
<!-- 02 指定sql映射文件生成的位置 -->
<sqlMapGenerator targetPackage=;com.xx.mapper;
targetProject=;src/main/java;>
<!-- 是否允许子包;即targetPackage.schemaName.tableName -->
<property name=;enableSubPackages; value=;false;/>
</sqlMapGenerator>
<!-- 03 生成XxxMapper接口 -->
<!-- type=;ANNOTATEDMAPPER;,生成Java Model 和基于注解的Mapper对象 -->
<!-- type=;MIXEDMAPPER;,生成基于注解的Java Model 和相应的Mapper对象 -->
<!-- type=;XMLMAPPER;,生成SQLMap XML文件和独立的Mapper接口 -->
<javaClientGenerator targetPackage=;com.xx.mapper;
targetProject=;src/main/java; type=;XMLMAPPER;>
<!-- 是否在当前路径下新加一层schema,false路径com.oop.eksp.user.model; true:com.oop.eksp.user.model.[schemaName] -->
<property name=;enableSubPackages; value=;false;/>
</javaClientGenerator>
<!-- 配置表信息 -->
<!-- schema即为数据库名 -->
<!-- tableName为对应的数据库表 -->
<!-- domainObjectName是要生成的实体类 -->
<!-- enable*ByExample是否生成 example类 -->
<!--<table schema=;; tableName=;t_book; domainObjectName=;Book;-->
<!--enableCountByExample=;false; enableDeleteByExample=;false;-->
<!--enableSelectByExample=;false; enableUpdateByExample=;false;>-->
<!--<!– 忽略列;不生成bean 字段 –>-->
<!--<!– <ignoreColumn column=;FRED; /> –>-->
<!--<!– 指定列的java数据类型 –>-->
<!--<!– <columnOverride column=;LONG_VARCHAR_FIELD; jdbcType=;VARCHAR; /> –>-->
<!--</table>-->
<table schema=;; tableName=;t_mvc_book; domainObjectName=;Book;
enableCountByExample=;false; enableDeleteByExample=;false;
enableSelectByExample=;false; enableUpdateByExample=;false;>
</table>
</context>
</generatorConfiguration>
jdbc.properties
此文件注意需修改数据库名;用户名及密码(二三四行)
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/DatabaseName?useUnicode=true&characterEncoding=UTF-8
jdbc.username=root
jdbc.password=123456
log4j2.xml
<?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>
mybatis.cfg.xml
注;每逆向生成一个数据库表对应的实体类;下面mappers之间都需添加一个对应的标签
<mappers>
<mapper resource=;com/xx/mapper/BookMapper.xml;/>
</mappers>
<?xml version=;1.0; encoding=;UTF-8;?>
<!DOCTYPE configuration PUBLIC ;-//mybatis.org//DTD Config 3.0//EN; ;http://mybatis.org/dtd/mybatis-3-config.dtd;>
<configuration>
<!-- 引入外部配置文件 -->
<properties resource=;jdbc.properties;/>
<settings>
<setting name=;logImpl; value=;LOG4J2;/>
</settings>
<!-- 别名 -->
<typeAliases>
<!--<typeAlias type=;com.xx.model.Book; alias=;Book;/>-->
</typeAliases>
<plugins>
<plugin interceptor=;com.github.pagehelper.PageInterceptor;>
</plugin>
</plugins>
<!-- 配置mybatis运行环境 -->
<environments default=;development;>
<environment id=;development;>
<!-- type=;JDBC; 代表使用JDBC的提交和回滚来管理事务 -->
<transactionManager type=;jdbc;/>
<!-- mybatis提供了3种数据源类型;分别是;POOLED,UNPOOLED,JNDI -->
<!-- POOLED 表示支持JDBC数据源连接池 -->
<!-- UNPOOLED 表示不支持数据源连接池 -->
<!-- JNDI 表示支持外部数据源连接池 -->
<dataSource type=;POOLED;>
<property name=;driver;
value=;${jdbc.driver};/>
<property name=;url;
value=;${jdbc.url};/>
<property name=;username; value=;${jdbc.username};/>
<property name=;password; value=;${jdbc.password};/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource=;com/xx/mapper/BookMapper.xml;/>
</mappers>
</configuration>
springmvc-servlet.xml
注;这里需修改 <context:component-scan base-package=;com.xx;/>里的目录
<?xml version=;1.0; encoding=;UTF-8;?>
<beans xmlns=;http://www.springframework.org/schema/beans;
xmlns:xsi=;http://www.w3.org/2001/XMLSchema-instance;
xmlns:context=;http://www.springframework.org/schema/context;
xmlns:mvc=;http://www.springframework.org/schema/mvc; 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-4.3.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd;>
<!-- 通过context:component-scan元素扫描指定包下的控制器-->
<!--1) 扫描com.javaxl.zf及子子孙孙包下的控制器(扫描范围过大;耗时)-->
<aop:aspectj-autoproxy/>
<context:component-scan base-package=;com.xx;/>
<!--2) 此标签默认注册DefaultAnnotationHandlerMapping和AnnotationMethodHandlerAdapter -->
<!--两个bean;这两个bean是spring MVC为;Controllers分发请求所必须的。并提供了数据绑定支持;-->
<!--;NumberFormatannotation支持;;DateTimeFormat支持;;Valid支持;读写XML的支持;JAXB;;读写JSON的支持;Jackson;-->
<mvc:annotation-driven></mvc:annotation-driven>
<!--3) ViewResolver -->
<bean class=;org.springframework.web.servlet.view.InternalResourceViewResolver;>
<!-- viewClass需要在pom中引入两个包;standard.jar and jstl.jar -->
<property name=;viewClass;
value=;org.springframework.web.servlet.view.JstlView;></property>
<property name=;prefix; value=;/;/>
<property name=;suffix; value=;.jsp;/>
</bean>
<!--4) 单独处理图片、样式、js等资源 -->
<!--<mvc:resources location=;/css/; mapping=;/css/**;/>-->
<!--<mvc:resources location=;/images/; mapping=;/images/**;/>-->
<!--<mvc:resources location=;/js/; mapping=;/js/**;/>-->
<!--支持json数据返回的适配器-->
<bean class=;org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter;>
<property name=;messageConverters;>
<list>
<ref bean=;mappingJackson2HttpMessageConverter;/>
</list>
</property>
</bean>
<bean id=;mappingJackson2HttpMessageConverter;
class=;org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;>
<!-- 处理中文乱码以及避免IE执行AJAX时;返回JSON出现下载文件-->
<property name=;supportedMediaTypes;>
<list>
<value>text/html;charset=UTF-8</value>
<value>text/json;charset=UTF-8</value>
<value>application/json;charset=UTF-8</value>
</list>
</property>
</bean>
</beans>
web.xml
注;这里需要修改CorsFilter过滤器工具类的路径
<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>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</context-param>
<!-- 读取Spring上下文的监听器 -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!-- 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>/WEB-INF/springmvc-servlet.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>
<!-- 解决cors跨域问题过滤器 -->
<filter>
<filter-name>corsFilter</filter-name>
<filter-class>com.xx.util.CorsFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>corsFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<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>
</web-app>
2.2 添加工具类
CorsFilter
package com.xx.util;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* 配置tomcat允许跨域访问
*
* ;author Administrator
*
*/
public class CorsFilter implements Filter {
;Override
public void init(FilterConfig filterConfig) throws ServletException {
}
// ;Override
// public void doFilter(ServletRequest servletRequest, ServletResponse
// servletResponse, FilterChain filterChain)
// throws IOException, ServletException {
// HttpServletResponse httpResponse = (HttpServletResponse) servletResponse;
//
// // Access-Control-Allow-Origin就是我们需要设置的域名
// // Access-Control-Allow-Headers跨域允许包含的头。
// // Access-Control-Allow-Methods是允许的请求方式
// httpResponse.addHeader(;Access-Control-Allow-Origin;, ;*;);// *,任何域名
// httpResponse.setHeader(;Access-Control-Allow-Methods;, ;POST, GET, PUT,
// DELETE;);
// // httpResponse.setHeader(;Access-Control-Allow-Headers;, ;Origin,
// // X-Requested-With, Content-Type, Accept;);
//
// // 允许请求头Token
// httpResponse.setHeader(;Access-Control-Allow-Headers;,
// ;Origin,X-Requested-With, Content-Type, Accept, Token;);
// HttpServletRequest req = (HttpServletRequest) servletRequest;
// System.out.println(;Token=; ; req.getHeader(;Token;));
// if(;OPTIONS;.equals(req.getMethod())) {
// return;
// }
//
//
// filterChain.doFilter(servletRequest, servletResponse);
// }
;Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain)
throws IOException, ServletException {
HttpServletResponse resp = (HttpServletResponse) servletResponse;
HttpServletRequest req = (HttpServletRequest) servletRequest;
// Access-Control-Allow-Origin就是我们需要设置的域名
// Access-Control-Allow-Headers跨域允许包含的头。
// Access-Control-Allow-Methods是允许的请求方式
resp.setHeader(;Access-Control-Allow-Origin;, ;*;);// *,任何域名
resp.setHeader(;Access-Control-Allow-Methods;, ;POST, GET, PUT, DELETE;);
// resp.setHeader(;Access-Control-Allow-Headers;, ;Origin,X-Requested-With,
// Content-Type, Accept;);
// 允许客户端;发一个新的请求头jwt
resp.setHeader(;Access-Control-Allow-Headers;, ;Origin,X-Requested-With, Content-Type, Accept, jwt;);
// 允许客户端;处理一个新的响应头jwt
resp.setHeader(;Access-Control-Expose-Headers;, ;jwt;);
// String sss = resp.getHeader(;Access-Control-Expose-Headers;);
// System.out.println(;sss=; ; sss);
// 允许请求头Token
// httpResponse.setHeader(;Access-Control-Allow-Headers;,;Origin,X-Requested-With,
// Content-Type, Accept, Token;);
// System.out.println(;Token=; ; req.getHeader(;Token;));
if (;OPTIONS;.equals(req.getMethod())) {// axios的ajax会发两次请求;第一次提交方式为;option;直接返回即可
return;
}
filterChain.doFilter(servletRequest, servletResponse);
}
;Override
public void destroy() {
}
}
JsonData
package com.xx.util;
import java.io.Serializable;
import java.util.HashMap;
/**
* 服务器返回给客户端的JSON格式的数据
*
*/
public class JsonData extends HashMap<String, Object> implements Serializable {
private static final long serialVersionUID = -8855960778711040221L;
private int code;
private String msg;
private Object result;
public int getCode() {
return code;
}
public void setCode(int code) {
this.code = code;
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
public Object getResult() {
return result;
}
public void setResult(Object result) {
this.result = result;
}
public JsonData(int code, String msg, Object result) {
super();
this.put(;code;, code);
this.put(;msg;, msg);
this.put(;result;, result);
}
public JsonData() {
super();
}
}
PageBean
package com.xx.util;
import javax.servlet.http.HttpServletRequest;
import java.util.HashMap;
import java.util.Map;
/**
* 分页工具类
*
*/
public class PageBean {
private int page = 1;// 页码
private int rows = 10;// 页大小
private int total = 0;// 总记录数
private boolean pagination = true;// 是否分页
private String url; //保存上一次请求的URL
private Map<String,String[]> paramMap = new HashMap<>();// 保存上一次请求的参数
/**
* 初始化pagebean的;保存上一次请求的重要参数
* ;param req
*/
public void setRequest(HttpServletRequest req) {
// 1.1 需要保存上一次请求的URL
this.setUrl(req.getRequestURL().toString());
// 1.2 需要保存上一次请求的参数 bname、price
this.setParamMap(req.getParameterMap());
// 1.3 需要保存上一次请求的分页设置 pagination
this.setPagination(req.getParameter(;pagination;));
// 1.4 需要保存上一次请求的展示条目数
this.setRows(req.getParameter(;rows;));
// 1.5 初始化请求的页码 page
this.setPage(req.getParameter(;page;));
}
public void setPage(String page) {
if(StringUtils.isNotBlank(page))
this.setPage(Integer.valueOf(page));
}
public void setRows(String rows) {
if(StringUtils.isNotBlank(rows))
this.setRows(Integer.valueOf(rows));
}
public void setPagination(String pagination) {
// 只有在前台jsp填写了pagination=false;才代表不分页
if(StringUtils.isNotBlank(pagination))
this.setPagination(!;false;.equals(pagination));
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
public Map<String, String[]> getParamMap() {
return paramMap;
}
public void setParamMap(Map<String, String[]> paramMap) {
this.paramMap = paramMap;
}
public PageBean() {
super();
}
public int getPage() {
return page;
}
public void setPage(int page) {
this.page = page;
}
public int getRows() {
return rows;
}
public void setRows(int rows) {
this.rows = 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 pagination;
}
public void setPagination(boolean pagination) {
this.pagination = pagination;
}
/**
* 获得起始记录的下标
*
* ;return
*/
public int getStartIndex() {
return (this.page - 1) * this.rows;
}
/**
* 最大页
* ;return
*/
public int maxPage() {
// total % rows == 0 ? total / rows : total / rows ;1
return this.total % this.rows == 0 ? this.total / this.rows : this.total / this.rows ; 1;
}
/**
* 下一页
* ;return
*/
public int nextPage() {
// 如果当前页小于最大页;那就下一页为当前页;1;如果不小于;说明当前页就是最大页;那就无需;1
return this.page < this.maxPage() ? this.page ; 1 : this.page;
}
/**
* 上一页
* ;return
*/
public int previousPage() {
return this.page > 1 ? this.page - 1 : this.page;
}
;Override
public String toString() {
return ;PageBean [page=; ; page ; ;, rows=; ; rows ; ;, total=; ; total ; ;, pagination=; ; pagination ; ;];;
}
}
ResponseUtil
package com.xx.util;
import java.io.PrintWriter;
import javax.servlet.http.HttpServletResponse;
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();
}
}
SessionUtil
package com.xx.util;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
/**
* ;author zsx
* ;site 155954····
* ;company 交换余生
* ;create 2022--08--26 16:53
*/
public class SessionUtil {
private static SqlSessionFactory sessionFactory;
private static ThreadLocal<SqlSession> threadLocal = new ThreadLocal<SqlSession>();
static {
sessionFactory = new SqlSessionFactoryBuilder().build(SessionUtil.class.getResourceAsStream(;/mybatis.cfg.xml;));
}
public static SqlSession openSession() {
SqlSession session = threadLocal.get();
if (null == session) {
session = sessionFactory.openSession();
threadLocal.set(session);
}
return session;
}
public static void main(String[] args) {
SqlSession session = openSession();
System.out.println(session.getConnection());
session.close();
// System.out.println(session.getConnection());
}
}
StringUtils
package com.xx.util;
public class StringUtils {
// 私有的构造方法;保护此类不能在外部实例化
private StringUtils() {
}
/**
* 如果字符串等于null或去空格后等于;;;则返回true;否则返回false
*
* ;param
* ;return
*/
public static boolean isBlank(String s) {
boolean b = false;
if (null == s || s.trim().equals(;;)) {
b = true;
}
return b;
}
/**
* 如果字符串不等于null或去空格后不等于;;;则返回true;否则返回false
*
* ;param s
* ;return
*/
public static boolean isNotBlank(String s) {
return !isBlank(s);
}
}
三、逆向生成
1.设置逆向生成指令
逆向生成的指令
mybatis-generator:generate -e
2.执行指令;逆向生成
在generatorConfig.xml里填写需逆向生成的实体类
注;前提是数据库得有这张表
<table schema=;; tableName=;t_mvc_book; domainObjectName=;Book;
enableCountByExample=;false; enableDeleteByExample=;false;
enableSelectByExample=;false; enableUpdateByExample=;false;>
</table>
数据库表结构
执行逆向生成指令
执行完毕后目录里会有以下几个类
3.开发代码
3.1 在BookMapper.xml里添加方法
<select id=;selecBookPage; resultType=;java.util.Map; parameterType=;java.util.Map; >
select * from t_mvc_book where bname like concat(%,#{bname},%)
</select>
3.2 在 BookMapper 里添加对应的方法
List<Map> selecBookPage(Map map);
3.3 创建biz
package com.xx.biz;
import com.xx.model.Book;
import com.xx.util.PageBean;
import java.util.List;
import java.util.Map;
/**
* ;author xx
* ;site 155954····
* ;company 交换余生
* ;create 2022--09--20 16:48
*/
public interface BookBiz {
/**
* 删除
* ;param bid
* ;return
*/
int deleteByPrimaryKey(Integer bid);
/**
* 增加
* ;param record
* ;return
*/
int insert(Book record);
/**
* 查询
* ;param map
* ;param pageBean 用于分页
* ;return
*/
List<Map> selecBookPage(Map map, PageBean pageBean);
/**
* 修改
* ;param record
* ;return
*/
int updateByPrimaryKeySelective(Book record);
}
3.4 实现biz中的方法
BookBizImpl
package com.xx.biz.impl;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.xx.biz.BookBiz;
import com.xx.mapper.BookMapper;
import com.xx.model.Book;
import com.xx.util.PageBean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
import java.util.Map;
/**
* ;author xx
* ;site 155954····
* ;company 交换余生
* ;create 2022--09--20 16:50
*/
;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 List<Map> selecBookPage(Map map, PageBean pageBean) {
if(pageBean!=null&&pageBean.isPagination()){
PageHelper.startPage(pageBean.getPage(),pageBean.getRows());
}
List<Map> maps = bookMapper.selecBookPage(map);
if(pageBean!=null&&pageBean.isPagination()){
PageInfo info = new PageInfo(maps);
pageBean.setTotal(info.getTotal();;;);
}
return maps;
}
;Override
public int updateByPrimaryKeySelective(Book record) {
return bookMapper.updateByPrimaryKeySelective(record);
}
}
4.5 测试方法
注;只测试查询方法
BookBizImplTest
package com.xx.biz.impl;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.xx.biz.BookBiz;
import com.xx.util.JsonData;
import com.xx.util.PageBean;
import com.xx.util.ResponseUtil;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* ;author xx
* ;site 155954····
* ;company 交换余生
* ;create 2022--09--20 17:11
*/
;RunWith(SpringJUnit4ClassRunner.class)
;ContextConfiguration(locations={;classpath:applicationContext-mybatis.xml;})
public class BookBizImplTest {
;Autowired
private BookBiz bookBiz;
;Test
public void selectlistPage() {
PageBean pageBean = new PageBean();
pageBean.setTotal(10);
ObjectMapper om = new ObjectMapper();
Map map = new HashMap();
String bname = ;;;
map.put(;bname;,bname);
List<Map> list = bookBiz.selecBookPage(map,pageBean);
for (Map book : list) {
System.out.println(book);
}
}
}
测试结果;
加载全部内容