SSM整合(spring-springmvc-mybatis)之HelloWorld
一、目录结构

helloworld(SSM)创建步骤:
步骤一:创建一个类型为Dynamic Web Project 名称为ssm的项目
步骤二:加入jar包:
spring核心jar包:
- commons-logging-1.2.jar
- spring-beans-5.3.10.jar
- spring-context-5.3.10.jar
- spring-core-5.3.10.jar
- spring-expression-5.3.10.jar
spring aop:
- spring-aop-5.3.10.jar
- spring-aspects-5.3.10.jar
springmvc jar包:
- spring-web-5.3.10.jar
- spring-webmvc-5.3.10.jar
spring 数据库交互jar包:
- spring-jdbc-5.3.10.jar
- spring-tx-5.3.10.jar
mybatis jar包:
- mybatis-3.5.9.jar
- mysql-connector-java-8.0.27 (1).jar
- log4j-1.2.17.jar
mybatis-spring 适配器包:
- mybatis-spring-1.3.2.jar
c3po:
- c3p0-0.9.5.5.jar
- c3p0-oracle-thin-extras-0.9.5.5.jar
- mchange-commons-java-0.2.19.jar
MyBatis-Spring下载地址:
https://github.com/mybatis/spring 在release中选择对应的版本下载即可;
步骤三:配置
web.xml:
- 配置DispacherServlet
- 配置启动spring ioc容器的Listener
配置说明,可参考十二、springMVC整合spring
1 <?xml version="1.0" encoding="UTF-8"?> 2 <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 3 xmlns="http://xmlns.jcp.org/xml/ns/javaee" 4 xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" 5 version="4.0"> 6 <context-param> 7 <param-name>contextConfigLocationparam-name> 8 <param-value>classpath:spring.xmlparam-value> 9 context-param> 10 <listener> 11 <listener-class>org.springframework.web.context.ContextLoaderListenerlistener-class> 12 listener> 13 14 <servlet> 15 <servlet-name>springDispatcherServletservlet-name> 16 <servlet-class>org.springframework.web.servlet.DispatcherServletservlet-class> 17 18 20 <init-param> 21 <param-name>contextConfigLocationparam-name> 22 <param-value>classpath:springmvc.xmlparam-value> 23 init-param> 24 25 <load-on-startup>1load-on-startup> 26 servlet> 27 28 29 <servlet-mapping> 30 <servlet-name>springDispatcherServletservlet-name> 31 <url-pattern>/url-pattern> 32 servlet-mapping> 33 34 web-app>
springmvc.xml:
基础配置(扫描包配置+视图解析器配置+<mvc:annotation-driven>mvc:annotation-driven>)
配置说明,可参考十二、springMVC整合spring spring和springmvc 整合时对扫描包做了特殊处理,来解决重复扫描包启动时实例化两次的问题;
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/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd 7 http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd 8 http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> 9 10 11 <context:component-scan base-package="ssm" use-default-filters="false"> 12 <context:include-filter type="annotation" 13 expression="org.springframework.stereotype.Controller" /> 14 <context:include-filter type="annotation" 15 expression="org.springframework.stereotype.Service" /> 16 context:component-scan> 17 18 <bean 19 class="org.springframework.web.servlet.view.InternalResourceViewResolver"> 20 <property name="prefix" value="/WEB-INF/views/">property> 21 <property name="suffix" value=".jsp">property> 22 bean> 23 <mvc:annotation-driven>mvc:annotation-driven> 24 beans>
spring.xml:
扫描包配置+数据源配置+事务配置+mybatis配置;
扫描包配置:请参考十二、springMVC整合spring spring和springmvc 整合时对扫描包做了特殊处理,来解决重复扫描包启动时实例化两次的问题;
数据源配置:和 中的配置是一样的;
mybatis配置:
- 创建出 sqlSessionFactoryBean对象
- 配置一个可以进行批量执行的sqlSession
- 扫描所有的mapper接口的实现,让这些mapper能够自动注入
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:tx="http://www.springframework.org/schema/tx" 5 xmlns:context="http://www.springframework.org/schema/context" 6 xmlns:mybatis-spring="http://mybatis.org/schema/mybatis-spring" 7 xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd 8 http://mybatis.org/schema/mybatis-spring http://mybatis.org/schema/mybatis-spring-1.2.xsd 9 http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd 10 http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.2.xsd"> 11 12 13 14 15 <context:component-scan base-package="ssm" 16 use-default-filters="false"> 17 <context:exclude-filter type="annotation" 18 expression="org.springframework.stereotype.Controller" /> 19 <context:exclude-filter type="annotation" 20 expression="org.springframework.stereotype.Service" /> 21 context:component-scan> 22 23 24 25 <context:property-placeholder 26 location="classpath:dbconfig.properties" /> 27 28 <bean id="datasource" 29 class="com.mchange.v2.c3p0.ComboPooledDataSource"> 30 <property name="user" value="${jdbc.username}">property> 31 <property name="password" value="${jdbc.password}">property> 32 <property name="driverClass" value="${jdbc.driver}">property> 33 <property name="jdbcUrl" value="${jdbc.url}">property> 34 bean> 35 36 <bean id="transactionManager" 37 class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> 38 <property name="dataSource" ref="datasource">property> 39 bean> 40 41 <tx:annotation-driven 42 transaction-manager="transactionManager" /> 43 44 46 47 <bean id="sqlSessionFactoryBean" 48 class="org.mybatis.spring.SqlSessionFactoryBean"> 49 <property name="dataSource" ref="datasource">property> 50 51 <property name="configLocation" 52 value="classpath:mybatis-config.xml">property> 53 54 <property name="mapperLocations" 55 value="classpath:mapper/*.xml">property> 56 bean> 57 58 <bean id="sqlSession" 59 class="org.mybatis.spring.SqlSessionTemplate"> 60 <constructor-arg name="sqlSessionFactory" 61 ref="sqlSessionFactoryBean">constructor-arg> 62 <constructor-arg name="executorType" value="BATCH">constructor-arg> 63 bean> 64 65 67 <mybatis-spring:scan base-package="ssm.mapper" /> 68 beans>
dbconfig.properties:
1 jdbc.driver=com.mysql.jdbc.Driver 2 jdbc.url=jdbc:mysql://localhost:3306/mybatis 3 jdbc.username=root 4 jdbc.password= 5 6 jdbc2.driver=com.mysql.jdbc.Driver 7 jdbc2.url=jdbc:mysql://localhost:3306/mybatis2 8 jdbc2.username=root 9 jdbc2.password=
mybatis-config.xml:
具体的mybatis的全局配置文件说明请参看
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 9 <setting name="mapUnderscoreToCamelCase" value="true" /> 10 11 <setting name="lazyLoadingEnabled" value="true" /> 12 <setting name="aggressiveLazyLoading" value="false" /> 13 settings> 14 15 17 configuration>
log4j.properties:
1 ### 设置### 2 log4j.rootLogger = debug,stdout,D,E 3 4 ### 输出信息到控制抬 ### 5 log4j.appender.stdout = org.apache.log4j.ConsoleAppender 6 log4j.appender.stdout.Target = System.out 7 log4j.appender.stdout.layout = org.apache.log4j.PatternLayout 8 log4j.appender.stdout.layout.ConversionPattern = [%-5p] %d{yyyy-MM-dd HH:mm:ss,SSS} method:%l%n%m%n 9 10 ### 输出DEBUG 级别以上的日志到=E://logs/error.log ### 11 log4j.appender.D = org.apache.log4j.DailyRollingFileAppender 12 log4j.appender.D.File = E://logs/log.log 13 log4j.appender.D.Append = true 14 log4j.appender.D.Threshold = DEBUG 15 log4j.appender.D.layout = org.apache.log4j.PatternLayout 16 log4j.appender.D.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n 17 18 ### 输出ERROR 级别以上的日志到=E://logs/error.log ### 19 log4j.appender.E = org.apache.log4j.DailyRollingFileAppender 20 log4j.appender.E.File =E://logs/error.log 21 log4j.appender.E.Append = true 22 log4j.appender.E.Threshold = ERROR 23 log4j.appender.E.layout = org.apache.log4j.PatternLayout 24 log4j.appender.E.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n 25 ### 设置### 26 log4j.rootLogger = debug,stdout,D,E 27 28 ### 输出信息到控制抬 ### 29 log4j.appender.stdout = org.apache.log4j.ConsoleAppender 30 log4j.appender.stdout.Target = System.out 31 log4j.appender.stdout.layout = org.apache.log4j.PatternLayout 32 log4j.appender.stdout.layout.ConversionPattern = [%-5p] %d{yyyy-MM-dd HH:mm:ss,SSS} method:%l%n%m%n 33 34 ### 输出DEBUG 级别以上的日志到=E://logs/error.log ### 35 log4j.appender.D = org.apache.log4j.DailyRollingFileAppender 36 log4j.appender.D.File = E://logs/log.log 37 log4j.appender.D.Append = true 38 log4j.appender.D.Threshold = DEBUG 39 log4j.appender.D.layout = org.apache.log4j.PatternLayout 40 log4j.appender.D.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n 41 42 ### 输出ERROR 级别以上的日志到=E://logs/error.log ### 43 log4j.appender.E = org.apache.log4j.DailyRollingFileAppender 44 log4j.appender.E.File =E://logs/error.log 45 log4j.appender.E.Append = true 46 log4j.appender.E.Threshold = ERROR 47 log4j.appender.E.layout = org.apache.log4j.PatternLayout 48 log4j.appender.E.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n
代码部分:
EmployeeController.java:
1 package ssm.controller; 2 3 import org.springframework.beans.factory.annotation.Autowired; 4 import org.springframework.stereotype.Controller; 5 import org.springframework.web.bind.annotation.RequestMapping; 6 import org.springframework.web.servlet.ModelAndView; 7 8 import ssm.entity.Employee; 9 import ssm.service.EmployeeService; 10 11 @RequestMapping("/emp") 12 @Controller 13 public class EmployeeController { 14 @Autowired 15 private EmployeeService employeeService; 16 17 @RequestMapping("/getEmp") 18 public ModelAndView getById(Employee employee) { 19 ModelAndView mv = new ModelAndView("success"); 20 mv.addObject("employee", employeeService.getEmpById(employee.getId())); 21 return mv; 22 } 23 24 }
Employee.java
1 package ssm.entity; 2 3 public class Employee { 4 5 private Integer id; 6 private String lastName; 7 private String email; 8 private String gender; 9 10 public Integer getId() { 11 return id; 12 } 13 14 public void setId(Integer id) { 15 this.id = id; 16 } 17 18 public String getLastName() { 19 return lastName; 20 } 21 22 public void setLastName(String lastName) { 23 this.lastName = lastName; 24 } 25 26 public String getEmail() { 27 return email; 28 } 29 30 public void setEmail(String email) { 31 this.email = email; 32 } 33 34 public String getGender() { 35 return gender; 36 } 37 38 public void setGender(String gender) { 39 this.gender = gender; 40 } 41 42 @Override 43 public String toString() { 44 return "Employee [id=" + id + ", lastName=" + lastName + ", email=" + email + ", gender=" + gender + "]"; 45 } 46 47 }
EmployeeService.java
1 package ssm.service; 2 3 import ssm.entity.Employee; 4 5 public interface EmployeeService { 6 7 Employee getEmpById(Integer id); 8 9 }
EmployeeServiceImpl.java
1 package ssm.service; 2 3 import org.springframework.beans.factory.annotation.Autowired; 4 import org.springframework.stereotype.Service; 5 6 import ssm.entity.Employee; 7 import ssm.mapper.EmployeeMapper; 8 9 @Service("employeeService") 10 public class EmployeeServiceImpl implements EmployeeService { 11 12 @Autowired 13 private EmployeeMapper employeeMapper; 14 15 @Override 16 public Employee getEmpById(Integer id) { 17 return employeeMapper.getEmpById(id); 18 } 19 20 }
EmployeeMapper.java
1 package ssm.mapper; 2 3 import ssm.entity.Employee; 4 5 public interface EmployeeMapper { 6 7 Employee getEmpById(Integer id); 8 9 }
EmployeeMapper.xml:
1 <?xml version="1.0" encoding="UTF-8" ?> 2 DOCTYPE mapper 3 PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" 4 "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> 5 <mapper namespace="ssm.mapper.EmployeeMapper"> 6 7 <select id="getEmpById" resultType="ssm.entity.Employee"> 8 select * from tbl_employee 9 where id=#{id,jdbcType=INTEGER} 10 select> 11 mapper>
success.jsp
1 <%@ page language="java" contentType="text/html; charset=UTF-8" 2 pageEncoding="UTF-8"%> 3 DOCTYPE html> 4 <html> 5 <head> 6 <meta charset="UTF-8"> 7 <title>Insert title heretitle> 8 head> 9 <body> 10 <h3>successh3> 11 <p>${employee.id}p> 12 13 body> 14 html>
运行结果:
当运行http://localhost:8080/SSM/emp/getById?id=1 时,跳转到了success页面,且形式了当前的id;
