目录
Spring+SpringMVC+MyBatis三大框架整合
2.3.1 创建applicationContext.xml文件
2.3.2 在对应的类中添加注解,把对象创建交给Spring容器
2.4.2 配置springmvc.xml文件(注意约束要补全)
2.4.3 编写Controller测试SpringMVC环境是否成功
2.5.2 实现:在web.xml文件中配置加载Spring框架的applicationContext.xml配置文件
2.6 配置MyBatis环境(基于注解开发,不使用xxxMapper.xml文件)
2.6.1 创建SqlMapConfig.xml文件,配置数据库环境
2.6.2 创建mapper接口(上面已经创建好),注解SQL语句
2.7.2 在applicationContext文件中配置Mybatis整合
2.7.4 在Service层实现注入dao,测试整合是否成功
Spring+SpringMVC+MyBatis三大框架整合
1.整合说明
- 整合说明
SSM三大框架整合可以使用多种方式,这里选择XML + 注解的方式
- 整合的思路
1. 先搭建整合的环境
2. 先把Spring的配置搭建完成
3. 再使用Spring整合SpringMVC框架
4. 最后使用Spring整合MyBatis框架
2.整合步骤
2.1 准备数据库
//创建数据库
create database dbssm character set utf8;
//使用该数据库
use dbssm;
//创建账户表
create table account(
id int primary key auto_increment,
name varchar(100),
money double(7,2),
);
2.2 创建Maven工程
2.2.1补全项目目录结构
2.2.2 导入依赖坐标
<!--版本锁定-->
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.7</maven.compiler.source>
<maven.compiler.target>1.7</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>
<mysql.version>5.1.8</mysql.version>
<mybatis.version>3.4.5</mybatis.version>
</properties>
<dependencies>
<!-- SpringAOP依赖 -->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.8.13</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>${spring.version}</version>
</dependency>
<!--Spring容器依赖包-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<!--SpringMVC依赖包-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>
</dependency>
<!--Spring整合junit单元测试-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>${spring.version}</version>
</dependency>
<!--Spring事务依赖包-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>${spring.version}</version>
</dependency>
<!--SpringJDBC模板技术-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- junit单元测试 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>compile</scope>
</dependency>
<!-- mysql数据库驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>${mysql.version}</version>
</dependency>
<!-- Servlet技术 -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.0.1</version>
<scope>provided</scope>
</dependency>
<!-- jsp技术 -->
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>2.0</version>
<scope>provided</scope>
</dependency>
<!-- jsp页面EL表达式支持包 -->
<dependency>
<groupId>javax.servlet.jsp.jstl</groupId>
<artifactId>jstl-api</artifactId>
<version>1.2</version>
<exclusions>
<exclusion>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>taglibs</groupId>
<artifactId>standard</artifactId>
<version>1.1.2</version>
</dependency>
<!-- 打印日志依赖包 -->
<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>
<exclusions>
<exclusion>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- mybatis依赖包 -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>${mybatis.version}</version>
</dependency>
<!-- Spring整合mybatis需要的jar包依赖 -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.3.0</version>
</dependency>
<!-- c3p0数据连接池技术 -->
<dependency>
<groupId>c3p0</groupId>
<artifactId>c3p0</artifactId>
<version>0.9.1.2</version>
<type>jar</type>
<scope>compile</scope>
</dependency>
</dependencies>
2.2.3 创建开发所需包目录及各层类、接口
service层
/** * 账户业务层接口 * Tool: IntelliJ IDEA. * Author: Poison * CreateDateTime: 2020/3/7 12:58 */ public interface AccountService { /** * 查询所有账户 * @return */ List<Account> findAll(); /** * 保存账户 * @param account */ void saveAccount(Account account); }
dao层
/** * 账户持久层接口 * Tool: IntelliJ IDEA. * Author: Poison * CreateDateTime: 2020/3/7 12:56 */ public interface AccountDao { /** * 查询所有账户 * @return */ List<Account> findAll(); /** * 保存账户信息 * @param account */ void saveAccount(Account account); }
account实体类
@Component public class Account implements Serializable { private Integer id; private String name; private Double 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; } @Override public String toString() { return "Account{" + "id=" + id + ", name='" + name + '\'' + ", money=" + money + '}'; } }
controller
/** * Tool: IntelliJ IDEA. * Author: Poison * CreateDateTime: 2020/3/7 14:36 */ @Controller @RequestMapping(path = "/account") public class AccountController { @Autowired private AccountService accountService; /** * 查询所有 * @return */ @RequestMapping(path = "/testFindAll") public String testFindAll(){ System.out.println("测试成功。。。"); accountService.findAll(); return "success"; } }
2.3 配置Spring环境
2.3.1 创建applicationContext.xml文件
开启注解扫描,排除Controller注解
<?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.poison">
<!--配置哪些注解不扫描-->
<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan>
</beans>
2.3.2 在对应的类中添加注解,把对象创建交给Spring容器
@Service(value = "accountService")
public class AccountServiceImpl implements AccountService {
@Override
public List<Account> findAll() {
System.out.println("业务层:查询所有账户方法....");
return null;
}
@Override
public void saveAccount(Account account) {
System.out.println("业务层:保存账户方法....");
}
}
2.3.3 编写测试类,测试Spring环境是否可用
/**
* Tool: IntelliJ IDEA.
* Author: Poison
* CreateDateTime: 2020/3/7 13:21
*/
@RunWith(SpringJUnit4ClassRunner.class) //替换junit的main方法,加入Spring容器
@ContextConfiguration(locations = "classpath:applicationContext.xml") //注解配置文件的位置
public class TestSpring {
//方式一:
//自动注入
@Autowired
private AccountService accountService;
@Test
public void testSpring(){
accountService.findAll();
}
//方式二:
//加载配置文件获取
@Test
public void testSpring2(){
ApplicationContext ac=new ClassPathXmlApplicationContext("applicationContext.xml");
AccountService accountService1 = ac.getBean("accountService", AccountService.class);
accountService1.findAll();
}
}
2.4 配置SpringMVC环境
2.4.1 在web.xml文件中配置前端控制器
<!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>
</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>
2.4.2 配置springmvc.xml文件(注意约束要补全)
<?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">
<!-- 开启注解扫描,只扫描Controller -->
<context:component-scan base-package="cn.poison">
<context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan>
<!-- 配置视图解析器对象 -->
<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="/css/**" location="/css/"></mvc:resources>
<mvc:resources mapping="/images/**" location="/images/"></mvc:resources>
<!-- 开启SpringMVC注解的支持 -->
<mvc:annotation-driven></mvc:annotation-driven>
</beans>
2.4.3 编写Controller测试SpringMVC环境是否成功
//Controller代码
@Controller
@RequestMapping(path = "/account")
public class AccountController {
@RequestMapping(path = "/testFindAll")
public String testFindAll(){
System.out.println("测试成功。。。");
return "success";
}
}
//前端jsp请求代码
<a href="account/testFindAll">查询所有</a>
2.5 Spring框架整合SpringMVC
2.5.1 思路
思路:
注:在spring-web依赖包下,提供了一个ContextLoaderListener监听器类,可以监听ServletContext域对象的创建与销毁,让ContextLoaderListener监听器去加载Spring的配置文件,实现整合
注意:ContextLoaderListener监听器只能加载WEB-INF目录下的applicationContext.xml的配置文件
2.5.2 实现:在web.xml文件中配置加载Spring框架的applicationContext.xml配置文件
<!-- 配置ServletContext域对象的监听器加载Spring配置文件 -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!-- 配置加载applicationContext.xml文件的路径 -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</context-param>
2.5.3 测试是否整合成功
@Controller
@RequestMapping(path = "/account")
public class AccountController {
@Autowired
private AccountService accountService;
/**
* 查询所有
* @return
*/
@RequestMapping(path = "/testFindAll")
public String testFindAll(){
System.out.println("测试成功。。。");
accountService.findAll();
return "success";
}
}
2.6 配置MyBatis环境(基于注解开发,不使用xxxMapper.xml文件)
2.6.1 创建SqlMapConfig.xml文件,配置数据库环境
jdbcConfig.properties文件
jdbc.driver=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql://localhost:3306/你的数据库名 jdbc.username=root jdbc.password=你的数据库密码
注意:如果数据库驱动用的是8.0以上的,driver需要换成com.mysql.cj.jdbc.Driver
<?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>
<!--引入mapper映射文件或指定mapper接口-->
<mappers>
<!--方式一:mapper.xml文件方式开发,指定映射文件路径-->
<!--<mapper resource="cn/poison/mapper/***.xml"></mapper>-->
<!--方式二:在mapper接口中使用注解指定sql语句方式开发,指定mapper接口全限定路径名 --
<mapper class="cn.poison.dao.AccountDao"></mapper>
<!--方式三:指定包名,扫描该包下所有的mapper文件或接口,简便 -->
<!--<package name="cn.poison.mapper"/>-->
</mappers>
</configuration>
2.6.2 创建mapper接口(上面已经创建好),注解SQL语句
/**
* 账户持久层接口
* Tool: IntelliJ IDEA.
* Author: Poison
* CreateDateTime: 2020/3/7 12:56
*/
public interface AccountDao {
/**
* 查询所有账户
* @return
*/
@Select("select * from account")
List<Account> findAll();
/**
* 保存账户信息
* @param account
*/
@Insert("insert into account(name,money) values(#{name},#{money})")
void saveAccount(Account account);
}
2.6.3 测试Mybatis环境是否搭建好
public class TestMybatis {
@Test
public void testMybatis() throws Exception {
//获取配置文件输入流
InputStream in = Resources.getResourceAsStream("SqlMapConfig.xml");
//获取SqlSessionFactory工厂类
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in);
//获取SqlSession对象
SqlSession sqlSession = factory.openSession();
//获取代理对象
AccountDao accountDao = sqlSession.getMapper(AccountDao.class);
//插入数据
Account account = new Account();
account.setName("张三");
account.setMoney(1000.0);
//执行插入
accountDao.saveAccount(account);
//执行查询所有
List<Account> accountList = accountDao.findAll();
accountList.forEach(li-> System.out.println(li));
//提交事务
sqlSession.commit();
//关闭资源
sqlSession.close();
in.close();
}
}
注意:如果想使用日志打印依赖包的功能,需要在resources文件夹下创建log4j.properties文件
# Set root category priority to INFO and its only appender to CONSOLE. #log4j.rootCategory=INFO, CONSOLE debug info warn error fatal log4j.rootCategory=debug, 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:\\JetBrains\\IdeaProjects\\MyBatisProject\\logs\\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
2.7 Spring框架整合MyBatis框架
2.7.1 思路
- 目的:
把SqlMapConfig.xml配置文件中的内容配置到applicationContext.xml配置文件中,将dao的代理对象放到Spring容器中
- 方法:在applicationContext.xml文件中配置以下内容
1.配置连接池
2.配置SqlSessionFactory工厂,由Spring和mybatis整合包提供的类org.mybatis.spring.SqlSessionFactoryBean实现IOC注入
3.配置AccountDao接口所在包,这里使用整合包提供的类org.mybatis.spring.mapper.MapperScannerConfigurer
注意:这里使用到的类由mybatis-spring整合包提供
<dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis-spring</artifactId> <version>1.3.0</version> </dependency>
配置完之后,SqlMapConfig的文件可以删除
2.7.2 在applicationContext文件中配置Mybatis整合
<!--Spring整合Mybatis框架-->
<!-- 配置连接池 -->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass" value="com.mysql.jdbc.Driver"></property>
<property name="jdbcUrl" value="jdbc:mysql://localhost:3306/dbssm"></property>
<property name="user" value="root"></property>
<property name="password" value="065864"></property>
</bean>
<!-- 配置SqlSessionFactory工厂, 由Spring和mybatis整合包提供的类-->
<bean id="sessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"></property>
</bean>
<!-- 配置dao接口所在包,这里使用整合包提供的类 -->
<bean id="mapperScannerConfigurer" class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<!--直接扫描dao下的所有包-->
<property name="basePackage" value="cn.poison.dao"></property>
</bean>
2.7.3 在dao接口中添加@Repository注解
@Repository
public interface AccountDao {
/**
* 查询所有账户
* @return
*/
@Select("select * from account")
List<Account> findAll();
/**
* 保存账户信息
* @param account
*/
@Insert("insert into account(name,money) values(#{name},#{money})")
void saveAccount(Account account);
}
2.7.4 在Service层实现注入dao,测试整合是否成功
编写请求jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
<html>
<head>
<title>测试</title>
</head>
<body>
<a href="account/testFindAll">查询所有</a>
</body>
</html>
编写响应jsp页面,将查询的数据库输出用jstl标签输出
<%@ 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>
</head>
<body>
<table border="1" width="300" cellpadding="1" cellspacing="2">
<c:forEach items="${accounts}" var="acoount">
<tr>
<td><c:out value="${acoount.id}"></c:out></td>
<td><c:out value="${acoount.name}"></c:out></td>
<td><c:out value="${acoount.money}"></c:out></td>
</tr>
</c:forEach>
</table>
</body>
</html>
- 注意:
由于tomcat的lib目录下,没有jstl的jar包,所以即使你在项目导入了依赖并且在jsp页面引入了jstl标签项目运行依然会报错
- 解决方法:
请参考小编的另一篇文章https://blog.csdn.net/qq_38763540/article/details/104075109进行修改
在service实现类中注入dao
@Service(value = "accountService")
public class AccountServiceImpl implements AccountService {
@Autowired
private AccountDao accountDao;
@Override
public List<Account> findAll() {
System.out.println("业务层:查询所有账户方法....");
return accountDao.findAll();
}
@Override
public void saveAccount(Account account) {
System.out.println("业务层:保存账户方法....");
accountDao.saveAccount(account);
}
}
Controller代码
@Controller
@RequestMapping(path = "/account")
public class AccountController {
@Autowired
private AccountService accountService;
/**
* 查询所有
* @return
*/
@RequestMapping(path = "/testFindAll")
public String testFindAll(Model model){
System.out.println("测试成功。。。");
List<Account> accountList = accountService.findAll();
model.addAttribute("accounts",accountList);
return "list";
}
}
测试结果:
2.7.5 配置Spring声明式事务管理
在applicationContext.xml中配置AOP增强事务管理
<!-- 配置事务通知 -->
<tx:advice id="txAdvice">
<tx:attributes>
<!--配置查询方法为只读-->
<tx:method name="find*" read-only="true"/>
<!--配置其他(增删改)方法事务管理-->
<tx:method name="*" isolation="DEFAULT"></tx:method>
</tx:attributes>
</tx:advice>
<!-- 配置AOP增强 -->
<aop:config>
<!--配置通用切入点表达式-->
<aop:pointcut id="pt1" expression="execution(* cn.poison.service.impl.*ServiceImpl.*(..))"/>
<!--关联事务与通知的关系-->
<aop:advisor advice-ref="txAdvice" pointcut-ref="pt1"></aop:advisor>
</aop:config>
测试:
jsp页面
<form method="post" action="account/testSave">
姓名:<input type="text" name="name"><br>
金额:<input type="text" name="money"><br>
<input type="submit" value="提交">
</form>
Controller代码
/**
* 测试保存
* @param account
* @param request
* @param response
* @throws IOException
*/
@RequestMapping(path = "/testSave")
public void testSave(Account account, HttpServletRequest request, HttpServletResponse response) throws IOException {
accountService.saveAccount(account);
response.sendRedirect(request.getContextPath()+"/account/testFindAll");
return;
}
运行结果:
综上,SSM框架整合基本完成,在实际开发中涉及到三大框架中各个框架使用的其他的组件,可以根据需要进行配置,有兴趣的同学可以试一下配置注解类的方式进行整合,小编经验尚浅,如果文中有写的不好的地方,还望指教!!