框架进行时——SSM整合基础环境搭建

一、导入相关的依赖

  1 <!--打war包-->
  2 <packaging>war</packaging>
  3 
  4 <!--版本锁定-->
  5 <properties>
  6     <java.version>11</java.version>
  7     <spring.version>5.2.5.RELEASE</spring.version>
  8     <jackson.version>2.10.3</jackson.version>
  9     <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
 10 </properties>
 11 
 12 <dependencies>
 13 
 14     <!--log start-->
 15     <dependency>
 16         <groupId>org.slf4j</groupId>
 17         <artifactId>slf4j-api</artifactId>
 18         <version>1.7.30</version>
 19     </dependency>
 20 
 21     <dependency>
 22         <groupId>ch.qos.logback</groupId>
 23         <artifactId>logback-core</artifactId>
 24         <version>1.2.3</version>
 25     </dependency>
 26 
 27     <dependency>
 28         <groupId>ch.qos.logback</groupId>
 29         <artifactId>logback-classic</artifactId>
 30         <version>1.2.3</version>
 31         <scope>compile</scope>
 32     </dependency>
 33     <!--log end-->
 34 
 35     <!--MySQL数据库驱动5.1.8-->
 36     <dependency>
 37         <groupId>mysql</groupId>
 38         <artifactId>mysql-connector-java</artifactId>
 39         <version>5.1.8</version>
 40         <scope>runtime</scope>
 41     </dependency>
 42 
 43     <!--Druid数据源1.1.9-->
 44     <dependency>
 45         <groupId>com.alibaba</groupId>
 46         <artifactId>druid</artifactId>
 47         <version>1.1.9</version>
 48     </dependency>
 49 
 50     <!--C3P0数据源-->
 51     <dependency>
 52         <groupId>com.mchange</groupId>
 53         <artifactId>c3p0</artifactId>
 54         <version>0.9.5.5</version>
 55     </dependency>
 56 
 57     <!--Mybatis核心依赖-->
 58     <dependency>
 59         <groupId>org.mybatis</groupId>
 60         <artifactId>mybatis</artifactId>
 61         <version>3.5.4</version>
 62     </dependency>
 63 
 64     <!--mybatis-spring整合-->
 65     <dependency>
 66         <groupId>org.mybatis</groupId>
 67         <artifactId>mybatis-spring</artifactId>
 68         <version>2.0.4</version>
 69     </dependency>
 70 
 71     <!--Spring核心依赖-->
 72     <dependency>
 73         <groupId>org.springframework</groupId>
 74         <artifactId>spring-context</artifactId>
 75         <version>${spring.version}</version>
 76     </dependency>
 77 
 78     <!--Spring与Junit整合-->
 79     <dependency>
 80         <groupId>org.springframework</groupId>
 81         <artifactId>spring-test</artifactId>
 82         <version>${spring.version}</version>
 83         <scope>test</scope>
 84     </dependency>
 85 
 86     <!--Spring事务相关-->
 87     <dependency>
 88         <groupId>org.springframework</groupId>
 89         <artifactId>spring-tx</artifactId>
 90         <version>${spring.version}</version>
 91     </dependency>
 92 
 93     <!--AspectJ-->
 94     <dependency>
 95         <groupId>org.aspectj</groupId>
 96         <artifactId>aspectjweaver</artifactId>
 97         <version>1.9.5</version>
 98     </dependency>
 99 
100     <!--Spring集成的jdbc相关组件-->
101     <dependency>
102         <groupId>org.springframework</groupId>
103         <artifactId>spring-jdbc</artifactId>
104         <version>${spring.version}</version>
105     </dependency>
106 
107     <!--Spring的web组件-->
108     <dependency>
109         <groupId>org.springframework</groupId>
110         <artifactId>spring-web</artifactId>
111         <version>${spring.version}</version>
112     </dependency>
113 
114     <!--SpringMVC-->
115     <dependency>
116         <groupId>org.springframework</groupId>
117         <artifactId>spring-webmvc</artifactId>
118         <version>${spring.version}</version>
119     </dependency>
120 
121     <!--Servlet-->
122     <dependency>
123         <groupId>javax.servlet</groupId>
124         <artifactId>javax.servlet-api</artifactId>
125         <version>4.0.1</version>
126         <scope>provided</scope>
127     </dependency>
128 
129     <!--Jsp-->
130     <dependency>
131         <groupId>javax.servlet.jsp</groupId>
132         <artifactId>javax.servlet.jsp-api</artifactId>
133         <version>2.3.3</version>
134         <scope>provided</scope>
135     </dependency>
136 
137     <!--JQuery-->
138     <dependency>
139         <groupId>org.webjars.bower</groupId>
140         <artifactId>jquery</artifactId>
141         <version>3.4.1</version>
142     </dependency>
143 
144     <!--jstl-->
145     <dependency>
146         <groupId>javax.servlet</groupId>
147         <artifactId>jstl</artifactId>
148         <version>1.2</version>
149     </dependency>
150 
151     <!--GSON-->
152     <dependency>
153         <groupId>com.google.code.gson</groupId>
154         <artifactId>gson</artifactId>
155         <version>2.8.6</version>
156     </dependency>
157 
158     <!--文件上传相关的依赖-->
159     <dependency>
160         <groupId>commons-io</groupId>
161         <artifactId>commons-io</artifactId>
162         <version>2.6</version>
163     </dependency>
164 
165     <dependency>
166         <groupId>commons-fileupload</groupId>
167         <artifactId>commons-fileupload</artifactId>
168         <version>1.4</version>
169     </dependency>
170 
171     <dependency>
172         <groupId>junit</groupId>
173         <artifactId>junit</artifactId>
174         <version>4.12</version>
175         <scope>test</scope>
176     </dependency>
177 
178     <!--Jackson-->
179     <dependency>
180         <groupId>com.fasterxml.jackson.core</groupId>
181         <artifactId>jackson-core</artifactId>
182         <version>${jackson.version}</version>
183     </dependency>
184 
185     <dependency>
186         <groupId>com.fasterxml.jackson.core</groupId>
187         <artifactId>jackson-databind</artifactId>
188         <version>${jackson.version}</version>
189     </dependency>
190 
191     <dependency>
192         <groupId>com.fasterxml.jackson.core</groupId>
193         <artifactId>jackson-annotations</artifactId>
194         <version>${jackson.version}</version>
195     </dependency>
196 
197 </dependencies>

 

此外,还可以使用嵌入式 Tomcat。配置如下 

  1 <!--版本锁定-->
  2 <properties>
  3     <tomcat.version>7.0.103</tomcat.version>
  4 </properties>
  5 
  6 <build>
  7     <plugins>
  8 
  9         <!--使用Tomcat7-->
 10         <plugin>
 11             <groupId>org.apache.tomcat.maven</groupId>
 12             <artifactId>tomcat7-maven-plugin</artifactId>
 13             <version>2.2</version>
 14             <configuration>
 15                 <!--应用的端口号-->
 16                 <port>80</port>
 17                 <!--web应用名-->
 18                 <path>/</path>
 19             </configuration>
 20             <dependencies>
 21                 <dependency>
 22                     <groupId>org.apache.tomcat</groupId>
 23                     <artifactId>tomcat-util</artifactId>
 24                     <version>${tomcat.version}</version>
 25                 </dependency>
 26                 <dependency>
 27                     <groupId>org.apache.tomcat</groupId>
 28                     <artifactId>tomcat-coyote</artifactId>
 29                     <version>${tomcat.version}</version>
 30                 </dependency>
 31                 <dependency>
 32                     <groupId>org.apache.tomcat</groupId>
 33                     <artifactId>tomcat-api</artifactId>
 34                     <version>${tomcat.version}</version>
 35                 </dependency>
 36                 <dependency>
 37                     <groupId>org.apache.tomcat</groupId>
 38                     <artifactId>tomcat-jdbc</artifactId>
 39                     <version>${tomcat.version}</version>
 40                 </dependency>
 41                 <dependency>
 42                     <groupId>org.apache.tomcat</groupId>
 43                     <artifactId>tomcat-dbcp</artifactId>
 44                     <version>${tomcat.version}</version>
 45                 </dependency>
 46                 <dependency>
 47                     <groupId>org.apache.tomcat</groupId>
 48                     <artifactId>tomcat-servlet-api</artifactId>
 49                     <version>${tomcat.version}</version>
 50                 </dependency>
 51                 <dependency>
 52                     <groupId>org.apache.tomcat</groupId>
 53                     <artifactId>tomcat-jsp-api</artifactId>
 54                     <version>${tomcat.version}</version>
 55                 </dependency>
 56                 <dependency>
 57                     <groupId>org.apache.tomcat</groupId>
 58                     <artifactId>tomcat-jasper</artifactId>
 59                     <version>${tomcat.version}</version>
 60                 </dependency>
 61                 <dependency>
 62                     <groupId>org.apache.tomcat</groupId>
 63                     <artifactId>tomcat-jasper-el</artifactId>
 64                     <version>${tomcat.version}</version>
 65                 </dependency>
 66                 <dependency>
 67                     <groupId>org.apache.tomcat</groupId>
 68                     <artifactId>tomcat-el-api</artifactId>
 69                     <version>${tomcat.version}</version>
 70                 </dependency>
 71                 <dependency>
 72                     <groupId>org.apache.tomcat</groupId>
 73                     <artifactId>tomcat-catalina</artifactId>
 74                     <version>${tomcat.version}</version>
 75                 </dependency>
 76                 <dependency>
 77                     <groupId>org.apache.tomcat</groupId>
 78                     <artifactId>tomcat-tribes</artifactId>
 79                     <version>${tomcat.version}</version>
 80                 </dependency>
 81                 <dependency>
 82                     <groupId>org.apache.tomcat</groupId>
 83                     <artifactId>tomcat-catalina-ha</artifactId>
 84                     <version>${tomcat.version}</version>
 85                 </dependency>
 86                 <dependency>
 87                     <groupId>org.apache.tomcat</groupId>
 88                     <artifactId>tomcat-annotations-api</artifactId>
 89                     <version>${tomcat.version}</version>
 90                 </dependency>
 91                 <dependency>
 92                     <groupId>org.apache.tomcat</groupId>
 93                     <artifactId>tomcat-juli</artifactId>
 94                     <version>${tomcat.version}</version>
 95                 </dependency>
 96                 <dependency>
 97                     <groupId>org.apache.tomcat.embed</groupId>
 98                     <artifactId>tomcat-embed-core</artifactId>
 99                     <version>${tomcat.version}</version>
100                 </dependency>
101                 <dependency>
102                     <groupId>org.apache.tomcat.embed</groupId>
103                     <artifactId>tomcat-embed-logging-juli</artifactId>
104                     <version>${tomcat.version}</version>
105                 </dependency>
106                 <dependency>
107                     <groupId>org.apache.tomcat.embed</groupId>
108                     <artifactId>tomcat-embed-logging-log4j</artifactId>
109                     <version>${tomcat.version}</version>
110                 </dependency>
111             </dependencies>
112         </plugin>
113 
114         <!--以jdk11进行编译和运行-->
115         <plugin>
116             <groupId>org.apache.maven.plugins</groupId>
117             <artifactId>maven-compiler-plugin</artifactId>
118             <version>3.8.1</version>
119             <configuration>
120                 <target>11</target>
121                 <source>11</source>
122                 <encoding>UTF-8</encoding>
123             </configuration>
124         </plugin>
125 
126     </plugins>
127 </build>

 

 

二、编写配置文件

1、MyBatis 的配置文件

其实 MyBatis 相关的配置都可以在与 Spring 的整合中完成,但是为了便于配置还是写一个全局配置文件。

这里就放在类路径下,名为 mybatis-config.xml,内容如下

 1 <?xml version="1.0" encoding="UTF-8" ?>
 2 <!DOCTYPE configuration
 3         PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
 4         "http://mybatis.org/dtd/mybatis-3-config.dtd">
 5 <configuration>
 6 
 7     <settings>
 8         <setting name="mapUnderscoreToCamelCase" value="true"/>
 9     </settings>
10 
11 </configuration>

2、DataBase 的配置文件

在类路径下新建 jdbc-config.properties 文件,用户保存数据库连接的一些基本信息,内容如下

 1 mysql.driverClassName=com.mysql.jdbc.Driver
 2 mysql.url=jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC
 3 mysql.username=root
 4 mysql.password=ideal
 5 
 6 # initialSize: 初始化连接数目
 7 datasource.initialSize=1
 8 
 9 # maxActive: 连接池支持的最大连接数
10 # 设置成可能的并发量 0表示没有限制
11 # 这里取值为20
12 datasource.maxActive=20
13 
14 # minIdle: 连接池中最小空闲连接数
15 # 当连接数少于此值时,连接池会创建连接来补充到该值的数量
16 datasource.minIdle=5
17 
18 # maxWait: 连接池中连接用完时,新的请求等待时间
19 # 单位为毫秒,取值-1表示无限等待,直到超时为止
20 # 超过时间后会显示错误信息
21 datasource.maxWait=-1

3、Spring 的配置文件

在 Spring 的配置文件中需要完成以下基本操作:

  • 扫描组件(控制器交由 SpringMVC 容器来管理,这里只管理除此之外的组件)

    • 使用 exclude-filter 子标签过滤掉控制器组件

  • 配置数据源(以 Druid 为例)

    • 先使用 property-placeholder 引入数据库连接的配置文件 jdbc-config.properties

    • 再使用 ${prop_key} 来取出上述配置文件中的值

  • 配置与 MyBatis 的整合

    • 配置用于创建 SqlSession 的工厂Bean:SqlSessionFactoryBean

      • 指定数据源

      • 指定全局配置文件

      • 指定 SQL 映射文件

      • 其他设置
    • 配置映射器扫码器:MapperScannerConfigurer

      • 指定映射器接口所在的包

  • 配置声明式事务

    • 配置事务管理器:DataSourceTransactionManager

      • 指定数据源

    • 配置事务通知

      • 指定事务管理器

      • 配置事务的隔离级别、传播行为等属性

    • 配置 AOP

      • 配置切入点表达式

      • 建立事务通知与切入点表达式的关联

还是在类路径下新建 Spring 的配置文件,名为 applicationContext.xml,内容如下

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <beans xmlns="http://www.springframework.org/schema/beans"
 3        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 4        xmlns:context="http://www.springframework.org/schema/context"
 5        xmlns:tx="http://www.springframework.org/schema/tx"
 6        xmlns:aop="http://www.springframework.org/schema/aop"
 7        xsi:schemaLocation="http://www.springframework.org/schema/beans
 8        http://www.springframework.org/schema/beans/spring-beans-4.3.xsd
 9        http://www.springframework.org/schema/context
10        https://www.springframework.org/schema/context/spring-context-4.3.xsd
11        http://www.springframework.org/schema/tx
12        http://www.springframework.org/schema/tx/spring-tx-4.3.xsd
13        http://www.springframework.org/schema/aop
14        https://www.springframework.org/schema/aop/spring-aop-4.3.xsd">
15 
16     <!--Spring的容器用来管理除控制器以外的组件-->
17     <context:component-scan base-package="com.ssm">
18         <context:exclude-filter
19                 type="annotation"
20                 expression="org.springframework.stereotype.Controller"/>
21     </context:component-scan>
22 
23     <!--引入数据库的配置文件-->
24     <context:property-placeholder location="classpath:jdbc-config.properties" />
25 
26     <!--Druid数据源-->
27     <bean class="com.alibaba.druid.pool.DruidDataSourceFactory"
28           factory-method="createDataSource"
29           id="dataSource">
30         <constructor-arg name="properties">
31             <props>
32                 <prop key="username">${mysql.username}</prop>
33                 <prop key="password">${mysql.password}</prop>
34                 <prop key="url">${mysql.url}</prop>
35                 <prop key="driverClassName">${mysql.driverClassName}</prop>
36                 <prop key="initialSize">${datasource.initialSize}</prop>
37                 <prop key="maxActive">${datasource.maxActive}</prop>
38                 <prop key="minIdle">${datasource.minIdle}</prop>
39                 <prop key="maxWait">${datasource.maxWait}</prop>
40             </props>
41         </constructor-arg>
42     </bean>
43 
44     <!--在Spring中使用MyBatis的SqlSession: SqlSessionFactoryBean-->
45     <bean class="org.mybatis.spring.SqlSessionFactoryBean"
46           id="sessionFactory">
47         <!--指定数据源-->
48         <property name="dataSource" ref="dataSource" />
49         <!--指定全局配置文件-->
50         <property name="configLocation" value="classpath:mybatis-config.xml" />
51         <!--指定SQL映射文件-->
52         <property name="mapperLocations" value="classpath:mapper/*.xml" />
53     </bean>
54 
55     <!--映射器扫描配置: MapperScannerConfigurer-->
56     <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"
57           id="mapperScannerConfigurer">
58         <!--指定映射器接口所在的基包-->
59         <property name="basePackage" value="com.ssm.dao" />
60     </bean>
61 
62     <!--基于XML配置文件的事务控制: 事务管理器(控制数据源中连接的关闭和提交)-->
63     <bean class="org.springframework.jdbc.datasource.DataSourceTransactionManager"
64           id="transactionManager">
65         <property name="dataSource" ref="dataSource" />
66     </bean>
67 
68     <!--基于XML配置文件的事务控制: 事务通知-->
69     <tx:advice transaction-manager="transactionManager" id="transactionInterceptor">
70         <tx:attributes>
71             <tx:method name="*" propagation="REQUIRED" read-only="false" />
72             <tx:method name="get*" propagation="SUPPORTS" read-only="true" />
73         </tx:attributes>
74     </tx:advice>
75 
76     <!--基于XML配置文件的事务控制: AOP配置-->
77     <aop:config>
78         <!--切入点表达式-->
79         <aop:pointcut id="pc1" expression="execution(* com.ssm.service.impl.*.*(..))"/>
80         <aop:advisor advice-ref="transactionInterceptor" pointcut-ref="pc1" />
81     </aop:config>
82 </beans>

4、SpringMVC 的配置文件

在 Spring 的配置文件中需要完成以下基本操作:

  • 扫描组件(这里只扫描控制器组件)

    • 使用 include-filter 子标签来实现过滤,并禁用掉默认的过滤规则

  • 配置视图解析器:InternalResourceViewResolver

    • 指定前缀

    • 指定后缀

  • 配置文件上传解析器:CommonsMultipartResolver(注意这里 bean 的 id 属性不能任意指定)

    • 设置默认编码

    • 设置单个文件的最大值

    • 设置总的文件的最大值

  • 其他的必要配置

还是在类路径下新建 SpringMVC 的配置文件,名为 applicationContext-mvc.xml,内容如下

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <beans xmlns="http://www.springframework.org/schema/beans"
 3        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 4        xmlns:context="http://www.springframework.org/schema/context"
 5        xmlns:mvc="http://www.springframework.org/schema/mvc"
 6        xsi:schemaLocation="http://www.springframework.org/schema/beans
 7        http://www.springframework.org/schema/beans/spring-beans-4.3.xsd
 8        http://www.springframework.org/schema/context
 9        https://www.springframework.org/schema/context/spring-context-4.3.xsd
10        http://www.springframework.org/schema/mvc
11        https://www.springframework.org/schema/mvc/spring-mvc-4.3.xsd">
12 
13     <!--SpringMVC的容器只用来管理控制器-->
14     <context:component-scan base-package="com.ssm" use-default-filters="false">
15         <context:include-filter
16                 type="annotation"
17                 expression="org.springframework.stereotype.Controller"/>
18     </context:component-scan>
19 
20     <!--视图解析器-->
21     <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"
22           id="internalResourceViewResolver">
23         <property name="prefix" value="/WEB-INF/pages/" />
24         <property name="suffix" value=".jsp" />
25     </bean>
26 
27     <!--文件上传解析器(注意这里的 id 不能改变)-->
28     <bean class="org.springframework.web.multipart.commons.CommonsMultipartResolver"
29           id="multipartResolver">
30         <property name="defaultEncoding" value="UTF-8" />
31         <!--单个文件上传的最大值:15MB-->
32         <property name="maxUploadSizePerFile" value="#{1024*1024*15}" />
33         <!--总的文件上传的最大值:1GB-->
34         <property name="maxUploadSize" value="#{1024*1024*1024}" />
35     </bean>
36 
37     <!--静态资源使用默认处理方式-->
38     <mvc:default-servlet-handler />
39     <mvc:annotation-driven></mvc:annotation-driven>
40 
41 </beans>

5、Web 的配置文件

在 Web 的配置文件中需要完成以下基本操作:

  • 配置应用加载的监听器

    • 设置初始化参数,在应用启动时加载 Spring 的配置文件

  • 配置字符编码过滤器

    • 设置初始化参数,指定要使用的编码方式

  • 配置对多种请求方法支持的过滤器

  • 配置前端控制器

    • 设置初始化参数,在应用启动时加载 SpringMVC 的配置文件

Web 的配置文件即为 web 目录中 WEB-INF/ 文件夹中的 web.xml 文件,内容如下

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
 3          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 4          xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
 5          http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
 6          version="4.0">
 7 
 8     <!--服务器启动时加载指定路径下的Spring配置文件-->
 9     <listener>
10         <listener-class>
11             org.springframework.web.context.ContextLoaderListener
12         </listener-class>
13     </listener>
14     <context-param>
15         <param-name>contextConfigLocation</param-name>
16         <param-value>classpath:applicationContext.xml</param-value>
17     </context-param>
18 
19     <!--获取当前项目的根目录(绝对路径)-->
20     <context-param>
21         <param-name>webAppRootKey</param-name>
22         <param-value>realPath</param-value>
23     </context-param>
24     <listener>
25         <listener-class>
26             org.springframework.web.util.WebAppRootListener
27         </listener-class>
28     </listener>
29 
30     <!--配置字符编码过滤器-->
31     <filter>
32         <filter-name>CharacterEncodingFilter</filter-name>
33         <filter-class>
34             org.springframework.web.filter.CharacterEncodingFilter
35         </filter-class>
36         <init-param>
37             <param-name>encoding</param-name>
38             <param-value>utf-8</param-value>
39         </init-param>
40     </filter>
41     <filter-mapping>
42         <filter-name>CharacterEncodingFilter</filter-name>
43         <url-pattern>/*</url-pattern>
44     </filter-mapping>
45 
46     <!--配置对多种请求方法支持的过滤器-->
47     <filter>
48         <filter-name>HiddenHttpMethodFilter</filter-name>
49         <filter-class>
50             org.springframework.web.filter.HiddenHttpMethodFilter
51         </filter-class>
52     </filter>
53     <filter-mapping>
54         <filter-name>HiddenHttpMethodFilter</filter-name>
55         <url-pattern>/*</url-pattern>
56     </filter-mapping>
57 
58     <!--配置前端控制器-->
59     <servlet>
60         <servlet-name>dispatcherServlet</servlet-name>
61         <servlet-class>
62             org.springframework.web.servlet.DispatcherServlet
63         </servlet-class>
64         <init-param>
65             <param-name>contextConfigLocation</param-name>
66             <param-value>classpath:applicationContext-mvc.xml</param-value>
67         </init-param>
68         <load-on-startup>1</load-on-startup>
69     </servlet>
70     <servlet-mapping>
71         <servlet-name>dispatcherServlet</servlet-name>
72         <url-pattern>/</url-pattern>
73     </servlet-mapping>
74 
75 </web-app>

 

三、编写三层架构的基本实现

1、实体类

用户 User

 1 package com.ssm.entity;
 2 
 3 public class User implements Serializable {
 4 
 5     private Integer id;
 6 
 7     private String username;
 8 
 9     private Integer gender;
10 
11     private Integer age;
12 
13     private Date birthday;
14 
15     private String email;
16 
17     private City city;
18 
19     // setter、getter以及 toString() 方法
20 }

城市 City

 1 package com.ssm.entity;
 2 
 3 public class City implements Serializable {
 4 
 5     private Integer cityId;
 6 
 7     private String cityName;
 8 
 9     // setter、getter以及 toString() 方法
10 }

2、持久层

映射器接口

1 package com.ssm.dao;
2 
3 public interface UserDao {
4 
5     List<User> queryAllUsers();
6 }
1 package com.ssm.dao;
2 
3 public interface CityDao {
4 
5     List<City> queryAllCities();
6 }

SQL映射文件

SQL 映射文件放在了 类路径下的 mapper 目录中,命名为 UserMapper.xml 和 CityMapper.xml

 1 <?xml version="1.0" encoding="UTF-8" ?>
 2 <!DOCTYPE mapper PUBLIC
 3         "-//mybatis.org//DTD Mapper 3.0//EN"
 4         "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
 5 <mapper namespace="com.ssm.dao.UserDao">
 6 
 7     <resultMap id="userCityMap" type="com.ssm.entity.User">
 8         <id column="id" property="id" />
 9         <result column="username" property="username" />
10         <result column="gender" property="gender" />
11         <result column="age" property="age" />
12         <result column="birthday" property="birthday" />
13         <result column="email" property="email" />
14         <association property="city" javaType="com.ssm.entity.City">
15             <id column="c_id" property="cityId" />
16             <result column="city_name" property="cityName" />
17         </association>
18     </resultMap>
19 
20     <select id="queryAllUsers" resultMap="userCityMap">
21         SELECT id,username,gender,age,birthday,email,u.city_id c_id,city_name
22         FROM user u 
23         LEFT JOIN city c ON u.city_id = c.city_id
24     </select>
25 </mapper>
 1 <?xml version="1.0" encoding="UTF-8" ?>
 2 <!DOCTYPE mapper PUBLIC
 3         "-//mybatis.org//DTD Mapper 3.0//EN"
 4         "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
 5 <mapper namespace="com.ssm.dao.CityDao">
 6 
 7     <select id="queryAllCities" resultType="com.ssm.entity.City">
 8         SELECT city_id, city_name 
 9         FROM city 
10         ORDER BY city_id ASC
11     </select>
12 </mapper>

3、业务层

业务层接口

1 package com.ssm.service;
2 
3 public interface UserService {
4 
5     List<User> getAllUsers();
6 }
1 package com.ssm.service;
2 
3 public interface CityService {
4 
5     List<City> getAllCities();
6 }

业务层实现类

 1 package com.ssm.service.impl;
 2 
 3 @Service("userService")
 4 public class UserServiceImpl implements UserService {
 5 
 6     private UserDao userDao;
 7 
 8     @Autowired
 9     public void setUserDao(UserDao userDao) {
10         this.userDao = userDao;
11     }
12 
13     @Override
14     public List<User> getAllUsers() {
15         return userDao.queryAllUsers();
16     }
17 }
 1 package com.ssm.service.impl;
 2 
 3 @Service("cityService")
 4 public class CityServiceImpl implements CityService {
 5 
 6     private CityDao cityDao;
 7 
 8     @Autowired
 9     public void setCityDao(CityDao cityDao) {
10         this.cityDao = cityDao;
11     }
12 
13     @Override
14     public List<City> getAllCities() {
15         return cityDao.queryAllCities();
16     }
17 }

4、表现层

处理客户端的查询请求,调用业务层查出用户和城市信息后转发到成功页面显示结果。

 1 package com.ssm.controller;
 2 
 3 @Controller
 4 public class UserController {
 5 
 6     private UserService userService;
 7 
 8     private CityService cityService;
 9 
10     @Autowired
11     public void setUserService(UserService userService) {
12         this.userService = userService;
13     }
14 
15     @Autowired
16     public void setCityService(CityService cityService) {
17         this.cityService = cityService;
18     }
19 
20     @GetMapping("/usersAndCities")
21     public String cities(ModelMap mm) {
22         List<User> allUsers = userService.getAllUsers();
23         List<City> allCities = cityService.getAllCities();
24         mm.addAttribute("allUsers", allUsers);
25         mm.addAttribute("allCities", allCities);
26         return "success";
27     }
28 }

 

四、编写 JSP 页面

1、首页

在 web 目录的根目录下创建 index.jsp 文件,用于展示欢迎信息以及提供用于测试跳转的请求链接。内容如下

 1 <%@ page contentType="text/html;charset=UTF-8"
 2          language="java"
 3          pageEncoding="UTF-8" %>
 4 <html>
 5 <head>
 6     <title>首页</title>
 7 </head>
 8 <body>
 9 
10     <h1>欢迎访问首页</h1>
11     <a href="${pageContext.request.contextPath}/usersAndCities">
12         <button>查看所有用户信息和城市信息</button>
13     </a>
14 
15 </body>
16 </html>

2、成功页面

在这里展示后台从数据库中查询到的测试信息。

在 web 目录的 WEB-INF/pages/ 文件夹中新建 success.jsp 文件,内容如下

 1 <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
 2 <%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
 3 <%@ page contentType="text/html;charset=UTF-8"
 4          language="java"
 5          pageEncoding="UTF-8" %>
 6 <html>
 7 <head>
 8     <title>成功页面</title>
 9 </head>
10 <body>
11 
12     <h1 align="center">Hello Spring, SpringMVC and Mybatis!</h1>
13     <hr/>
14 
15     <h2 align="center">用户信息表</h2>
16     <table align="center" cellpadding="15" cellspacing="0" border="1">
17         <tr>
18             <th>编号</th>
19             <th>姓名</th>
20             <th>性别</th>
21             <th>年龄</th>
22             <th>生日</th>
23             <th>邮箱</th>
24             <th>所在城市</th>
25         </tr>
26         <c:if test="${not empty allUsers}">
27             <c:forEach items="${allUsers}" var="user">
28                 <tr align="center">
29                     <td>${user.id}</td>
30                     <td>${user.username}</td>
31                     <td>${user.gender==1 ? "男" : "女"}</td>
32                     <td>${user.age}</td>
33                     <td>
34                         <fmt:formatDate value="${user.birthday}"
35                                         pattern="yyyy年M月d日" />
36                     </td>
37                     <td>${user.email}</td>
38                     <td>${user.city.cityName}</td>
39                 </tr>
40             </c:forEach>
41         </c:if>
42 
43     </table>
44 
45     <hr />
46     <h2 align="center">城市列表</h2>
47     <table align="center" cellpadding="10" cellspacing="0" border="1">
48         <tr>
49             <th>编号</th>
50             <th>城市名</th>
51         </tr>
52         <c:if test="${not empty allCities}">
53             <c:forEach items="${allCities}" var="city">
54                 <tr align="center">
55                     <td>${city.cityId}</td>
56                     <td>${city.cityName}</td>
57                 </tr>
58             </c:forEach>
59         </c:if>
60 
61     </table>
62 
63 </body>
64 </html>

 

五、整合结果测试

访问首页:

 

 

点击按钮之后:

 

 

附录  数据库表

 1 -- 使用的数据库名为test
 2 USE test;
 3 
 4 -- 创建city表,保存城市信息
 5 CREATE TABLE `city`(
 6     `city_id` INT PRIMARY KEY AUTO_INCREMENT,
 7     `city_name` VARCHAR(35) NOT NULL UNIQUE
 8 )ENGINE=InnoDB DEFAULT CHARSET=utf8;
 9 
10 -- 创建user表,保存用户信息
11 CREATE TABLE `user`(
12     `id` INT PRIMARY KEY auto_increment,
13     `username` VARCHAR(50) NOT NULL UNIQUE,
14     `gender` SMALLINT DEFAULT 1,
15     `age` SMALLINT DEFAULT NULL,
16     `birthday` DATE,
17     `email` VARCHAR(50) DEFAULT NULL,
18     `city_id` INT,
19     CONSTRAINT fk_city_id FOREIGN KEY(`city_id`) REFERENCES `city`(`city_id`)
20 )ENGINE=InnoDB DEFAULT CHARSET=utf8;
21 
22 -- 插入一些城市数据到city表中
23 INSERT INTO city(city_name) VALUES('北京'),('天津'),('石家庄'),('太原'),('呼和浩特'),('沈阳'),('长春'),('哈尔滨'),('上海'),('南京'),('杭州'),('合肥'),('福州'),('南昌'),('济南'),('郑州'),('武汉'),('长沙'),('广州'),('南宁'),('海口'),('重庆'),('成都'),('贵阳'),('昆明'),('拉萨'),('西安'),('兰州'),('西宁'),('银川'),('乌鲁木齐'),('香港'),('澳门'),('台北');
24 
25 -- 插入一些用户数据到user表中
26 INSERT INTO user(username,gender,age,birthday,email,city_id) 
27 VALUES('赵一',1,18,STR_TO_DATE('1900/01/02','%Y/%m/%d'),'zy@qq.com',1),
28 ('钱二',0,19,STR_TO_DATE('1901/02/01','%Y/%m/%d'),'qe@qq.com',2);

 

 

 

  

 

posted @ 2020-04-24 13:22  Sept4_桃李宿江南  阅读(222)  评论(0)    收藏  举报