SSM框架整合

此博客描述了SSM框架整合的项目结构和项目源码,共包含六个部分:

(1)SSM框架环境搭建

(2)Spring框架环境搭建

(3)SpringMVC框架环境搭建

(4)Spring框架整合SpringMVC框架

(5)MyBatis框架环境搭建

(6)Spring框架整合MyBatis框架。

具体内容请点击阅读全文…

SSM框架整合

  • SSM框架
  • Spring框架
  • SpringMVC框架
  • SpringMVC框架整合
  • MyBatis框架
  • MyBatis框架整合

SSM框架

结构目录

  • java
  • resources
    • log4j.properties(日志文件)
  • pom.xml(Maven项目配置文件)

Maven项目配置文件

  • Spring框架
    • spring-beans
    • spring-core
    • spring-context
    • spring-context-support
    • spring-aop
    • aspectjweaver
    • spring-org
    • spring-test
    • spring-tx
  • SpringMVC框架
    • spring-web
    • spring-webmvc
  • 前端
    • servlet-api
    • jsp-api
    • jstl
  • MyBatis框架
    • mybatis
    • mybatis-spring
  • 数据库
    • mysql-connector-java
    • c3p0
  • 日志
    • log4j
    • slf4j
    • slf4j-log4j12
  • 测试
    • junit

pom.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
<?xml version="1.0" encoding="UTF-8"?>

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>

<groupId>cn.water</groupId>
<artifactId>SSM</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>war</packaging>

<name>SSM Maven Webapp</name>
<!-- FIXME change it to the project's website -->
<url>http://www.example.com</url>

<!-- 版本锁定 -->
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<spring.version>5.0.2.RELEASE</spring.version>
<slf4j.version>1.6.6</slf4j.version>
<log4j.version>1.2.12</log4j.version>
<shiro.version>1.2.3</shiro.version>
<mysql.version>5.1.6</mysql.version>
<mybatis.version>3.4.5</mybatis.version>
</properties>

<dependencies>
<!-- Spring核心 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- Spring核心 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- Spring 核心(包括spring-core,spring-beans,spring-aop,spring-expression) -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- 将第三方库整合进 Spring 应用上下文 提供支持(如缓存 caching , 邮件mailing , 计划任务scheduling) -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>${spring.version}</version>
</dependency>

<!-- Spring AOP -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- Spring AOP(动态代理 注解) -->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.6.8</version>
</dependency>
<!-- Spring web -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- SpringMVC -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>
</dependency>

<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-orm</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- Spring 单元测试 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- 单元测试 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>compile</scope>
</dependency>
<!-- Spring 事务 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- MySQL驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>${mysql.version}</version>
</dependency>
<!-- servlet -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
<scope>provided</scope>
</dependency>
<!-- servlet jsp -->
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>2.0</version>
<scope>provided</scope>
</dependency>
<!-- JSP标准标签库(EL表达式、JSTL标签) -->
<dependency>
<groupId>jstl</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<!-- log start -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>${log4j.version}</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>${slf4j.version}</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>${slf4j.version}</version>
</dependency>
<!-- log end -->
<!-- MyBatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>${mybatis.version}</version>
</dependency>
<!-- MyBatis(SSM整合) -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.3.0</version>
</dependency>
<!-- 数据库连接池 -->
<dependency>
<groupId>c3p0</groupId>
<artifactId>c3p0</artifactId>
<version>0.9.1.2</version>
<type>jar</type>
<scope>compile</scope>
</dependency>

</dependencies>

<build>
<finalName>SSM</finalName>
<pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
<plugins>
<plugin>
<artifactId>maven-clean-plugin</artifactId>
<version>3.1.0</version>
</plugin>
<!-- see http://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_war_packaging -->
<plugin>
<artifactId>maven-resources-plugin</artifactId>
<version>3.0.2</version>
</plugin>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.0</version>
</plugin>
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.22.1</version>
</plugin>
<plugin>
<artifactId>maven-war-plugin</artifactId>
<version>3.2.2</version>
</plugin>
<plugin>
<artifactId>maven-install-plugin</artifactId>
<version>2.5.2</version>
</plugin>
<plugin>
<artifactId>maven-deploy-plugin</artifactId>
<version>2.8.2</version>
</plugin>
</plugins>
</pluginManagement>
</build>
</project>

log日志文件

  • 记录日志

log4j.properties

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# Set root category priority to INFO and its only appender to CONSOLE.
#log4j.rootCategory=INFO, CONSOLE debug info warn error fatal
log4j.rootCategory=info, CONSOLE, LOGFILE

# Set the enterprise logger category to FATAL and its only appender to CONSOLE.
log4j.logger.org.apache.axis.enterprise=FATAL, CONSOLE

# CONSOLE is set to be a ConsoleAppender using a PatternLayout.
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern=%d{ISO8601} %-6r [%15.15t] %-5p %30.30c %x - %m\n

# LOGFILE is set to be a File appender using a PatternLayout.
log4j.appender.LOGFILE=org.apache.log4j.FileAppender
log4j.appender.LOGFILE.File=d:\axis.log
log4j.appender.LOGFILE.Append=true
log4j.appender.LOGFILE.layout=org.apache.log4j.PatternLayout
log4j.appender.LOGFILE.layout.ConversionPattern=%d{ISO8601} %-6r [%15.15t] %-5p %30.30c %x - %m\n

Spring框架

结构目录

  • java
    • dao
      • AccountDao.java(持久层)
    • domain
      • Account.java(JavaBean对象)
    • service
      • AccountService.java(业务层)
      • AccountServiceImp.java(业务层)
    • test
      • TestSpring.java(测试文件)
  • resources
    • applicationContext.xml(Spring配置文件)

Spring配置文件

  • 开启注解扫描
    • 忽略表现层注解

applicationContext.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">

<!-- 开启注解扫描 -->
<!-- 使用Spring框架处理业务层(service)和持久层(dao),不处理表现层(Controller) -->
<context:component-scan base-package="cn.water">
<!-- 配置不扫描的注解类 -->
<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan>
</beans>

`

JavaBean对象

Accont.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
package cn.water.domain;

import java.io.Serializable;

public class Account implements Serializable {

private Integer id;
private String name;
private Double money;

@Override
public String toString() {
return "Account{" +
"id=" + id +
", name='" + name + '\'' +
", money=" + money +
'}';
}

public Integer getId() {
return id;
}

public void setId(Integer id) {
this.id = id;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public Double getMoney() {
return money;
}

public void setMoney(Double money) {
this.money = money;
}
}

`

持久层

  • MyBatis框架生成代理对象,我们不需要创建实现类

AccountDao.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
package cn.water.dao;

import cn.water.domain.Account;

import java.util.List;

public interface AccountDao {

/** 查询所有用户 */
public abstract List<Account> findAll();

/** 添加用户 */
public abstract void add(Account account);


}

`

业务层

AccountService.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
package cn.water.service;

import cn.water.domain.Account;

import java.util.List;

public interface AccountService {

/** 查询所有用户 */
public abstract List<Account> findAll();

/** 添加用户 */
public abstract void add(Account account);

}

AccountServiceImp.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
package cn.water.service;

import cn.water.domain.Account;
import org.springframework.stereotype.Service;

import java.util.List;

@Service("accountService")
public class AccountServiceImp implements AccountService{

/** 查询所有用户 */
@Override
public List<Account> findAll() {
System.out.println("业务层:查询所有用户");
return null;
}

/** 添加用户 */
@Override
public void add(Account account) {
System.out.println("业务层:添加用户");
}
}

测试

TestSpring.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
package cn.water.test;

import cn.water.service.AccountService;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class TestSpring {

@Test
public void run01() {
// 加载配置文件
ApplicationContext ac = new ClassPathXmlApplicationContext("classpath:applicationContext.xml");
// 获取对象
AccountService as = (AccountService) ac.getBean("accountService");
// 调用方法
as.findAll();
}
}

`

运行结果

1
业务层:查询所有用户

SpringMVC框架

结构目录

  • java
    • controller
      • AccountController.java(表现层)
  • resources
    • applicationContext.xml(Spring配置文件)
    • springmvc.xml(SpringMVC配置文件)
  • webapp
    • WEB-INF
      • pages
        • list.jsp(jsp页面文件)
      • web.xml(web配置文件)
    • index.jsp(jsp页面文件)

web配置文件

  • 前端控制器
    • 配置 前端控制器(DispatcherServlet)
    • 配置 创建前端控制器时,加载配置文件(contextConfigLocation)
    • 配置 服务器启动时,立即创建前端控制器(1)
    • 配置 映射/作用范围(/)
  • 过滤器
    • 配置 过滤器(CharacterEncodingFilter)
    • 配置 编码(UTF-8)
    • 配置 映射/作用范围(/*)

web.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
<!DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd" >

<web-app>
<display-name>Archetype Created Web Application</display-name>

<!-- 前端控制器 -->
<servlet>
<servlet-name>dispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dispatcherServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>

<!-- 过滤器 -->
<filter>
<filter-name>characterEncodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>characterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>


</web-app>

SpringMVC配置文件

  • 开启 注解扫描(context:component-scan)
    • 只扫描表现层注解
  • 配置 视图解析器(InternalResourceViewResolver)
  • 配置 前端控制器(mvc:resource)
  • 开启 SpringMVC注解支持(mvc:annotation-driven)

springmvc.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">

<!-- 开启 注解扫描 -->
<context:component-scan base-package="cn.water.controller"/>

<!-- 配置 视图解析器 -->
<bean id="internalResourceViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/pages/"></property>
<property name="suffix" value=".jsp"></property>
</bean>

<!-- 配置 前端控制器 -->
<mvc:resources mapping="/js/**" location="/js/"></mvc:resources>
<mvc:resources mapping="/images/**" location="/images/"></mvc:resources>
<mvc:resources mapping="/css/**" location="/css/"></mvc:resources>

<!-- 开启 SpringMVC注解支持 -->
<mvc:annotation-driven/>

</beans>

表现层

AccountController.java

  • 返回:list
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
package cn.water.controller;

import cn.water.domain.Account;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

import java.util.List;

@Controller
@RequestMapping("accountController")
public class AccountController {

@RequestMapping("findAll")
public String findAll(){
System.out.println("表现层:查询所有用户信息");
return "list";
}

}

jsp页面

index.jsp

  • 执行表现层的方法,获得返回值“/WEB-INF/pages/list.jsp”,跳转页面
1
2
3
4
5
6
7
8
9
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<h3><a href="accountController/findAll">findAll</a></h3>
</body>
</html>

jsp页面

  • 展示

list.jsp

1
2
3
4
5
6
7
8
9
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<h1>用户信息列表</h1>
</body>
</html>

Spring 整合 SpringMVC

结构目录

  • java
    • controller
      • AccountController.java(表现层)
    • dao
      • AccountDao.java(持久层)
    • domain
      • Account.java(JavaBean对象)
    • service
      • AccountService.java(业务层)
      • AccountServiceImp.java(业务层)
  • resources
    • applicationContext.xml(Spring配置文件)
    • springmvc.xml(SpringMVC配置文件)
  • webapp
    • WEB-INF
      • pages
        • list.jsp(jsp页面文件)
      • web.xml(web配置文件)
    • index.jsp(jsp页面文件)

web配置文件

  • 监听器
    • 配置 监听器(ContextLoaderListener)
    • 配置 服务器启动时,加载配置文件(contextConfigLocation)
  • 前端控制器
  • 过滤器

web.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
<!DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd" >

<web-app>
<display-name>Archetype Created Web Application</display-name>

<!-- 监听器 -->
<!-- 服务器启动时,加载Spring配置文件 -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</context-param>


<!-- 前端控制器 -->
<!-- 服务器启动时,DispatcherServlet对象被创建,加载SpringMVC配置文件 -->
<servlet>
<servlet-name>dispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dispatcherServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>

<!-- 过滤器 -->
<filter>
<filter-name>characterEncodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>characterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

</web-app>

表现层

  • 通过依赖反转获取 业务层对象,并执行业务层的方法,到达Spring与SpringMVC的整合。

AccountController.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
package cn.water.controller;

import cn.water.service.AccountService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
@RequestMapping("accountController")
public class AccountController {

@Autowired
private AccountService service;

@RequestMapping("findAll")
public String findAll(){
/* 表现层 */
System.out.println("表现层:查询所有用户信息");
/* 业务层 */
service.findAll();
return "list";
}

}

执行结果

点击 index.jsp 页面,执行表现层中的findAll(),和业务层的findAll(),最后跳转到 list.jsp 页面。

1
2
表现层:查询所有用户信息
业务层:查询所有用户

MyBatis框架

数据库表

1
2
3
4
5
6
7
8
9
10
11
CREATE DATABASE ssm;

USE ssm;

CREATE TABLE account(
id INT PRIMARY KEY AUTO_INCREMENT,
NAME VARCHAR(100),
money DOUBLE(4,2)
);

INSERT INTO account VALUES (NULL,'cat',9.16),(NULL,'dog',11.27);

结构目录

  • java
    • dao
      • AccountDao.java(持久层)
    • domain
      • Account.java(JavaBean对象)
    • test
      • TestMyBatis(测试类)
  • resources
    • SqlMapConfig.xml(数据库连接配置文件)

数据库连接配置文件

方式一

jdbcConfig.properties
1
2
3
4
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/ee314
jdbc.username=root
jdbc.password=1234
SqlMapConfig.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">

<configuration>

<!-- 加载 连接数据库的信息 -->
<properties resource="jdbcConfig.properties"></properties>
<!-- 配置 环境 -->
<environments default="mysql">
<environment id="mysql">
<transactionManager type="JDBC"></transactionManager>
<dataSource type="pooled">
<property name="driver" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</dataSource>
</environment>
</environments>

<!-- 指定 映射文件位置 -->
<mappers>
<package name="cn.water.dao"/>
<!-- <mapper class="cn.water.dao.AccountDao"/> -->
</mappers>

</configuration>

方式二

SqlMapConfig.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">

<configuration>

<!-- 配置 环境 -->
<environments default="mysql">
<environment id="mysql">
<transactionManager type="JDBC"></transactionManager>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql:///ssm"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
</environments>

<!-- 引入 映射配置文件 -->
<mappers>
<package name="cn.water.dao"/>
<!-- <mapper class="cn.water.dao.AccountDao"/> -->
</mappers>

</configuration>

持久层

  • 采用注解的方式

AccountDao

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
package cn.water.dao;

import cn.water.domain.Account;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Select;

import java.util.List;

public interface AccountDao {

/** 查询所有用户 */
@Select("select * from account")
public abstract List<Account> findAll();

/** 添加用户 */
@Insert("insert into account (name,money) values (#{name},#{money})")
public abstract void add(Account account);


}

测试类

TestMyBatis

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
package cn.water.test;

import cn.water.dao.AccountDao;
import cn.water.domain.Account;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Test;

import java.io.IOException;
import java.io.InputStream;
import java.util.List;


public class TestMyBatis {

@Test
public void run01() throws Exception {
/* 加载 配置文件 */
InputStream inputStream = Resources.getResourceAsStream("SqlMapConfig.xml");
/* 通过 建造者对象,获取 工厂对象 */
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
/* 通过 工厂对象,获取 Session对象 */
SqlSession sqlSession = sqlSessionFactory.openSession();
/* 通过 Session对象,获取 代理对象 */
AccountDao mapper = sqlSession.getMapper(AccountDao.class);
/* 调用 持久层 */
List<Account> all = mapper.findAll();
/* 遍历 */
for (Account account : all) {
System.out.println(account);
}
/* 释放资源 */
sqlSession.close();
inputStream.close();
}

}

运行结果

1
2
Account{id=1, name='cat', money=9.16}
Account{id=2, name='dog', money=11.27}

Spring 整合 MyBatis

结构目录

  • java
    • controller
      • AccountController.java(表现层)
    • dao
      • AccountDao.java(持久层)
    • domain
      • Account.java(JavaBean对象)
    • service
      • AccountService.java(业务层)
      • AccountServiceImp.java(业务层)
  • resources
    • applicationContext.xml(Spring配置文件)
    • springmvc.xml(SpringMVC配置文件)
  • webapp
    • WEB-INF
      • pages
        • list.jsp(jsp页面文件)
      • web.xml(web配置文件)
    • index.jsp(jsp页面文件)

Spring配置文件

  • 开启注解扫描
    • 忽略表现层注解
  • Spring 整合 MyBatis
    • 配置 连接池(ComboPooledDataSource)
    • 配置 SqlSessionFactoryBean
    • 配置 持久层接口的包
  • Spring 声明式事务管理
    • 配置 事务管理(DataSourceTransactionManager)
    • 配置 事务通知(tx:advice)
    • 配置 AOP增强(aop:config)

applicationContext.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">

<!-- 开启注解扫描 -->
<!-- 使用Spring框架处理业务层(service)和持久层(dao),不处理表现层(Controller) -->
<context:component-scan base-package="cn.water">
<!-- 配置不扫描的注解类 -->
<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan>

<!-- Spring 整合 MyBatis -->
<!-- 配置 连接池 -->
<bean id="comboPooledDataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass" value="com.mysql.jdbc.Driver"></property>
<property name="jdbcUrl" value="jdbc:mysql:///ssm"></property>
<property name="user" value="root"></property>
<property name="password" value="root"></property>
</bean>
<!-- 配置 SqlSessionFactoryBean -->
<bean id="sessionFactoryBean" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="comboPooledDataSource"></property>
</bean>
<!-- 配置 持久层接口的包 -->
<bean id="mapperScannerConfigurer" class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="cn.water.dao"></property>
</bean>

<!-- Spring 声明式事务管理 -->
<!-- 配置 事务管理器 -->
<bean id="dataSourceTransactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="comboPooledDataSource"></property>
</bean>
<!-- 配置 事务通知 -->
<tx:advice id="txAdvice" transaction-manager="dataSourceTransactionManager">
<tx:attributes>
<!-- 查询方法:只读 -->
<tx:method name="find*" read-only="true"/>
<!-- -->
<tx:method name="*" isolation="DEFAULT"/>
</tx:attributes>
</tx:advice>
<!-- 配置 AOP增强 -->
<aop:config>
<aop:advisor advice-ref="txAdvice" pointcut="execution(* cn.water.service.*SErviceImp.*(..))"/>
</aop:config>

</beans>

业务层

  • 业务层调用持久层

AccountServiceImp.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
package cn.water.service;

import cn.water.dao.AccountDao;
import cn.water.domain.Account;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

@Service("accountService")
public class AccountServiceImp implements AccountService{

@Autowired
private AccountDao dao;

/** 查询所有用户 */
@Override
public List<Account> findAll() {
/* 业务层 */
System.out.println("业务层:查询所有用户");
/* 持久层 */
return dao.findAll();
}

/** 添加用户 */
@Override
public void addAccount(Account account) {
/* 业务层 */
System.out.println("业务层:添加用户");
/* 持久层 */
dao.addAccount(account);
}
}

jsp页面

index.jsp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>

<h3><a href="accountController/findAll">findAll</a></h3>

<form action="accountController/addAccount" method="post">
姓名:<input type="text" name="name">
金额:<input type="text" name="money">
<input type="submit" value="保存">
</form>

</body>
</html>

jsp页面

list.jsp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
<title>Title</title>
</head>
<body>

<h1>用户信息列表</h1>
<h2>${accounts}</h2>
<c:forEach items="${accounts}" var="account">
<h3>${account.id}</h3>
<h3>${account.name}</h3>
<h3>${account.money}</h3> <br>
</c:forEach>
</body>
</html>

运行结果

页面展示

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
用户信息列表
[Account{id=1, name='cat', money=9.16}, Account{id=2, name='dog', money=11.27}, Account{id=3, name='rat', money=14.87}, Account{id=4, name='water', money=11.11}]
1
cat
9.16

2
dog
11.27

3
rat
14.87

4
water
11.11

控制台

1
2
3
4
表现层:查询所有用户信息
业务层:添加用户
表现层:查询所有用户信息
业务层:查询所有用户
-------------本文结束-------------
Donate comment here