MyBatis3_Spring4_SpringMvc整合指南

本文档详细介绍了MyBatis3、Spring4和SpringMvc的整合步骤,包括添加所需依赖、规划项目结构、配置文件编写、数据库脚本、模型层、控制器和视图的编码。通过本教程,读者可以掌握Java开发环境中这三大框架的集成方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

MyBatis3_Spring4_SpringMvc整合指南


  • 1.1MyBatis3_Spring4_SpringMvc整合指南 MyBatis3_Spring4_SpringMvc整合指南加粗样式

一、 添加架包支持
1、 添加Spring4架包
spring-beans-4.3.25.RELEASE.jar
说明:这个jar文件是所有应用都要用到的,它包含访问配置文件、创建和管理bean以及进行Inversion of Control / Dependency Injection(IoC/DI)操作相关的所有类。如果应用只需基本的IoC/DI支持,引入spring-core.jar及spring-beans.jar文件就可以了。
spring-context-4.3.25.RELEASE.jar
说明:Spring提供在基础IoC功能上的扩展服务,此外还提供许多企业级服务的支持,如邮件服务、任务调度、JNDI定位、

学习内容:

例如:
1、 搭建 Java 开发环境
2、 掌握 Java 基本语法
3、 掌握条件语句
4、 掌握循环语句


学习产出:

例如:

spring-core-4.3.25.RELEASE.jar
说明:Spring框架基本的核心工具类,Spring其它组件要都要使用到这个包里的类,是其它组件的基本核心,当然你也可以在自己的应用系统中使用这些工具类。
spring-expression-4.3.25.RELEASE.jar
说明:Spring表达式语言( Spring 3.0 创建了一种新的方式用以配置对象的注入(set注入或者构造参数注入),它便是SpEL (Spring Expression Language),SpEL使用#{…}作为定界符,所有在大框号中的字符都将被认为是SpEL。
spring-aop-4.3.25.RELEASE.jar
说明:这个jar文件包含在应用中使用Spring的AOP特性时所需的类。使用基于AOP的Spring特性,如声明型事务管理(Declarative Transaction Management)。
spring-aspects-4.3.25.RELEASE.jar
说明:Spring提供对AspectJ框架的整合(AspectJ:springAOP就是用aspectj来实现的,是依赖关系!AspectJ是动态代理的一种实现!而spring默认使用的就是AspectJ来实现的动态代理,spring自己的AOP就是使用AspectJ来实现的)。
spring-jdbc-4.3.25.RELEASE.jar
说明:Spring对JDBC数据访问进行封装的所有类。
spring-orm-4.3.25.RELEASE.jar
说明:包含Spring对DAO特性集进行了扩展,使其支持 iBATIS、JDO、OJB、TopLink,因为Hibernate已经独立成包了,现在不包含在这个包里了。这个jar文件里大部分的类都要依赖spring-dao.jar里的类,用这个包时你需要同时包含spring-dao.jar包。
spring-tx-4.3.25.RELEASE.jar
说明:Spring提供对事务的支持。
spring-web-4.3.25.RELEASE. .jar
说明:SpringWeb下的工具包。
spring-webmvc-4.3.25.RELEASE .jar
说明:包含Spring MVC框架相关的所有类。包含国际化、标签、Theme、视图展现的FreeMarker、JasperReports、Tiles、Velocity、XSLT相关类。当然,如果你的应用使用了独立的MVC框架,则无需这个JAR文件里的任何类。
2、 添加SpringAOP支持的补充包
com.springsource.net.sf.cglib-2.2.0.jar
com.springsource.org.aopalliance-1.0.0.jar
com.springsource.org.aspectj.weaver-1.6.8.RELEASE.jar
3、 添加持久层架包
mybatis-3.4.1.jar:mybatis架包
mysql-connector-java-5.1.37-bin.jar:数据库连接驱动架包
c3p0-0.9.1.2.jar:C3P0连接池架包
4、 添加MyBatis-Spring整合架包
mybatis-spring-1.3.0.jar:需要下载MyBatis官方指定匹配Spring版本的架包
5、 添加其他架包
commons-logging-1.2.jar:日志支持架包
log4j.jar:Debug调试输出日志架包
taglibs-standard-impl-1.2.1.jar、taglibs-standard-spec-1.2.1.jar:JSTL标签库架包

二、 规划项目结构
1、 包结构(src源码目录下):
org.ssm.domain:实体层
org.ssm.dao:持久层接口
org.ssm.service:业务层接口
org.ssm.service.impl:业务层实现类
org.ssm. controller:控制层

2、 配置文件目录(conf源码目录下):
org.ssm.dao:持久层SQL映射文件包
applicationContext.xml:Spring核心配置文件
log4j.xml:Debug调试输出配置文件

3、 WEB目录结构:
/WEB-INF/lib:项目架包目录
/WEB-INF/views:项目视图目录
/WEB-INF/spring-mvc-servlet.xml:SpringMVC核心配置文件
/WEB-INF/web.xml:项目配置文件

三、 编写配置文件
1、 Web项目配置文件(/WEB-INF/web.xml)配置:
<!—
配置Spring配置文件的位置
classpath:代表源码目录
–>

contextConfigLocation
classpath:applicationContext.xml

<!-- 配置Spring启动的监听器 -->
<listener>
	<listener-class>

org.springframework.web.context.ContextLoaderListener

<!-- 配置SpringMVC前端控制器 -->	
<servlet>
	<servlet-name>spring-mvc</servlet-name>
	<servlet-class>

org.springframework.web.servlet.DispatcherServlet

1

<!-- 配置SpringMVC前端控制器映射 -->
<servlet-mapping>
	<servlet-name>spring-mvc</servlet-name>
	<url-pattern>/</url-pattern>
</servlet-mapping>

<!-- 配置字符集过滤器 -->
<filter>
	<filter-name>CharsetFilter</filter-name>
	<filter-class>org.ssm.filter.CharsetFilter</filter-class>
	<init-param>
		<param-name>charset</param-name>
		<param-value>utf-8</param-value>
	</init-param>
</filter>
<filter-mapping>
	<filter-name>CharsetFilter</filter-name>
	<url-pattern>/*</url-pattern>
</filter-mapping>

2、 Spring核心配置文件( /src/applicationContext.xml)配置:

<context:component-scan base-package=“org.ssm”>


<context:exclude-filter type=“annotation”
expression=“org.springframework.stereotype.Controller” />
</context:component-scan>

<!-- 
	配置数据源:
	com.mchange.v2.c3p0.ComboPooledDataSource:c3p0数据源
	destroy-method="close":设置close方法为关闭连接方法
-->
<bean id="dataSource"
		class="com.mchange.v2.c3p0.ComboPooledDataSource" 

destroy-method=“close”>




<!-- 配置事务管理器 -->
<bean id="dataSourceTransactionManager"
	class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
	<property name="dataSource" ref="dataSource" />
</bean>

<!-- 配置使用注解实现声明式事务 -->
<tx:annotation-driven
	transaction-manager="transactionManager" />

<!-- 配置创建sqlSessionFactory -->
<bean id="sqlSessionFactoryBean"
	class="org.mybatis.spring.SqlSessionFactoryBean">
	<property name="dataSource" ref="dataSource"/>
	<!-- 配置MyBatis-SQL映射文件所在位置 -->
	<property name="mapperLocations" 

value=“classpath:org/ssm/dao/*.xml”/>

<!-- 配置扫描MyBatis实现的持久层包扫描 -->
<mybatis-spring:scan base-package="org.ssm.dao"/>

<!-- 配置扫描MyBatis实现的持久层包扫描的另外一种方式 -->
<!-- <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> -->
<!-- <property name="basePackage" value="org.ssm.dao"/> -->
<!-- </bean> -->

3、 SpringMVC核心配置文件( /WEB-INF/spring-mvc-servlet.xml)配置:

<context:component-scan
base-package=“org.ssm” use-default-filters=“false”>

<context:include-filter type=“annotation”
expression=“org.springframework.stereotype.Controller” />
</context:component-scan>

<!-- 配置SpringMVC视图解析器 -->
<bean
	class="org.springframework.web.servlet.view.InternalResourceViewResolver">
	<!-- 配置路径映射的前缀规则 -->
	<property name="prefix" value="/WEB-INF/views/" />
	<!-- 配置路径映射的后缀规则 -->
	<property name="suffix" value=".jsp"/>
</bean>

<!-- 配置注解、JSR303支持、数据格式化、类型转化器等功能的支持 -->
<mvc:annotation-driven />

<!-- 配置默认处理器,以支持访问静态资源 -->
<mvc:default-servlet-handler />

<!-- 配置不经过Controller处理的映射规则 -->
<mvc:view-controller path="/index" view-name="index" />

4、 Debug调试输出配置文件(/src/log4j.xml)配置:
将log4j.xml文件拷贝到源码目录,无需配置。

四、 编写数据库脚本
DROP TABLE IF EXISTS student;
CREATE TABLE student (
stuId int(11) NOT NULL AUTO_INCREMENT,
stuName varchar(50) NOT NULL,
age int(11) NOT NULL,
gender varchar(2) NOT NULL,
PRIMARY KEY (stuId)
);

五、 模型层编码
实体类:

public class Student implements Serializable {
	private int stuId;
	private String stuName;
	private int age;
	private String gender;
	
	//setter、getter 方法省略
}

数据访问接口:

public interface StudentDao {
	public int insert(Student obj);
	public int update(Student obj);
	public int delete(Integer id);
	public Student selectById(Integer id);
	public List<Student> selectAll();
}

SQL映射文件:

<insert id="insert" parameterType="org.ssm.domain.Student">
	insert into student(stuName,age,gender)
	values(#{stuName},#{age},#{gender})
</insert>

<update id="update" parameterType="org.ssm.domain.Student">
	update student set stuName=#{stuName},age=#{age},gender=#{gender}
	where stuId=#{stuId}
</update>

<delete id="delete" parameterType="integer">
	delete from student where stuId=#{id}
</delete>

<select id="selectById" resultType="org.ssm.domain.Student">
	select * from student where stuId=#{id}
</select>

<select id="selectAll" resultType="org.ssm.domain.Student">
	select * from student
</select>
业务层接口:
public interface StudentService {
	public boolean insert(Student obj);
	public boolean update(Student obj);
	public boolean delete(Integer id);
	public Student selectById(Integer id);
	public List<Student> selectAll();
}

业务层实现类:

@Service
public class StudentServiceImpl implements StudentService {

	@Autowired
	private StudentDao studentDao;
	
	@Override
	public boolean insert(Student obj) {
		
		return this.studentDao.insert(obj)>0?true:false;
	}

	@Override
	public boolean update(Student obj) {
		return this.studentDao.update(obj)>0?true:false;
	}

	@Override
	public boolean delete(Integer id) {
		return this.studentDao.delete(id)>0?true:false;
	}

	@Override
	public Student selectById(Integer id) {
		
		return this.studentDao.selectById(id);
	}

	@Override
	public List<Student> selectAll() {
		
		return this.studentDao.selectAll();
	}
}

字符过滤器:

public class CharsetFilter implements Filter {
	
	private String charset;

	@Override
	public void init(FilterConfig filterConfig) throws ServletException {
		
		Filter.super.init(filterConfig);
				
		this.charset=filterConfig.getInitParameter("charset");
			
	}

	@Override
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain)
			throws IOException, ServletException {
		
		request.setCharacterEncoding(this.charset);
		response.setCharacterEncoding(this.charset);
		response.setContentType("text/html;charset="+this.charset);
		
		filterChain.doFilter(request, response);
		
	}
	
	@Override
	public void destroy() {
		
		Filter.super.destroy();
		
		this.charset=null;
	}
}

六、 控制器编码
获取原生API基类:

public class BaseController {
	@Autowired
	protected HttpServletRequest request;
	
	@Autowired
	protected HttpServletResponse response;
}

Controller处理器类:

@RequestMapping("/student")
@Controller
public class StudentController extends BaseController {
	
	@Autowired
	private StudentService studentService;
	
	@RequestMapping("/index")
	public String index(Map<String,Object> map) {
		
		map.put("objs", this.studentService.selectAll());
		
		return "student/index";
	}
	
	@RequestMapping(value = "/append",method = RequestMethod.GET)
	public String append() {	
		
		return "student/append";
	}

	@RequestMapping(value = "/append",method = RequestMethod.POST)
	public String append(Student obj) {	
		
		if(this.studentService.insert(obj)) 
			return "redirect:/student/index";
		else {
			request.setAttribute("msg", "添加学生失败!");
			return "error";
		}	
	}
	
	@RequestMapping(value = "/modify",method = RequestMethod.GET)
	public String modify(Map<String, Object> map,Integer id) {	
		
		map.put("obj", this.studentService.selectById(id));
		
		return "student/modify";
	}
	
	@RequestMapping(value = "/modify",method = RequestMethod.POST)
	public String modify(Student obj) {	
		
		if(this.studentService.update(obj)) 
			return "redirect:/student/index";
		else {
			request.setAttribute("msg", "修改学生信息失败!");
			return "error";
		}	
	}
	
	@RequestMapping("/remove")
	public String remove(Integer id) {	
		
		if(this.studentService.delete(id)) 
			return "redirect:/student/index";
		else {
			request.setAttribute("msg", "删除学生信息失败!");
			return "error";
		}	
	}
	
	@RequestMapping("/detail")
	public String detail(Map<String, Object> map,Integer id) {	
		
		map.put("obj", this.studentService.selectById(id));
		
		return "student/detail";
	}
}

七、 视图编码
1、/WEB-INF/views/index.jsp:

<head>
<base href="${pageContext.request.contextPath }/">
<meta charset="utf-8">
</head>
<body>

学生管理系统

2、/WEB-INF/views/error.jsp:

Error Page

错误信息:${msg }
返回首页 3、/WEB-INF/views/student/index.jsp:
<head>
<base href="${pageContext.request.contextPath }/">
<meta charset="utf-8">
</head>
<body>
	<h1>Student List</h1>
	<table style="width:800px;border:1px #000 solid">
		<tr>
			<td>ID</td>
			<td>Name</td>
			<td>Age</td>
			<td>Gender</td>
			<td>Operate</td>
		</tr>
		<c:forEach var="obj" items="${objs }" varStatus="status">
		<tr>
			<td>${status.index+1 }</td>
			<td>
<a href="student/detail?id=${obj.stuId }">
${obj.stuName }
</a>
</td>
			<td>${obj.age }</td>
			<td>${obj.gender }</td>
			<td>
				<a href="student/modify?id=${obj.stuId }">Modify</a>
				&nbsp;&nbsp;
				<a href="student/remove?id=${obj.stuId }">Remove</a>
			</td>
		</tr>		
		</c:forEach>
	</table>
	<a href="student/append">Append</a>
</body>

4、/WEB-INF/views/student/append.jsp:

<head>
<base href="${pageContext.request.contextPath }/">
<meta charset="utf-8">
<script type="text/javascript" src="js/jquery-1.8.3.min.js"></script>
</head>
<body>
	<h1>Student Append</h1>
	<form action="student/append" method="post">
		name:<input id="stuName" type="text" name="stuName"> <br/>
		age:<input id="age" type="text" name="age"> <br/>
		gender:<input id="gender" type="text" name="gender"> <br/>
		<input id="btn" type="submit" value="submit">
	</form>
</body>
 

5、/WEB-INF/views/student/modify.jsp:

<head>
<base href="${pageContext.request.contextPath }/">
<meta charset="utf-8">
</head>
<body>
	<h1>Student Modify</h1>
	<form action="student/modify" method="post">
		<input type="hidden" name="stuId" value="${obj.stuId }">
		name:
<input type="text" name="stuName" value="${obj.stuName }"><br/>
		age:<input type="text" name="age" value="${obj.age }"><br/>
		gender:
<input type="text" name="gender" value="${obj.gender }"><br/>
		<input type="submit" value="submit">
	</form>
</body>

6、/WEB-INF/views/student/detail.jsp:

<head>
<base href="${pageContext.request.contextPath }/">
<meta charset="utf-8">
</head>
<body>
	<h1>Student Detail</h1>
	<ul>
		<li>id:${obj.stuId }</li>
		<li>name:${obj.stuName }</li>
		<li>age:${obj.age }</li>
		<li>gender:${obj.gender }</li>
	</ul>
	<a href="student/index">Return To List</a>
</body>

八、 发布测试,整合结束

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值