SSM-SpringMVC+Spring+Mybatis

创建项目

创建好 项目后, 项目目录分析

数据库设计

我们采用员工表 Employee 与 部门表 Department

部门表 表设计---

员工表 --表设计

因为有文件上传操作,因此 建立 info表

(其中 员工只能隶属一个部门,因此 两张表之间 有外键关系)

java 代码 设计

数据库建立完毕后,需要为 每张表添加 3-4条数据

建立 entity 实体层

建立实体层: 注意事项

复制代码
 # 实体层 注意事项
 ​
 类名    --- 与表名  相对应 , java 中规定 类名首字母必须为大写字母
 属性名   ----- 与 列名 相对应,且 属性类型 与列名对应类型一致,
               属性名 采用小驼峰命名发, 列名 不区分大小写
               例如    表中 列 为 stuno 则属性为 stuNo
               
 实体类中 必须包含无参数的构造方法
建立mapper层 数据访问层

因为 我们使用的mybatis,因此 包名为mapper 当然也可以为dao

mybatis中 规定 接口与映射文件放在一起,并一一对应,

不仅名称一致,还需要再 xxxMapper.xml 配置 namespace, 指向 对应的接口

XML 复制代码
 <?xml version="1.0" encoding="UTF-8" ?>
 <!DOCTYPE mapper
         PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> 
 <mapper namespace="mapper.EmployeeMapper">
 ​
 </mapper>
建立service层 业务层
添加Spring 依赖

编写 pom.xml

XML 复制代码
  <!--spring aop 依赖 jar-->
     <!-- https://mvnrepository.com/artifact/org.aspectj/aspectjweaver -->
     <dependency>
       <groupId>org.aspectj</groupId>
       <artifactId>aspectjweaver</artifactId>
       <version>1.9.7</version>
       <scope>runtime</scope>
     </dependency>
  <!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc -->
     <dependency>
       <groupId>org.springframework</groupId>
       <artifactId>spring-webmvc</artifactId>
       <version>5.2.9.RELEASE</version>
     </dependency>
     <dependency>
       <groupId>org.springframework</groupId>
       <artifactId>spring-jdbc</artifactId>
       <version>5.2.9.RELEASE</version>
     </dependency>
     <dependency>
       <groupId>org.springframework</groupId>
       <artifactId>spring-core</artifactId>
       <version>5.2.9.RELEASE</version>
     </dependency>
 ​
     <dependency>
       <groupId>org.springframework</groupId>
       <artifactId>spring-beans</artifactId>
       <version>5.2.9.RELEASE</version>
     </dependency>
 ​
添加mybatis 依赖

编写 pom.xml

复制代码
  
XML 复制代码
 <!-- mbatis 分页插件-->
     <dependency>
       <groupId>com.github.pagehelper</groupId>
       <artifactId>pagehelper</artifactId>
       <version>5.2.0</version>
     </dependency>
 ​
 ​
     <!--mybatis-spring 依赖-->
     <!-- https://mvnrepository.com/artifact/org.mybatis/mybatis-spring -->
     <dependency>
       <groupId>org.mybatis</groupId>
       <artifactId>mybatis-spring</artifactId>
       <version>2.0.6</version>
     </dependency>
     <!--引入mybatis.jar-->
     <dependency>
       <groupId>org.mybatis</groupId>
       <artifactId>mybatis</artifactId>
       <version>3.4.6</version>
     </dependency>
添加其他一些依赖

添加 mysql 数据库依赖 及 log4j

复制代码
 
XML 复制代码
 <!--mysql-->
     <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
     <dependency>
       <groupId>mysql</groupId>
       <artifactId>mysql-connector-java</artifactId>
       <version>8.0.26</version>
     </dependency>
 ​
     <!--log4j-->
     <!-- https://mvnrepository.com/artifact/log4j/log4j -->
     <dependency>
       <groupId>log4j</groupId>
       <artifactId>log4j</artifactId>
       <version>1.2.17</version>
     </dependency>

添加数据源 依赖

复制代码
 
XML 复制代码
 <!-- https://mvnrepository.com/artifact/com.alibaba/druid -->
     <dependency>
       <groupId>com.alibaba</groupId>
       <artifactId>druid</artifactId>
       <version>1.2.5</version>
     </dependency>

jsp 需要引入 jstl

复制代码
  
XML 复制代码
<!--jstl 依赖 -->
     <!-- https://mvnrepository.com/artifact/jstl/jstl -->
     <dependency>
       <groupId>jstl</groupId>
       <artifactId>jstl</artifactId>
       <version>1.2</version>
     </dependency>
 ​

文件上传和下载

XML 复制代码
 <!-- https://mvnrepository.com/artifact/commons-io/commons-io -->
     <dependency>
       <groupId>commons-io</groupId>
       <artifactId>commons-io</artifactId>
       <version>2.6</version>
     </dependency>
     <!-- https://mvnrepository.com/artifact/commons-fileupload/commons-fileupload -->
     <dependency>
       <groupId>commons-fileupload</groupId>
       <artifactId>commons-fileupload</artifactId>
       <version>1.4</version>
     </dependency>
 ​
     <dependency>
       <groupId>javax.servlet</groupId>
       <artifactId>servlet-api</artifactId>
       <version>2.5</version>
       <scope>provided</scope>
     </dependency>
复制代码
 ​
为pom.xml 增加 build
复制代码
 
XML 复制代码
 <!--资源-->
 <build>
       <resources>
 ​
         <resource>
           <!--目录-->
           <directory>src/main/java</directory>
           <!--包含-->
           <includes>
             <include>mapper/**.xml</include>
           </includes>
         </resource>
         <resource>
           <!--目录-->
           <directory>src/main/resources</directory>
           <!--包含-->
           <includes>
             <include>**.*</include>
           </includes>
         </resource>
       </resources>
 </build>
编写 数据库配置文件

如果 mysql版本 为 5.0 ,则 driver 应该为 com.mysql.jdbc.Driver

复制代码
 文件名  db.properties
 # mysql 为8.0 配置
 uname=自己mysql的用户名
 password=mysql的密码
 driver=com.mysql.cj.jdbc.Driver
 url=jdbc:mysql://localhost:3306/数据库名称?serverTimezone=GMT
编写日志配置文件
复制代码
  文件名  log4j.properties
 ​
 ### 设置###
 log4j.rootLogger = debug,stdout
 ### 输出信息到控制抬 ###
 log4j.appender.stdout = org.apache.log4j.ConsoleAppender
 log4j.appender.stdout.Target = System.out
 log4j.appender.stdout.layout = org.apache.log4j.PatternLayout
 log4j.appender.stdout.layout.ConversionPattern = [%-5p] %d{yyyy-MM-dd HH:mm:ss,SSS} method:%l%n%m%n
编写spring 配置文件

spring.xml

XML 复制代码
 <?xml version="1.0" encoding="UTF-8"?>
 ​
 <beans xmlns="http://www.springframework.org/schema/beans"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:context="http://www.springframework.org/schema/context"
        xmlns:tx="http://www.springframework.org/schema/tx"
        xmlns:aop="http://www.springframework.org/schema/aop"
        xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context-3.0.xsd
        http://www.springframework.org/schema/tx
        http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
         http://www.springframework.org/schema/aop
        http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
 ">
       <!--spring 加载 db.properties -->
        <context:property-placeholder location="classpath:db.properties"/>
        <!-- 第一步   spring 管理 数据源 (以前mybatis自己管理)  -->
        <bean id="ds" class="com.alibaba.druid.pool.DruidDataSource"  >
            <property name="driverClassName" value="${driver}"/>
            <property name="url" value="${url}"/>
            <property name="username" value="${uname}"/>
            <property name="password" value="${password}"/>
         </bean>
       <!-- 第二步      将mybatis中 SqlSessionFactory 交由 spring-->
        <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
            <!--配置数据源属性-->
            <property name="dataSource"  ref="ds"/>
            <!-- 单独写了 mybatis的配置文件 , 使用以下方式引入 -->
            <property name="configLocation" value="classpath:mybatis.xml"/>
             <!-- 配置 mybatis 中的 别名 -->
            <property name="typeAliasesPackage" value="entity"/>
            <!--配置 mybatis 中的 映射器-->
            <property name="mapperLocations" value="classpath:mapper/*.xml"/>
            <!--配置分页mybati 插件-->
            <property name="plugins">
                <array>
                    <bean class="com.github.pagehelper.PageInterceptor">
                        <property name="properties">
                            <!--使用下面的方式配置参数,一行配置一个 -->
                            <value>
                                helperDialect=mysql
                                reasonable=true
                            </value>
                        </property>
                    </bean>
                </array>
            </property>
        </bean>
     <!--第三步  配置 mapper 的扫描-->
        <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
            <!--配置 sqlSessionFactoryBeanName -->
            <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
            <!-- 配置 扫描 mapper-->
            <property name="basePackage" value="mapper"/>
        </bean>
        <!--扫描 service 包 , 因为 我们会对 service 做 事务管理-->
        <context:component-scan base-package="service"/>
 ​
 ​
     <!-- 配置 文件 上传 需要 解析器-->
        <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
            <!--设置 最大上传 为10M -->
            <property name="maxUploadSize" value="10240000000" />
            <!--默认编码为 utf-8 处理中文-->
            <property name="defaultEncoding" value="utf-8"/>
        </bean>
 ​
 ​
     <!--配置 事务 -->
      <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
          <!--配置数据源-->
          <property name="dataSource" ref="ds"/>
      </bean>
 ​
     <!-- 使用 tx 之前 先 引入 命名空间  tx-->
     <tx:advice id="txAdvice" transaction-manager="transactionManager">
         <tx:attributes>
             <tx:method name="insert*" propagation="REQUIRED"/>
             <tx:method name="save*" propagation="REQUIRED"/>
             <tx:method name="create*" propagation="REQUIRED"/>
             <tx:method name="add*" propagation="REQUIRED"/>
             <tx:method name="update*" propagation="REQUIRED"/>
             <tx:method name="delete*" propagation="REQUIRED"/>
             <tx:method name="del*" propagation="REQUIRED"/>
             <tx:method name="select*" propagation="SUPPORTS" read-only="true"/>
             <tx:method name="find*" propagation="SUPPORTS" read-only="true"/>
             <tx:method name="search*" propagation="SUPPORTS" read-only="true"/>
             <tx:method name="query*" propagation="SUPPORTS" read-only="true"/>
         </tx:attributes>
     </tx:advice>
 ​
     <!--定义切面, 应用 通知-->
     <aop:config>
         <aop:advisor advice-ref="txAdvice"
                      pointcut="execution(* service.*.*(..))"/>
     </aop:config>
 ​
 ​
 ​
 ​
 </beans>
编写 springmvc 配置文件

springmvc.xml

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-3.0.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context-3.0.xsd http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd">
 ​
     <!--扫描 controller 包 -->
     <context:component-scan base-package="controller"/>
     <!--配置  视图 解析器-->
     <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
         <!--前缀-->
         <property name="prefix" value="/WEB-INF/"/>
         <!--后缀-->
         <property name="suffix" value=".jsp"/>
     </bean>
     <mvc:annotation-driven/>
 </beans>
编写mybatis配置文件

如果 mybatis 里面什么也 没有,可以 不配置改文件

XML 复制代码
 <?xml version="1.0" encoding="UTF-8" ?>
 <!DOCTYPE configuration
         PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
         "http://mybatis.org/dtd/mybatis-3-config.dtd">
 <configuration>
 ​
     <settings>
         <!--增加 日志的输出  这样 控制台 就可以看到 sql-->
         <setting name="logImpl" value="LOG4J"/>
     </settings>
 ​
 </configuration>
编写web.xml 文件
XML 复制代码
 <?xml version="1.0" encoding="UTF-8"?>
 ​
 <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
           http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
          version="4.0" metadata-complete="false">
 ​
   <display-name>Archetype Created Web Application</display-name>
   <!-- 加载 spring 配置文件  -->
   <context-param>
     <param-name>contextConfigLocation</param-name>
     <param-value>classpath:spring.xml</param-value>
   </context-param>
   <!--  监听器 -->
   <listener>
     <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
   </listener>
 ​
   <!--过滤器 处理中文-->
   <filter>
     <filter-name>encodingFilter</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>encodingFilter</filter-name>
     <url-pattern>/*</url-pattern>
   </filter-mapping>
 ​
 ​
 ​
   <!-- 配置 springmvc的 DispatcherServlet-->
   <servlet>
     <servlet-name>springmvc</servlet-name>
     <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
     <!--配置 初始化 参数 ,自动加载 springmvc.xml-->
     <init-param>
       <param-name>contextConfigLocation</param-name>
       <param-value>classpath:springmvc.xml</param-value>
     </init-param>
   </servlet>
   <servlet-mapping>
     <servlet-name>springmvc</servlet-name>
     <url-pattern>/</url-pattern>
   </servlet-mapping>
 </web-app>
 ​
编写需求功能(这里以部门为例)
分页查询
编写mapper 接口 DepartmentMapper.java
复制代码
    ```java
    
        List<Department> findAll();
     
    ```
编写mapper的xml 文件DepartmentMapper.xml
复制代码
 ​
     <select id="findAll" resultType="department" >
 ​
         select * from department
     </select>

编写 service及实现类

DepService.java

复制代码
  List<Department> findAll();

DepServiceImpl.java

java 复制代码
 @Service
 public class DepServiceImpl  implements DepService {
 ​
 ​
     @Autowired
     private DepartmentMapper departmentMapper;
 ​
 ​
     @Override
     public List<Department> findAll() {
         return departmentMapper.findAll();
     }
 ​
 }
 ​

编写 controller

java 复制代码
 @Controller
 public class DepController {
 ​
     @Autowired
     private DepService depService;
 ​
     private  final int PAGESIZE=3; // 定义 每页显示的 条数
     
      /**
      * 分页查询
      * @return
      */
     @RequestMapping("/page")
     public String pageList(int current,Model model){
      //判断页码
      if(current==0){
          current =1; // 从第一页开始
      }
     // 分页处理
      PageHelper.startPage(current,PAGESIZE);
      // 获得全部数据
      List<Department> list = depService.searchInfo();
      // 创建 PageInfo 对象
      PageInfo<Department> pageInfo = new PageInfo<>(list);
      // 将 数据返回到 jsp
       model.addAttribute("pageInfo",pageInfo);
 ​
       return "listPage";
     }
 ​
 ​
 }

编写jsp页面

任意jsp页面

复制代码
 <a href="/page?current=1"> 点我 分页查询 部门信息</a>

listPage.jsp

复制代码
 ​
html 复制代码
 <%@ page contentType="text/html;charset=UTF-8" language="java"  isELIgnored="false" %>
 <%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
 <html>
 <head>
     <title>部门列表----分页查询</title>
 </head>
 <body>
   <h2>部门名称                部门主管 </h2>
    <ul>
 ​
     <c:if test="${pageInfo.list !=null && pageInfo.list.size()>0 }">
           <c:forEach items="${pageInfo.list}" var="dep" >
               <li>
                   ${dep.depName}  -  ${dep.depEmpName}
               </li>
 ​
           </c:forEach>
 ​
      </c:if>
    </ul>
 ​
   <div>
 ​
       <c:if test="${pageInfo.isFirstPage}">
       <%--   <a href="javascript:void(0)" disabled="disabled" >上一页</a>--%>
           <button disabled >上一页</button>
       </c:if>
       <c:if test="${! pageInfo.isFirstPage}">
         <%--  <a href="/page?current=${pageInfo.pageNum-1}">上一页</a>--%>
           <button onclick="window.location.href='/page?current=${pageInfo.pageNum-1}'" >上一页</button>
       </c:if>
 ​
 ​
       <c:if test="${pageInfo.isLastPage}">
         <%--  <a href="javascript:void(0)" disabled="disabled" >下一页</a>--%>
           <button disabled >下一页</button>
       </c:if>
       <c:if test="${! pageInfo.isLastPage}">
          <%-- <a href="/page?current=${pageInfo.pageNum+1}">下一页</a>--%>
           <button onclick="window.location.href='/page?current=${pageInfo.pageNum+1}'" >下一页</button>
       </c:if>
 ​
        共${pageInfo.pages} 页 ,当前是 第${pageInfo.pageNum}页
 ​
   </div>
 </body>
 </html>
复制代码
 ​
相关推荐
冒泡的肥皂1 小时前
MVCC初学demo(一
数据库·后端·mysql
.Shu.2 小时前
Redis Reactor 模型详解【基本架构、事件循环机制、结合源码详细追踪读写请求从客户端连接到命令执行的完整流程】
数据库·redis·架构
薛晓刚4 小时前
当MySQL的int不够用了
数据库
SelectDB技术团队5 小时前
Apache Doris 在菜鸟的大规模湖仓业务场景落地实践
数据库·数据仓库·数据分析·apache doris·菜鸟技术
星空下的曙光5 小时前
mysql 命令语法操作篇 数据库约束有哪些 怎么使用
数据库·mysql
小楓12015 小时前
MySQL數據庫開發教學(一) 基本架構
数据库·后端·mysql
染落林间色5 小时前
达梦数据库-实时主备集群部署详解(附图文)手工搭建一主一备数据守护集群DW
数据库·sql
颜颜yan_6 小时前
企业级时序数据库选型指南:从传统架构向智能时序数据管理的转型之路
数据库·架构·时序数据库
lichenyang4536 小时前
管理项目服务器连接数据库
数据库·后端
沙振宇6 小时前
【数据库】通过‌phpMyAdmin‌管理Mysql数据
数据库·mysql