Spring+SpringMVC+Mybatis(SSM)整合(部门员工案例)

导读:本篇文章讲解 Spring+SpringMVC+Mybatis(SSM)整合(部门员工案例),希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

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

(0)
小半的头像小半

相关推荐

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!