前言

最近比较闲,复习搭建一下项目,这次主要使用spring+SpringMVC+Mybatis。项目持久层使用Mybatis3,控制层使用SpringMVC4.1,使用Spring4.1管理控制器,数据库连接池使用druid数据源,该项数据库暂使用MySQL。(如果是Oracle需修改pom.xml)

<!-- oracle连接 -->
    <dependency>
      <groupId>com.hynnet</groupId>
      <artifactId>oracle-driver-ojdbc6</artifactId>
      <version>12.1.0.1</version>
    </dependency>

1、 数据库表结构以及maven项目结构

数据表非常的简单(不是重点),如下:

创建Maven Project时,将Filter选择为org.apache.maven.archetypes。填写完相关项目坐标信息后项目结构如下:

注:若无src/main/Java,src/test/java,src/test/resources时,创建这个几个Source Folder。

2、修改pom.xml添加对应的包依赖

这儿将全部使用的Maven依赖贴出了,对应什么作用上面都有解释,如下:

pom.xml

  1. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  2. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
  3. <modelVersion>4.0.0</modelVersion>
  4. <groupId>org.andy.sm</groupId>
  5. <artifactId>springmvc_mybatis_demo</artifactId>
  6. <packaging>war</packaging>
  7. <version>0.0.1-SNAPSHOT</version>
  8. <name>springmvc_mybatis_demo Maven Webapp</name>
  9. <url>http://maven.apache.org</url>
  10. <properties>
  11. <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  12. <spring.version>4.1.4.RELEASE</spring.version>
  13. <jackson.version>2.5.0</jackson.version>
  14. </properties>
  15. <dependencies>
  16. <dependency>
  17. <groupId>junit</groupId>
  18. <artifactId>junit</artifactId>
  19. <version>4.12</version>
  20. <scope>test</scope>
  21. </dependency>
  22. <!-- spring -->
  23. <dependency>
  24. <groupId>org.springframework</groupId>
  25. <artifactId>spring-core</artifactId>
  26. <version>${spring.version}</version>
  27. </dependency>
  28. <dependency>
  29. <groupId>org.springframework</groupId>
  30. <artifactId>spring-beans</artifactId>
  31. <version>${spring.version}</version>
  32. </dependency>
  33. <dependency>
  34. <groupId>org.springframework</groupId>
  35. <artifactId>spring-context</artifactId>
  36. <version>${spring.version}</version>
  37. </dependency>
  38. <dependency>
  39. <groupId>org.springframework</groupId>
  40. <artifactId>spring-tx</artifactId>
  41. <version>${spring.version}</version>
  42. </dependency>
  43. <dependency>
  44. <groupId>org.springframework</groupId>
  45. <artifactId>spring-web</artifactId>
  46. <version>${spring.version}</version>
  47. </dependency>
  48. <dependency>
  49. <groupId>org.springframework</groupId>
  50. <artifactId>spring-webmvc</artifactId>
  51. <version>${spring.version}</version>
  52. </dependency>
  53. <dependency>
  54. <groupId>org.springframework</groupId>
  55. <artifactId>spring-jdbc</artifactId>
  56. <version>${spring.version}</version>
  57. </dependency>
  58. <dependency>
  59. <groupId>org.springframework</groupId>
  60. <artifactId>spring-test</artifactId>
  61. <version>${spring.version}</version>
  62. <scope>test</scope>
  63. </dependency>
  64. <!-- mybatis 包 -->
  65. <dependency>
  66. <groupId>org.mybatis</groupId>
  67. <artifactId>mybatis</artifactId>
  68. <version>3.2.8</version>
  69. </dependency>
  70. <!--mybatis spring 插件 -->
  71. <dependency>
  72. <groupId>org.mybatis</groupId>
  73. <artifactId>mybatis-spring</artifactId>
  74. <version>1.2.2</version>
  75. </dependency>
  76. <!-- mysql连接 -->
  77. <dependency>
  78. <groupId>mysql</groupId>
  79. <artifactId>mysql-connector-java</artifactId>
  80. <version>5.1.34</version>
  81. </dependency>
  82. <!-- 数据源 -->
  83. <dependency>
  84. <groupId>com.alibaba</groupId>
  85. <artifactId>druid</artifactId>
  86. <version>1.0.12</version>
  87. </dependency>
  88. <dependency>
  89. <groupId>org.aspectj</groupId>
  90. <artifactId>aspectjweaver</artifactId>
  91. <version>1.8.4</version>
  92. </dependency>
  93. <!-- log4j -->
  94. <dependency>
  95. <groupId>log4j</groupId>
  96. <artifactId>log4j</artifactId>
  97. <version>1.2.17</version>
  98. </dependency>
  99. <!-- servlet -->
  100. <dependency>
  101. <groupId>javax.servlet</groupId>
  102. <artifactId>servlet-api</artifactId>
  103. <version>3.0-alpha-1</version>
  104. </dependency>
  105. <dependency>
  106. <groupId>javax.servlet</groupId>
  107. <artifactId>jstl</artifactId>
  108. <version>1.2</version>
  109. </dependency>
  110. <!-- json -->
  111. <dependency>
  112. <groupId>org.codehaus.jackson</groupId>
  113. <artifactId>jackson-mapper-asl</artifactId>
  114. <version>1.9.13</version>
  115. </dependency>
  116. <dependency>
  117. <groupId>com.alibaba</groupId>
  118. <artifactId>fastjson</artifactId>
  119. <version>1.2.3</version>
  120. </dependency>
  121. <dependency>
  122. <groupId>com.fasterxml.jackson.core</groupId>
  123. <artifactId>jackson-annotations</artifactId>
  124. <version>${jackson.version}</version>
  125. </dependency>
  126. <dependency>
  127. <groupId>com.fasterxml.jackson.core</groupId>
  128. <artifactId>jackson-core</artifactId>
  129. <version>${jackson.version}</version>
  130. </dependency>
  131. <dependency>
  132. <groupId>com.fasterxml.jackson.core</groupId>
  133. <artifactId>jackson-databind</artifactId>
  134. <version>${jackson.version}</version>
  135. </dependency>
  136. <!-- 文件上传 -->
  137. <dependency>
  138. <groupId>commons-io</groupId>
  139. <artifactId>commons-io</artifactId>
  140. <version>2.4</version>
  141. </dependency>
  142. <dependency>
  143. <groupId>commons-fileupload</groupId>
  144. <artifactId>commons-fileupload</artifactId>
  145. <version>1.2.2</version>
  146. </dependency>
  147. </dependencies>
  148. <build>
  149. <finalName>springmvc_mybatis_demo</finalName>
  150. <plugins>
  151. <!-- Run the JUnit unit tests in an isolated classloader -->
  152. <plugin>
  153. <groupId>org.apache.maven.plugins</groupId>
  154. <artifactId>maven-surefire-plugin</artifactId>
  155. <version>2.4.2</version>
  156. <configuration>
  157. <skipTests>true</skipTests>
  158. </configuration>
  159. </plugin>
  160. <plugin>
  161. <groupId>org.apache.maven.plugins</groupId>
  162. <artifactId>maven-war-plugin</artifactId>
  163. <version>2.3</version>
  164. <configuration>
  165. <webXml>src/main/webapp/WEB-INF/web.xml</webXml>
  166. </configuration>
  167. </plugin>
  168. <!-- generate java doc -->
  169. <plugin>
  170. <groupId>org.apache.maven.plugins</groupId>
  171. <artifactId>maven-javadoc-plugin</artifactId>
  172. <version>2.9.1</version>
  173. <configuration>
  174. <javadocDirectory>target/javadoc</javadocDirectory>
  175. <reportOutputDirectory>target/javadoc</reportOutputDirectory>
  176. <charset>UTF-8</charset>
  177. <encoding>UTF-8</encoding>
  178. <docencoding>UTF-8</docencoding>
  179. <show>private</show>
  180. </configuration>
  181. </plugin>
  182. <!-- 部署至本机 -->
  183. <plugin>
  184. <groupId>org.codehaus.cargo</groupId>
  185. <artifactId>cargo-maven2-plugin</artifactId>
  186. <version>1.0</version>
  187. <configuration>
  188. <container>
  189. <containerId>tomcat6x</containerId>
  190. <home>D:\WebServer\apache-tomcat-6.0.39</home>
  191. </container>
  192. <configuration>
  193. <type>existing</type>
  194. <home>D:\WebServer\apache-tomcat-6.0.39</home>
  195. </configuration>
  196. </configuration>
  197. </plugin>
  198. </plugins>
  199. </build>
  200. </project>

3、使用Generator自动生成Mybatis相关表信息

自动生成表的Model,Mapping,Dao文件,先关使用见文章http://blog.csdn.net/fengshizty/article/details/43086833

并将其导入到项目的src/main/java包中。

其中生成的Model中UserInfo如下:

UserInfo.java(其中List<CourseInfo> courseInfos手动添加的)

  1. package org.andy.shop.model;
  2. import java.util.List;
  3. public class UserInfo {
  4. private Integer id;
  5. private String uname;
  6. private Integer unumber;
  7. private List<CourseInfo> courseInfos;
  8. public Integer getId() {
  9. return id;
  10. }
  11. public void setId(Integer id) {
  12. this.id = id;
  13. }
  14. public String getUname() {
  15. return uname;
  16. }
  17. public void setUname(String uname) {
  18. this.uname = uname == null ? null : uname.trim();
  19. }
  20. public Integer getUnumber() {
  21. return unumber;
  22. }
  23. public void setUnumber(Integer unumber) {
  24. this.unumber = unumber;
  25. }
  26. public List<CourseInfo> getCourseInfos() {
  27. return courseInfos;
  28. }
  29. }

Dao包中的UserInfoMapper.java

  1. package org.andy.shop.dao;
  2. import java.util.List;
  3. import org.andy.shop.model.UserInfo;
  4. public interface UserInfoMapper {
  5. int deleteByPrimaryKey(Integer id);
  6. int insert(UserInfo record);
  7. int insertSelective(UserInfo record);
  8. UserInfo selectByPrimaryKey(Integer id);
  9. int updateByPrimaryKeySelective(UserInfo record);
  10. int updateByPrimaryKey(UserInfo record);
  11. List<UserInfo> selectAll();
  12. }

mapping 中的配置文件UserInfoMapper.xml

  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
  3. <mapper namespace="org.andy.shop.dao.UserInfoMapper">
  4. <resultMap id="BaseResultMap" type="org.andy.shop.model.UserInfo">
  5. <id column="id" property="id" jdbcType="INTEGER" />
  6. <result column="uname" property="uname" jdbcType="VARCHAR" />
  7. <result column="unumber" property="unumber" jdbcType="INTEGER" />
  8. </resultMap>
  9. <sql id="Base_Column_List">
  10. id, uname, unumber
  11. </sql>
  12. <select id="selectByPrimaryKey" resultMap="BaseResultMap"
  13. parameterType="java.lang.Integer">
  14. select
  15. <include refid="Base_Column_List" />
  16. from user_info
  17. where id = #{id,jdbcType=INTEGER}
  18. </select>
  19. <delete id="deleteByPrimaryKey" parameterType="java.lang.Integer">
  20. delete from
  21. user_info
  22. where id = #{id,jdbcType=INTEGER}
  23. </delete>
  24. <insert id="insert" parameterType="org.andy.shop.model.UserInfo">
  25. insert into user_info (id,
  26. uname, unumber
  27. )
  28. values (#{id,jdbcType=INTEGER},
  29. #{uname,jdbcType=VARCHAR},
  30. #{unumber,jdbcType=INTEGER}
  31. )
  32. </insert>
  33. <insert id="insertSelective" parameterType="org.andy.shop.model.UserInfo">
  34. insert into user_info
  35. <trim prefix="(" suffix=")" suffixOverrides=",">
  36. <if test="id != null">
  37. id,
  38. </if>
  39. <if test="uname != null">
  40. uname,
  41. </if>
  42. <if test="unumber != null">
  43. unumber,
  44. </if>
  45. </trim>
  46. <trim prefix="values (" suffix=")" suffixOverrides=",">
  47. <if test="id != null">
  48. #{id,jdbcType=INTEGER},
  49. </if>
  50. <if test="uname != null">
  51. #{uname,jdbcType=VARCHAR},
  52. </if>
  53. <if test="unumber != null">
  54. #{unumber,jdbcType=INTEGER},
  55. </if>
  56. </trim>
  57. </insert>
  58. <update id="updateByPrimaryKeySelective" parameterType="org.andy.shop.model.UserInfo">
  59. update user_info
  60. <set>
  61. <if test="uname != null">
  62. uname = #{uname,jdbcType=VARCHAR},
  63. </if>
  64. <if test="unumber != null">
  65. unumber = #{unumber,jdbcType=INTEGER},
  66. </if>
  67. </set>
  68. where id = #{id,jdbcType=INTEGER}
  69. </update>
  70. <update id="updateByPrimaryKey" parameterType="org.andy.shop.model.UserInfo">
  71. update user_info
  72. set uname = #{uname,jdbcType=VARCHAR},
  73. unumber =
  74. #{unumber,jdbcType=INTEGER}
  75. where id = #{id,jdbcType=INTEGER}
  76. </update>
  77. <resultMap type="org.andy.shop.model.UserInfo" id="UserCourseMap"
  78. extends="BaseResultMap">
  79. <collection property="courseInfos" javaType="list"
  80. ofType="org.andy.shop.model.CourseInfo">
  81. <id property="id" column="course_id" jdbcType="INTEGER" />
  82. <result property="cname" column="cname" jdbcType="VARCHAR" />
  83. <result property="caddress" column="caddress" jdbcType="VARCHAR" />
  84. </collection>
  85. </resultMap>
  86. <select id="selectAll" resultMap="UserCourseMap">
  87. select u.id, u.uname,
  88. u.unumber, c.id course_id, c.cname, c.caddress from user_info u left
  89. join course_user_info cu on u.id = cu.uid
  90. left join course_info c on
  91. cu.cid = c.id
  92. </select>
  93. </mapper>

4、引入Spring并配置相关属性

在src/main/resources创建spring的配置文件,这里创建了spring.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" xmlns:context="http://www.springframework.org/schema/context"
  4. xsi:schemaLocation="http://www.springframework.org/schema/beans
  5. http://www.springframework.org/schema/beans/spring-beans-4.1.xsd
  6. http://www.springframework.org/schema/context
  7. http://www.springframework.org/schema/context/spring-context-4.1.xsd">
  8. <!--引入配置属性文件 -->
  9. <context:property-placeholder location="classpath:config.properties" />
  10. <!--自动扫描含有@Service将其注入为bean -->
  11. <context:component-scan base-package="org.andy.shop.service" />
  12. </beans>

5、引入Mybatis并配置数据连接池等信息

5.1、数据连接池druid配置信息

配置连接池配置信息在config.properties中,如下:

  1. #mysql version database druid setting
  2. validationQuery=SELECT 1
  3. jdbc.url=jdbc:mysql://localhost:3306/shop?useUnicode=true&characterEncoding=utf-8
  4. jdbc.username=root
  5. jdbc.password=12345

5.2、配置Mybatis相关信息

以下是mybatis的配置信息:spring-mybatis.xml(ps:名字可随便起)

  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" xmlns:tx="http://www.springframework.org/schema/tx"
  4. xmlns:aop="http://www.springframework.org/schema/aop"
  5. xsi:schemaLocation="
  6. http://www.springframework.org/schema/beans
  7. http://www.springframework.org/schema/beans/spring-beans-4.1.xsd
  8. http://www.springframework.org/schema/tx
  9. http://www.springframework.org/schema/tx/spring-tx-4.1.xsd
  10. http://www.springframework.org/schema/aop
  11. http://www.springframework.org/schema/aop/spring-aop-4.1.xsd
  12. ">
  13. <!-- 配置数据源 使用的是Druid数据源 -->
  14. <bean name="dataSource" class="com.alibaba.druid.pool.DruidDataSource"
  15. init-method="init" destroy-method="close">
  16. <property name="url" value="${jdbc.url}" />
  17. <property name="username" value="${jdbc.username}" />
  18. <property name="password" value="${jdbc.password}" />
  19. <!-- 初始化连接大小 -->
  20. <property name="initialSize" value="0" />
  21. <!-- 连接池最大使用连接数量 -->
  22. <property name="maxActive" value="20" />
  23. <!-- 连接池最小空闲 -->
  24. <property name="minIdle" value="0" />
  25. <!-- 获取连接最大等待时间 -->
  26. <property name="maxWait" value="60000" />
  27. <property name="poolPreparedStatements" value="true" />
  28. <property name="maxPoolPreparedStatementPerConnectionSize"
  29. value="33" />
  30. <!-- 用来检测有效sql -->
  31. <property name="validationQuery" value="${validationQuery}" />
  32. <property name="testOnBorrow" value="false" />
  33. <property name="testOnReturn" value="false" />
  34. <property name="testWhileIdle" value="true" />
  35. <!-- 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 -->
  36. <property name="timeBetweenEvictionRunsMillis" value="60000" />
  37. <!-- 配置一个连接在池中最小生存的时间,单位是毫秒 -->
  38. <property name="minEvictableIdleTimeMillis" value="25200000" />
  39. <!-- 打开removeAbandoned功能 -->
  40. <property name="removeAbandoned" value="true" />
  41. <!-- 1800秒,也就是30分钟 -->
  42. <property name="removeAbandonedTimeout" value="1800" />
  43. <!-- 关闭abanded连接时输出错误日志 -->
  44. <property name="logAbandoned" value="true" />
  45. <!-- 监控数据库 -->
  46. <property name="filters" value="mergeStat" />
  47. </bean>
  48. <!-- myBatis文件 -->
  49. <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
  50. <property name="dataSource" ref="dataSource" />
  51. <!-- 自动扫描entity目录, 省掉Configuration.xml里的手工配置 -->
  52. <property name="mapperLocations" value="classpath:org/andy/shop/mapping/*.xml" />
  53. </bean>
  54. <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
  55. <property name="basePackage" value="org.andy.shop.dao" />
  56. <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory" />
  57. </bean>
  58. <!-- 配置事务管理器 -->
  59. <bean id="transactionManager"
  60. class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
  61. <property name="dataSource" ref="dataSource" />
  62. </bean>
  63. <!-- 注解方式配置事物 -->
  64. <!-- <tx:annotation-driven transaction-manager="transactionManager" /> -->
  65. <!-- 拦截器方式配置事物 -->
  66. <tx:advice id="transactionAdvice" transaction-manager="transactionManager">
  67. <tx:attributes>
  68. <tx:method name="insert*" propagation="REQUIRED" />
  69. <tx:method name="update*" propagation="REQUIRED" />
  70. <tx:method name="delete*" propagation="REQUIRED" />
  71. <tx:method name="get*" propagation="SUPPORTS" read-only="true" />
  72. <tx:method name="find*" propagation="SUPPORTS" read-only="true" />
  73. <tx:method name="select*" propagation="SUPPORTS" read-only="true" />
  74. </tx:attributes>
  75. </tx:advice>
  76. <!-- Spring aop事务管理 -->
  77. <aop:config>
  78. <aop:pointcut id="transactionPointcut"
  79. expression="execution(* org.andy.shop.service..*Impl.*(..))" />
  80. <aop:advisor pointcut-ref="transactionPointcut"
  81. advice-ref="transactionAdvice" />
  82. </aop:config>
  83. </beans>

主要配置数据连接池,事务管理, mybatis关联映射等,事务采用aop的声明式事务。

6、引入日志

在src/main/resources中添加log4j日志配置信息:

log4j.properties

  1. ### set log levels ###
  2. log4j.rootLogger = INFO , C , D , E
  3. ### console ###
  4. log4j.appender.C = org.apache.log4j.ConsoleAppender
  5. log4j.appender.C.Target = System.out
  6. log4j.appender.C.layout = org.apache.log4j.PatternLayout
  7. log4j.appender.C.layout.ConversionPattern = [springmvc_mybatis_demo][%p] [%-d{yyyy-MM-dd HH:mm:ss}] %C.%M(%L) | %m%n
  8. ### log file ###
  9. log4j.appender.D = org.apache.log4j.DailyRollingFileAppender
  10. log4j.appender.D.File = ../logs/springmvc-mybatis-demo.log
  11. log4j.appender.D.Append = true
  12. log4j.appender.D.Threshold = INFO
  13. log4j.appender.D.layout = org.apache.log4j.PatternLayout
  14. log4j.appender.D.layout.ConversionPattern = [springmvc_mybatis_demo][%p] [%-d{yyyy-MM-dd HH:mm:ss}] %C.%M(%L) | %m%n
  15. ### exception ###
  16. log4j.appender.E = org.apache.log4j.DailyRollingFileAppender
  17. log4j.appender.E.File = ../logs/springmvc-mybatis-demo_error.log
  18. log4j.appender.E.Append = true
  19. log4j.appender.E.Threshold = ERROR
  20. log4j.appender.E.layout = org.apache.log4j.PatternLayout
  21. log4j.appender.E.layout.ConversionPattern = [sspringmvc_mybatis_demo][%p] [%-d{yyyy-MM-dd HH:mm:ss}] %C.%M(%L) | %m%n

7、创建Service

在src/main/java中创建相关的org.andy.shop.service包和org.andy.shop.service.Impl包。

UserService接口:

  1. package org.andy.shop.service;
  2. import java.util.List;
  3. import org.andy.shop.model.UserInfo;
  4. /**
  5. * 创建时间:2015-1-27 下午5:15:03
  6. * @author andy
  7. * @version 2.2
  8. */
  9. public interface UserService {
  10. UserInfo getUserById(int id);
  11. List<UserInfo> getUsers();
  12. int insert(UserInfo userInfo);
  13. }

UserServiceImpl实现Service:

  1. package org.andy.shop.service.impl;
  2. import java.util.List;
  3. import org.andy.shop.dao.UserInfoMapper;
  4. import org.andy.shop.model.UserInfo;
  5. import org.andy.shop.service.UserService;
  6. import org.springframework.beans.factory.annotation.Autowired;
  7. import org.springframework.stereotype.Service;
  8. /**
  9. * 创建时间:2015-1-27 下午5:22:59
  10. *
  11. * @author andy
  12. * @version 2.2
  13. */
  14. @Service("userService")
  15. public class UserServiceImpl implements UserService {
  16. @Autowired
  17. private UserInfoMapper userInfoMapper;
  18. @Override
  19. public UserInfo getUserById(int id) {
  20. return userInfoMapper.selectByPrimaryKey(id);
  21. }
  22. @Override
  23. public List<UserInfo> getUsers() {
  24. return userInfoMapper.selectAll();
  25. }
  26. @Override
  27. public int insert(UserInfo userInfo) {
  28. int result = userInfoMapper.insert(userInfo);
  29. System.out.println(result);
  30. return result;
  31. }
  32. }

8、测试Spring和Mybatis配置

在src/test/java中写测试类,检测是否能够读出数据,若能读出则证明Spring+Mybatis整合成功。

TestUserService测试类:

  1. package org.andy.shop.service;
  2. import java.util.List;
  3. import org.andy.shop.model.UserInfo;
  4. import org.apache.log4j.Logger;
  5. import org.junit.Test;
  6. import org.junit.runner.RunWith;
  7. import org.springframework.beans.factory.annotation.Autowired;
  8. import org.springframework.test.context.ContextConfiguration;
  9. import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
  10. import com.alibaba.fastjson.JSON;
  11. /**
  12. * 创建时间:2015-1-27 下午10:45:38
  13. *
  14. * @author andy
  15. * @version 2.2
  16. */
  17. @RunWith(SpringJUnit4ClassRunner.class)
  18. @ContextConfiguration(locations = { "classpath:spring.xml",
  19. "classpath:spring-mybatis.xml" })
  20. public class TestUserService {
  21. private static final Logger LOGGER = Logger
  22. .getLogger(TestUserService.class);
  23. @Autowired
  24. private UserService userService;
  25. @Test
  26. public void testQueryById1() {
  27. UserInfo userInfo = userService.getUserById(1);
  28. LOGGER.info(JSON.toJSON(userInfo));
  29. }
  30. @Test
  31. public void testQueryAll() {
  32. List<UserInfo> userInfos = userService.getUsers();
  33. LOGGER.info(JSON.toJSON(userInfos));
  34. }
  35. @Test
  36. public void testInsert() {
  37. UserInfo userInfo = new UserInfo();
  38. userInfo.setUname("xiaoming");
  39. userInfo.setUnumber(4);
  40. int result = userService.insert(userInfo);
  41. System.out.println(result);
  42. }
  43. }

若是测试成功,那证明已经成功了一半了。

9、引入SpringMVC

9.1 配置SpringMVC配置信息

SpringMVC的配置信息主要包括控制层Controller的bean管理,视图层和控制层配置等等,下面是spring-mvc.xml信息:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xmlns:p="http://www.springframework.org/schema/p" xmlns:context="http://www.springframework.org/schema/context"
  5. xsi:schemaLocation="http://www.springframework.org/schema/beans
  6. http://www.springframework.org/schema/beans/spring-beans-4.1.xsd
  7. http://www.springframework.org/schema/context
  8. http://www.springframework.org/schema/context/spring-context-4.1.xsd
  9. http://www.springframework.org/schema/mvc
  10. http://www.springframework.org/schema/mvc/spring-mvc-4.1.xsd">
  11. <!-- 自动扫描controller包下的所有类,如果@Controller注入为bean -->
  12. <context:component-scan base-package="org.andy.shop.controller" />
  13. <!-- 避免IE执行AJAX时,返回JSON出现下载文件 -->
  14. <bean id="mappingJacksonHttpMessageConverter"
  15. class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
  16. <property name="supportedMediaTypes">
  17. <list>
  18. <value>text/html;charset=UTF-8</value>
  19. </list>
  20. </property>
  21. </bean>
  22. <!-- 启动Spring MVC的注解功能,完成请求和注解POJO的映射 -->
  23. <bean
  24. class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
  25. <property name="messageConverters">
  26. <list>
  27. <!-- json转换器 -->
  28. <ref bean="mappingJacksonHttpMessageConverter" />
  29. </list>
  30. </property>
  31. </bean>
  32. <!-- 对模型视图名称的解析,即在模型视图名称添加前后缀 -->
  33. <bean
  34. class="org.springframework.web.servlet.view.InternalResourceViewResolver">
  35. <property name="viewClass"
  36. value="org.springframework.web.servlet.view.JstlView" />
  37. <property name="prefix" value="/WEB-INF/views" />
  38. <property name="suffix" value=".jsp" />
  39. </bean>
  40. <!-- 配置多文件上传 -->
  41. <bean id="multipartResolver"
  42. class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
  43. <property name="defaultEncoding">
  44. <value>UTF-8</value>
  45. </property>
  46. <property name="maxUploadSize">
  47. <!-- 上传文件大小限制为31M,31*1024*1024 -->
  48. <value>32505856</value>
  49. </property>
  50. <property name="maxInMemorySize">
  51. <value>4096</value>
  52. </property>
  53. </bean>
  54. </beans>

自动扫描org.andy.shop.controller报下还有@Controller的控制层,注入为bean。

9.2、Web容器web.xml配置

web容器配置启动加载的配置文件,设置SpringMVC拦截的请求(此处拦截.htmls结尾的url请求)

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
  4. xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
  5. id="WebApp_ID" version="2.5">
  6. <display-name>springmvc_mybatis_demo</display-name>
  7. <context-param>
  8. <param-name>contextConfigLocation</param-name>
  9. <param-value>classpath:spring.xml,classpath:spring-mybatis.xml</param-value>
  10. </context-param>
  11. <filter>
  12. <filter-name>encodingFilter</filter-name>
  13. <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
  14. <init-param>
  15. <param-name>encoding</param-name>
  16. <param-value>utf-8</param-value>
  17. </init-param>
  18. <init-param>
  19. <param-name>forceEncoding</param-name>
  20. <param-value>true</param-value>
  21. </init-param>
  22. </filter>
  23. <filter-mapping>
  24. <filter-name>encodingFilter</filter-name>
  25. <url-pattern>/*</url-pattern>
  26. </filter-mapping>
  27. <listener>
  28. <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  29. </listener>
  30. <!-- 防止spring内存溢出监听器 -->
  31. <listener>
  32. <listener-class>org.springframework.web.util.IntrospectorCleanupListener</listener-class>
  33. </listener>
  34. <servlet>
  35. <description>spring mvc servlet</description>
  36. <servlet-name>rest</servlet-name>
  37. <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  38. <init-param>
  39. <param-name>contextConfigLocation</param-name>
  40. <param-value>
  41. classpath:spring-mvc.xml
  42. </param-value>
  43. </init-param>
  44. <load-on-startup>1</load-on-startup>
  45. </servlet>
  46. <servlet-mapping>
  47. <servlet-name>rest</servlet-name>
  48. <url-pattern>*.htmls</url-pattern>
  49. </servlet-mapping>
  50. <!-- 配置session超时时间,单位分钟 -->
  51. <session-config>
  52. <session-timeout>30</session-timeout>
  53. </session-config>
  54. <welcome-file-list>
  55. <welcome-file>index.jsp</welcome-file>
  56. </welcome-file-list>
  57. </web-app>

9.3、Controller控制层

在org.andy.shop.controller创建控制层,如UserController.java

  1. package org.andy.shop.controller;
  2. import java.util.List;
  3. import org.andy.shop.model.UserInfo;
  4. import org.andy.shop.service.UserService;
  5. import org.springframework.beans.factory.annotation.Autowired;
  6. import org.springframework.stereotype.Controller;
  7. import org.springframework.ui.ModelMap;
  8. import org.springframework.web.bind.annotation.PathVariable;
  9. import org.springframework.web.bind.annotation.RequestMapping;
  10. import org.springframework.web.bind.annotation.ResponseBody;
  11. /**
  12. * 创建时间:2015-1-28 下午1:17:27
  13. * @author andy
  14. * @version 2.2
  15. */
  16. @Controller
  17. @RequestMapping("/user")
  18. public class UserController {
  19. @Autowired
  20. private UserService userService;
  21. @RequestMapping("/showInfo/{userId}")
  22. public String showUserInfo(ModelMap modelMap, @PathVariable int userId){
  23. UserInfo userInfo = userService.getUserById(userId);
  24. modelMap.addAttribute("userInfo", userInfo);
  25. return "/user/showInfo";
  26. }
  27. @RequestMapping("/showInfos")
  28. public @ResponseBody Object showUserInfos(){
  29. List<UserInfo> userInfos = userService.getUsers();
  30. return userInfos;
  31. }
  32. }

9.4、视图层

在WEB-INF创建视图总目录views(为了安全起见一般都在WEB-INF下创建),创建/user/showInfo.jsp视图文件。

  1. <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
  2. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
  3. <html>
  4. <head>
  5. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  6. <title>userInfo</title>
  7. </head>
  8. <body>
  9. 姓名: ${userInfo.uname}
  10. </body>
  11. </html>

9.5、项目总目录结构

到此为demo以及基本创建完成总目录如下:

10、项目测试

将项目编译,Maven build...输入clean compile package,部署到Tomcat服务器,启动项目。

测试1:测试第一个url,  http://localhost:8080/springmvc_mybatis_demo/user/showInfo/1.htmls

测试2:测试第二个json数据返回的url,  http://localhost:8080/springmvc_mybatis_demo/user/showInfos.htmls

Maven搭建SpringMVC+Mybatis项目详解的更多相关文章

  1. Maven搭建SpringMVC+Hibernate项目详解 【转】

    前言 今天复习一下SpringMVC+Hibernate的搭建,本来想着将Spring-Security权限控制框架也映入其中的,但是发现内容太多了,Spring-Security的就留在下一篇吧,这 ...

  2. Maven搭建SpringMVC + SpringJDBC项目详解

    前言 上一次复习搭建了SpringMVC+Mybatis,这次搭建一下SpringMVC,采用的是SpringJDBC,没有采用任何其他的ORM框架,SpringMVC提供了一整套的WEB框架,所以如 ...

  3. Maven搭建SpringMVC+Hibernate项目详解

    前言 今天复习一下SpringMVC+Hibernate的搭建,本来想着将Spring-Security权限控制框架也映入其中的,但是发现内容太多了,Spring-Security的就留在下一篇吧,这 ...

  4. Maven搭建SpringMVC+Hibernate项目详解(转)

    前言 今天复习一下SpringMVC+Hibernate的搭建,本来想着将Spring-Security权限控制框架也映入其中的,但是发现内容太多了,Spring-Security的就留在下一篇吧,这 ...

  5. 从头开始基于Maven搭建SpringMVC+Mybatis项目(3)

    接上文内容,本节介绍基于Mybatis的查询和分页功能,并展示一个自定义的分页标签,可重复使用以简化JSP页面的开发. 从头阅读传送门 在上一节中,我们已经使用Maven搭建好了项目的基础结构,包括一 ...

  6. 从头开始基于Maven搭建SpringMVC+Mybatis项目(1)

    技术发展日新月异,许多曾经拥有霸主地位的流行技术短短几年间已被新兴技术所取代. 在Java的世界中,框架之争可能比语言本身的改变更让人关注.近几年,SpringMVC凭借简单轻便.开发效率高.与spr ...

  7. maven搭建springmvc+mybatis项目

    上一篇中已经成功使用maven搭建了一个web项目,本篇描述在此基础上怎么搭建一个基于springmvc+mybatis环境的项目. 说了这么久,为什么那么多人都喜欢用maven搭建项目?我们都知道m ...

  8. 从头开始基于Maven搭建SpringMVC+Mybatis项目(2)

    接上文内容,本节介绍Maven的聚合和继承. 从头阅读传送门 互联网时代,软件正在变得越来越复杂,开发人员通常会对软件划分模块,以获得清晰的设计.良好的分工及更高的可重用性.Maven的聚合特性能把多 ...

  9. 从头开始基于Maven搭建SpringMVC+Mybatis项目(4)

    接上文内容,上一节中的示例中完成了支持分页的商品列表查询功能,不过我们的目标是打造一个商品管理后台,本节中还需要补充添加.修改.删除商品的功能,这些功能依靠Mybatis操作数据库,并通过Spring ...

随机推荐

  1. JS操作页面

    DOM操作 1 windows对象操作 属性(值或者子对象): opener:打开当前窗口的源窗口,如果当前窗口是首次启动浏览器打开的,则opener是null.可以利用这属性来关闭源窗口 方法(函数 ...

  2. 1027 HTML

    body bgcolor(背景色)="#9900FF"(引号内呈现的是颜色代号,99是红色 00是绿色 FF是蓝色,所有颜色都是以这三个颜色调配) text (字体颜色)=&quo ...

  3. BugHD for JavaScript上线,轻松收集前端 Error

    从收集 APP 崩溃信息到全面收集网站出现的 Error,现在的 BugHD 变得更加强大.目前,BugHD JS Error 收集功能 已正式上线,前端 er 们不用再面对一堆 Bug 无处下手. ...

  4. 如何优雅的使用vue+vux开发app -02

    如何优雅的使用vue+vux开发app -02 很明显这又是一个错误的示范,请勿模仿 使用动态组件实现保留状态的路由 <!DOCTYPE html> <html> <he ...

  5. 建站集成软件包 XAMPP搭建后台系统与微信小程序开发

    下载安装XAMPP软件,运行Apache和MySQL 查看项目文件放在哪个位置可以正常运行 然后访问localhost即可 下载weiphp官网的weiapp(专为微信小程序开发使用)放在htdocs ...

  6. XML学习笔记1——概述

    我对于XML是很不够重视的,认识也是非常肤浅的,因为在之前的Web经验中,基本上都可以使用JSON来代替XML,JSON网络流量少,解析快,JS支持好等这些特点让我对自己的观点坚信不疑.然而我渐渐地改 ...

  7. Java并发包中CountDownLatch的工作原理、使用示例

    1. CountDownLatch的介绍 CountDownLatch是一个同步工具,它主要用线程执行之间的协作.CountDownLatch 的作用和 Thread.join() 方法类似,让一些线 ...

  8. WPF中找不到Image或者Image不是Drawing系列

    WPF中默认没有引用WinForm里面的一些东西,都是用它自带的那一套,但又不能完全脱离,所以有的时候比较蛋疼

  9. 深入理解PHP内核(六)哈希表以及PHP的哈希表实现

    原文链接:http://www.orlion.ga/241/ 一.哈希表(HashTable) 大部分动态语言的实现中都使用了哈希表,哈希表是一种通过哈希函数,将特定的键映射到特定值得一种数据 结构, ...

  10. poj 2195 Going Home

    /* 做网络流的题建图真的是太重要了! 本题是将人所在的位置和房子所在的位置建立边的联系,其中man到house这一条边的流量为 1, 费用为两者的距离 而方向边的流量为 0, 费用为正向边的相反数( ...