一、创建 SSMVCAnnoDemo 项目

点击菜单,选择“File -> New Project” 创建新项目。选择使用 archetype 中的 maven-webapp 模版创建。

输入对应的项目坐标GroupId 和 ArtifactId

之后在项目名称中填入项目名称,这里我填的 ProjectName 和上文的 ArtifactId 相同,都是 SSMVCAnnoDemo。

点击确定后,等待 Maven 帮我们构建好项目的目录结构。当控制台显示 BUILD SUCCESS 就表示初始化完成了。

初始化完成后的目录结构是这样的:

在 main 目录下创建 java 目录并将其设置为源码目录:

之后创建 com.chanshuyi.action 等包,创建完成后的目录结构如下:

二、导入依赖的包和插件

设置 POM.XML 配置文件中的全局属性:

  1. <!-- 声明全局属性 -->
  2. <properties>
  3. <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  4. <struts.version>2.3.24</struts.version>
  5. <springframework.version>4.1.6.RELEASE</springframework.version>
  6. <junit.version>3.8.1</junit.version>
  7. <commonsLogging.version>1.2</commonsLogging.version>
  8. </properties>

依次引入 MyBatis、Spring、SpringMVC、MySQL、Druid、JUnit、Log4J 等的依赖 Jar 包:

  1. <!-- ********************** MyBatis ********************** -->
  2. <!-- MyBatis 核心包 -->
  3. <dependency>
  4. <groupId>org.mybatis</groupId>
  5. <artifactId>mybatis</artifactId>
  6. <version>3.1.1</version>
  7. </dependency>
  8. <!-- 添加mybatis与Spring整合的核心包 -->
  9. <dependency>
  10. <groupId>org.mybatis</groupId>
  11. <artifactId>mybatis-spring</artifactId>
  12. <version>1.1.1</version>
  13. </dependency>
  14.  
  15. <!-- ********************** Spring ********************** -->
  16. <!-- Spring MVC 依赖 -->
  17. <dependency>
  18. <groupId>org.springframework</groupId>
  19. <artifactId>spring-webmvc</artifactId>
  20. <version>${springframework.version}</version>
  21. </dependency>
  22. <!-- 添加Spring-core包 -->
  23. <dependency>
  24. <groupId>org.springframework</groupId>
  25. <artifactId>spring-core</artifactId>
  26. <version>${springframework.version}</version>
  27. </dependency>
  28. <!-- 添加spring-tx包 -->
  29. <dependency>
  30. <groupId>org.springframework</groupId>
  31. <artifactId>spring-tx</artifactId>
  32. <version>${springframework.version}</version>
  33. </dependency>
  34. <!-- Spring ORM 相关-->
  35. <dependency>
  36. <groupId>org.springframework</groupId>
  37. <artifactId>spring-orm</artifactId>
  38. <version>${springframework.version}</version>
  39. </dependency>
  40. <!-- 添加spring-jdbc包 -->
  41. <dependency>
  42. <groupId>org.springframework</groupId>
  43. <artifactId>spring-jdbc</artifactId>
  44. <version>${springframework.version}</version>
  45. </dependency>
  46. <!--添加spring-web包 -->
  47. <dependency>
  48. <groupId>org.springframework</groupId>
  49. <artifactId>spring-web</artifactId>
  50. <version>${springframework.version}</version>
  51. </dependency>
  52. <!-- 添加spring-context包 -->
  53. <dependency>
  54. <groupId>org.springframework</groupId>
  55. <artifactId>spring-context</artifactId>
  56. <version>${springframework.version}</version>
  57. </dependency>
  58. <dependency>
  59. <groupId>org.springframework</groupId>
  60. <artifactId>spring-beans</artifactId>
  61. <version>${springframework.version}</version>
  62. </dependency>
  63. <dependency>
  64. <groupId>commons-logging</groupId>
  65. <artifactId>commons-logging</artifactId>
  66. <version>${commonsLogging.version}</version>
  67. </dependency>
  68. <!--添加aspectjweaver包 -->
  69. <dependency>
  70. <groupId>org.aspectj</groupId>
  71. <artifactId>aspectjweaver</artifactId>
  72. <version>1.8.5</version>
  73. </dependency>
  74.  
  75. <!-- ********************** Spring MVC 依赖的jar包 **********************-->
  76. <dependency>
  77. <groupId>javax.servlet</groupId>
  78. <artifactId>jstl</artifactId>
  79. <version>1.2</version>
  80. </dependency>
  81. <dependency>
  82. <groupId>taglibs</groupId>
  83. <artifactId>standard</artifactId>
  84. <version>1.1.2</version>
  85. </dependency>
  86. <!-- Servelt API -->
  87. <dependency>
  88. <groupId>javax.servlet</groupId>
  89. <artifactId>javax.servlet-api</artifactId>
  90. <version>3.0.1</version>
  91. <scope>provided</scope>
  92. </dependency>
  93.  
  94. <!-- ********************** DB Connection ********************** -->
  95. <dependency>
  96. <groupId>mysql</groupId>
  97. <artifactId>mysql-connector-java</artifactId>
  98. <version>5.1.21</version>
  99. </dependency>
  100. <!-- Druid -->
  101. <dependency>
  102. <groupId>com.alibaba</groupId>
  103. <artifactId>druid</artifactId>
  104. <version>1.0.6</version>
  105. </dependency>
  106.  
  107. <!-- ********************** 其他 ********************** -->
  108. <!-- 单元测试 JUnit -->
  109. <dependency>
  110. <groupId>junit</groupId>
  111. <artifactId>junit</artifactId>
  112. <version>${junit.version}</version>
  113. <scope>test</scope>
  114. </dependency>
  115. <!-- 日志记录 Log4j -->
  116. <dependency>
  117. <groupId>org.slf4j</groupId>
  118. <artifactId>slf4j-api</artifactId>
  119. <version>1.7.6</version>
  120. </dependency>
  121. <dependency>
  122. <groupId>org.slf4j</groupId>
  123. <artifactId>slf4j-log4j12</artifactId>
  124. <version>1.7.6</version>
  125. </dependency>

之后导入 Tomcat 启动插件,我们将通过 Maven 方式启动 Tomcat,这样就不必在本地配置一个 Tomcat 服务器。

  1. <!-- Maven的Tomcat插件(支持Maven以"tomcat7:run"方式启动web项目) -->
  2. <plugin>
  3. <groupId>org.apache.tomcat.maven</groupId>
  4. <artifactId>tomcat7-maven-plugin</artifactId>
  5. <version>2.1</version>
  6. <configuration>
  7. <port>5050</port>
  8. <path>/</path>
  9. <uriEncoding>UTF-8</uriEncoding>
  10. <finalName>mgr</finalName>
  11. <server>tomcat7</server>
  12. </configuration>
  13. </plugin>

配置完成后的 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>com.chanshuyi.SSMVCAnnoDemo</groupId>
  5. <artifactId>SSMVCAnnoDemo</artifactId>
  6. <packaging>war</packaging>
  7. <version>1.0-SNAPSHOT</version>
  8. <name>SSMVCAnnoDemo Maven Webapp</name>
  9. <url>http://maven.apache.org</url>
  10.  
  11. <!-- 声明全局属性 -->
  12. <properties>
  13. <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  14. <struts.version>2.3.24</struts.version>
  15. <springframework.version>4.1.6.RELEASE</springframework.version>
  16. <junit.version>3.8.1</junit.version>
  17. <commonsLogging.version>1.2</commonsLogging.version>
  18. </properties>
  19.  
  20. <dependencies>
  21. <!-- ********************** MyBatis ********************** -->
  22. <!-- MyBatis 核心包 -->
  23. <dependency>
  24. <groupId>org.mybatis</groupId>
  25. <artifactId>mybatis</artifactId>
  26. <version>3.1.1</version>
  27. </dependency>
  28. <!-- 添加mybatis与Spring整合的核心包 -->
  29. <dependency>
  30. <groupId>org.mybatis</groupId>
  31. <artifactId>mybatis-spring</artifactId>
  32. <version>1.1.1</version>
  33. </dependency>
  34.  
  35. <!-- ********************** Spring ********************** -->
  36. <!-- Spring MVC 依赖 -->
  37. <dependency>
  38. <groupId>org.springframework</groupId>
  39. <artifactId>spring-webmvc</artifactId>
  40. <version>${springframework.version}</version>
  41. </dependency>
  42. <!-- 添加Spring-core包 -->
  43. <dependency>
  44. <groupId>org.springframework</groupId>
  45. <artifactId>spring-core</artifactId>
  46. <version>${springframework.version}</version>
  47. </dependency>
  48. <!-- 添加spring-tx包 -->
  49. <dependency>
  50. <groupId>org.springframework</groupId>
  51. <artifactId>spring-tx</artifactId>
  52. <version>${springframework.version}</version>
  53. </dependency>
  54. <!-- Spring ORM 相关-->
  55. <dependency>
  56. <groupId>org.springframework</groupId>
  57. <artifactId>spring-orm</artifactId>
  58. <version>${springframework.version}</version>
  59. </dependency>
  60. <!-- 添加spring-jdbc包 -->
  61. <dependency>
  62. <groupId>org.springframework</groupId>
  63. <artifactId>spring-jdbc</artifactId>
  64. <version>${springframework.version}</version>
  65. </dependency>
  66. <!--添加spring-web包 -->
  67. <dependency>
  68. <groupId>org.springframework</groupId>
  69. <artifactId>spring-web</artifactId>
  70. <version>${springframework.version}</version>
  71. </dependency>
  72. <!-- 添加spring-context包 -->
  73. <dependency>
  74. <groupId>org.springframework</groupId>
  75. <artifactId>spring-context</artifactId>
  76. <version>${springframework.version}</version>
  77. </dependency>
  78. <dependency>
  79. <groupId>org.springframework</groupId>
  80. <artifactId>spring-beans</artifactId>
  81. <version>${springframework.version}</version>
  82. </dependency>
  83. <dependency>
  84. <groupId>commons-logging</groupId>
  85. <artifactId>commons-logging</artifactId>
  86. <version>${commonsLogging.version}</version>
  87. </dependency>
  88. <!--添加aspectjweaver包 -->
  89. <dependency>
  90. <groupId>org.aspectj</groupId>
  91. <artifactId>aspectjweaver</artifactId>
  92. <version>1.8.5</version>
  93. </dependency>
  94.  
  95. <!-- ********************** Spring MVC 依赖的jar包 **********************-->
  96. <dependency>
  97. <groupId>javax.servlet</groupId>
  98. <artifactId>jstl</artifactId>
  99. <version>1.2</version>
  100. </dependency>
  101. <dependency>
  102. <groupId>taglibs</groupId>
  103. <artifactId>standard</artifactId>
  104. <version>1.1.2</version>
  105. </dependency>
  106. <!-- Servelt API -->
  107. <dependency>
  108. <groupId>javax.servlet</groupId>
  109. <artifactId>javax.servlet-api</artifactId>
  110. <version>3.0.1</version>
  111. <scope>provided</scope>
  112. </dependency>
  113.  
  114. <!-- ********************** DB Connection ********************** -->
  115. <dependency>
  116. <groupId>mysql</groupId>
  117. <artifactId>mysql-connector-java</artifactId>
  118. <version>5.1.21</version>
  119. </dependency>
  120. <!-- Druid -->
  121. <dependency>
  122. <groupId>com.alibaba</groupId>
  123. <artifactId>druid</artifactId>
  124. <version>1.0.6</version>
  125. </dependency>
  126.  
  127. <!-- ********************** 其他 ********************** -->
  128. <!-- 单元测试 JUnit -->
  129. <dependency>
  130. <groupId>junit</groupId>
  131. <artifactId>junit</artifactId>
  132. <version>${junit.version}</version>
  133. <scope>test</scope>
  134. </dependency>
  135. <!-- 日志记录 Log4j -->
  136. <dependency>
  137. <groupId>org.slf4j</groupId>
  138. <artifactId>slf4j-api</artifactId>
  139. <version>1.7.6</version>
  140. </dependency>
  141. <dependency>
  142. <groupId>org.slf4j</groupId>
  143. <artifactId>slf4j-log4j12</artifactId>
  144. <version>1.7.6</version>
  145. </dependency>
  146. </dependencies>
  147.  
  148. <build>
  149. <finalName>SSMVCAnnoDemo</finalName>
  150. <plugins>
  151. <!-- Maven的Tomcat插件(支持Maven以"tomcat7:run"方式启动web项目) -->
  152. <plugin>
  153. <groupId>org.apache.tomcat.maven</groupId>
  154. <artifactId>tomcat7-maven-plugin</artifactId>
  155. <version>2.1</version>
  156. <configuration>
  157. <port>5050</port>
  158. <path>/</path>
  159. <uriEncoding>UTF-8</uriEncoding>
  160. <finalName>mgr</finalName>
  161. <server>tomcat7</server>
  162. </configuration>
  163. </plugin>
  164. </plugins>
  165. </build>
  166. </project>

pom.xml

三、开发模型层(MyBatis)

创建 SpringMVC 配置文件 resources/spring-servlet.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. xmlns:p="http://www.springframework.org/schema/p"
  7. xsi:schemaLocation="http://www.springframework.org/schema/beans
  8. http://www.springframework.org/schema/beans/spring-beans.xsd
  9. http://www.springframework.org/schema/mvc
  10. http://www.springframework.org/schema/mvc/spring-mvc.xsd
  11. http://www.springframework.org/schema/context
  12. http://www.springframework.org/schema/context/spring-context.xsd"
  13. default-lazy-init="true">
  14.  
  15. <!-- 添加注解驱动 -->
  16. <mvc:annotation-driven />
  17. <!-- 默认扫描的包路径 -->
  18. <context:component-scan base-package="com.chanshuyi.controller, com.chanshuyi.service.impl, com.chanshuyi.dao.impl" />
  19.  
  20. <!-- mvc:view-controller可以在不需要Controller处理request的情况,转向到设置的View -->
  21. <!-- 像下面这样设置,如果请求为/,则不通过controller,而直接解析为/index.jsp -->
  22. <!--<mvc:view-controller path="/" view-name="index" />-->
  23. <!-- 配置 SpringMVC Controller 转发JSP页面的路径 -->
  24. <bean class="org.springframework.web.servlet.view.UrlBasedViewResolver">
  25. <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"></property>
  26. <!-- 配置jsp路径前缀 -->
  27. <property name="prefix" value="/"></property>
  28. <!-- 配置URl后缀 -->
  29. <property name="suffix" value=".jsp"></property>
  30. </bean>
  31.  
  32. <!-- ================================== import sub-config file ================================== -->
  33. <import resource="spring-mybatis.xml" />
  34. <!-- ================================== /import sub-config file ================================== -->
  35. </beans>

创建 spring-mybatis.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. xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
  6.  
  7. <!-- 引入外部properties文件 -->
  8. <context:property-placeholder location="classpath:jdbc.properties" />
  9.  
  10. <!-- ====================================================== Add MyBatis Support Start ====================================================== -->
  11. <!-- 配置写数据源 -->
  12. <bean id="dataSourceWrite" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close">
  13. <!-- 基本属性 url、user、password -->
  14. <property name="url" value="${jdbc.master.url}" />
  15. <property name="username" value="${jdbc.master.username}" />
  16. <property name="password" value="${jdbc.master.password}" />
  17. <!-- 配置初始化大小、最小、最大 -->
  18. <property name="initialSize" value="${jdbc.master.initialSize}" />
  19. <property name="minIdle" value="${jdbc.master.minIdle}" />
  20. <property name="maxActive" value="${jdbc.master.maxActive}" />
  21. <!-- 配置获取连接等待超时的时间 -->
  22. <property name="maxWait" value="60000" />
  23. <!-- 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 -->
  24. <property name="timeBetweenEvictionRunsMillis" value="60000" />
  25. <!-- 配置一个连接在池中最小生存的时间,单位是毫秒 -->
  26. <property name="minEvictableIdleTimeMillis" value="300000" />
  27. <property name="validationQuery" value="SELECT '1'" />
  28. <property name="testWhileIdle" value="true" />
  29. <property name="testOnBorrow" value="true" />
  30. <property name="testOnReturn" value="false" />
  31. <!-- 打开PSCache,并且指定每个连接上PSCache的大小 mysql false -->
  32. <property name="poolPreparedStatements" value="false" />
  33. <property name="maxPoolPreparedStatementPerConnectionSize" value="20" />
  34. <!-- 配置监控统计拦截的filters -->
  35. <property name="filters" value="config,stat,log4j,wall" />
  36. <property name="connectionProperties" value="config.decrypt=false" />
  37. </bean>
  38. <!-- 配置读数据源 -->
  39. <bean id="dataSourceRead" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close">
  40. <!-- 基本属性 url、user、password -->
  41. <property name="url" value="${jdbc.slave.url}" />
  42. <property name="username" value="${jdbc.slave.username}" />
  43. <property name="password" value="${jdbc.slave.password}" />
  44. <!-- 配置初始化大小、最小、最大 -->
  45. <property name="initialSize" value="${jdbc.slave.initialSize}" />
  46. <property name="minIdle" value="${jdbc.slave.minIdle}" />
  47. <property name="maxActive" value="${jdbc.slave.maxActive}" />
  48. <!-- 配置获取连接等待超时的时间 -->
  49. <property name="maxWait" value="60000" />
  50. <!-- 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 -->
  51. <property name="timeBetweenEvictionRunsMillis" value="60000" />
  52. <!-- 配置一个连接在池中最小生存的时间,单位是毫秒 -->
  53. <property name="minEvictableIdleTimeMillis" value="300000" />
  54. <property name="validationQuery" value="SELECT '1'" />
  55. <property name="testWhileIdle" value="true" />
  56. <property name="testOnBorrow" value="false" />
  57. <property name="testOnReturn" value="false" />
  58. <!-- 打开PSCache,并且指定每个连接上PSCache的大小 mysql false -->
  59. <property name="poolPreparedStatements" value="false" />
  60. <property name="maxPoolPreparedStatementPerConnectionSize" value="20" />
  61. <!-- 配置监控统计拦截的filters -->
  62. <property name="filters" value="config,stat,log4j,wall" />
  63. <property name="connectionProperties" value="config.decrypt=false" />
  64. </bean>
  65.  
  66. <!-- 可写的SessionFactory -->
  67. <bean id="sqlWriteSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean" scope="singleton">
  68. <property name="dataSource" ref="dataSourceWrite" />
  69. <property name="configLocation" value="classpath:mybatis-config.xml" />
  70. </bean>
  71. <!-- 只读的SessionFactory -->
  72. <bean id="sqlReadOnlySessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean" scope="singleton">
  73. <property name="dataSource" ref="dataSourceRead" />
  74. <property name="configLocation" value="classpath:mybatis-config.xml" />
  75. </bean>
  76.  
  77. <!-- 可写的Session -->
  78. <bean id="writableSQLSession" class="org.mybatis.spring.SqlSessionTemplate">
  79. <constructor-arg index="0" ref="sqlWriteSessionFactory" />
  80. </bean>
  81. <!-- 只读的Session -->
  82. <bean id="readonlySQLSession" class="org.mybatis.spring.SqlSessionTemplate">
  83. <constructor-arg index="0" ref="sqlReadOnlySessionFactory" />
  84. </bean>
  85. <!-- ====================================================== Add MyBatis Support End ====================================================== -->
  86. </beans>

创建 jdbc.properties 配置文件

  1. ############################ MySQL/Oracle/SQLServer Database Configuratioin Info ###############################
  2. # MySQL Master DB Info
  3. jdbc.master.dialet=org.hibernate.dialect.MySQLDialect
  4. jdbc.master.driverClassName=com.mysql.jdbc.Driver
  5. jdbc.master.url=jdbc:mysql://127.0.0.1:3306/SSMDemo
  6. jdbc.master.username=root
  7. jdbc.master.password=sa
  8.  
  9. # MySQL Slave DB Info
  10. jdbc.slave.dialet=org.hibernate.dialect.MySQLDialect
  11. jdbc.slave.driverClassName=com.mysql.jdbc.Driver
  12. jdbc.slave.url=jdbc:mysql://localhost:3306/SSMDemo
  13. jdbc.slave.username=root
  14. jdbc.slave.password=sa
  15.  
  16. ############################## Connection Pool Configuration Info ##############################################
  17. # MySQL Master DB Setting
  18. jdbc.master.initialSize = 10
  19. jdbc.master.minIdle = 0
  20. jdbc.master.maxActive = 30
  21.  
  22. # MySQL Slave DB Setting
  23. jdbc.slave.initialSize = 10
  24. jdbc.slave.minIdle = 0
  25. jdbc.slave.maxActive = 30

在本地 MySQL 数据库创建一个 SSMDemo 数据库,执行下面的语句创建 user 表并插入一条测试数据。

  1. CREATE TABLE `user` (
  2. `id` int(11) NOT NULL AUTO_INCREMENT,
  3. `username` varchar(45) DEFAULT NULL,
  4. `password` varchar(45) DEFAULT NULL,
  5. PRIMARY KEY (`id`)
  6. ) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8;
  7.  
  8. -- ----------------------------
  9. -- Records of user
  10. -- ----------------------------
  11. INSERT INTO `user` VALUES ('1', 'admin', 'password');

创建 mybatis-config.xml 文件,并配置需要扫描包路径

  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
  3. <configuration>
  4. <mappers>
  5. <!-- 配置扫描的Mapper类 -->
  6. <package name="com.chanshuyi.dao.mapper"/>
  7. </mappers>
  8. </configuration>

下载 MBGGenerator(密码:c1dy),这是MyBatis 官方的 MyBatis Generator,我们使用它将数据库表转化成 model、mapper 以及 SqlProvider 文件。

下载文件解压放到 resources 目录下。进入 resources/mbg 目录,双击运行 generate.bat,程序自动将配置文件 resources/mbgconfig.xml 中配置的表格映射成相对应的文件。

四、开发视图层(Spring)

创建 resources/log4j.properties 文件,提供日志记录。

  1. #Console Log
  2. log4j.rootLogger=info, console, file
  3.  
  4. # Write to Console
  5. log4j.appender.console=org.apache.log4j.ConsoleAppender
  6. log4j.appender.console.Threshold=INFO
  7. log4j.appender.console.layout=org.apache.log4j.PatternLayout
  8. log4j.appender.console.layout.ConversionPattern=%5p %d{MM-dd HH:mm:ss}(%F:%L): %m%n
  9.  
  10. # Write to File
  11. log4j.appender.file=org.apache.log4j.DailyRollingFileAppender
  12. log4j.appender.file.File=${catalina.home}app/log/log.log
  13. log4j.appender.file.layout=org.apache.log4j.PatternLayout
  14. log4j.appender.file.layout.ConversionPattern=%5p %d{MM-dd HH:mm:ss}(%F:%L): %m%n

在 com.chanshuyi.dao.mapper.UserMapper 类中增加 getUserListByMapSql 接口:

  1. /**
  2. * 根据参数构造SQL进行查询
  3. * @param param
  4. * @return
  5. */
  6. @SelectProvider(type = UserSqlProvider.class, method = "getUserListByMapSql")
  7. List<User> getUserListByMapSql(@Param("param") Map<String, String> param);

在 UserSqlProvider 类增加对上面接口 SQL 的实现:

  1. /**
  2. * 获取查询SQL
  3. * @param param
  4. * @return
  5. */
  6. public String getUserListByMapSql(Map<String, Object> param) {
  7. StringBuilder builder = new StringBuilder();
  8. Map<String, String> realParam = (Map<String, String>)param.get("param");
  9.  
  10. //add select part
  11. builder.append(" select * from user where 1 = 1 ");
  12.  
  13. //add condition part
  14. String conditionStr = "";
  15. if(!StringUtil.isNullOrEmpty(realParam)){
  16. conditionStr = getQueryCondition(realParam);
  17. if(!StringUtil.isNullOrEmpty(conditionStr)){
  18. builder.append(conditionStr);
  19. }
  20. }
  21.  
  22. return new String(builder);
  23. }
  24.  
  25. public String getQueryCondition(Map<String, String> param){
  26. StringBuilder builder = new StringBuilder();
  27.  
  28. //if param is null or empty, return empty String
  29. if(param == null || param.size() < 1){
  30. return "";
  31. }
  32.  
  33. for(String key : param.keySet()){
  34. String value = param.get(key);
  35. if(value != null && !value.isEmpty()){
  36. builder.append(" and " + key + " = '" + value + "'");
  37. }
  38. }
  39.  
  40. return new String(builder);
  41. }

上面用到了 StringUtil.java,我们在 com.chanshuyi.util 中导入它:

  1. package com.mszz.util;
  2.  
  3. import java.util.Collection;
  4. import java.util.Map;
  5.  
  6. /**
  7. * 字符串工具类
  8. * @author chenxinquan
  9. *
  10. */
  11. public class StringUtil {
  12. /**
  13. * 判断对象或对象数组中每一个对象是否为空: 对象为null,字符序列长度为0,集合类、Map为empty
  14. * @author zl
  15. * @param obj
  16. * @return
  17. */
  18. public static boolean isNullOrEmpty(Object obj) {
  19. if (obj == null)
  20. return true;
  21.  
  22. if (obj instanceof CharSequence)
  23. return ((CharSequence) obj).length() == 0;
  24.  
  25. if (obj instanceof Collection)
  26. return ((Collection) obj).isEmpty();
  27.  
  28. if (obj instanceof Map)
  29. return ((Map) obj).isEmpty();
  30.  
  31. if (obj instanceof Object[]) {
  32. Object[] object = (Object[]) obj;
  33. if (object.length == 0) {
  34. return true;
  35. }
  36. boolean empty = true;
  37. for (int i = 0; i < object.length; i++) {
  38. if (!isNullOrEmpty(object[i])) {
  39. empty = false;
  40. break;
  41. }
  42. }
  43. return empty;
  44. }
  45. return false;
  46. }
  47. }
  48.  
  49. StringUtil.java

创建 com.chanshuyi.dao.impl.BaseDao.java 类,提供基本的数据库读写对象,并用注解方式将 SqlSession 注入。

  1. package com.chanshuyi.dao.impl;
  2.  
  3. import org.apache.ibatis.session.SqlSession;
  4. import org.springframework.beans.factory.annotation.Autowired;
  5.  
  6. /**
  7. * 所有Service的基类,用来注入sqlSession
  8. */
  9. public class BaseDao {
  10. /**
  11. * 可写的sqlSession
  12. */
  13. @Autowired
  14. protected SqlSession writableSQLSession;
  15.  
  16. /**
  17. * 只读的sqlSession
  18. */
  19. @Autowired
  20. protected SqlSession readonlySQLSession;
  21. }

创建DAO层接口 IUserDao.java:

  1. package com.chanshuyi.dao;
  2.  
  3. import com.chanshuyi.model.User;
  4.  
  5. import java.util.List;
  6. import java.util.Map;
  7.  
  8. /**
  9. * Created by chanshuyi on 2015/12/26.
  10. */
  11. public interface IUserDao {
  12. User getUserById(int userId);
  13.  
  14. /**
  15. *
  16. * @param param Map中的key要与数据库表中的字段名相同
  17. * @return
  18. */
  19. User getUserByMapSql(Map<String, String> param);
  20.  
  21. List<User> getUserListByMapSql(Map<String, String> param);
  22. }

创建 UserDaoImpl.java 继承 BaseDao.java、实现 IUserDao 接口,并用 @Repository 创建名称为 userDao 的对象。

  1. package com.chanshuyi.dao.impl;
  2.  
  3. import com.chanshuyi.dao.IUserDao;
  4. import com.chanshuyi.dao.mapper.UserMapper;
  5. import com.chanshuyi.model.User;
  6. import org.apache.commons.logging.Log;
  7. import org.apache.commons.logging.LogFactory;
  8. import org.springframework.stereotype.Repository;
  9.  
  10. import java.util.List;
  11. import java.util.Map;
  12.  
  13. /**
  14. * Created by Administrator on 2015/12/26.
  15. */
  16. @Repository("userDao")
  17. public class UserDaoImpl extends BaseDao implements IUserDao {
  18.  
  19. private static Log logger = LogFactory.getLog(UserDaoImpl.class);
  20.  
  21. @Override
  22. public User getUserById(int userId) {
  23. UserMapper mapper = readonlySQLSession.getMapper(UserMapper.class);
  24. return mapper.selectByPrimaryKey(userId);
  25. }
  26.  
  27. /**
  28. *
  29. * @param param
  30. * @return
  31. */
  32. @Override
  33. public User getUserByMapSql(Map<String, String> param) {
  34. logger.info("getUserByMapSql 根据动态参数查询用户对象");
  35. return getUserListByMapSql(param).size() > 0 ? getUserListByMapSql(param).get(0) : null;
  36. }
  37.  
  38. /**
  39. * get**MapSql()类的方法只能用于各参数的等于查询
  40. * 例如:select * from user where username = 1 and password = 3 (正确)
  41. * select * from user where username in (1,2,3) (错误,无法实现)
  42. * @param param
  43. * @return
  44. */
  45. @Override
  46. public List<User> getUserListByMapSql(Map<String, String> param) {
  47. logger.info("getUserListByMapSql 根据动态参数查询用户对象列表");
  48. UserMapper mapper = readonlySQLSession.getMapper(UserMapper.class);
  49. return mapper.getUserListByMapSql(param);
  50. }
  51. }

创建 IUserService.java 和 UserServiceImpl.java。在 UserServiceImpl 中添加 @Service 注解创建名称为 userService 的对象,并将 userDao 对象注入。

  1. package com.mszz.service;
  2.  
  3. import com.mszz.model.User;
  4.  
  5. import java.util.List;
  6. import java.util.Map;
  7.  
  8. /**
  9. * Created by chanshuyi on 2015/12/26.
  10. */
  11. public interface IUserService {
  12. User getUserById(int userId);
  13.  
  14. /**
  15. *
  16. * @param param Map中的key要与数据库表中的字段名相同
  17. * @return
  18. */
  19. User getUserByMapSql(Map<String, String> param);
  20.  
  21. List<User> getUserListByMapSql(Map<String, String> param);
  22. }
  1. package com.chanshuyi.service.impl;
  2.  
  3. import com.chanshuyi.dao.IUserDao;
  4. import com.chanshuyi.model.User;
  5. import com.chanshuyi.service.IUserService;
  6. import org.apache.commons.logging.Log;
  7. import org.apache.commons.logging.LogFactory;
  8. import org.springframework.beans.factory.annotation.Autowired;
  9. import org.springframework.stereotype.Service;
  10.  
  11. import java.util.List;
  12. import java.util.Map;
  13.  
  14. /**
  15. * Created by Administrator on 2015/6/18.
  16. */
  17. @Service("userService")
  18. public class UserServiceImpl implements IUserService {
  19.  
  20. private static Log logger = LogFactory.getLog(UserServiceImpl.class);
  21.  
  22. @Autowired
  23. IUserDao userDao;
  24.  
  25. @Override
  26. public User getUserById(int userId) {
  27. return userDao.getUserById(userId);
  28. }
  29.  
  30. @Override
  31. public User getUserByMapSql(Map<String, String> param) {
  32. return userDao.getUserByMapSql(param);
  33. }
  34.  
  35. @Override
  36. public List<User> getUserListByMapSql(Map<String, String> param) {
  37. return userDao.getUserListByMapSql(param);
  38. }
  39. }

五、开发控制层(Struts)

创建 com.chanshuyi.action.UserController 类

  1. package com.chanshuyi.controller;
  2.  
  3. import com.chanshuyi.service.IUserService;
  4. import org.slf4j.Logger;
  5. import org.slf4j.LoggerFactory;
  6. import org.springframework.beans.factory.annotation.Autowired;
  7. import org.springframework.stereotype.Controller;
  8. import org.springframework.web.bind.annotation.RequestMapping;
  9. import org.springframework.web.bind.annotation.RequestParam;
  10. import org.springframework.web.bind.annotation.ResponseBody;
  11.  
  12. import javax.servlet.http.HttpServletRequest;
  13. import java.util.HashMap;
  14. import java.util.Map;
  15.  
  16. /**
  17. * Created by Administrator on 2015/6/18.
  18. */
  19. @Controller("userAction")
  20. @RequestMapping(value="/login")
  21. public class UserController{
  22.  
  23. private static Logger logger = LoggerFactory.getLogger(UserController.class);
  24.  
  25. private String message;
  26.  
  27. private String username;
  28.  
  29. private String password;
  30.  
  31. @Autowired
  32. private IUserService userService;
  33.  
  34. @Autowired
  35. private HttpServletRequest request;
  36.  
  37. @RequestMapping("")
  38. public String login(@RequestParam(value = "username", required = false) String username,
  39. @RequestParam(value = "password", required = false) String password){
  40. try{
  41. Map<String, String> param = new HashMap<String, String>();
  42. param.put("username", username);
  43. param.put("password", password);
  44. if(userService.getUserByMapSql(param) != null){
  45. message = "登录成功!";
  46. logger.info(message);
  47. }else{
  48. message = "登录失败!";
  49. logger.info(message);
  50. }
  51. }catch(Exception e){
  52. logger.warn(e.getMessage());
  53. e.printStackTrace();
  54. }
  55. request.setAttribute("message", message);
  56. return "index"; // 转到webapp/index.jsp页面
  57. }
  58.  
  59. /******** set/get ********/
  60. public String getMessage() {
  61. return message;
  62. }
  63.  
  64. public void setMessage(String message) {
  65. this.message = message;
  66. }
  67.  
  68. public String getUsername() {
  69. return username;
  70. }
  71.  
  72. public void setUsername(String username) {
  73. this.username = username;
  74. }
  75.  
  76. public String getPassword() {
  77. return password;
  78. }
  79.  
  80. public void setPassword(String password) {
  81. this.password = password;
  82. }
  83. }

创建 webapp/index.jsp 文件

  1. <%@page language="java" pageEncoding="UTF-8"%>
  2. <%@ page contentType="text/html;charset=utf-8" %>
  3. <%@ page isELIgnored="false"%>
  4. <html>
  5. <head>
  6. <meta charset="utf-8">
  7. </head>
  8. <body>
  9. <h2>Hello World!</h2>
  10. <%-- 通过Struts传递参数,数据传递方式必须选择post,否则编码错误! --%>
  11. <form action="login" method="post" >
  12. <p id="message">${message}</p>
  13. <b>Username:</b><input type="text" id="name" name="username" /><br>
  14. <b>Password:</b><input type="password" id="password" name="password"/><br>
  15. <input type="submit" value="Login"/>
  16. </form>
  17. </body>
  18. </html>

修改 web.xml 文件,加载 SpringMVC 处理器

  1. <!DOCTYPE web-app PUBLIC
  2. "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
  3. "http://java.sun.com/dtd/web-app_2_3.dtd" >
  4.  
  5. <web-app>
  6. <display-name>Archetype Created Web Application</display-name>
  7.  
  8. <!-- 字符集过滤器 -->
  9. <filter>
  10. <filter-name>encodingFilter</filter-name>
  11. <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
  12. <init-param>
  13. <param-name>encoding</param-name>
  14. <param-value>UTF-8</param-value>
  15. </init-param>
  16. <init-param>
  17. <param-name>forceEncoding</param-name>
  18. <param-value>true</param-value>
  19. </init-param>
  20. </filter>
  21. <filter-mapping>
  22. <filter-name>encodingFilter</filter-name>
  23. <url-pattern>/*</url-pattern>
  24. </filter-mapping>
  25.  
  26. <!-- spring MVC的核心就是DispatcherServlet,使用springMVC的第一步就是将下面的servlet放入web.xml
  27. servlet-name属性非常重要,默认情况下,DispatchServlet会加载这个名字-servlet.xml的文件,如下,就会加载
  28. dispather-servlet.xml,也是在WEN-INF目录下。-->
  29. <servlet>
  30. <servlet-name>spring</servlet-name>
  31. <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  32. <init-param>
  33. <param-name>contextConfigLocation</param-name>
  34. <param-value>classpath:/spring-servlet.xml</param-value>
  35. </init-param>
  36. <load-on-startup>1</load-on-startup>
  37. </servlet>
  38. <!-- 设置dispatchservlet的匹配模式,通过把dispatchservlet映射到/,默认servlet会处理所有的请求,包括静态资源 -->
  39. <servlet-mapping>
  40. <servlet-name>spring</servlet-name>
  41. <url-pattern>/</url-pattern>
  42. </servlet-mapping>
  43. </web-app>

六、启动项目测试

为工程配置 Maven 命令 “tomcat7:run”

点击启动项目

打开浏览器输入:http://localhost:5050/index.jsp

输入 admin/password,点击 Login 按钮

提示登录成功,说明项目已经成功部署好。

与 Spring 框架项目对比

因为我们一般用 SpringMVC 的时候都是用注解的形式,所以SpringMVC 框架的项目都是注解形式,没有 XML 配置文件方式。下面我们来对比一下用 SpringMVC 和用 Spring + Struts 的实现区别。

1、使用 SpringMVC 框架时需要配置与 Spring 不同的 web.xml 配置,并且读取的根配置文件不再是 applicationContext.xml,而是 servletName-servlet.xml(servletName 表示的是配置在 web.xml 中的servlet 名称)。

2、因为使用了 SpringMVC,所以不再需要 Struts 来接收用户请求,而是直接通过 @RequestMapping 注解的方式在 Controller 类上进行注解映射,也就少了 struts.xml 这个配置文件。而一般情况下用 SpringMVC 的项目更习惯于将 Action 写成 Controller。

链接:http://pan.baidu.com/s/1gdZgyqf 密码:vrm5

玩转 SSH(六):SpringMVC + MyBatis 架构搭建(注解版)的更多相关文章

  1. SpringBoot Mybatis整合(注解版),SpringBoot集成Mybatis(注解版)

    SpringBoot Mybatis整合(注解版),SpringBoot集成Mybatis(注解版) ================================ ©Copyright 蕃薯耀 2 ...

  2. SSM框架——Spring+SpringMVC+Mybatis的搭建教程

    一:概述 SSM框架在项目开发中经常使用到,相比于SSH框架,它在仅几年的开发中运用的更加广泛. Spring作为一个轻量级的框架,有很多的拓展功能,最主要的我们一般项目使用的就是IOC和AOP. S ...

  3. IntelliJ IDEA下Maven SpringMVC+Mybatis入门搭建例子

    很久之前写了一篇SSH搭建例子,由于工作原因已经转到SpringMVC+Mybatis,就以之前SSH实现简单登陆的例子,总结看看SpringMVC+Mybatis怎么实现. Spring一开始是轻量 ...

  4. Maven 搭建 SSM框架——Spring+SpringMVC+Mybatis的搭建教程

    一:概述 SSM框架在项目开发中经常使用到,相比于SSH框架,它在仅几年的开发中运用的更加广泛. Spring作为一个轻量级的框架,有很多的拓展功能,最主要的我们一般项目使用的就是IOC和AOP.Sp ...

  5. 记录:springmvc + mybatis + maven 搭建配置流程

    前言:不会配置 spring mvc,不知道为什么那样配置,也不知道从何下手,那么看这里就对了. 在 IDEA 中搭建 maven + springmvc + mybatis: 一.在 IDEA 中首 ...

  6. SpringMVC+Mybatis框架搭建

    一.新建javaweb项目,并建好相应的包结构 二.添加项目jar到lib目录下 三.在config包中新建配置文件 sping-mvc.xml,内容如下: <?xml version=&quo ...

  7. SSM(Spring +SpringMVC + Mybatis)框架搭建

    SSM(Spring +SpringMVC + Mybatis)框架的搭建 最近通过学习别人博客发表的SSM搭建Demo,尝试去搭建一个简单的SSMDemo---实现的功能是对用户增删改查的操作 参考 ...

  8. spring+springMVC+Mybatis架构下采用AbstractRoutingDataSource、atomikos、JTA实现多数据源灵活切换以及分布式事务管理

    背景: 1.系统采用SSM架构.需要在10多个MYSQL数据库之间进行切换并对数据进行操作,上篇博文<springMVC+Mybatis(使用AbstractRoutingDataSource实 ...

  9. springmvc+mybatis环境搭建

    1.spring+mybatis 环境搭建: A.配置jdbc和dbcp数据源:注意版本com.mysql.cj.jdbc.Driver B.配置sessionfactory,绑定dbcp及配置map ...

随机推荐

  1. 浅谈PHP的CI框架(一)

    作为前端开发人员,掌握一门后端语言是必不可少的,PHP的CI框架是一个快速开发框架,基于MVC,比较接近原生PHP,在原有的PHP代码上封装了许多类,易上手,容易扩展,适用于小项目,并且CI的文档及案 ...

  2. 用C++编一程序,先输出一行sun mon tue wed thu fri fri,接着使用右对齐打印出日期,像日历那样

    用C++编一程序,先输出一行sun mon tue wed thu fri fri,接着使用右对齐打印出日期,像日历那样 先输出一行sun mon tue wed thu fri fri,再提醒用户输 ...

  3. 【PHP系列】PHP推荐标准之PSR-3,日志记录器接口

    上节聊完了PHP官方的相关代码规范,下面给大家带来了PHP系列的PHP推荐标准的另外两个,PSR-3,PSR-4. 首先,我们先来了解下PSR-3是怎么回事. PHP-FIG发布的第三个推荐规范与前两 ...

  4. webpack性能优化——DLL

    Webpack性能优化的方式有很多种,本文之所以将 dll 单独讲解,是因为 dll 是一种最简单粗暴并且极其有效的优化方式. 在通常的打包过程中,你所引用的诸如:jquery.bootstrap.r ...

  5. 卷积神经网络(CNN)反向传播算法

    在卷积神经网络(CNN)前向传播算法中,我们对CNN的前向传播算法做了总结,基于CNN前向传播算法的基础,我们下面就对CNN的反向传播算法做一个总结.在阅读本文前,建议先研究DNN的反向传播算法:深度 ...

  6. 本人开发的JavaWeb急速框架Blast上线了

    JAVA 急速WEB框架Blast --对JavaWeb的学习性框架,参考了spring的实现 --阅读Blast源码可以快速掌握JavaWeb常用技术和方法论,并付诸实践 Blast 是基于 Jav ...

  7. Linux usb子系统(一) _写一个usb鼠标驱动

    USB总线是一种典型的热插拔的总线标准,由于其优异的性能几乎成为了当下大小设备中的标配. USB的驱动可以分为3类:SoC的USB控制器的驱动,主机端USB设备的驱动,设备上的USB Gadget驱动 ...

  8. ThinkPhp框架:有条件的数据库查询、tp框架的其他知识

    上一篇的随笔写的是基本操作,现在可以做一些高级操作,例如有条件的查询数据,有分页的条件查询数据 一.一个条件的查询数据 查询数据自然是先要显示出数据,然后根据条件进行查询数据 (1)显示出表的数据 这 ...

  9. Struts2框架(8)---Struts2的输入校验

    Struts2的输入校验 在我们项目实际开发中在数据校验时,分为两种,一种是前端校验,一种是服务器校验: 客户端校验:主要是通过jsp写js脚本,它的优点很明显,就是输入错误的话提醒比较及时,能够减轻 ...

  10. VMware10虚拟机安装mac os x 10.9

    身边越来越多盆友们购进mac本子,不断地诱惑着小编,近日一直想着买一台mac本子装逼,后来想想用来开发(非ios)可能会遇着各种问题,就先在虚拟机上玩玩看,毕竟1,2万RMB不是小数. 在mac os ...