SSM整合(spring-springmvc-mybatis)之HelloWorld


一、目录结构

 

helloworld(SSM)创建步骤:

步骤一:创建一个类型为Dynamic Web Project  名称为ssm的项目

步骤二:加入jar包:

spring核心jar包:

  1. commons-logging-1.2.jar
  2. spring-beans-5.3.10.jar
  3. spring-context-5.3.10.jar
  4. spring-core-5.3.10.jar
  5. spring-expression-5.3.10.jar

spring aop:

  1. spring-aop-5.3.10.jar
  2. spring-aspects-5.3.10.jar

springmvc jar包:

  1. spring-web-5.3.10.jar
  2. spring-webmvc-5.3.10.jar

spring 数据库交互jar包:

  1. spring-jdbc-5.3.10.jar
  2. spring-tx-5.3.10.jar

mybatis jar包:

  1. mybatis-3.5.9.jar
  2. mysql-connector-java-8.0.27 (1).jar
  3. log4j-1.2.17.jar

mybatis-spring 适配器包:

  1. mybatis-spring-1.3.2.jar

c3po:

  1. c3p0-0.9.5.5.jar
  2. c3p0-oracle-thin-extras-0.9.5.5.jar
  3. mchange-commons-java-0.2.19.jar

MyBatis-Spring下载地址:

https://github.com/mybatis/spring 在release中选择对应的版本下载即可;

步骤三:配置

web.xml:

  1. 配置DispacherServlet 
  2. 配置启动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;