框架进行时——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-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 的配置文件
-
扫描组件(控制器交由 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 的配置文件
-
扫描组件(这里只扫描控制器组件)
-
使用 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 的配置文件
-
配置应用加载的监听器
-
设置初始化参数,在应用启动时加载 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);

浙公网安备 33010602011771号