一、导入相关的依赖

  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);

  

框架进行时——SSM整合基础环境搭建的更多相关文章

  1. SSM整合之---环境搭建

    SSM整合---环境搭建 l  查询所有用户的信息,保存用户信息 1.pom.xml配置项目所需的jar包 <dependencies> <dependency> <gr ...

  2. SSM整合_年轻人的第一个增删改查_基础环境搭建

    写在前面 SSM整合_年轻人的第一个增删改查_基础环境搭建 SSM整合_年轻人的第一个增删改查_查找 SSM整合_年轻人的第一个增删改查_新增 SSM整合_年轻人的第一个增删改查_修改 SSM整合_年 ...

  3. 01-Hadoop概述及基础环境搭建

    1 hadoop概述 1.1 为什么会有大数据处理 传统模式已经满足不了大数据的增长 1)存储问题 传统数据库:存储亿级别的数据,需要高性能的服务器:并且解决不了本质问题:只能存结构化数据 大数据存储 ...

  4. Spark入门实战系列--2.Spark编译与部署(上)--基础环境搭建

    [注] 1.该系列文章以及使用到安装包/测试数据 可以在<倾情大奉送--Spark入门实战系列>获取: 2.Spark编译与部署将以CentOS 64位操作系统为基础,主要是考虑到实际应用 ...

  5. IOS开发基础环境搭建

    一.目的 本文的目的是windows下IOS开发基础环境搭建做了对应的介绍,大家可根据文档步骤进行mac环境部署: 二.安装虚拟机 下载虚拟机安装文件绿色版,点击如下文件安装 获取安装包:       ...

  6. Spark环境搭建(上)——基础环境搭建

    Spark摘说 Spark的环境搭建涉及三个部分,一是linux系统基础环境搭建,二是Hadoop集群安装,三是Spark集群安装.在这里,主要介绍Spark在Centos系统上的准备工作--linu ...

  7. 【1】windows下IOS开发基础环境搭建

    一.目的 本文的目的是windows下IOS开发基础环境搭建做了对应的介绍,大家可根据文档步骤进行mac环境部署: 二.安装虚拟机 下载虚拟机安装文件绿色版,点击如下文件安装 获取安装包:       ...

  8. Maven 学习笔记(一) 基础环境搭建

    在Java的世界里,项目的管理与构建,有两大常用工具,一个是Maven,另一个是Gradle,当然,还有一个正在淡出的Ant.Maven 和 Gradle 都是非常出色的工具,排除个人喜好,用哪个工具 ...

  9. dos基础+环境搭建基础理论

    dos基础 市面上两大操作系统 windows.*nix(unix.linux.mac.bsd(安全性比较高)) 后三种都属于unix的衍生版本 linux是为了兼容unix开发的,最后开放了源代码 ...

随机推荐

  1. 2019牛客暑期多校训练营(第八场)B-Beauty Values(期望线性性)

    >传送门< 题意:思路:期望的线性性(可加性),比赛的时候写的代码超级无敌长,不过值得欣慰的是一发AC了,官方的题解写的还不错~ 我们可以把每种数字对答案的贡献分开来计算,即枚举每个数字, ...

  2. DFS——求图的连通性问题

    DFS作为一个竞赛必学的一个知识点,怎么说我都得写一下 遍历就相当于爆搜,只不过是搜的方式比较规整罢了. 深度优先遍历:为了避免重复访问某个顶点,可以设一个标志数组vis[i],未访问时值为0,访问一 ...

  3. Windows10与虚拟机中CentOS-7.2进行telnet通信 出现在端口23处失败【解决】

    (telnet服务是由xinetd守护,所以安装和启动都要用到xinetd) 1.先检查CentOS7.0是否已经安装以下几个安装包:telnet-server.telnet.xinetd.命令如下: ...

  4. Codeforces Round #540 (Div. 3) C. Palindromic Matrix (大模拟)

    题意:给你\(n\)个数,判断是否能构成一个\(n\)X\(n\)的回文矩阵,若可以,输出\(YES\)和矩阵,否则输出\(NO\). 题解:如果这个矩阵的行/列元素是偶数的话,很好办,所有出现的数一 ...

  5. Windows Terminal 更换主题

    1. 打开设置,是个json文件 2. 在此处获取主题配置:https://atomcorp.github.io/themes/ 3.将主题配置粘贴到schemes节点(可以增加N个) 4.配置每个命 ...

  6. Selenium+Python之下拉菜单的定位

    1.通过selenium.webdriver.support.ui的Select进行定位 下拉菜单如下图: 定位代码(选择Male): from selenium.webdriver.support. ...

  7. 搭建基于springboot轻量级读写分离开发框架

    何为读写分离 读写分离是指对资源的修改和读取进行分离,能解决很多数据库瓶颈,以及代码混乱难以维护等相关的问题,使系统有更好的扩展性,维护性和可用性. 一般会分三个步骤来实现: 一. 主从数据库搭建 信 ...

  8. C# 类(9) - 接口 Interface

    Interface 接口 类似 抽象类,也不能被实例化...(前面说的静态类,加上抽象类,还有这个,都3个了)接口其实比 抽象类 更加抽象.接口的方法(这个方法还不能有实体代码,和抽象类的抽象方法差不 ...

  9. 记录一个状压DP用到的骚操作

    不断的让i=i^lowbit(i)就可以枚举i二进制里面所有的1 嘛,很显然,怕是我没想到哦

  10. CVE-2018-8120 提权

    经验证,诸多版本的Windows系统均存在该漏洞,文末同时附带一份利用该漏洞制作的提权工具,以供学习.经测试该工具支持Win2003 x32/x64.WinXP x32.Win7 x32/x64, W ...