Spring+SpringMVC+MyBatis 整合

396056737 8年前
   <p>Spring+SpringMVC+MyBatis(SSM)在我们项目中是经常用到的,这篇文章主要讲解使用Intellij IDEA整合SSM,具体环境如下:</p>    <ul>     <li>数据库:MySQL5.7</li>     <li>依赖管理:Maven</li>     <li>IDE:Intellij IDEA</li>     <li>JDK:1.8</li>     <li>服务器:Tomcat 9</li>    </ul>    <p>首先用Intellij IDEA创建Maven项目,如果还不知道怎么创建的朋友可以先去百度谷歌,网上很多这种教程,这里我主要讲解SSM整合的过程,项目目录结构如下:</p>    <p style="text-align:center"><img src="https://simg.open-open.com/show/bd6cb539239864eef09eed74d4ee5f7f.png"></p>    <h2>1.创建表,插入数据</h2>    <pre>  <code class="language-java">CREATE TABLE user (    id       INTEGER PRIMARY KEY AUTO_INCREMENT,    name     CHAR(20) NOT NULL,    password CHAR(40) NOT NULL  )    ENGINE = InnoDB    AUTO_INCREMENT = 16    DEFAULT CHARSET = utf8;</code></pre>    <pre>  <code class="language-java">INSERT INTO user (id,name, password) VALUES (1,'A', '123');  INSERT INTO user (id,name, password) VALUES (2,'B', '456');</code></pre>    <h2>2.添加Maven依赖</h2>    <pre>  <code class="language-java"><?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.demo</groupId>      <artifactId>SSM</artifactId>      <version>1.0-SNAPSHOT</version>      <packaging>war</packaging>      <name>SSM</name>      <description/>        <properties>          <spring.version>4.3.4.RELEASE</spring.version>          <mybatis.version>3.4.2</mybatis.version>          <log4j.version>2.7</log4j.version>          <junit.version>4.12</junit.version>          <driver.version>5.1.40</driver.version>      </properties>        <dependencies>          <!--Spring start-->          <dependency>              <groupId>org.springframework</groupId>              <artifactId>spring-core</artifactId>              <version>${spring.version}</version>          </dependency>            <dependency>              <groupId>org.springframework</groupId>              <artifactId>spring-context</artifactId>              <version>${spring.version}</version>          </dependency>            <dependency>              <groupId>org.springframework</groupId>              <artifactId>spring-web</artifactId>              <version>${spring.version}</version>          </dependency>            <dependency>              <groupId>org.springframework</groupId>              <artifactId>spring-webmvc</artifactId>              <version>${spring.version}</version>          </dependency>            <dependency>              <groupId>org.springframework</groupId>              <artifactId>spring-jdbc</artifactId>              <version>${spring.version}</version>          </dependency>            <!--绑定XML-->          <dependency>              <groupId>org.springframework</groupId>              <artifactId>spring-oxm</artifactId>              <version>${spring.version}</version>          </dependency>            <dependency>              <groupId>org.springframework</groupId>              <artifactId>spring-test</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>          <!--Spring end-->            <!--AOP start-->          <dependency>              <groupId>aopalliance</groupId>              <artifactId>aopalliance</artifactId>              <version>1.0</version>          </dependency>            <dependency>              <groupId>org.aspectj</groupId>              <artifactId>aspectjweaver</artifactId>              <version>1.8.10</version>          </dependency>          <!--AOP end-->            <!--文件上传start-->          <dependency>              <groupId>commons-fileupload</groupId>              <artifactId>commons-fileupload</artifactId>              <version>1.3.2</version>          </dependency>          <!--文件上传end-->            <!--json start-->          <dependency>              <groupId>com.fasterxml.jackson.core</groupId>              <artifactId>jackson-core</artifactId>              <version>2.8.4</version>          </dependency>            <dependency>              <groupId>com.fasterxml.jackson.core</groupId>              <artifactId>jackson-databind</artifactId>              <version>2.8.4</version>          </dependency>          <!--json end-->            <!--mybatis start-->          <dependency>              <groupId>org.mybatis</groupId>              <artifactId>mybatis</artifactId>              <version>3.4.2</version>          </dependency>            <dependency>              <groupId>org.mybatis</groupId>              <artifactId>mybatis-spring</artifactId>              <version>1.3.1</version>          </dependency>          <!--mybatis end-->            <!--log start-->          <dependency>              <groupId>org.apache.logging.log4j</groupId>              <artifactId>log4j-core</artifactId>              <version>${log4j.version}</version>          </dependency>          <!--log end-->            <!--单元测试start-->          <dependency>              <groupId>junit</groupId>              <artifactId>junit</artifactId>              <version>${junit.version}</version>          </dependency>          <!--单元测试end-->            <!--数据库驱动start-->          <dependency>              <groupId>mysql</groupId>              <artifactId>mysql-connector-java</artifactId>              <version>5.1.40</version>          </dependency>          <!--数据库驱动end-->            <!--druid start-->          <dependency>              <groupId>com.alibaba</groupId>              <artifactId>druid</artifactId>              <version>1.0.29</version>          </dependency>          <!--druid end-->      </dependencies>        <build>          <plugins>              <plugin>                  <groupId>org.apache.maven.plugins</groupId>                  <artifactId>maven-compiler-plugin</artifactId>                  <version>3.6.1</version>                  <configuration>                      <source>1.8</source>                      <target>1.8</target>                  </configuration>              </plugin>                <!--MBG-->              <plugin>                  <groupId>org.mybatis.generator</groupId>                  <artifactId>mybatis-generator-maven-plugin</artifactId>                  <version>1.3.5</version>                  <configuration>                      <verbose>true</verbose>                      <overwrite>true</overwrite>                  </configuration>              </plugin>          </plugins>      </build>    </project></code></pre>    <p>代码都加了注释,很容易看懂。需要说一下的是MBG,全称是MyBatis Generator,是一个生成MyBatis代码的插件,后面会用到。具体可以看看 <a href="/misc/goto?guid=4959667280574423812" rel="nofollow,noindex">MyBatis Generator官方文档</a></p>    <h2>3.配置文件</h2>    <h3>3.1 Mybatis配置文件mybatis-config.xml</h3>    <pre>  <code class="language-java"><?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>    </configuration></code></pre>    <h3>3.2 数据库配置文件database.properties</h3>    <pre>  <code class="language-java">db.driver=com.mysql.jdbc.Driver  db.url=jdbc:mysql://localhost:3306/mybatis?characterEncoding=UTF-8  db.user=root  db.password=123456  db.maxActive=10  db.initialSize=2  db.minIdle=2  db.maxWait=60000  db.timeBetweenEvictionRunsMillis=3000  db.minEvictableIdleTimeMillis=300000  db.validationQuery=SELECT 'x' FROM DUAL  db.testWhileIdle=true  db.testOnBorrow=false  db.testOnReturn=false</code></pre>    <h3>3.3 Spring配置文件application.xml</h3>    <pre>  <code class="language-java"><?xml version="1.0" encoding="UTF-8"?>  <beans xmlns="http://www.springframework.org/schema/beans"         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"         xsi:schemaLocation="http://www.springframework.org/schema/beans         http://www.springframework.org/schema/beans/spring-beans.xsd">        <import resource="classpath:spring/spring-mybatis.xml"/>    </beans></code></pre>    <p>这里为了方便项目扩展,用import标签引入另一个配置文件spring-mybatis.xml</p>    <pre>  <code class="language-java"><?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:tx="http://www.springframework.org/schema/tx"         xmlns:context="http://www.springframework.org/schema/context"         xsi:schemaLocation="http://www.springframework.org/schema/beans         http://www.springframework.org/schema/beans/spring-beans.xsd         http://www.springframework.org/schema/tx         http://www.springframework.org/schema/tx/spring-tx.xsd         http://www.springframework.org/schema/context         http://www.springframework.org/schema/context/spring-context.xsd">        <context:property-placeholder location="classpath:properties/database.properties"/>        <!--数据源配置-->      <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close">          <!--驱动-->          <property name="driverClassName" value="${db.driver}"/>          <!-- 数据库地址 -->          <property name="url" value="${db.url}"/>          <!-- 用户名 -->          <property name="username" value="${db.user}"/>          <!-- 密码 -->          <property name="password" value="${db.password}"/>          <!-- 最大连接池数量 -->          <property name="maxActive" value="${db.maxActive}"/>          <!-- 初始化物理连接个数 -->          <property name="initialSize" value="${db.initialSize}"/>          <!-- 最小连接池数量 -->          <property name="minIdle" value="${db.minIdle}"/>          <!-- 最大等待时间 -->          <property name="maxWait" value="${db.maxWait}"/>          <property name="timeBetweenEvictionRunsMillis" value="${db.timeBetweenEvictionRunsMillis}"/>          <property name="minEvictableIdleTimeMillis" value="${db.minEvictableIdleTimeMillis}"/>          <!-- 检测连接是否有效的SQL -->          <property name="validationQuery" value="${db.validationQuery}"/>          <property name="testWhileIdle" value="${db.testWhileIdle}"/>          <!-- 申请连接时是否执行validationQuery -->          <property name="testOnBorrow" value="${db.testOnBorrow}"/>          <!-- 归还连接时是否执行validationQuery -->          <property name="testOnReturn" value="${db.testOnReturn}"/>      </bean>        <!-- 配置Mybatis的文件 ,mapperLocations配置**Mapper.xml文件位置,configLocation配置mybatis-config文件位置-->      <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">          <property name="dataSource" ref="dataSource"/>          <property name="mapperLocations" value="classpath:mapper/*.xml"/>          <property name="configLocation" value="classpath:mybatis/mybatis-config.xml"/>      </bean>        <!-- 自动扫描了所有的XxxxMapper.xml对应的mapper接口文件,这样就不用一个一个手动配置Mpper的映射了,             只要Mapper接口类和Mapper映射文件对应起来就可以了 -->      <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">          <property name="basePackage" value="com.demo.dao"/>          <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>      </bean>        <!-- 事物管理器 -->      <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">          <property name="dataSource" ref="dataSource"/>      </bean>        <tx:annotation-driven transaction-manager="transactionManager"/>  </beans></code></pre>    <h3>3.4 SpringMVC配置文件spring-mvc.xml</h3>    <pre>  <code class="language-java"><?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:mvc="http://www.springframework.org/schema/mvc"         xmlns:context="http://www.springframework.org/schema/context"         xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">        <!-- 注解的支持,可以将请求参数绑定到控制器参数-->      <mvc:annotation-driven/>        <!--注解扫描-->      <context:component-scan base-package="com.demo.controller"/>      <context:component-scan base-package="com.demo.serviceImpl"/>        <!--静态资源处理,mapping:匹配URL,location:静态资源在WebApp中的位置-->      <mvc:resources mapping="/common/**" location="/common/"/>      <mvc:resources mapping="/css/**" location="/css/"/>      <mvc:resources mapping="/image/**" location="/image/"/>      <mvc:resources mapping="/js/**" location="/js/"/>        <!-- 注解的映射器 -->      <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"/>        <!-- 注解的适配器 -->      <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"/>        <!-- 视图解析器 -->      <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">          <property name="contentType" value="text/html"/>          <property name="prefix" value="/jsp/"/>          <property name="suffix" value=".jsp"/>      </bean>        <!--上传文件配置-->      <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">          <!-- 默认编码 -->          <property name="defaultEncoding" value="UTF-8"/>          <!-- 启用是为了推迟文件解析,以便捕获文件大小异常 -->          <property name="resolveLazily" value="true"/>          <!-- 文件大小最大值 -->          <property name="maxUploadSize" value="209715200"/>          <!-- 内存中的最大值 -->          <property name="maxInMemorySize" value="40960"/>      </bean>    </beans></code></pre>    <h3>3.5 log4j配置文件log4j.xml</h3>    <pre>  <code class="language-java"><?xml version="1.0" encoding="UTF-8"?>  <Configuration status="WARN">      <Appenders>          <Console name="Console" target="SYSTEM_OUT">              <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" />          </Console>      </Appenders>      <Loggers>          <Root level="debug">              <AppenderRef ref="Console" />          </Root>      </Loggers>  </Configuration></code></pre>    <h3>3.6 MyBatis Generator配置文件generatorConfig.xml</h3>    <pre>  <code class="language-java"><?xml version="1.0" encoding="UTF-8"?>  <!DOCTYPE generatorConfiguration          PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"          "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">    <generatorConfiguration>      <!--数据库驱动-->      <classPathEntry              location="C:/Users/Administrator/.m2/repository/mysql/mysql-connector-java/5.1.40/mysql-connector-java-5.1.40.jar"/>        <context id="mybatis" targetRuntime="MyBatis3">          <!-- 防止生成的代码中有很多注释-->          <commentGenerator>              <property name="suppressAllComments" value="true"/>              <property name="suppressDate" value="true"/>          </commentGenerator>            <jdbcConnection driverClass="com.mysql.jdbc.Driver"                          connectionURL="jdbc:mysql://localhost:3306/mybatis"                          userId="root"                          password="199498xy">          </jdbcConnection>            <!--Java类型解析器不应该强制型对象字段BigDecimal的使用,此功能是为了使数据库DECIMAL和NUMERIC列容易处理-->          <javaTypeResolver>              <property name="forceBigDecimals" value="false"/>          </javaTypeResolver>            <!--生成Model类存放位置-->          <javaModelGenerator targetPackage="com.demo.bean" targetProject="E:/workspace/java/project/SSM/src/main/java">              <property name="enableSubPackages" value="true"/>              <property name="trimStrings" value="true"/>          </javaModelGenerator>            <!--生成映射文件存放位置-->          <sqlMapGenerator targetPackage="mapper" targetProject="E:/workspace/java/project/SSM/src/main/resources">              <property name="enableSubPackages" value="true"/>          </sqlMapGenerator>            <!--生成Dao类存放位置-->          <javaClientGenerator type="XMLMAPPER" targetPackage="com.demo.dao" targetProject="E:/workspace/java/project/SSM/src/main/java">              <property name="enableSubPackages" value="true"/>          </javaClientGenerator>            <!--生成对应表及类名-->          <table tableName="user" domainObjectName="User"/>        </context>  </generatorConfiguration></code></pre>    <p>命令行运行maven命令</p>    <pre>  <code class="language-java">mvn mybatis-generator:generate</code></pre>    <p>生成User表的Mapper.xml文件、bean和对应的接口,bean和接口下面会说到</p>    <pre>  <code class="language-java"><?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="com.demo.dao.UserMapper">    <resultMap id="BaseResultMap" type="com.demo.bean.User">      <id column="id" jdbcType="INTEGER" property="id" />      <result column="name" jdbcType="CHAR" property="name" />      <result column="password" jdbcType="CHAR" property="password" />    </resultMap>    <sql id="Example_Where_Clause">      <where>        <foreach collection="oredCriteria" item="criteria" separator="or">          <if test="criteria.valid">            <trim prefix="(" prefixOverrides="and" suffix=")">              <foreach collection="criteria.criteria" item="criterion">                <choose>                  <when test="criterion.noValue">                    and ${criterion.condition}                  </when>                  <when test="criterion.singleValue">                    and ${criterion.condition} #{criterion.value}                  </when>                  <when test="criterion.betweenValue">                    and ${criterion.condition} #{criterion.value} and #{criterion.secondValue}                  </when>                  <when test="criterion.listValue">                    and ${criterion.condition}                    <foreach close=")" collection="criterion.value" item="listItem" open="(" separator=",">                      #{listItem}                    </foreach>                  </when>                </choose>              </foreach>            </trim>          </if>        </foreach>      </where>    </sql>    <sql id="Update_By_Example_Where_Clause">      <where>        <foreach collection="example.oredCriteria" item="criteria" separator="or">          <if test="criteria.valid">            <trim prefix="(" prefixOverrides="and" suffix=")">              <foreach collection="criteria.criteria" item="criterion">                <choose>                  <when test="criterion.noValue">                    and ${criterion.condition}                  </when>                  <when test="criterion.singleValue">                    and ${criterion.condition} #{criterion.value}                  </when>                  <when test="criterion.betweenValue">                    and ${criterion.condition} #{criterion.value} and #{criterion.secondValue}                  </when>                  <when test="criterion.listValue">                    and ${criterion.condition}                    <foreach close=")" collection="criterion.value" item="listItem" open="(" separator=",">                      #{listItem}                    </foreach>                  </when>                </choose>              </foreach>            </trim>          </if>        </foreach>      </where>    </sql>    <sql id="Base_Column_List">      id, name, password    </sql>    <select id="selectByExample" parameterType="com.demo.bean.UserExample" resultMap="BaseResultMap">      select      <if test="distinct">        distinct      </if>      <include refid="Base_Column_List" />      from user      <if test="_parameter != null">        <include refid="Example_Where_Clause" />      </if>      <if test="orderByClause != null">        order by ${orderByClause}      </if>    </select>    <select id="selectByPrimaryKey" parameterType="java.lang.Integer" resultMap="BaseResultMap">      select       <include refid="Base_Column_List" />      from user      where id = #{id,jdbcType=INTEGER}    </select>    <delete id="deleteByPrimaryKey" parameterType="java.lang.Integer">      delete from user      where id = #{id,jdbcType=INTEGER}    </delete>    <delete id="deleteByExample" parameterType="com.demo.bean.UserExample">      delete from user      <if test="_parameter != null">        <include refid="Example_Where_Clause" />      </if>    </delete>    <insert id="insert" parameterType="com.demo.bean.User">      insert into user (id, name, password)      values (#{id,jdbcType=INTEGER}, #{name,jdbcType=CHAR}, #{password,jdbcType=CHAR})    </insert>    <insert id="insertSelective" parameterType="com.demo.bean.User">      insert into user      <trim prefix="(" suffix=")" suffixOverrides=",">        <if test="id != null">          id,        </if>        <if test="name != null">          name,        </if>        <if test="password != null">          password,        </if>      </trim>      <trim prefix="values (" suffix=")" suffixOverrides=",">        <if test="id != null">          #{id,jdbcType=INTEGER},        </if>        <if test="name != null">          #{name,jdbcType=CHAR},        </if>        <if test="password != null">          #{password,jdbcType=CHAR},        </if>      </trim>    </insert>    <select id="countByExample" parameterType="com.demo.bean.UserExample" resultType="java.lang.Long">      select count(*) from user      <if test="_parameter != null">        <include refid="Example_Where_Clause" />      </if>    </select>    <update id="updateByExampleSelective" parameterType="map">      update user      <set>        <if test="record.id != null">          id = #{record.id,jdbcType=INTEGER},        </if>        <if test="record.name != null">          name = #{record.name,jdbcType=CHAR},        </if>        <if test="record.password != null">          password = #{record.password,jdbcType=CHAR},        </if>      </set>      <if test="_parameter != null">        <include refid="Update_By_Example_Where_Clause" />      </if>    </update>    <update id="updateByExample" parameterType="map">      update user      set id = #{record.id,jdbcType=INTEGER},        name = #{record.name,jdbcType=CHAR},        password = #{record.password,jdbcType=CHAR}      <if test="_parameter != null">        <include refid="Update_By_Example_Where_Clause" />      </if>    </update>    <update id="updateByPrimaryKeySelective" parameterType="com.demo.bean.User">      update user      <set>        <if test="name != null">          name = #{name,jdbcType=CHAR},        </if>        <if test="password != null">          password = #{password,jdbcType=CHAR},        </if>      </set>      where id = #{id,jdbcType=INTEGER}    </update>    <update id="updateByPrimaryKey" parameterType="com.demo.bean.User">      update user      set name = #{name,jdbcType=CHAR},        password = #{password,jdbcType=CHAR}      where id = #{id,jdbcType=INTEGER}    </update>  </mapper></code></pre>    <h3>3.7 web配置文件web.xml</h3>    <pre>  <code class="language-java"><?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_3_1.xsd"           version="3.1">        <!-- 起始欢迎界面 -->      <welcome-file-list>          <welcome-file>index.jsp</welcome-file>      </welcome-file-list>        <!-- 错误跳转页面 -->      <error-page>          <!-- 路径不正确 -->          <error-code>404</error-code>          <location>/error/404.jsp</location>      </error-page>        <error-page>          <!-- 没有访问权限,访问被禁止 -->          <error-code>405</error-code>          <location>/error/405.jsp</location>      </error-page>        <error-page>          <!-- 内部错误 -->          <error-code>500</error-code>          <location>/error/500.jsp</location>      </error-page>        <context-param>          <param-name>contextConfigLocation</param-name>          <param-value>classpath:application.xml</param-value>      </context-param>        <!-- Spring字符集过滤器 -->      <filter>          <filter-name>SpringEncodingFilter</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>          <init-param>              <param-name>forceEncoding</param-name>              <param-value>true</param-value>          </init-param>      </filter>        <filter-mapping>          <filter-name>SpringEncodingFilter</filter-name>          <url-pattern>/*</url-pattern>      </filter-mapping>        <listener>          <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>      </listener>        <servlet>          <servlet-name>dispatcher</servlet-name>          <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>          <init-param>              <param-name>contextConfigLocation</param-name>              <param-value>classpath:spring/spring-mvc.xml</param-value>          </init-param>          <load-on-startup>1</load-on-startup>      </servlet>        <servlet-mapping>          <servlet-name>dispatcher</servlet-name>          <url-pattern>/</url-pattern>      </servlet-mapping>    </web-app></code></pre>    <h3>4.接口和类</h3>    <h3>4.1 com.demo.bean下的User.java和UserExample.java</h3>    <p>这两个类是由MBG生成的</p>    <pre>  <code class="language-java">package com.demo.bean;    public class User {      private Integer id;        private String name;        private String password;        public Integer getId() {          return id;      }        public void setId(Integer id) {          this.id = id;      }        public String getName() {          return name;      }        public void setName(String name) {          this.name = name == null ? null : name.trim();      }        public String getPassword() {          return password;      }        public void setPassword(String password) {          this.password = password == null ? null : password.trim();      }  }</code></pre>    <p>Example类用于构造复杂的筛选条件</p>    <pre>  <code class="language-java">package com.demo.bean;    import java.util.ArrayList;  import java.util.List;    public class UserExample {      protected String orderByClause;        protected boolean distinct;        protected List<Criteria> oredCriteria;        public UserExample() {          oredCriteria = new ArrayList<Criteria>();      }        public void setOrderByClause(String orderByClause) {          this.orderByClause = orderByClause;      }        public String getOrderByClause() {          return orderByClause;      }        public void setDistinct(boolean distinct) {          this.distinct = distinct;      }        public boolean isDistinct() {          return distinct;      }        public List<Criteria> getOredCriteria() {          return oredCriteria;      }        public void or(Criteria criteria) {          oredCriteria.add(criteria);      }        public Criteria or() {          Criteria criteria = createCriteriaInternal();          oredCriteria.add(criteria);          return criteria;      }        public Criteria createCriteria() {          Criteria criteria = createCriteriaInternal();          if (oredCriteria.size() == 0) {              oredCriteria.add(criteria);          }          return criteria;      }        protected Criteria createCriteriaInternal() {          Criteria criteria = new Criteria();          return criteria;      }        public void clear() {          oredCriteria.clear();          orderByClause = null;          distinct = false;      }        protected abstract static class GeneratedCriteria {          protected List<Criterion> criteria;            protected GeneratedCriteria() {              super();              criteria = new ArrayList<Criterion>();          }            public boolean isValid() {              return criteria.size() > 0;          }            public List<Criterion> getAllCriteria() {              return criteria;          }            public List<Criterion> getCriteria() {              return criteria;          }            protected void addCriterion(String condition) {              if (condition == null) {                  throw new RuntimeException("Value for condition cannot be null");              }              criteria.add(new Criterion(condition));          }            protected void addCriterion(String condition, Object value, String property) {              if (value == null) {                  throw new RuntimeException("Value for " + property + " cannot be null");              }              criteria.add(new Criterion(condition, value));          }            protected void addCriterion(String condition, Object value1, Object value2, String property) {              if (value1 == null || value2 == null) {                  throw new RuntimeException("Between values for " + property + " cannot be null");              }              criteria.add(new Criterion(condition, value1, value2));          }            public Criteria andIdIsNull() {              addCriterion("id is null");              return (Criteria) this;          }            public Criteria andIdIsNotNull() {              addCriterion("id is not null");              return (Criteria) this;          }            public Criteria andIdEqualTo(Integer value) {              addCriterion("id =", value, "id");              return (Criteria) this;          }            public Criteria andIdNotEqualTo(Integer value) {              addCriterion("id <>", value, "id");              return (Criteria) this;          }            public Criteria andIdGreaterThan(Integer value) {              addCriterion("id >", value, "id");              return (Criteria) this;          }            public Criteria andIdGreaterThanOrEqualTo(Integer value) {              addCriterion("id >=", value, "id");              return (Criteria) this;          }            public Criteria andIdLessThan(Integer value) {              addCriterion("id <", value, "id");              return (Criteria) this;          }            public Criteria andIdLessThanOrEqualTo(Integer value) {              addCriterion("id <=", value, "id");              return (Criteria) this;          }            public Criteria andIdIn(List<Integer> values) {              addCriterion("id in", values, "id");              return (Criteria) this;          }            public Criteria andIdNotIn(List<Integer> values) {              addCriterion("id not in", values, "id");              return (Criteria) this;          }            public Criteria andIdBetween(Integer value1, Integer value2) {              addCriterion("id between", value1, value2, "id");              return (Criteria) this;          }            public Criteria andIdNotBetween(Integer value1, Integer value2) {              addCriterion("id not between", value1, value2, "id");              return (Criteria) this;          }            public Criteria andNameIsNull() {              addCriterion("name is null");              return (Criteria) this;          }            public Criteria andNameIsNotNull() {              addCriterion("name is not null");              return (Criteria) this;          }            public Criteria andNameEqualTo(String value) {              addCriterion("name =", value, "name");              return (Criteria) this;          }            public Criteria andNameNotEqualTo(String value) {              addCriterion("name <>", value, "name");              return (Criteria) this;          }            public Criteria andNameGreaterThan(String value) {              addCriterion("name >", value, "name");              return (Criteria) this;          }            public Criteria andNameGreaterThanOrEqualTo(String value) {              addCriterion("name >=", value, "name");              return (Criteria) this;          }            public Criteria andNameLessThan(String value) {              addCriterion("name <", value, "name");              return (Criteria) this;          }            public Criteria andNameLessThanOrEqualTo(String value) {              addCriterion("name <=", value, "name");              return (Criteria) this;          }            public Criteria andNameLike(String value) {              addCriterion("name like", value, "name");              return (Criteria) this;          }            public Criteria andNameNotLike(String value) {              addCriterion("name not like", value, "name");              return (Criteria) this;          }            public Criteria andNameIn(List<String> values) {              addCriterion("name in", values, "name");              return (Criteria) this;          }            public Criteria andNameNotIn(List<String> values) {              addCriterion("name not in", values, "name");              return (Criteria) this;          }            public Criteria andNameBetween(String value1, String value2) {              addCriterion("name between", value1, value2, "name");              return (Criteria) this;          }            public Criteria andNameNotBetween(String value1, String value2) {              addCriterion("name not between", value1, value2, "name");              return (Criteria) this;          }            public Criteria andPasswordIsNull() {              addCriterion("password is null");              return (Criteria) this;          }            public Criteria andPasswordIsNotNull() {              addCriterion("password is not null");              return (Criteria) this;          }            public Criteria andPasswordEqualTo(String value) {              addCriterion("password =", value, "password");              return (Criteria) this;          }            public Criteria andPasswordNotEqualTo(String value) {              addCriterion("password <>", value, "password");              return (Criteria) this;          }            public Criteria andPasswordGreaterThan(String value) {              addCriterion("password >", value, "password");              return (Criteria) this;          }            public Criteria andPasswordGreaterThanOrEqualTo(String value) {              addCriterion("password >=", value, "password");              return (Criteria) this;          }            public Criteria andPasswordLessThan(String value) {              addCriterion("password <", value, "password");              return (Criteria) this;          }            public Criteria andPasswordLessThanOrEqualTo(String value) {              addCriterion("password <=", value, "password");              return (Criteria) this;          }            public Criteria andPasswordLike(String value) {              addCriterion("password like", value, "password");              return (Criteria) this;          }            public Criteria andPasswordNotLike(String value) {              addCriterion("password not like", value, "password");              return (Criteria) this;          }            public Criteria andPasswordIn(List<String> values) {              addCriterion("password in", values, "password");              return (Criteria) this;          }            public Criteria andPasswordNotIn(List<String> values) {              addCriterion("password not in", values, "password");              return (Criteria) this;          }            public Criteria andPasswordBetween(String value1, String value2) {              addCriterion("password between", value1, value2, "password");              return (Criteria) this;          }            public Criteria andPasswordNotBetween(String value1, String value2) {              addCriterion("password not between", value1, value2, "password");              return (Criteria) this;          }      }        public static class Criteria extends GeneratedCriteria {            protected Criteria() {              super();          }      }        public static class Criterion {          private String condition;            private Object value;            private Object secondValue;            private boolean noValue;            private boolean singleValue;            private boolean betweenValue;            private boolean listValue;            private String typeHandler;            public String getCondition() {              return condition;          }            public Object getValue() {              return value;          }            public Object getSecondValue() {              return secondValue;          }            public boolean isNoValue() {              return noValue;          }            public boolean isSingleValue() {              return singleValue;          }            public boolean isBetweenValue() {              return betweenValue;          }            public boolean isListValue() {              return listValue;          }            public String getTypeHandler() {              return typeHandler;          }            protected Criterion(String condition) {              super();              this.condition = condition;              this.typeHandler = null;              this.noValue = true;          }            protected Criterion(String condition, Object value, String typeHandler) {              super();              this.condition = condition;              this.value = value;              this.typeHandler = typeHandler;              if (value instanceof List<?>) {                  this.listValue = true;              } else {                  this.singleValue = true;              }          }            protected Criterion(String condition, Object value) {              this(condition, value, null);          }            protected Criterion(String condition, Object value, Object secondValue, String typeHandler) {              super();              this.condition = condition;              this.value = value;              this.secondValue = secondValue;              this.typeHandler = typeHandler;              this.betweenValue = true;          }            protected Criterion(String condition, Object value, Object secondValue) {              this(condition, value, secondValue, null);          }      }  }</code></pre>    <h3>4.2 com.demo.dao下的UserMapper.java</h3>    <p>这个DAO也是MBG生成的,这下体会到MBG的好处了吧,一下子帮你生成了这么多代码,年轻人可以少熬点夜了~</p>    <pre>  <code class="language-java">package com.demo.dao;    import com.demo.bean.User;  import com.demo.bean.UserExample;  import java.util.List;  import org.apache.ibatis.annotations.Param;    public interface UserMapper {      long countByExample(UserExample example);        int deleteByExample(UserExample example);        int deleteByPrimaryKey(Integer id);        int insert(User record);        int insertSelective(User record);        List<User> selectByExample(UserExample example);        User selectByPrimaryKey(Integer id);        int updateByExampleSelective(@Param("record") User record, @Param("example") UserExample example);        int updateByExample(@Param("record") User record, @Param("example") UserExample example);        int updateByPrimaryKeySelective(User record);        int updateByPrimaryKey(User record);  }</code></pre>    <h3>4.3 com.demo.service下的UserService.java接口</h3>    <p>这里只定义了简单的增删查改方法</p>    <pre>  <code class="language-java">package com.demo.service;    import com.demo.bean.User;    import java.util.List;    public interface UserService {        void insertUser(User user);        void deleteUser(int id);        User findUserById(Integer id);        List<User> findAllUsers();        void updateUser(User user);  }</code></pre>    <h3>4.4 com.demo.serviceImpl下的UserServiceImpl.java</h3>    <p>UserServiceImpl实现了UserService,通过注入UserMapper 对数据进行操作</p>    <pre>  <code class="language-java">package com.demo.serviceImpl;    import com.demo.bean.User;  import com.demo.bean.UserExample;  import com.demo.dao.UserMapper;  import com.demo.service.UserService;  import org.springframework.beans.factory.annotation.Autowired;  import org.springframework.stereotype.Service;    import java.util.List;    @Service  public class UserServiceImpl implements UserService {        @Autowired      private UserMapper userMapper;        @Override      public void insertUser(User user) {          userMapper.insert(user);      }        @Override      public void deleteUser(int id) {          UserExample userExample = new UserExample();          userExample.createCriteria().andIdEqualTo(id);          userMapper.deleteByExample(userExample);      }        @Override      public User findUserById(Integer id) {          return userMapper.selectByPrimaryKey(id);      }        @Override      public List<User> findAllUsers() {          return userMapper.selectByExample(null);      }        @Override      public void updateUser(User user) {          userMapper.updateByPrimaryKey(user);      }    }</code></pre>    <h3>4.5 com.demo.controller下的UserController.java</h3>    <p>MVC模式下的控制器,通过注入的UserService完成相关业务</p>    <pre>  <code class="language-java">package com.demo.controller;    import com.demo.bean.User;  import com.demo.service.UserService;  import org.apache.logging.log4j.LogManager;  import org.apache.logging.log4j.Logger;  import org.springframework.beans.factory.annotation.Autowired;  import org.springframework.stereotype.Controller;  import org.springframework.web.bind.annotation.PathVariable;  import org.springframework.web.bind.annotation.RequestMapping;  import org.springframework.web.bind.annotation.RequestMethod;  import org.springframework.web.bind.annotation.ResponseBody;    @Controller  @RequestMapping(value = "/user")  public class UserController {        private static Logger logger = LogManager.getLogger();        @Autowired      private UserService userService;        @RequestMapping(value = "/{id}", method = RequestMethod.GET)      @ResponseBody      public User findUserById(@PathVariable("id") Integer id) {          User user = userService.findUserById(id);          logger.info(user.toString());          return user;      }  }</code></pre>    <h2>5.测试</h2>    <p>将项目部署到本地的Tomcat上,打开你的chrome,访问:</p>    <pre>  <code class="language-java">http://localhost:8080/user/1</code></pre>    <p>浏览器访问服务器,服务器成功返回一个json数据</p>    <p><img src="https://simg.open-open.com/show/70c09dd954714217a1dcbe194ad3d8c7.png"></p>    <p>ok,到这里我们整个SSM整合过程已经完成,后面只要在这个基础上开发就可以了。</p>    <p> </p>    <p>项目主页:<a href="http://www.open-open.com/lib/view/home/1490163342751">http://www.open-open.com/lib/view/home/1490163342751</a></p>    <p> </p>