一、目录结构

 

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

 

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>contextConfigLocation</param-name>
8 <param-value>classpath:spring.xml</param-value>
9 </context-param>
10 <listener>
11 <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
12 </listener>
13 <!-- 配置DispatcherServlet(快捷键 alt +/) -->
14 <servlet>
15 <servlet-name>springDispatcherServlet</servlet-name>
16 <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
17 <!-- 配置DispatcherServletd 一个初始化参数:配置springmvc配置文件的位置和名称 -->
18 <!-- 实际上也可以不通过 contextConfigLocation 来配置Springmvc的配置文件,而是用默认的 即默认的配置文件为
19 /WEB-INF/<servlet-name>-servlet.xml 本项目默认位置配置文件即为: /WEB-INF/springDispatcherServlet-servlet.xml -->
20 <init-param>
21 <param-name>contextConfigLocation</param-name>
22 <param-value>classpath:springmvc.xml</param-value>
23 </init-param>
24 <!-- 表示springDispatcherServlet在加载的时候被创建 -->
25 <load-on-startup>1</load-on-startup>
26 </servlet>
27
28 <!-- Map all requests to the DispatcherServlet for handling -->
29 <servlet-mapping>
30 <servlet-name>springDispatcherServlet</servlet-name>
31 <url-pattern>/</url-pattern>
32 </servlet-mapping>
33
34 </web-app>

View Code

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 <!-- spirngmvc 只负责 网站跳转逻辑 -->
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>

View Code

spring.xml:

扫描包配置+数据源配置+事务配置+mybatis配置;

扫描包配置:请参考​​十二、springMVC整合spring ​​ spring和springmvc 整合时对扫描包做了特殊处理,来解决重复扫描包启动时实例化两次的问题;

数据源配置:和​​四、JdbcTemplate的配置 ​​ 中的配置是一样的;

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 <!-- spring 希望管理所有的业务逻辑组件,等 -->
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 <!-- spring用来控制业务逻辑。数据源、事务控制、aop... -->
24 <!-- 导入资源文件 -->
25 <context:property-placeholder
26 location="classpath:dbconfig.properties" />
27 <!-- 配置c3p0数据源 -->
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 <!-- spring 事务管理器 -->
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 <!-- 整合mybatis目的: 1.spring管理所有组件。mapper的实现类。可以对service中引用dao的内容,可以为@Autowired
45 自动注入mapper; 2.spring用来管理声明式事务, -->
46 <!-- 创建出 sqlSessionFactoryBean对象 -->
47 <bean id="sqlSessionFactoryBean"
48 class="org.mybatis.spring.SqlSessionFactoryBean">
49 <property name="dataSource" ref="datasource"></property>
50 <!-- configLocation指定全局配置文件的位置 -->
51 <property name="configLocation"
52 value="classpath:mybatis-config.xml"></property>
53 <!-- 指定mapper位置(如果mapper与mapper接口的文件名不一样的话这里需要配置,若一样就可以不配置) -->
54 <property name="mapperLocations"
55 value="classpath:mapper/*.xml"></property>
56 </bean>
57 <!--配置一个可以进行批量执行的sqlSession -->
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 <!-- 扫描所有的mapper接口的实现,让这些mapper能够自动注入 -->
65 <!-- <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> 配置SqlSessionFactoryBean的名称
66 <property name="basePackage" value="ssm.mapper" /> </bean> -->
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=

View Code

mybatis-config.xml:

具体的mybatis的全局配置文件说明请参看​​二、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 <!-- settings包含很多重要的设置项; name:设置项的名字,value设置项的取值 -->
7 <settings>
8 <!-- 开启驼峰命名 比如数据库字段为Last_Name 则 自动变为lastName -->
9 <setting name="mapUnderscoreToCamelCase" value="true" />
10 <!-- 分步查询配合一下两个配置 实现懒加载(按需加载) -->
11 <setting name="lazyLoadingEnabled" value="true" />
12 <setting name="aggressiveLazyLoading" value="false" />
13 </settings>
14
15 <!-- 配置顺序,properties settings typeAliases typeHandlers objectFactory objectWrapperFactory
16 reflectFactory plugings environment databaseIdProvider mappers -->
17 </configuration>

View Code

 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

View Code

代码部分:

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 }

View Code

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 }

View Code

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 }

View Code

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 }

View Code

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 }

View Code

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>

View Code

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 here</title>
8 </head>
9 <body>
10 <h3>success</h3>
11 <p>${employee.id}</p>
12
13 </body>
14 </html>

View Code

运行结果:

当运行http://localhost:8080/SSM/emp/getById?id=1 时,跳转到了success页面,且形式了当前的id;

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

 

SSM的CRUD:

​​SSM整合(spring-springmvc-mybatis)之CRUD​​

我从来不相信什么懒洋洋的自由。我向往的自由是通过勤奋和努力实现的更广阔的人生。 我要做一个自由又自律的人,靠势必实现的决心认真地活着。