失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > 结合Layui框架 实现SpringMVC+Spring+Mybatis SSM整合案例CRUD(超详细代码 外加说明)

结合Layui框架 实现SpringMVC+Spring+Mybatis SSM整合案例CRUD(超详细代码 外加说明)

时间:2024-05-05 02:43:49

相关推荐

结合Layui框架 实现SpringMVC+Spring+Mybatis SSM整合案例CRUD(超详细代码 外加说明)

首先:

你需要去Layui官网下载UI框架。你可能会问,为什么用Layui实现页面效果?简单来说就是:简单、好用、上手快,作为JAVA后端开发人员,Layui无疑是非常友好的,拿来即用。

页面效果图:

练习用的数据库表格:emp和dept 员工和部门

![在这里插入图片描述](https://img-/0502222809482.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl81MzUwNDE0Mg==,size_16,color_FFFFFF,t_70

*SQLyog Ultimate v11.24 (32 bit)MySQL - 5.6.30 : Database - exam**********************************************************************//*!40101 SET NAMES utf8 */;/*!40101 SET SQL_MODE=''*/;/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;CREATE DATABASE /*!32312 IF NOT EXISTS*/`exam` /*!40100 DEFAULT CHARACTER SET utf8 */;USE `exam`;/*Table structure for table `dept` */DROP TABLE IF EXISTS `dept`;CREATE TABLE `dept` (`deptno` int(11) NOT NULL,`dname` varchar(50) DEFAULT NULL,`loc` varchar(50) DEFAULT NULL,PRIMARY KEY (`deptno`)) ENGINE=InnoDB DEFAULT CHARSET=utf8;/*Data for the table `dept` */insert into `dept`(`deptno`,`dname`,`loc`) values (10,'教研部','北京'),(20,'学工部','上海'),(30,'销售部','广州'),(40,'财务部','武汉'),(50,'发展部','南京'),(60,'研发部','深圳'),(70,'客服部','杭州'),(80,'国际部','广州'),(90,'本部','东京');/*Table structure for table `emp` */DROP TABLE IF EXISTS `emp`;CREATE TABLE `emp` (`empno` int(11) NOT NULL,`ename` varchar(50) DEFAULT NULL,`job` varchar(50) DEFAULT NULL,`mgr` int(11) DEFAULT NULL,`hiredate` date DEFAULT NULL,`sal` decimal(7,2) DEFAULT NULL,`COMM` decimal(7,2) DEFAULT NULL,`deptno` int(11) DEFAULT NULL,PRIMARY KEY (`empno`),KEY `fk_emp` (`mgr`),KEY `fk_dept` (`deptno`),CONSTRAINT `fk_emp` FOREIGN KEY (`mgr`) REFERENCES `emp` (`empno`)) ENGINE=InnoDB DEFAULT CHARSET=utf8;/*Data for the table `emp` */insert into `emp`(`empno`,`ename`,`job`,`mgr`,`hiredate`,`sal`,`COMM`,`deptno`) values (1001,'甘宁','文员',1013,'2000-12-17','8000.00',NULL,20),(1002,'黛绮丝','销售员',1006,'2001-02-20','16000.00','3000.00',30),(1003,'殷天正','销售员',1006,'2001-02-22','12500.00','5000.00',30),(1004,'刘备','经理',1009,'2001-04-02','29750.00',NULL,20),(1005,'谢逊','销售员',1006,'2001-09-28','12500.00','14000.00',30),(1006,'关羽','经理',1009,'2001-05-01','28500.00',NULL,30),(1007,'张飞','经理',1009,'2001-09-01','24500.00',NULL,10),(1008,'诸葛亮','分析师',1004,'-04-19','30000.00',NULL,20),(1009,'曾阿牛','董事长',NULL,'2001-11-17','50000.00',NULL,10),(1010,'韦一笑','销售员',1006,'2001-09-08','15000.00','0.00',30),(1011,'周泰','文员',1008,'-05-23','11000.00',NULL,20),(1012,'程普','文员',1006,'2001-12-03','9500.00',NULL,30),(1013,'庞统','分析师',1004,'2001-12-03','30000.00',NULL,20),(1014,'黄盖','文员',1007,'2002-01-23','13000.00',NULL,10),(1015,'赵云','经理',1009,'1970-01-01','29500.00',NULL,80),(1016,'路人甲','经理',1009,'-05-02','12345.00','1000.00',20),(1017,'路人乙','经理',1009,'-05-02','12345.00','1000.00',20),(1018,'路人丙','经理',1009,'-05-02','12345.00','1000.00',20),(1019,'路人丁','经理',1009,'-05-02','12345.00','1000.00',20),(1020,'路人戊','经理',1009,'-05-01','12345.00','1000.00',20),(1021,'路人己','经理',1009,'-05-01','12345.00','1000.00',20),(1022,'许褚','经理',1009,'-05-01','12345.00','1500.00',20),(1023,'路人庚','经理',1009,'-05-02','12345.00','1000.00',20),(1024,'胡青牛','文员',1013,'-05-02','5000.00','1500.00',70),(1025,'东方不败','董事长',NULL,'-05-02','30000.00','5000.00',50);/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;

接下来,让我们开始编程吧!

一、使用maven创建web项目,这里就不详细描述创建过程了,相信很多小伙伴觉得so easy。我把自己快速创建的方法介绍一下,供参考:

1.创建工程:为什么不选择骨架,因为两点:自动创建的web.xml和jsp配置过低,需要手动修改;第二,可能会出现out目录和target目录同时存在的问题,无法统一解析路径。所以,我们选择自己搭建,快速完成!

2.在porm依赖中加入java<packing>war</packing>,这一步很关键:

3.点击File选择project structure,你也可以直接ctrl+alt+shift+s

4.web项目路径设置

5.完成后的样子!Tomcat自己配,你既然学到了springssm,这个还让人教的话,我只能说,大侠你骨骼精奇,天赋异禀!

二、结构搭建,如图:

1.generatorConfig.xml是引入的逆向工程配置,不熟悉的小伙伴们可以选择不使用,这里不详细介绍了,自己去了解。

2.logback.xml是日志整合配置

3.spring-config.xml对应spring配置

4.springmvc.xml对应mvc配置

5.sqlMapConfig.xml对应mybatis

以上,可以根据自己的习惯来命名和搭建结构层次,不同公司有不同规范,大同小异。

三、porm依赖,及SSM核心配置

以下依赖项和xml配置能看懂,知道是什么意思即可,以后依赖的更多,你记得下来吗?所以没有必要自己去配一遍,直接复制粘贴。进公司后,根据项目的不同,公司会统一提供,你大概率没有机会自己写。

1.porm配置

<?xml version="1.0" encoding="UTF-8"?><project xmlns="/POM/4.0.0"xmlns:xsi="/2001/XMLSchema-instance"xsi:schemaLocation="/POM/4.0.0 /xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>org.example</groupId><artifactId>layui_ssm</artifactId><version>1.0-SNAPSHOT</version><packaging>war</packaging><properties><!-- jdk版本 --><jdk.version>15</jdk.version><!-- spring版本号 RELEASE 正式版,经过测试更加稳定--><spring.version>5.0.3.RELEASE</spring.version><!--mybatis版本--><mybatis.version>3.5.4</mybatis.version><!--spring-mybatis--><mybatis-spring.version>1.3.1</mybatis-spring.version><!--mysql数据库驱动版本--><mysql.version>5.1.47</mysql.version><!--junit测试包版本号--><junit.version>4.12</junit.version><!--日志包版本号--><log4j.version>1.2.17</log4j.version><druid-version>1.1.10</druid-version><logback.version>1.1.3</logback.version></properties><dependencies><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>${spring.version}</version></dependency><!--spring-web容器功能模块--><dependency><groupId>org.springframework</groupId><artifactId>spring-web</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-test</artifactId><version>${spring.version}</version></dependency><!-- MyBatis --><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>${mybatis.version}</version></dependency><!-- MyBatis/Spring --><dependency><groupId>org.mybatis</groupId><artifactId>mybatis-spring</artifactId><version>${mybatis-spring.version}</version></dependency><!-- 数据库驱动 --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>${mysql.version}</version></dependency><!--alibaba druid datasource--><dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>${druid-version}</version></dependency><!--spring的事务--><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>com.github.pagehelper</groupId><artifactId>pagehelper</artifactId><version>4.1.6</version></dependency><dependency><groupId>com.github.jsqlparser</groupId><artifactId>jsqlparser</artifactId><version>0.9.5</version></dependency><!--springmvc的依赖--><dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-web</artifactId><version>${spring.version}</version></dependency><!--jsp的相关依赖--><dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version>3.0.1</version><scope>provided</scope></dependency><dependency><groupId>javax.servlet</groupId><artifactId>jsp-api</artifactId><version>2.0</version><scope>provided</scope></dependency><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><!--把对象转换成json格式--><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.9.4</version></dependency><!--引入阿里的json依赖,解决json传递时的日期问题--><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.62</version></dependency><!--文件上传相关依赖--><dependency><groupId>commons-fileupload</groupId><artifactId>commons-fileupload</artifactId><version>1.4</version></dependency><dependency><groupId>commons-io</groupId><artifactId>commons-io</artifactId><version>1.4</version></dependency><dependency><groupId>commons-lang</groupId><artifactId>commons-lang</artifactId><version>2.6</version></dependency><!-- junit测试包 --><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>${junit.version}</version><scope>test</scope></dependency><!--日志依赖--><dependency><groupId>ch.qos.logback</groupId><artifactId>logback-core</artifactId><version>${logback.version}</version></dependency><dependency><groupId>ch.qos.logback</groupId><artifactId>logback-access</artifactId><version>${logback.version}</version></dependency><dependency><groupId>ch.qos.logback</groupId><artifactId>logback-classic</artifactId><version>${logback.version}</version></dependency><dependency><groupId>org.slf4j</groupId><artifactId>log4j-over-slf4j</artifactId><version>1.7.12</version></dependency><dependency><groupId>org.logback-extensions</groupId><artifactId>logback-ext-spring</artifactId><version>0.1.2</version></dependency><dependency><groupId>org.slf4j</groupId><artifactId>jcl-over-slf4j</artifactId><version>1.7.12</version></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.16</version></dependency><dependency><groupId>org.mybatis.generator</groupId><artifactId>mybatis-generator-core</artifactId><version>1.3.7</version></dependency></dependencies><build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>3.3</version><configuration><source>${jdk.version}</source><target>${jdk.version}</target></configuration></plugin><!-- mybatis逆向工程 --><plugin><groupId>org.mybatis.generator</groupId><artifactId>mybatis-generator-maven-plugin</artifactId><version>1.3.2</version><configuration><!--配置文件的位置--><configurationFile>src/main/resources/generatorConfig.xml</configurationFile><verbose>true</verbose><overwrite>true</overwrite></configuration></plugin><!-- tomcat7插件 --><plugin><groupId>org.apache.tomcat.maven</groupId><artifactId>tomcat7-maven-plugin</artifactId><version>2.2</version><configuration><port>8080</port><path>/</path><uriEncoding>utf-8</uriEncoding></configuration></plugin></plugins><resources><resource><directory>src/main/java</directory><includes><include>**/*.xml</include></includes><filtering>true</filtering></resource><resource><directory>src/main/resources</directory><includes><include>**/*.properties</include><include>**/*.xml</include></includes></resource></resources></build></project>在这里插入代码片

其中:tomcat7插件依赖可以删掉,这个是为了不配置tomcat,用插件在本地启动直接tomcat,作为了解。

JDK版改成自己的,这里的是jdk15

2.web.xml

<?xml version="1.0" encoding="UTF-8"?><web-app xmlns="/xml/ns/javaee"xmlns:xsi="/2001/XMLSchema-instance"xsi:schemaLocation="/xml/ns/javaee /xml/ns/javaee/web-app_4_0.xsd"version="4.0"><!--自动加载某个页面--><welcome-file-list><welcome-file>index.jsp</welcome-file></welcome-file-list><!--当web.xml一加载的时候,applicationContext.xml就要加载--><!--使用web.xml全局配置--><context-param><param-name>contextConfigLocation</param-name><param-value>classpath:spring-config.xml</param-value></context-param><!--springmvc整合logback.xml--><context-param><param-name>logbackConfigLocation</param-name><param-value>classpath:logback.xml</param-value></context-param><!--配置过滤器,解决中文乱码--><filter><filter-name>characterEncodingFilter</filter-name><filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class><!--配置初始化编码--><init-param><param-name>encoding</param-name><param-value>UTF-8</param-value></init-param></filter><filter-mapping><filter-name>characterEncodingFilter</filter-name><url-pattern>/*</url-pattern></filter-mapping><!--配置springmvc的核心拦截器--><servlet><servlet-name>springmvc</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><init-param><param-name>contextConfigLocation</param-name><param-value>classpath:springmvc.xml</param-value></init-param><load-on-startup>1</load-on-startup></servlet><servlet-mapping><servlet-name>springmvc</servlet-name><url-pattern>/</url-pattern></servlet-mapping><!--配置监听器--><listener><listener-class>org.springframework.web.context.ContextLoaderListener</listener-class></listener><!--监听logback配置文件--><listener><listener-class>ch.qos.logback.ext.spring.web.LogbackConfigListener</listener-class></listener></web-app>

3.mybatis配置

<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE configurationPUBLIC "-////DTD Config 3.0//EN""/dtd/mybatis-3-config.dtd"><!--sqlMapConfig.xml: 叫做Mybatis的核心配置文件--><configuration><settings><!-- 配置打印 SQL log 的路径前缀 --><setting name="logPrefix" value="mybatis.sql."/><!--设置自动映射配置--><setting name="autoMappingBehavior" value="FULL"/><!-- 打开懒加载(延迟加载) --><setting name="lazyLoadingEnabled" value="true"/><!-- 将积极加载改为消极加载(即为按需加载) --><setting name="aggressiveLazyLoading" value="false"/></settings><!--配置pageHelper的拦截器--><plugins><plugin interceptor="com.github.pagehelper.PageHelper"><!--配置方言:mysql--><property name="dialect" value="mysql"/><!-- 3.3.0版本可用 - 分页参数合理化,默认false禁用 --><!-- 启用合理化时,如果pageNum<1会查询第一页,如果pageNum>pages会查询最后一页 --><!-- 禁用合理化时,如果pageNum<1或pageNum>pages会返回空数据 --><property name="reasonable" value="true"/></plugin></plugins></configuration>

4.springmvc配置

<?xml version="1.0" encoding="UTF-8"?><beans xmlns="/schema/beans"xmlns:xsi="/2001/XMLSchema-instance"xmlns:mvc="/schema/mvc"xmlns:context="/schema/context"xsi:schemaLocation="/schema/beans/schema/beans/spring-beans-4.2.xsd/schema/mvc/schema/mvc/spring-mvc-4.2.xsd/schema/context/schema/context/spring-context-4.2.xsd "><!--springmvc开启包扫描,只扫描controller--><context:component-scan base-package="cn.kgc.demo.controller"/><mvc:annotation-driven conversion-service="myConversionService"><mvc:message-converters><!--装配消息转换器--><bean class="org.springframework.http.converter.StringHttpMessageConverter"><property name="supportedMediaTypes"><list><value>application/json;charset=UTF-8</value></list></property></bean><!--装配日期格式转换器--><bean class="com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter"><property name="supportedMediaTypes"><list><value>text/html;charset=UTF-8</value><value>application/json</value></list></property><property name="features"><list><!-- Date的日期转换器 --><value>WriteDateUseDateFormat</value></list></property></bean></mvc:message-converters></mvc:annotation-driven><!--不拦截静态资源--><mvc:resources mapping="/statics/**" location="/statics/"></mvc:resources><!--配置视图解析器--><bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"><property name="prefix" value="/WEB-INF/jsp/"/><property name="suffix" value=".jsp"/></bean><!--装配定义好的转换器--><bean id="myConversionService" class="org.springframework.context.support.ConversionServiceFactoryBean"><property name="converters"><list><bean class="cn.kgc.demo.config.StringToDateConverter"><!--表单提交时候,记得根据情况更换日期格式--><constructor-arg type="java.lang.String" value="yyyy-MM-dd"/></bean></list></property></bean><!-- 配置MultipartResolver,用于上传文件,使用spring的CommonsMultipartResolver --><bean id="multipartResolver" class="org.springframework.monsMultipartResolver"><!--最大上传文件大小限制:10Mb 默认单位:b 1024*1024*10 --><property name="maxUploadSize" value="10485760"/><!--默认字符编码--><property name="defaultEncoding" value="UTF-8"/></bean></beans>

5.spring配置

<beans xmlns="/schema/beans"xmlns:context="/schema/context"xmlns:tx="/schema/tx"xmlns:aop="/schema/aop"xmlns:xsi="/2001/XMLSchema-instance"xsi:schemaLocation="/schema/beans/schema/beans/spring-beans.xsd/schema/context/schema/context/spring-context.xsd/schema/tx/schema/tx/spring-tx.xsd/schema/aop/schema/aop/spring-aop.xsd"><!--1.配置通配符的扫描器base-package="cn.kgc.demo.*" "*"为通配符,匹配所有扫描cn.kgc.demo此包下面的类或者子包及其子包的类--><context:component-scan base-package="cn.kgc.demo.*"><!--不扫描Controller注解,让springmvc自己去扫描--><context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/></context:component-scan><!--2.配置读取数据库四大件的db.properties--><!--classpath:表示文件的路径,表示文件在根路径时使用classpath* : 表示文件的路径有子路径。--><!--<bean id="propertyPlaceholderConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"><property name="location" value="classpath:db.properties"/></bean>--><!--下面这种配置出错 原因db.properties中username与系统中的username重名,如果这么提取会取到自己的系统用户名两种方法出坑:一是username换个名字,二是在context:property-placeholder 标签上添加 system-properties-mode=“FALLBACK”--><context:property-placeholder location="classpath:db.properties" system-properties-mode="FALLBACK"/><!--配置数据源--><bean id="druidDataSource" class="com.alibaba.druid.pool.DruidDataSource"><!--注入驱动--><property name="driverClassName" value="${driver}"></property><!--url--><property name="url" value="${url}"></property><!--用户名--><property name="username" value="${username}"></property><!--密码--><property name="password" value="${password}"></property><!-- 配置初始化大小、最小、最大 --><property name="initialSize" value="1" /><property name="minIdle" value="1" /><property name="maxActive" value="20" /><!-- 配置获取连接等待超时的时间 --><property name="maxWait" value="60000" /><!-- 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 --><property name="timeBetweenEvictionRunsMillis" value="60000" /><!-- 配置一个连接在池中最小生存的时间,单位是毫秒 --><property name="minEvictableIdleTimeMillis" value="300000" /></bean><!--4.配置SqlSessionFactory的创建且为单例模式,我们使用spring框架去管理--><bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"><!--注入数据源--><property name="dataSource" ref="druidDataSource"/><!--注入mybatis的文件--><property name="configLocation" value="classpath:sqlMapConfig.xml"/><!--注入mybatis的别名配置--><property name="typeAliasesPackage" value="cn.kgc.demo.pojo"/><!--配置扫描到resources/mapper下面的所有mapper.xml文件--><property name="mapperLocations" value="classpath:mapper/*.xml"/></bean><!--5.配置得到Mapper动态代理对象(用匿名bean)通过此工具类将Mapper动态代理对象实例化并放入到IOC容器中进行管理--><bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"><!--依赖引入sqlSessionFactory对象--><property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/><!--配置扫描到mapper接口包下面所有的Mapper文件--><property name="basePackage" value="cn.kgc.demo.dao"/></bean><!--配置事务管理器--><bean id="tx" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"><!--注入数据源--><property name="dataSource" ref="druidDataSource"/></bean><!--注解版的事务管理 - 删掉 传播行为 / 切入点--><!--开启声明式事务的注解驱动--><!--proxy-target-class="true": 使用spring的动态代理配置transaction-manager="tx :引入配置管理器--><tx:annotation-driven proxy-target-class="true" transaction-manager="tx"/></beans>

6.日志配置:学会利用日志信息,学着长大。

<?xml version="1.0" encoding="UTF-8"?><configuration><!--输出日志到控制台--><appender name="consoleLog" class="ch.qos.logback.core.ConsoleAppender"><!--负责把事件转成字符串,格式化日志信息的输出--><layout><pattern><!--%d是日期,%msg是日志消息%n换行-->[%p]%d-%msg%n</pattern></layout></appender><appender name="fileLog" class="ch.qos.logback.core.rolling.RollingFileAppender"><filter class="ch.qos.logback.classic.filter.LevelFilter"><level>debug</level><onMatch>DENY</onMatch></filter><encoder><pattern>[%p]%d-%msg%n</pattern></encoder><!-- 指定文件的输出位置--><rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"><fileNamePattern>D:/logs/%d.log</fileNamePattern></rollingPolicy></appender><!-- 滚动文件的方式生成日志日志文件,文件的存储位置通过file标签指定 --><!-- 通过encoder指定日志的生成格式,每个appender的日志格式都可以自定义,不用相同 --><appender name="MyBatis" class="ch.qos.logback.core.rolling.RollingFileAppender"><file>D:/logs/logs/mybatis-sql.log</file><!--通过rollingPolicy设置日志滚动的策略,这是使用按照时间滚动fileNamePattern属性设置滚动生成文件的格式,这里设置的精确到天,也就是按照天滚动,如果时间设置精确到秒,就按秒来滚动maxHistory属性设定最大的文件数,比如按天滚动,这里设置了30天,在第31天日志生成的时候,第一天的日志就会被删掉--><rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"><FileNamePattern>D:/logs/logs/mybatis-sql.log.%d{yyyy-MM-dd}</FileNamePattern><maxHistory>30</maxHistory></rollingPolicy><encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"><pattern>%thread|%d{yyyy-MM-dd HH:mm:ss.SSS}|%level|%logger{36}|%m%n</pattern></encoder></appender><logger name="mybatis.sql" level="DEBUG"><appender-ref ref="MyBatis"/></logger><root level="info"><appender-ref ref="consoleLog"></appender-ref><appender-ref ref="fileLog"></appender-ref></root></configuration>

7.逆向生成配置:

<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE generatorConfigurationPUBLIC "-////DTD MyBatis Generator Configuration 1.0//EN""/dtd/mybatis-generator-config_1_0.dtd"><generatorConfiguration><!--启动命令:mybatis-generator:generate -e--><properties resource="db.properties"></properties><classPathEntry location="${driverLocation}"/><context id="context1" targetRuntime="MyBatis3"><commentGenerator><!-- 是否去除自动生成的注释 true:是 : false:否 --><property name="suppressAllComments" value="true"/><!-- 是否去除所有自动生成的文件的时间戳,默认为false --><property name="suppressDate" value="true"/></commentGenerator><!--数据库连接的信息:驱动类、连接地址、用户名、密码 --><jdbcConnection driverClass="${driver}"connectionURL="${url}"userId="${username}"password="${password}"></jdbcConnection><!-- targetPackage:包名称(自定义) targetProject:项目路径(自定义) --><!--定义model的包名称:POJO实体类--><javaModelGenerator targetPackage="cn.kgc.demo.pojo" targetProject="src/main/java"><!-- enableSubPackages:是否让schema作为包的后缀 --><property name="enableSubPackages" value="false"/><!-- 从数据库返回的值被清理前后的空格 --><property name="trimStrings" value="true"/></javaModelGenerator><!-- 配置生成相应的实体Mapper.xml,对于Mapper3.X我们需要把type="XMLMAPPER" --><!-- targetPackage:包名称(自定义) targetProject:项目路径(自定义) --><sqlMapGenerator targetPackage="cn.kgc.demo.dao" targetProject="src/main/java"><property name="enableSubPackages" value="false"/></sqlMapGenerator><!-- 配置生成相应的接口类,对应与Mapper.xml中的一系列CRUD方法SQL语句 --><!-- targetPackage:包名称(自定义) targetProject:项目路径(自定义) --><javaClientGenerator targetPackage="cn.kgc.demo.dao" targetProject="src/main/java" type="XMLMAPPER"><property name="enableSubPackages" value="false"/></javaClientGenerator><!--tableName="表名"domainObjectName="实体类名"--><table schema="SSMBlog" tableName="emp" domainObjectName="Emp"enableCountByExample="false"enableUpdateByExample="false"enableDeleteByExample="false"enableSelectByExample="false"selectByExampleQueryId="false"></table><table schema="SSMBlog" tableName="dept" domainObjectName="Dept"enableCountByExample="false"enableUpdateByExample="false"enableDeleteByExample="false"enableSelectByExample="false"selectByExampleQueryId="false"></table></context></generatorConfiguration>

注意:数据库连接,表名,实体类名,根据不同表格要做出调整。

逆向生成依赖和配置都有了,我们可以:

8.db.properties,路径请改成自己的数据库

driver=com.mysql.jdbc.DriverdriverLocation=D:\\developer_tools\\repository\\mysql\\mysql-connector-java\\5.1.47\\mysql-connector-java-5.1.47.jarurl=jdbc:mysql://localhost:3306/exam?useUnicode=true&characterEncoding=utf8username=rootpassword=

9.最后一小步,完成字符串向日期转换类

/*** @Description 自定义字符串向日期转换器*/public class StringToDateConverter implements Converter<String, Date> {/*日期正则表达式: yyyy-MM-dd*/private String datePattern;public StringToDateConverter(String datePattern) {this.datePattern = datePattern;}@Overridepublic Date convert(String s) {Date date = null;try {date = new SimpleDateFormat(datePattern).parse(s);} catch (ParseException e) {e.printStackTrace();}return date;}}

四、前端页面代码

1.empFun.js是我们自己封装的js代码,在emplist.jsp页面中导入,动态实现。

2.addEmp.jsp和updateEmp.jsp 添加和修改,同样在emplist页面中导入,并隐藏,作为页面弹出层。

代码如下:

empList.jsp:

<%@ page contentType="text/html;charset=UTF-8" language="java" %><%--导入layui的CSS--%><link rel="stylesheet" href="/statics/layui/css/layui.css"><html><head><title>员工信息界面</title></head><body><div class="layui-col-xs-offset4 layui-col-xs-8"><h2 >员工信息一览表</h2></div><br/><br/><%--表单查询条件--%><form class="layui-form" action="" style="margin-top: 20px;margin-bottom: -20px;"><div class="layui-form-item"><div class="layui-inline"><label class="layui-form-label">员工姓名</label><div class="layui-input-inline"><input type="text" name="ename" autocomplete="off"class="layui-input" placeholder="请输入员工姓名"></div></div><div class="layui-inline"><label class="layui-form-label">工作</label><div class="layui-input-inline"><input type="text" name="job" placeholder="请输入员工职位"autocomplete="off" class="layui-input"></div></div><div class="layui-inline"><label class="layui-form-label">部门</label><div class="layui-input-inline"><select name="deptno" id="selDept"></select></div></div><div class="layui-inline"><div class="layui-input-inline"><button type="submit" class="layui-btn" lay-submit="" lay-filter="btnSelect"><i class="layui-icon">&#xe615;</i>查询</button></div></div></div></form><%--导入layui的js--%><script src="/statics/layui/layui.js"></script><%--导入自己封装的js--%><script src="/statics/layui/empFun.js"></script><%--导入添加员工jsp页面--%><jsp:include page="addEmp.jsp"/><%--导入修改员工jsp页面--%><jsp:include page="updateEmp.jsp"/><%--table标签选择器--%><table id="demo" lay-filter="test" ></table><%--添加按钮 toolbar头工具栏--%><script type="text/html" id="toolbarDemo"><div class="layui-btn-container"><div><button class="layui-btn layui-btn-sm layui-btn-danger"lay-event="delBatch" id="delBatchEmp"><i class="layui-icon">&#xe640;</i>批量删除</button><button class="layui-btn layui-btn-sm" lay-event="getCheckData">获取选中行数据</button><button class="layui-btn layui-btn-sm" lay-event="getCheckLength">获取选中数目</button><button class="layui-btn layui-btn-sm" lay-event="isAll">验证是否全选</button></div><div class="layui-col-lg-offset9" ><button class="layui-btn layui-btn-sm layui-btn-normal" lay-event="add"><i class="layui-icon">&#xe624;</i>添加</button></div></div></script><%--删除,修改,查看,toolbar行工具栏--%><script type="text/html" id="barDemo"><a class="layui-btn layui-btn-xs layui-btn-warm" lay-event="edit"><i class="layui-icon">&#xe642;</i>编辑</a><a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del"><i class="layui-icon">&#xe640;</i>删除</a></script></body></html>

addEmp.jsp:

<%@ page contentType="text/html;charset=UTF-8" language="java" %><html><head><title>添加员工信息</title></head><body><!--隐藏的div--><div id="saveEmpDiv" style="display:none;margin-top: 20px;"><form class="layui-form" action="" id="saveEmpForm"><div class="layui-form-item"><label class="layui-form-label">编号</label><div class="layui-input-inline"><input type="text" name="empno" lay-verify="required" placeholder="请输入员工编号" autocomplete="off" class="layui-input"></div></div><div class="layui-form-item"><label class="layui-form-label">姓名</label><div class="layui-input-inline"><input type="text" name="ename" lay-verify="required|ename" placeholder="请输入员工姓名" autocomplete="off" class="layui-input"></div></div><div class="layui-form-item"><label class="layui-form-label">工作</label><div class="layui-input-inline"><input type="text" name="job" lay-verify="required" placeholder="请输入员工工作" autocomplete="off" class="layui-input"></div></div><div class="layui-form-item"><label class="layui-form-label">上司编号</label><div class="layui-input-inline"><input type="text" name="mgr" lay-verify="" placeholder="请输入员工上司编号" autocomplete="off" class="layui-input"></div></div><div class="layui-form-item"><label class="layui-form-label">工资</label><div class="layui-input-inline"><input type="text" name="sal" lay-verify="required|number|sal" placeholder="请输入员工工资" autocomplete="off" class="layui-input"></div></div><div class="layui-form-item"><label class="layui-form-label">入职时间</label><div class="layui-input-inline"><input type="text" class="layui-input" name="hiredate" id="hiredate" lay-verify="required" placeholder="yyyy-MM-dd" autocomplete="off"></div></div><div class="layui-form-item"><label class="layui-form-label">奖金</label><div class="layui-input-inline"><input type="text" name="comm" lay-verify="required|number|comm" placeholder="请输入员工奖金" autocomplete="off" class="layui-input"></div></div><div class="layui-form-item"><label class="layui-form-label">部门</label><div class="layui-input-inline"><select name="deptno" id="saveDept" lay-verify="required"></select></div></div><div class="layui-form-item"><div class="layui-input-block"><button class="layui-btn" lay-submit="" lay-filter="formAdd">添加</button><button type="reset" class="layui-btn layui-btn-primary">重置</button></div></div></form></div></body></html>

update.jsp:

<%@ page contentType="text/html;charset=UTF-8" language="java" %><html><head><title>修改员工信息</title></head><body><!--隐藏修改的div--><div id="updEmpDiv" style="display:none;margin-top: 20px;"><form class="layui-form" action="" lay-filter="updEmpFormFilter" id="updEmpForm"><!--员工主键empno--><input type="hidden" name="empno"/><div class="layui-form-item"><label class="layui-form-label">姓名</label><div class="layui-input-inline"><input type="text" name="ename" lay-verify="required|ename" placeholder="请输入员工姓名" autocomplete="off" class="layui-input"></div></div><div class="layui-form-item"><label class="layui-form-label">工作</label><div class="layui-input-inline"><input type="text" name="job" lay-verify="required" placeholder="请输入员工工作" autocomplete="off" class="layui-input"></div></div><div class="layui-form-item"><label class="layui-form-label">上司编号</label><div class="layui-input-inline"><input type="text" name="mgr" lay-verify="required|number|mgr" placeholder="请输入员工上司编号" autocomplete="off" class="layui-input"></div></div><div class="layui-form-item"><label class="layui-form-label">工资</label><div class="layui-input-inline"><input type="text" name="sal" lay-verify="required|number|sal" placeholder="请输入员工工资" autocomplete="off" class="layui-input"></div></div><div class="layui-form-item"><label class="layui-form-label">入职时间</label><div class="layui-input-inline"><input type="text" name="hiredate" id="hiredate" lay-verify="required" placeholder="请输入员工入职时间" autocomplete="off" class="layui-input"></div></div><div class="layui-form-item"><label class="layui-form-label">奖金</label><div class="layui-input-inline"><input type="text" name="comm" lay-verify="required|number|comm" placeholder="请输入员工奖金" autocomplete="off" class="layui-input"></div></div><div class="layui-form-item"><label class="layui-form-label">部门</label><div class="layui-input-inline"><select name="deptno" id="updDept" lay-verify="required"></select></div></div><div class="layui-form-item"><div class="layui-input-block"><button class="layui-btn" lay-submit lay-filter="formUpdate">修改</button><button type="reset" class="layui-btn layui-btn-primary">重置</button></div></div></form></div></body></html>

empFun.jsp:

/*执行方法渲染*/layui.use('table',function (){var table = layui.table;var $=layui.$;var layer=layui.layer;var form=layui.form;var laydate=layui.laydate;var currentPage = 1; //创建全局变量,指定当前页是第1页var selectJson={};//全局变量 初始化为空;查询后赋值,使其根据查询数据加载页面//日期常规用法laydate.render({elem: '#hiredate',type: 'date',calendar:true,format:'yyyy-MM-dd'//格式可以任意设置});//下拉列表loadDeptInfos()//页面信息显示loadEmpList();/************************* 自定义函数**************************************///员工信息页面加载:用于第一次进入页面 和 查询后显示的页面function loadEmpList(){table.render({elem:'#demo' //表示跟表格容器的id进行绑定,height:400,url:'/emp/empInfos'/*数据接口*/,page:true/*开启分页*/,limit:5,limits:[5,10,15,20],where:selectJson //where表示把值传递到后端,toolbar: '#toolbarDemo',defaultToolbar: ['filter', 'exports', 'print',{//自定义头部工具栏右侧图标。如无需自定义,去除该参数即可title: '提示',layEvent: 'LAYTABLE_TIPS',icon: 'layui-icon-tips'}],cols:[[{type:'checkbox',fixed:'left'},{field: 'empno', title: '编号', width:100, sort: true},{field: 'ename', title: '姓名', width:100},{field: 'job', title: '职位', width:100, },{field: 'mgr', title: '上司', width:90,sort: true},{field: 'hiredate', title: '入职日期', width: 170,sort: true},{field: 'sal', title: '薪水', width: 80, sort: true},{field: 'comm', title: '奖金', width: 80,},{field: 'dname', title: '部门', width: 100,templet:'<div>{{ d.dept.dname }}</div>'},{field: 'loc', title: '地址', width: 100,templet: '<div>{{ d.dept.loc }}</div>'},{field: 'right',width: 200,align:'center',toolbar:'#barDemo'}]]/*渲染完毕之后的回调函数*/,done: function(res, curr, count){//得到当前页码console.log(curr);//给currentPage赋值currentPage = curr;}});}//条件查询form.on('submit(btnSelect)', function(data){console.log(data.field) //当前容器的全部表单字段,名值对形式:{name: value}selectJson=data.field;//赋值,然后调用loadEmpList()方法:loadEmpList();return false; //阻止表单跳转。如果需要表单跳转,去掉这段即可。});/*====头工具栏事件:批量删除和添加=====================*/table.on('toolbar(test)',function (obj) {var checkStatus = table.checkStatus(obj.config.id);//layui固定写法,也可以用<table>标id名“demo”取代console.log(checkStatus)//选中行的信息:包括date,isAll等信息console.log(checkStatus.data)//选中行的数据信息console.log(checkStatus.data.length)//选中行的数据信息的长度var arrEmp=checkStatus.data;switch(obj.event){case 'add'://新增layer.open({type:1,//弹出类型title:"添加员工信息",area:["480px","580px"],//弹框尺寸anim:3,//弹出动画效果shade:0.5,//阴影content:$('#saveEmpDiv')});break;case 'delBatch'://删除if(arrEmp.length===0){return layer.msg("请选择需要删除的员工信息",{icon: 7,time:2000,anim: 3,shade:0.5})}layer.confirm("确定批量删除么",function (index){//7905,7900,7844 -> [7905,7900,7844]//springmvc能够接收字符串类型的数字,以,号分隔,springmvc会自动转换了Integer的数组var empNoStr="";for(var i=0;i<arrEmp.length;i++){empNoStr+=arrEmp[i].empno+",";}//去除字符串多出的逗号,返回新的子字符串empNoStr=empNoStr.substring(0,empNoStr.length-1);//向后端服务器发出删除指令delBatchEmpByEmpNo(empNoStr);//关闭窗口layer.close(index);})break;}})function delBatchEmpByEmpNo(empNoStr){$.post("/emp/deleteBatchEmp",{"empnos":empNoStr},function (jsonObj){console.log(jsonObj)if(jsonObj === "success"){layer.msg("删除成功",{icon:1,time:2000,anim:4,shade:0.5})//重新渲染当前页的表格数据table.reload('demo',{page: {curr: currentPage //重新从指定的页码开始渲染表格数据}});}else{layer.msg("删除失败",{icon:1,time:2000,anim:4,shade:0.5})}},"text" //text:表示后端响应的是文本,不写的话后端删除数据后在前端页面无法显示删除成功或失败,if判定进不去).error(function (){layer.msg("服务器异常",{icon:3,time:2000,anim:6,shade:0.5})});}//添加form.on('submit(formAdd)', function(data){console.log(data.field) //当前容器的全部表单字段,名值对形式:{name: value}var addData=data.field;//赋值,然后调用loadEmpList()方法:saveEmp(addData);//关闭所有的弹出窗口layer.closeAll();return false; //阻止表单跳转。如果需要表单跳转,去掉这段即可。});function saveEmp(addData){$.post("/emp/insertEmp",addData,function (jsonObj){console.log(jsonObj)if(jsonObj === "success"){layer.msg("添加成功",{icon:1,time:2000,anim:4,shade:0.5})//重新渲染当前页的表格数据loadEmpList();}else{layer.msg("添加失败",{icon:1,time:2000,anim:4,shade:0.5})}},"text" //text:表示后端响应的是文本,不写的话后端删除数据后在前端页面无法显示删除成功或失败,if判定进不去).error(function (){layer.msg("服务器异常",{icon:3,time:2000,anim:6,shade:0.5})});}/*====监听行工具事件:单行删除和编辑功能=======*///根据员工编号删除和编辑功能:table.on('tool(test)', function(obj){//注:tool 是工具条事件名,// test 是 table 原始容器的属性 lay-filter="对应的值"var thisData = obj.data; //获得当前行数据var layEvent = obj.event; //获得 lay-event 对应的值(也可以是表头的 event 参数对应的值)console.log(thisData)if(layEvent === 'del'){//删除layer.confirm('真的删除行么', function(index){delEmpByEmpno(obj);layer.close(index);});} else if(layEvent === 'edit'){//编辑//1.先给表单赋值form.val("updEmpFormFilter",{//class="layui-form" 所在元素属性 lay-filter="" 对应的值"empno":thisData.empno // "name": "value","ename":thisData.ename,"job": thisData.job,"mgr": thisData.mgr,"sal": thisData.sal,"hiredate": thisData.hiredate,"comm": m,"deptno": thisData.dept.deptno});//2.弹出编辑页面layer.open({type:1,//弹出类型title:"修改员工信息",area:["480px","580px"],//弹框尺寸anim:3,//弹出动画效果shade:0.5,//阴影content:$('#updEmpDiv')});}});function delEmpByEmpno(obj) {$.post("/emp/deleteEmp",{"empno":obj.data.empno},function (jsonObj){if(jsonObj === "success"){obj.del(); //删除对应行(tr)的DOM结构,并更新缓存layer.msg("删除成功",{icon:1,time:2000,anim:4,shade:0.5})}else{layer.msg("删除失败",{icon:1,time:2000,anim:4,shade:0.5})}},"text").error(function (){layer.msg("服务器异常",{icon:3,time:2000,anim:6,shade:0.5})});}//编辑form.on('submit(formUpdate)', function(data){console.log(data.field) //当前容器的全部表单字段,名值对形式:{name: value}var updateData=data.field;//赋值,然后刷新当前页updateEmp(updateData);//关闭所有的弹出窗口layer.closeAll();return false; //阻止表单跳转。如果需要表单跳转,去掉这段即可。});function updateEmp(updateData){$.post("/emp/changeEmp",updateData,function (jsonObj){if(jsonObj==="success"){layer.msg("修改成功",{icon:1,time:2000,anim:4,shade:0.5})//重新渲染当前页的表格数据table.reload('demo',{page: {curr: currentPage //重新从指定的页码开始渲染表格数据}});}else{layer.msg("修改失败",{icon:1,time:2000,anim:4,shade:0.5})}},"text").error(function (){layer.msg("服务器异常",{icon:3,time:2000,anim:6,shade:0.5})});}/***********下拉列表和验证功能*************///加载部门下拉列表function loadDeptInfos(){$.post("/emp/deptInfos",function (deptList) {var optionStr = "<option value=''>===请选择===</option>";$(deptList).each(function (){optionStr+="<option value='"+this.deptno+"'>"+this.dname+"</option>"})//把生成好的选项加入到下拉框中$("#selDept").append(optionStr);$("#saveDept").append(optionStr);$("#updDept").append(optionStr);form.render('select'); //刷新sel},"json").error(function (){layer.msg("请求数据异常!")})}//表单验证:form.verify({ename: function(value, item){//value:表单的值、item:表单的DOM对象if(!new RegExp("^[a-zA-Z0-9_\u4e00-\u9fa5\\s·]+$").test(value)){return '用户名不能有特殊字符';}if(/(^\_)|(\__)|(\_+$)/.test(value)){return '用户名首尾不能出现下划线\'_\'';}if(/^\d+\d+\d$/.test(value)){return '用户名不能全为数字';}//如果不想自动弹出默认提示框,可以直接返回 true,这时你可以通过其他任意方式提示(v2.5.7 新增)if(value === 'xxx'){alert('用户名不能为敏感词');return true;}},mgr: function(value, item){//value:表单的值、item:表单的DOM对象if(value > 9999 || value < 1001){return "上司编号只能在 1001 ~ 9999 之间!";}},sal: function(value, item){//value:表单的值、item:表单的DOM对象if(value > 50000 || value < 4500){return "工资只能在 4500 ~ 50000 之间!";}},comm: function(value, item){//value:表单的值、item:表单的DOM对象if(value > 5000 || value < 1500){return "奖金只能在 1500 ~ 5000 之间!";}}});});

前端页面看似代码量很大,但其实只要浏览过Layui的官网,很容易就能掌握并上手,官方的文档和示例介绍的明明白白,直接从官网复制粘贴,改成自己需求的就好,没什么难度。

五、后端代码

后端代码没有难度,为了整体便于阅读,这里也全部放上来:

从上到下 依次:

1.控制器:

package cn.kgc.demo.controller;import cn.kgc.demo.pojo.Dept;import cn.kgc.demo.pojo.Emp;import cn.kgc.demo.service.DeptService;import cn.kgc.demo.service.EmpService;import org.apache.ibatis.annotations.Param;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.ResponseBody;import java.util.List;import java.util.Map;@Controller@RequestMapping("emp")public class MyController {@Autowiredprivate EmpService empService;@Autowiredprivate DeptService deptService;//员工编号单个删除//但若返回的字符串中带有中文字符,则接收方页面将会出现乱码。此时需要使用//@RequestMapping 的 produces 属性指定字符集。@RequestMapping(value = "deleteEmp"/*,produces = "text/plain;charset=utf-8"*/)@ResponseBodypublic String deleteEmp(Integer empno){try {return empService.removeEmpByEmpno(empno);} catch (Exception e) {e.printStackTrace();return "error";}}//查询员工信息,实现分页,模糊查询@RequestMapping("empInfos")@ResponseBodypublic Map<String,Object> empInfos(Integer page, Integer limit, Emp emp){Map<String,Object> map=null;try {map = empService.findEmpAndDeptByLazyWithParams(page,limit,emp);map.put("code",0);} catch (Exception e) {e.printStackTrace();map.put("code",200);map.put("msg","访问数据失败");}return map;}//下拉列表部门的查询@RequestMapping("deptInfos")@ResponseBodypublic List<Dept> deptInfos(){try {return deptService.findDeptAll();} catch (Exception e) {e.printStackTrace();return null;}}//按员工编号批量删除@RequestMapping(value = "deleteBatchEmp")@ResponseBodypublic String deleteBatchEmp(Integer[] empnos){try {return empService.removeBatchEmpByEmpno(empnos);} catch (Exception e) {e.printStackTrace();return "error";}}//添加@RequestMapping("insertEmp")@ResponseBodypublic String insertEmp(Emp emp){try {return empService.addEmp(emp);} catch (Exception e) {e.printStackTrace();return "error";}}@RequestMapping("changeEmp")@ResponseBodypublic String changeEmp(Emp emp){try {return empService.changeEmp(emp);} catch (Exception e) {e.printStackTrace();return "error";}}}

2.跳转控制器:因为我们的jsp储存在WEB-INF目录下,不能直接访问,所以这里用一个控制器作为跳转使用,在index.jsp 中,写了这么一段:

<%--跳转到Transit控制器--%><c:redirect url="/transit/toEmpList"/>

通过控制器跳转到empList.jsp,当然你也可以不这样写

package cn.kgc.demo.controller;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.RequestMapping;@Controller@RequestMapping("transit")public class TransitController {@RequestMapping("toEmpList")public String toEmpList(){return "empList";}}

3.dao层和对应的mapper.xml:没什么好说的,代码是逆向生成的

根据需要,增加查询语句

DeptMapper:

import cn.kgc.demo.pojo.Dept;import org.apache.ibatis.annotations.Select;import java.util.List;public interface DeptMapper {int deleteByPrimaryKey(Integer deptno);int insert(Dept record);int insertSelective(Dept record);Dept selectByPrimaryKey(Integer deptno);int updateByPrimaryKeySelective(Dept record);int updateByPrimaryKey(Dept record);@Select("select * from dept")List<Dept> selectDeptAll();}

EmpMapper:

package cn.kgc.demo.dao;import cn.kgc.demo.pojo.Emp;import org.apache.ibatis.annotations.Param;import java.util.List;public interface EmpMapper {int deleteByPrimaryKey(Integer empno);int insert(Emp record);int insertSelective(Emp record);Emp selectByPrimaryKey(Integer empno);int updateByPrimaryKeySelective(Emp record);int updateByPrimaryKey(Emp record);//嵌套查询,员工表和部门表List<Emp> selectEmpAndDeptAll();//条件查询,姓名(模糊),职位,部门List<Emp> selectEmpByParams(Emp emp);int deleteBatchEmpByEmpNo(@Param("empnos") Integer[] empnos);}

DeptMapper.xml:

<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE mapper PUBLIC "-////DTD Mapper 3.0//EN" "/dtd/mybatis-3-mapper.dtd" ><mapper namespace="cn.kgc.demo.dao.DeptMapper" ><resultMap id="BaseResultMap" type="cn.kgc.demo.pojo.Dept" ><id column="deptno" property="deptno" jdbcType="INTEGER" /><result column="dname" property="dname" jdbcType="VARCHAR" /><result column="loc" property="loc" jdbcType="VARCHAR" /></resultMap><sql id="Base_Column_List" >deptno, dname, loc</sql><select id="selectByPrimaryKey" resultMap="BaseResultMap" parameterType="java.lang.Integer" >select <include refid="Base_Column_List" />from deptwhere deptno = #{deptno,jdbcType=INTEGER}</select><delete id="deleteByPrimaryKey" parameterType="java.lang.Integer" >delete from deptwhere deptno = #{deptno,jdbcType=INTEGER}</delete><insert id="insert" parameterType="cn.kgc.demo.pojo.Dept" >insert into dept (deptno, dname, loc)values (#{deptno,jdbcType=INTEGER}, #{dname,jdbcType=VARCHAR}, #{loc,jdbcType=VARCHAR})</insert><insert id="insertSelective" parameterType="cn.kgc.demo.pojo.Dept" >insert into dept<trim prefix="(" suffix=")" suffixOverrides="," ><if test="deptno != null" >deptno,</if><if test="dname != null" >dname,</if><if test="loc != null" >loc,</if></trim><trim prefix="values (" suffix=")" suffixOverrides="," ><if test="deptno != null" >#{deptno,jdbcType=INTEGER},</if><if test="dname != null" >#{dname,jdbcType=VARCHAR},</if><if test="loc != null" >#{loc,jdbcType=VARCHAR},</if></trim></insert><update id="updateByPrimaryKeySelective" parameterType="cn.kgc.demo.pojo.Dept" >update dept<set ><if test="dname != null" >dname = #{dname,jdbcType=VARCHAR},</if><if test="loc != null" >loc = #{loc,jdbcType=VARCHAR},</if></set>where deptno = #{deptno,jdbcType=INTEGER}</update><update id="updateByPrimaryKey" parameterType="cn.kgc.demo.pojo.Dept" >update deptset dname = #{dname,jdbcType=VARCHAR},loc = #{loc,jdbcType=VARCHAR}where deptno = #{deptno,jdbcType=INTEGER}</update></mapper>

EmpMapper.xml:

<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE mapper PUBLIC "-////DTD Mapper 3.0//EN" "/dtd/mybatis-3-mapper.dtd" ><mapper namespace="cn.kgc.demo.dao.EmpMapper" ><resultMap id="BaseResultMap" type="cn.kgc.demo.pojo.Emp" ><id column="empno" property="empno" jdbcType="INTEGER" /><result column="ename" property="ename" jdbcType="VARCHAR" /><result column="job" property="job" jdbcType="VARCHAR" /><result column="mgr" property="mgr" jdbcType="INTEGER" /><result column="hiredate" property="hiredate" jdbcType="DATE" /><result column="sal" property="sal" jdbcType="DECIMAL" /><result column="COMM" property="comm" jdbcType="DECIMAL" /><result column="deptno" property="deptno" jdbcType="INTEGER" /></resultMap><sql id="Base_Column_List" >empno, ename, job, mgr, hiredate, sal, COMM, deptno</sql><select id="selectByPrimaryKey" resultMap="BaseResultMap" parameterType="java.lang.Integer" >select <include refid="Base_Column_List" />from empwhere empno = #{empno,jdbcType=INTEGER}</select><delete id="deleteByPrimaryKey" parameterType="java.lang.Integer" >delete from empwhere empno = #{empno,jdbcType=INTEGER}</delete><insert id="insert" parameterType="cn.kgc.demo.pojo.Emp" >insert into emp (empno, ename, job, mgr, hiredate, sal, COMM, deptno)values (#{empno,jdbcType=INTEGER}, #{ename,jdbcType=VARCHAR}, #{job,jdbcType=VARCHAR}, #{mgr,jdbcType=INTEGER}, #{hiredate,jdbcType=DATE}, #{sal,jdbcType=DECIMAL}, #{comm,jdbcType=DECIMAL}, #{deptno,jdbcType=INTEGER})</insert><insert id="insertSelective" parameterType="cn.kgc.demo.pojo.Emp" >insert into emp<trim prefix="(" suffix=")" suffixOverrides="," ><if test="empno != null" >empno,</if><if test="ename != null" >ename,</if><if test="job != null" >job,</if><if test="mgr != null" >mgr,</if><if test="hiredate != null" >hiredate,</if><if test="sal != null" >sal,</if><if test="comm != null" >COMM,</if><if test="deptno != null" >deptno,</if></trim><trim prefix="values (" suffix=")" suffixOverrides="," ><if test="empno != null" >#{empno,jdbcType=INTEGER},</if><if test="ename != null" >#{ename,jdbcType=VARCHAR},</if><if test="job != null" >#{job,jdbcType=VARCHAR},</if><if test="mgr != null" >#{mgr,jdbcType=INTEGER},</if><if test="hiredate != null" >#{hiredate,jdbcType=DATE},</if><if test="sal != null" >#{sal,jdbcType=DECIMAL},</if><if test="comm != null" >#{comm,jdbcType=DECIMAL},</if><if test="deptno != null" >#{deptno,jdbcType=INTEGER},</if></trim></insert><update id="updateByPrimaryKeySelective" parameterType="cn.kgc.demo.pojo.Emp" >update emp<set ><if test="ename != null" >ename = #{ename,jdbcType=VARCHAR},</if><if test="job != null" >job = #{job,jdbcType=VARCHAR},</if><if test="mgr != null" >mgr = #{mgr,jdbcType=INTEGER},</if><if test="hiredate != null" >hiredate = #{hiredate,jdbcType=DATE},</if><if test="sal != null" >sal = #{sal,jdbcType=DECIMAL},</if><if test="comm != null" >COMM = #{comm,jdbcType=DECIMAL},</if><if test="deptno != null" >deptno = #{deptno,jdbcType=INTEGER},</if></set>where empno = #{empno,jdbcType=INTEGER}</update><update id="updateByPrimaryKey" parameterType="cn.kgc.demo.pojo.Emp" >update empset ename = #{ename,jdbcType=VARCHAR},job = #{job,jdbcType=VARCHAR},mgr = #{mgr,jdbcType=INTEGER},hiredate = #{hiredate,jdbcType=DATE},sal = #{sal,jdbcType=DECIMAL},COMM = #{comm,jdbcType=DECIMAL},deptno = #{deptno,jdbcType=INTEGER}where empno = #{empno,jdbcType=INTEGER}</update><resultMap id="selectEmpAndDeptMap" type="Emp"><association property="dept" javaType="Dept" column="deptno"select="cn.kgc.demo.dao.DeptMapper.selectByPrimaryKey"/></resultMap><select id="selectEmpByParams" resultMap="selectEmpAndDeptMap">select <include refid="Base_Column_List"/> from emp<where><if test="ename!=null and ename!=''">and ename like concat("%",#{ename},"%")</if><if test="job!=null and job!=''">and job = #{job}</if><if test="deptno!=null">and deptno = #{deptno}</if></where></select><delete id="deleteBatchEmpByEmpNo">delete from emp where empno in<foreach collection="empnos" item="item" open="(" separator="," close=")">#{item}</foreach></delete></mapper>

4.pojo层:

Dept:

package cn.kgc.demo.pojo;import lombok.Data;@Datapublic class Dept {private Integer deptno;private String dname;private String loc;}

Emp:

package cn.kgc.demo.pojo;import lombok.Data;import java.math.BigDecimal;import java.util.Date;@Datapublic class Emp {private Integer empno;private String ename;private String job;private Integer mgr;private Date hiredate;private BigDecimal sal;private BigDecimal comm;private Integer deptno;private Dept dept;}

5.service层:

import cn.kgc.demo.pojo.Emp;import java.util.Map;public interface EmpService {//删除String removeEmpByEmpno(Integer empno);//根据条件进行分页查询员工和部门数据Map<String, Object> findEmpAndDeptByLazyWithParams(Integer page, Integer limit, Emp emp);String removeBatchEmpByEmpno(Integer[] empnos);String addEmp(Emp emp);String changeEmp(Emp emp);}

package cn.kgc.demo.service;import cn.kgc.demo.pojo.Dept;import java.util.List;public interface DeptService {List<Dept> findDeptAll();}

package cn.kgc.demo.service.impl;import cn.kgc.demo.dao.DeptMapper;import cn.kgc.demo.dao.EmpMapper;import cn.kgc.demo.pojo.Emp;import cn.kgc.demo.service.EmpService;import com.github.pagehelper.PageHelper;import com.github.pagehelper.PageInfo;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Service;import java.util.HashMap;import java.util.List;import java.util.Map;import java.util.Random;@Servicepublic class EmpServiceImpl implements EmpService {@Autowiredprivate EmpMapper empMapper;@Overridepublic String removeEmpByEmpno(Integer empno) {if(empMapper.deleteByPrimaryKey(empno)>0){return "success";}else{return "fail";}}@Overridepublic Map<String, Object> findEmpAndDeptByLazyWithParams(Integer page, Integer limit, Emp emp) {/*开启分页查询*/PageHelper.startPage(page,limit);List<Emp> list = empMapper.selectEmpByParams(emp);/*封装数据*/PageInfo pageInfo=new PageInfo(list);Map<String, Object> map=new HashMap<>();map.put("count",pageInfo.getTotal());map.put("data",pageInfo.getList());return map;}@Overridepublic String removeBatchEmpByEmpno(Integer[] empnos) {if(empMapper.deleteBatchEmpByEmpNo(empnos)>0){return "success";}else{return "fail";}}@Overridepublic String addEmp(Emp emp) {if(empMapper.insertSelective(emp)>0){return "success";}else{return "fail";}}@Overridepublic String changeEmp(Emp emp) {if(empMapper.updateByPrimaryKeySelective(emp)>0){return "success";}else{return "fail";}}}

package cn.kgc.demo.service.impl;import cn.kgc.demo.dao.DeptMapper;import cn.kgc.demo.pojo.Dept;import cn.kgc.demo.service.DeptService;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Service;import java.util.List;@Servicepublic class DeptServiceImpl implements DeptService {@AutowiredDeptMapper deptMapper;@Overridepublic List<Dept> findDeptAll() {return deptMapper.selectDeptAll();}}

至此:全部结束!

代码量有点儿大,提供一个思路给大家。想要熟练的话,还是要多写多练,没有捷径可言!

如果觉得《结合Layui框架 实现SpringMVC+Spring+Mybatis SSM整合案例CRUD(超详细代码 外加说明)》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。