Spring 6 +Mybatis+Spring MVC整合

因为Spring MVC是Spring框架中的一个子模块,所以Spring与Spring MVC之间不存在整合的问题。实际上SSM框架的整合只涉及Spring与MyBatis的整合,以及Spring MVC与MyBatis的整合。实现SSM框架的整合,首先需要准备三个框架的JAR包以及其他整合所需要的JAR包。本次主要使用spring 6。

详见以下操作步骤:

  1. 创建一个Maven项目、完成jar包的相关配置;
  2. 导入Spring、Mybatis、Spring MVC核心包,导入Junit依赖包;Maven项目的pom.xml中的依赖包代码如下:
	<dependencies>
	<dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
    </dependency>
    <!-- https://mvnrepository.com/artifact/org.springframework/spring-context -->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-context</artifactId>
      <version>6.1.5</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/org.springframework/spring-web -->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-web</artifactId>
      <version>6.1.5</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/org.springframework/spring-core -->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-core</artifactId>
      <version>6.1.5</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/org.springframework/spring-beans -->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-beans</artifactId>
      <version>6.1.5</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc -->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-webmvc</artifactId>
      <version>6.1.5</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/org.springframework/spring-aop -->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-aop</artifactId>
      <version>6.1.5</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/org.springframework/spring-tx -->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-tx</artifactId>
      <version>6.1.5</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
    <dependency>
      <groupId>org.mybatis</groupId>
      <artifactId>mybatis</artifactId>
      <version>3.5.12</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/org.mybatis/mybatis-spring -->
    <dependency>
      <groupId>org.mybatis</groupId>
      <artifactId>mybatis-spring</artifactId>
      <version>3.0.3</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/org.springframework/spring-jdbc -->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-jdbc</artifactId>
      <version>6.1.5</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/org.apache.commons/commons-dbcp2 -->
    <dependency>
      <groupId>org.apache.commons</groupId>
      <artifactId>commons-dbcp2</artifactId>
      <version>2.12.0</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind -->
    <dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-databind</artifactId>
      <version>2.17.0</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-core -->
    <dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-core</artifactId>
      <version>2.17.0</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/com.mysql/mysql-connector-j -->
    <dependency>
      <groupId>com.mysql</groupId>
      <artifactId>mysql-connector-j</artifactId>
      <version>8.3.0</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/org.apache.logging.log4j/log4j-core -->
    <dependency>
      <groupId>org.apache.logging.log4j</groupId>
      <artifactId>log4j-core</artifactId>
      <version>2.23.0</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/org.apache.logging.log4j/log4j-api -->
    <dependency>
      <groupId>org.apache.logging.log4j</groupId>
      <artifactId>log4j-api</artifactId>
      <version>2.23.0</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/commons-logging/commons-logging -->
    <dependency>
      <groupId>commons-logging</groupId>
      <artifactId>commons-logging</artifactId>
      <version>1.3.0</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/org.springframework/spring-orm -->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-orm</artifactId>
      <exclusions>
        <exclusion>
          <groupId>commons-logging</groupId>
          <artifactId>commons-logging</artifactId>
        </exclusion>
      </exclusions>
      <version>6.1.5</version>
    </dependency>
	</dependencies>

  1. 在src/main/webapp下创建信息输入页面input.jsp,代码如下:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>SSM框架整合</title>
<script type="text/javascript" src="${pageContext.request.contextPath }/js/jquery-3.2.1.min.js" ></script>
<script type="text/javascript">
	function testJson() {
		//获取输入的值uname为id
		var uname = $("#uname").val();
		$("#userlist").html(""); 
		$.ajax({
			//请求路径
			url : "${pageContext.request.contextPath}/select",
			//请求类型
			type : "post",
			//data表示发送的数据 定义发送请求的数据格式为JSON字符串
			data : JSON.stringify({uid:0,uname:uname,usex:"男"}),

			contentType : "application/json;charset=utf-8",
			//定义回调响应的数据格式为JSON字符串,该属性可以省略
			dataType : "json",
			//成功响应的结果
			success : function(data){//回调函数
				if(data != null){					
					//alert("ID:" + data.id + ",姓名:" + data.uname + ",性別:" +  data.usex);
					$.each(data, function(i) {
						var tr = "<br >";						
						tr += "&nbsp" + (i + 1) + "&nbsp";
						tr += data[i].uid+"&nbsp";
						tr += data[i].uname+"&nbsp";
						tr += data[i].usex+"&nbsp";
						$("#userlist").append(tr);
					});				
				}			
			}
		});
	}
</script>
</head>
<body>
	<form action="">
		输入用户名:<input type="text" name="uname"  id="uname"/><br>
		<input type="button" value="提交" onclick="testJson()" />
	</form>
	<div id="userlist"></div>
</body>
</html>
  1. 对src/main/webapp/WEB-INF下的web.xml修改,配置ApplicationContext容器、配置DispatcherServlet、配置过滤器避免中文乱码,代码如下:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
	<!-- 首页 -->
	<welcome-file-list>
		<welcome-file>input.jsp</welcome-file>
	</welcome-file-list>
	<!-- 实例化ApplicationContext容器 -->
	<context-param>
		<!-- 加载src目录下的applicationContext.xml文件 -->
		<param-name>contextConfigLocation</param-name>
		<param-value>classpath:applicationContext.xml</param-value>
	</context-param>
	<!-- 指定以ContextLoaderListener方式启动Spring容器 -->
	<listener>
		<listener-class>
			org.springframework.web.context.ContextLoaderListener
		</listener-class>
	</listener>
	<!--配置DispatcherServlet -->
	<servlet>
		<servlet-name>springmvc</servlet-name>
		<servlet-class>org.springframework.web.servlet.DispatcherServlet
		</servlet-class>
		<load-on-startup>1</load-on-startup>
	</servlet>
	<servlet-mapping>
		<servlet-name>springmvc</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>
		<init-param>
			<param-name>forceEncoding</param-name>
			<param-value>true</param-value>
		</init-param>
	</filter>
	<filter-mapping>
		<filter-name>characterEncodingFilter</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>
</web-app>
  1. 配置applicationContext.xml,在resources下创建applicationContext.xml文件,填写如下代码:
<?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:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx"
	xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd
        http://www.springframework.org/schema/tx
		http://www.springframework.org/schema/tx/spring-tx-4.3.xsd">
	<!-- 配置数据源 -->
	<bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource">
		<property name="driverClassName" value="com.mysql.jdbc.Driver" />
		<property name="url" value="jdbc:mysql://localhost:3306/springtest?characterEncoding=utf8" />
		<property name="username" value="root" />
		<property name="password" value="123456" />
		<!-- 最大连接数 -->
		<property name="maxTotal" value="30" />
		<!-- 最大空闲连接数 -->
		<property name="maxIdle" value="10" />
		<!-- 初始化连接数 -->
		<property name="initialSize" value="5" />
	</bean>
	<!-- 添加事务支持 -->
	<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
		<property name="dataSource" ref="dataSource" />
	</bean>
	<!-- 开启事务注解 -->
	<tx:annotation-driven transaction-manager="txManager" />
	<!-- 配置MyBatis工厂,同时指定数据源,并与MyBatis完美整合 -->
	<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
		<property name="dataSource" ref="dataSource" />
		<!-- configLocation的属性值为MyBatis的核心配置文件 -->
		<property name="configLocation" value="classpath:mybatis-config.xml" />
	</bean>
	<!--Mapper代理开发,使用Spring自动扫描MyBatis的接口并装配 (Spring将指定包中所有被@Mapper注解标注的接口自动装配为MyBatis的映射接口) -->
	<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
		<!-- mybatis-spring组件的扫描器 -->
		<property name="basePackage" value="com.dao" />
		<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory" />
	</bean>
	<!-- 指定需要扫描的包(包括子包),使注解生效。dao包在mybatis-spring组件中已经扫描,这里不再需要扫描 -->
	<context:component-scan base-package="com.service" />
</beans>
  1. 配置DispatcherServlet,在WEB-INF下创建springmvc-servlet.xml文件,填写如下代码:
<?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:context="http://www.springframework.org/schema/context" xmlns:mvc="http://www.springframework.org/schema/mvc"
	xsi:schemaLocation="
    	http://www.springframework.org/schema/beans 
    	http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context 
        http://www.springframework.org/schema/context/spring-context.xsd
        http://www.springframework.org/schema/mvc 
        http://www.springframework.org/schema/mvc/spring-mvc.xsd">
	<!-- 使用扫描机制,扫描包 -->
	<context:component-scan base-package="com.controller" /> 
	<!-- 配置视图解析器 -->
	<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="internalResourceViewResolver">
		<!-- 前缀 -->
		<property name="prefix" value="/WEB-INF/jsp/" />
		<!-- 后缀 -->
		<property name="suffix" value=".jsp" />
	</bean>
	<mvc:annotation-driven />
	<!-- annotation-driven用于简化开发的配置, 注解DefaultAnnotationHandlerMapping和AnnotationMethodHandlerAdapter -->
	<!-- 使用resources过滤掉不需要dispatcher servlet的资源。 使用resources时,必须使用annotation-driven,不然resources元素会阻止任意控制器被调用。 -->
	<!-- 配置静态资源,允许js目录下所有文件可见 -->
	<mvc:resources location="/js/" mapping="/js/**" />
	<!-- 配置springmvc将对象直接转换为json对象 -->
	<mvc:annotation-driven>
		<mvc:message-converters>
			<bean class="org.springframework.http.converter.StringHttpMessageConverter" />
			<bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter" />
		</mvc:message-converters>
	</mvc:annotation-driven>
</beans>
  1. 配置Mybatis,添加日志文件,在src/main/resource下创建log4j.properties文件,填写如下代码:
# Global logging configuration
log4j.rootLogger=ERROR, stdout
# MyBatis logging configuration...
log4j.logger.com.dao=DEBUG
# Console output...
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n
  1. 配置数据库,添加数据库springtest,创建user表,字段分别为uid,uname,usex,uid为自增字段,主键,或依次执行如下命令:
CREATE DATABASE springtest;
-- ----------------------------
-- Table structure for `user`
-- ----------------------------
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
  `uid` tinyint(2) NOT NULL AUTO_INCREMENT,
  `uname` varchar(20) COLLATE utf8_unicode_ci DEFAULT NULL,
  `usex` varchar(10) COLLATE utf8_unicode_ci DEFAULT NULL,
  PRIMARY KEY (`uid`)
) ENGINE=InnoDB AUTO_INCREMENT=52 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

-- ----------------------------
-- Records of user
-- ----------------------------
INSERT INTO `user` VALUES ('1', '小花', '女');
INSERT INTO `user` VALUES ('12', '米小圈', '男');

  1. 根据数据表user的字段,在com.po包下创建持久化类MyUser,如下
package com.po;

/**
 * springtest数据库中user表的持久化类,与持久层关联
 */
public class MyUser {
	private Integer uid;// 主键
	private String uname;
	private String usex;

	public Integer getUid() {
		return uid;
	}

	public void setUid(Integer uid) {
		this.uid = uid;
	}

	public String getUname() {
		return uname;
	}

	public void setUname(String uname) {
		this.uname = uname;
	}

	public String getUsex() {
		return usex;
	}

	public void setUsex(String usex) {
		this.usex = usex;
	}
}
  1. 在com.dao包下创建用于执行业务功能的接口UserDao,代码如下
package com.dao;
import java.util.List;
import org.apache.ibatis.annotations.Mapper;
import org.springframework.stereotype.Repository;
import com.po.MyUser;
@Repository("userDao")
@Mapper
/*使用Spring自动扫描MyBatis的接口并装配
(Spring将指定包中所有被@Mapper注解标注的接口自动装配为MyBatis的映射接口*/
public interface UserDao {
	/**
	 * 接口方法对应SQL映射文件UserMapper.xml中的id
	 */
	public List<MyUser> selectUserByUname(MyUser user);
}
  1. 在com.mybatis包下创建接口UserDao对应的Mapper文件UserMapper.xml,代码如下:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!-- com.dao.UserDao对应Dao接口 -->
<mapper namespace="com.dao.UserDao">
	<!-- 查询用户信息 -->
	<select id="selectUserByUname" resultType="com.po.MyUser" parameterType="com.po.MyUser">
		select * from user where 1=1
		<if test="uname !=null and uname!=''">
			and uname like concat('%',#{uname},'%')
		</if>
	</select>
</mapper>
  1. 创建mybatis-config.xml文件,填写如下代码:
<?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>
	<mappers><!-- 映射器,告诉 MyBatis到哪里去找映射文件 -->
		<mapper resource="com/mybatis/UserMapper.xml" />
	</mappers>
</configuration>
  1. 添加业务逻辑代码,在com.service包下创建业务逻辑接口UserService,代码如下
package com.service;
import java.util.List;
import com.po.MyUser;
public interface UserService {
	public List<MyUser> selectUserByUname(MyUser user);
}

继续添加接口UserService的实现类UserServiceImpl,代码如下:

package com.service;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import com.dao.UserDao;
import com.po.MyUser;

@Service("userService")
@Transactional
/**
 * 加上注解@Transactional,可以指定这个类需要受Spring的事务管理
 * 注意@Transactional只能针对public属性范围内的方法添加, 本案例并不需要处理事务,在这里只是告诉读者如何使用事务
 */
public class UserServiceImpl implements UserService {
	@Autowired
	private UserDao userDao;

	@Override
	public List<MyUser> selectUserByUname(MyUser user) {
		return userDao.selectUserByUname(user);
	}
}

由于含有@Service、@Transactional、@Autowired注解,因此在applicationContext.xml文件中包含对com.service包的注解扫描

<!-- 指定需要扫描的包(包括子包),使注解生效。dao包在mybatis-spring组件中已经扫描,这里不再需要扫描 -->
<context:component-scan base-package="com.service" />
  1. 在com.controller包下创建控制器类UserController,代码如下
package com.controller;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;

import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import com.po.MyUser;
import com.service.UserService;
@Controller
public class UserController {
	@Autowired
	private UserService userService;
	
	@RequestMapping("/select")
	@ResponseBody
	public Object select(@RequestBody MyUser user) {
		
		List<MyUser> list = userService.selectUserByUname(user);		 
		System.out.println("list:"+list);
		return list;
	}
	
	@RequestMapping("/input")
	public String initLogin() {
		System.out.println("userList");
		return "userList";
	}
}

@responseBody注解的作用是将controller的方法返回的对象通过适当的转换器转换为指定的格式之后,写入到response对象的body区,通常用来返回JSON数据或者是XML数据。(注意:在使用此注解之后不会再走视图处理器,而是直接将数据写入到输入流中,他的效果等同于通过response对象输出指定格式的数据。)

由于含有@Controller和@Autowired注解,需要在springmvc-servlet.xml文件中添加对com.controller包的注解扫描

<!-- 使用扫描机制,扫描包 -->
	<context:component-scan base-package="com.controller" />
  • 30
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值