Spring+SpringMVC+Mybatis(SSM)整合(部门员工案例)
目录
1.pom.xml
<?xml version="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.0</modelVersion>
<groupId>com.bjpowernode</groupId>
<artifactId>SSMDeptEmpProject</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>war</packaging>
<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>
<spring.version>5.2.0.RELEASE</spring.version>
</properties>
<dependencies>
<!--springmvc-->
<dependency>
<groupId>jstl</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>
</dependency>
<!--spring-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</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-jdbc</artifactId>
<version>${spring.version}</version>
</dependency>
<!--mybatis-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>2.0.7</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.6</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.29</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.2.5</version>
</dependency>
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>5.2.0</version>
</dependency>
<!--tool-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.22</version>
</dependency>
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.8.0</version>
</dependency>
<!--log-->
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.2</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.13.3</version>
</dependency>
</dependencies>
</project>
2.domain类
2.1 Department.java
package com.bjpowernode.domain;
import lombok.Data;
@Data
public class Department {
private Long id;
private String name;
private String sn;
}
2.2 Employee.java
package com.bjpowernode.domain;
import lombok.Data;
import lombok.ToString;
@Data
public class Employee {
private Long id;
private String username;
private String password;
private String email;
private Integer age;
private boolean admin;
private Department dept;
}
3.mapper
package com.bjpowernode.mapper;
import com.bjpowernode.domain.Employee;
import com.bjpowernode.query.QueryObject;
import java.util.*;
public interface EmployeeMapper {
List<Employee> selectAll();
}
4.service层
4.1 EmployeeService.java
package com.bjpowernode.service;
import com.bjpowernode.domain.Employee;
import com.bjpowernode.query.QueryObject;
import com.github.pagehelper.PageInfo;
import java.util.*;
public interface EmployeeService {
List<Employee> listAll();
}
4.2 EmployeeService.impl
package com.bjpowernode.service.impl;
import com.bjpowernode.domain.Employee;
import com.bjpowernode.mapper.EmployeeMapper;
import com.bjpowernode.query.QueryObject;
import com.bjpowernode.service.EmployeeService;
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.*;
import java.util.List;
@Service
public class EmployeeServiceImpl implements EmployeeService {
@Autowired
private EmployeeMapper employeeMapper;
@Override
public List<Employee> listAll() {
return employeeMapper.selectAll();
}
}
5.controller层
5.1 EmployeeController.java
package com.bjpowernode.web.controller;
import com.bjpowernode.domain.Employee;
import com.bjpowernode.query.QueryObject;
import com.bjpowernode.service.EmployeeService;
import com.github.pagehelper.PageInfo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import java.util.List;
@Controller
@RequestMapping("/employee")
public class EmployeeController {
@Autowired
private EmployeeService employeeService;
@RequestMapping("/list")
public String list(Model model){
List<Employee> employees = employeeService.listAll();
for (Employee employee : employees) {
System.out.println("employee = " + employee);
}
model.addAttribute("list",employees);
return "/employee/list0";
}
}
6. resources
com/bjpowernode/mapper
6.1 EmployeeMapper.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.bjpowernode.mapper.EmployeeMapper">
<resultMap id="baseMap" type="com.bjpowernode.domain.Employee">
<id property="id" column="id"/>
<result property="username" column="username"/>
<result property="password" column="password"/>
<result property="email" column="email"/>
<result property="age" column="age"/>
<result property="admin" column="admin"/>
<association property="dept" javaType="com.bjpowernode.domain.Department" columnPrefix="d_">
<id property="id" column="id"/>
<result property="name" column="name"/>
</association>
</resultMap>
<select id="selectAll" resultMap="baseMap">
SELECT
emp.id,
emp.username,
emp.PASSWORD,
emp.email,
emp.age,
emp.admin,
d.id d_id,
d.NAME d_name
FROM
employee emp
LEFT JOIN department d ON d.id = emp.dept_id
</select>
</mapper>
6.2 db.properties
driverClassName=com.mysql.cj.jdbc.Driver
url=jdbc:mysql:///mybatis_relation?characterEncoding=UTF8&useSSL=false
username=root
password=root
6.3 log4j.properties
log4j.rootLogger=ERROR, stdout
log4j.logger.com.bjpowernode.mapper=TRACE
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n
6.4 Spring的配置文件applicationContext
<?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"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
https://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd">
<!--ioc扫描器-->
<context:component-scan base-package="com.bjpowernode.service"/>
<!--关联数据库的配置文件-->
<context:property-placeholder location="classpath:db.properties"
system-properties-mode="NEVER"/>
<!--数据源-->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close">
<property name="driverClassName" value="${driverClassName}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
</bean>
<!--sqlSessionFactory-->
<bean class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="configuration" ref="configuration"/>
<property name="dataSource" ref="dataSource"/>
<property name="typeAliasesPackage" value="com.bjpowernode.domain"/>
<!-- 注意其他配置 -->
<property name="plugins">
<array>
<bean class="com.github.pagehelper.PageInterceptor">
<property name="properties">
<!--使用下面的方式配置参数,一行配置一个 -->
<value>
helperDialect=mysql
pageSizeZero=true
reasonable=true
</value>
</property>
</bean>
</array>
</property>
</bean>
<!--Log4J-->
<bean id="configuration" class="org.apache.ibatis.session.Configuration">
<property name="logImpl" value="org.apache.ibatis.logging.log4j.Log4jImpl"/>
<property name="lazyLoadingEnabled" value="true"/>
<property name="aggressiveLazyLoading" value="false"/>
<property name="lazyLoadTriggerMethods" value="clone"/>
</bean>
<!--mapper扫描器-->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.bjpowernode.mapper"/>
</bean>
<!--tx 使用aop对方法进行事务的增强-->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
<!--自动开启事务-->
<tx:annotation-driven transaction-manager="transactionManager"/>
</beans>
6.5 SpringMVC的配置文件springMVC.xml
springMVC.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: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 https://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd">
<!--挂载spring的配置文件-->
<import resource="classpath:applicationContext.xml"/>
<!--ioc扫描器-->
<context:component-scan base-package="com.bjpowernode.web"/>
<!--mvc 注解驱动-->
<mvc:annotation-driven/>
<!--处理静态资源-->
<mvc:default-servlet-handler/>
<!--视图解析器,配置模板-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/view/"/>
<property name="suffix" value=".jsp"/>
</bean>
</beans>
7.webapp
WEB-INF
webapp/WEB-INF/web.xml
web.xml
<!DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd" >
<web-app>
<display-name>Archetype Created Web Application</display-name>
<servlet>
<servlet-name>mvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<!--springmvc的配置的文件的位置
classPath: 字节码的输出路径
-->
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springMVC.xml</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>mvc</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
webapp\WEB-INF\view\employee
list0.jsp
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<table border="1" cellspacing="0px" cellpadding="10px">
<tr>
<th>编号</th>
<th>姓名</th>
<th>邮箱</th>
<th>年龄</th>
<th>是否是超管</th>
<th>所属部门</th>
<th>操作</th>
</tr>
<%--
for(String emp : list){
emp 对应下面的emp list 对应下面的list
}
--%>
<!--
items="list" 这个list是Controller通过Model对象设置的属性名称
var="emp"相当于遍历items集合中的每一个对象
-->
<c:forEach items="${list}" var="emp">
<tr>
<td>${emp.id}</td>
<td>${emp.username}</td>
<td>${emp.email}</td>
<td>${emp.age}</td>
<td>${emp.admin?'是':'否'}</td>
<td>${emp.dept.name}</td>
<td>
<a href="#">编辑</a>
<a href="#">删除</a>
</td>
</tr>
</c:forEach>
</table>
</body>
</html>
8.运行效果
9.分页查询功能
9.1 引入查询参数对象QueryObject
com.bjpowernode.query
QueryObject.java
package com.bjpowernode.query;
import lombok.Data;
@Data
public class QueryObject {
private int currentPage = 1;//当前页
private int pageSize = 5;//每页显示的条数
}
9.2 EmployeeMapper.java
package com.bjpowernode.mapper;
import com.bjpowernode.domain.Employee;
import com.bjpowernode.query.QueryObject;
import java.util.*;
public interface EmployeeMapper {
List<Employee> selectByPageHelper(QueryObject queryObject);
}
9.3 EmpolyeeMapper.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.bjpowernode.mapper.EmployeeMapper">
<resultMap id="baseMap" type="com.bjpowernode.domain.Employee">
<id property="id" column="id"/>
<result property="username" column="username"/>
<result property="password" column="password"/>
<result property="email" column="email"/>
<result property="age" column="age"/>
<result property="admin" column="admin"/>
<association property="dept" javaType="com.bjpowernode.domain.Department" columnPrefix="d_">
<id property="id" column="id"/>
<result property="name" column="name"/>
</association>
</resultMap>
<select id="selectByPageHelper" resultMap="baseMap">
SELECT
emp.id,
emp.username,
emp.PASSWORD,
emp.email,
emp.age,
emp.admin,
d.id d_id,
d.NAME d_name
FROM
employee emp
LEFT JOIN department d ON d.id = emp.dept_id
</select>
</mapper>
9.4 service层
9.4.1 EmployeeService,java
package com.bjpowernode.service;
import com.bjpowernode.domain.Employee;
import com.bjpowernode.query.QueryObject;
import com.github.pagehelper.PageInfo;
import java.util.*;
public interface EmployeeService {
PageInfo selectByPageHelper(QueryObject queryObject);
}
9.4.2 EmployeeServiceImpl.java
package com.bjpowernode.service.impl;
import com.bjpowernode.domain.Employee;
import com.bjpowernode.mapper.EmployeeMapper;
import com.bjpowernode.query.QueryObject;
import com.bjpowernode.service.EmployeeService;
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.*;
import java.util.List;
@Service
public class EmployeeServiceImpl implements EmployeeService {
@Autowired
private EmployeeMapper employeeMapper;
@Override
public List<Employee> listAll() {
return employeeMapper.selectAll();
}
@Override
public PageInfo selectByPageHelper(QueryObject queryObject) {
// 分页 必须在查询之前调用
PageHelper.startPage(queryObject.getCurrentPage(),queryObject.getPageSize());
List<Employee> employeeList = employeeMapper.selectByPageHelper(queryObject);//传入queryObject是为了以后程序的扩展性,
// 如果这个员工列表有搜索(模糊查询)功能,是不是要把搜索(模糊)的关键字传到SQL中
PageInfo<Employee> employeePageInfo = new PageInfo<>(employeeList);
return employeePageInfo;
}
}
9.5 controller层
EmployeeController.java
package com.bjpowernode.web.controller;
import com.bjpowernode.domain.Employee;
import com.bjpowernode.query.QueryObject;
import com.bjpowernode.service.EmployeeService;
import com.github.pagehelper.PageInfo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import java.util.List;
@Controller
@RequestMapping("/employee")
public class EmployeeController {
@Autowired
private EmployeeService employeeService;
@RequestMapping("/list")
public String list(Model model,Integer currentPage){
QueryObject queryObject = new QueryObject();
if(currentPage!=null){
queryObject.setCurrentPage(currentPage);
}
PageInfo pageInfo = employeeService.selectByPageHelper(queryObject);
model.addAttribute("pageInfo",pageInfo);
return "/employee/list";
}
}
webapp\WEB-INF\view\employee
9.6 list.jsp
package com.bjpowernode.web.controller;
import com.bjpowernode.domain.Employee;
import com.bjpowernode.query.QueryObject;
import com.bjpowernode.service.EmployeeService;
import com.github.pagehelper.PageInfo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import java.util.List;
@Controller
@RequestMapping("/employee")
public class EmployeeController {
@Autowired
private EmployeeService employeeService;
// @RequestMapping("/list")
// public String list(Model model){
// List<Employee> employees = employeeService.listAll();
// for (Employee employee : employees) {
// System.out.println("employee = " + employee);
// }
// model.addAttribute("list",employees);
// return "/employee/list0";
// }
@RequestMapping("/list")
public String list(Model model){
QueryObject queryObject = new QueryObject();
PageInfo pageInfo = employeeService.selectByPageHelper(queryObject);
model.addAttribute("pageInfo",pageInfo);
return "/employee/list";
}
}
9.7 遇到的问题
9.7.1 分页按钮无效
分页按钮无效
原因:浏览器第一次发送请求http://localhost:8080/employee/list并没有携带分页(当前页的参数),所以当前页的参数为null,用户在页面点击了分页的相关按钮,才会把分页相关的参数再次发送给Controller
9.7.2 CurrentPage为null
解决办法:使用包装类Integer,并在判断一下
问题成功解决
EmployeeController.java 代码
package com.bjpowernode.web.controller;
import com.bjpowernode.domain.Employee;
import com.bjpowernode.query.QueryObject;
import com.bjpowernode.service.EmployeeService;
import com.github.pagehelper.PageInfo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import java.util.List;
@Controller
@RequestMapping("/employee")
public class EmployeeController {
@Autowired
private EmployeeService employeeService;
@RequestMapping("/list")
public String list(Model model,Integer currentPage){
QueryObject queryObject = new QueryObject();
if(currentPage!=null){
queryObject.setCurrentPage(currentPage);
}
PageInfo pageInfo = employeeService.selectByPageHelper(queryObject);
model.addAttribute("pageInfo",pageInfo);
return "/employee/list";
}
}
EmployeeController.java 代码优化
使用@ModelAttribute注解
@ModelAttribute
package com.bjpowernode.web.controller;
import com.bjpowernode.domain.Employee;
import com.bjpowernode.query.QueryObject;
import com.bjpowernode.service.EmployeeService;
import com.github.pagehelper.PageInfo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import java.util.List;
@Controller
@RequestMapping("/employee")
public class EmployeeController {
@Autowired
private EmployeeService employeeService;
@RequestMapping("/list")
public String list(Model model, @ModelAttribute("QueryObjectKey") QueryObject queryObjectValue) {
// QueryObject queryObject = new QueryObject();
// if(currentPage!=null){
// queryObject.setCurrentPage(currentPage);
// }
// 上述代码 可以使用 @ModelAttribute 注解 替换 原因: 因为@ModelAttribute 注解等价于 model.addAttribute("QueryObjectKey",queryObjectValue)
// 单独接收一个 currentPage 和 使用它的对象接收 是一样的,springmvc 帮我们实现的
PageInfo pageInfo = employeeService.selectByPageHelper(queryObjectValue);
model.addAttribute("pageInfo", pageInfo);
return "/employee/list";
}
// @RequestMapping("/list")
// public String list(Model model,Integer currentPage){
// QueryObject queryObject = new QueryObject();
// if(currentPage!=null){
// queryObject.setCurrentPage(currentPage);
// }
// PageInfo pageInfo = employeeService.selectByPageHelper(queryObject);
// model.addAttribute("pageInfo",pageInfo);
// return "/employee/list";
// }
// @RequestMapping("/list")
// public String list(Model model){
// List<Employee> employees = employeeService.listAll();
// for (Employee employee : employees) {
// System.out.println("employee = " + employee);
// }
// model.addAttribute("list",employees);
// return "/employee/list0";
// }
}
9.8 测试类
pageInfo的getList()API
@Test
public void selectByPageHelper(){
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
EmployeeService employeeService = context.getBean(EmployeeService.class);
QueryObject queryObject = new QueryObject();
queryObject.setCurrentPage(2);
PageInfo<Employee> pageInfo = employeeService.selectByPageHelper(queryObject);
System.out.println("pageInfo = " + pageInfo);
System.out.println("------------------------------------------------");
System.out.println("pageInfo.getList() = " + pageInfo.getList());
System.out.println("--------------------------------------------------");
for (Employee employee : pageInfo.getList()) {
System.out.println("employee = " + employee);
}
}
10.搜索功能
10.1 web.xml
<!DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd" >
<web-app>
<display-name>Archetype Created Web Application</display-name>
<!-- 编码过滤器 -->
<filter>
<filter-name>charsetFilter</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>charsetFilter</filter-name>
<!-- 只对springmvc处理的请求进行编码过滤 -->
<url-pattern>/*</url-pattern>
</filter-mapping>
<servlet>
<servlet-name>mvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<!--springmvc的配置的文件的位置
classPath: 字节码的输出路径
-->
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springMVC.xml</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>mvc</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
10.2 EmpolyeeQueryObject.java
package com.bjpowernode.query;
import lombok.Data;
@Data
public class EmpolyeeQueryObject extends QueryObject{
private String keyword;
}
10.3 mapper层
EmployeeMapper.java
package com.bjpowernode.mapper;
import com.bjpowernode.domain.Employee;
import com.bjpowernode.query.EmpolyeeQueryObject;
import com.bjpowernode.query.QueryObject;
import java.util.*;
public interface EmployeeMapper {
List<Employee> selectByPageHelperAndKeyword(EmpolyeeQueryObject empolyeeQueryObject);
}
10.4 service层
10.4.1 EmployeeService接口
package com.bjpowernode.service;
import com.bjpowernode.domain.Employee;
import com.bjpowernode.query.EmpolyeeQueryObject;
import com.bjpowernode.query.QueryObject;
import com.github.pagehelper.PageInfo;
import java.util.*;
public interface EmployeeService {
PageInfo selectByPageHelperAndKeyword(EmpolyeeQueryObject empolyeeQueryObjectValue);
}
10.4.2 EmployeeServiceImpl实现类
package com.bjpowernode.service.impl;
import com.bjpowernode.domain.Employee;
import com.bjpowernode.mapper.EmployeeMapper;
import com.bjpowernode.query.EmpolyeeQueryObject;
import com.bjpowernode.query.QueryObject;
import com.bjpowernode.service.EmployeeService;
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.*;
import java.util.List;
@Service
public class EmployeeServiceImpl implements EmployeeService {
@Autowired
private EmployeeMapper employeeMapper;
@Override
public PageInfo selectByPageHelperAndKeyword(EmpolyeeQueryObject empolyeeQueryObject) {
// 分页 必须在查询之前调用
PageHelper.startPage(empolyeeQueryObject.getCurrentPage(),empolyeeQueryObject.getPageSize());
List<Employee> employeeList = employeeMapper.selectByPageHelperAndKeyword(empolyeeQueryObject);//传入queryObject是为了以后程序的扩展性,
// 如果这个员工列表有搜索(模糊查询)功能,是不是要把搜索(模糊)的关键字传到SQL中
PageInfo<Employee> employeePageInfo = new PageInfo<>(employeeList);
return employeePageInfo;
}
}
10.5 controller层
EmployeeController.java
package com.bjpowernode.web.controller;
import com.bjpowernode.domain.Employee;
import com.bjpowernode.query.EmpolyeeQueryObject;
import com.bjpowernode.query.QueryObject;
import com.bjpowernode.service.EmployeeService;
import com.github.pagehelper.PageInfo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import java.util.List;
@Controller
@RequestMapping("/employee")
public class EmployeeController {
@Autowired
private EmployeeService employeeService;
@RequestMapping("/list")
public String list(Model model, @ModelAttribute("empolyeeQueryObject") EmpolyeeQueryObject empolyeeQueryObjectValue) {
System.out.println("empolyeeQueryObjectValue.getKeyword() = " + empolyeeQueryObjectValue.getKeyword());
// QueryObject queryObject = new QueryObject();
// if(currentPage!=null){
// queryObject.setCurrentPage(currentPage);
// }
// model.addAttribute("empolyeeQueryObject",empolyeeQueryObjectValue);
// 上述代码 可以使用 @ModelAttribute 注解 替换 原因: 因为@ModelAttribute 注解等价于 model.addAttribute("QueryObjectKey",queryObjectValue)
// 单独接收一个 currentPage 和 使用它的对象接收 是一样的,springmvc 帮我们实现的
PageInfo pageInfo = employeeService.selectByPageHelperAndKeyword(empolyeeQueryObjectValue);
model.addAttribute("pageInfo", pageInfo);
return "/employee/list";
}
}
}
10.6 EmployeeMapper.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.bjpowernode.mapper.EmployeeMapper">
<resultMap id="baseMap" type="com.bjpowernode.domain.Employee">
<id property="id" column="id"/>
<result property="username" column="username"/>
<result property="password" column="password"/>
<result property="email" column="email"/>
<result property="age" column="age"/>
<result property="admin" column="admin"/>
<association property="dept" javaType="com.bjpowernode.domain.Department" columnPrefix="d_">
<id property="id" column="id"/>
<result property="name" column="name"/>
</association>
</resultMap>
<select id="selectByPageHelperAndKeyword" resultMap="baseMap">
SELECT
emp.id,
emp.username,
emp.PASSWORD,
emp.email,
emp.age,
emp.admin,
d.id d_id,
d.NAME d_name
FROM
employee emp
LEFT JOIN department d ON d.id = emp.dept_id
<where>
<if test="keyword!=null and keyword!=''">
and emp.username like concat('%',#{keyword},'%')
</if>
</where>
</select>
</mapper>
10.7 前段页面list.jsp
src\main\webapp\WEB-INF\view\employee\list.jsp
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<form id="formId" action="/employee/list" method="post">
<input type="hidden" name="currentPage" id="currentPageId">
关键字:<input type="text" name="keyword" value="${empolyeeQueryObject.keyword}">
<input type="button" value="搜索" onclick="goPage(1)">
</form>
<table border="1" cellspacing="0px" cellpadding="10px">
<tr>
<th>编号</th>
<th>姓名</th>
<th>邮箱</th>
<th>年龄</th>
<th>是否是超管</th>
<th>所属部门</th>
<th>操作</th>
</tr>
<%--
for(String emp : list){
emp 对应下面的emp list 对应下面的list
}
--%>
<%-- items="${pageInfo.list}"--%>
<%-- 这个pageInfo是Controller通过Model对象设置的属性名称--%>
<%-- list是PageInfo继承的父类PageSerializable的--%>
<%-- var="emp"相当于遍历items集合中的每一个对象的属性(成员变量)--%>
<c:forEach items="${pageInfo.list}" var="emp">
<tr>
<td>${emp.id}</td>
<td>${emp.username}</td>
<td>${emp.email}</td>
<td>${emp.age}</td>
<td>${emp.admin?'是':'否'}</td>
<td>${emp.dept.name}</td>
<td>
<a href="#">编辑</a>
<a href="#">删除</a>
</td>
</tr>
</c:forEach>
<tr>
<%-- <td colspan="7" align="center">--%>
<%-- <a href="/employee/list?currentPage=1">首页</a>--%>
<%-- <a href="/employee/list?currentPage=${pageInfo.prePage}&keyword=${empolyeeQueryObject.keyword}">上一页</a>--%>
<%-- <a href="/employee/list?currentPage=${pageInfo.nextPage}&keyword=${empolyeeQueryObject.keyword}">下一页</a>--%>
<%-- <a href="/employee/list?currentPage=${pageInfo.pages}&keyword=${empolyeeQueryObject.keyword}">尾页</a>--%>
<%-- 当前 ${pageInfo.pageNum} / ${pageInfo.pages}页--%>
<%-- 共 ${pageInfo.total} 条--%>
<%-- </td>--%>
<td colspan="7" align="center">
<a href="javascript:void(0);" onclick="goPage(1)">首页</a>
<a href="javascript:void(0);" onclick="goPage(${pageInfo.prePage})">上一页</a>
<a href="javascript:void(0);" onclick="goPage(${pageInfo.nextPage})">下一页</a>
<a href="javascript:void(0);" onclick="goPage(${pageInfo.pages})">尾页</a>
当前 ${pageInfo.pageNum} / ${pageInfo.pages}页
共 ${pageInfo.total} 条
</td>
</tr>
</table>
</body>
</html>
<script>
function goPage(pageNo) {
// 给currentPage 赋值
var currentPageElement = document.getElementById("currentPageId")
currentPageElement.value=pageNo;
// 提交表单
var formElement = document.getElementById("formId");
formElement.submit();
}
</script>
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/85562.html