spring框架学习:Spring整合Web项目整合Mybatis

Posted Johnny*

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了spring框架学习:Spring整合Web项目整合Mybatis相关的知识,希望对你有一定的参考价值。

使用Spring开发Web项目,首先要考虑的是如何初始化SpringIOC 容器。在Java程序中,由于java程序的有统一入口:main(),所以我们只需在main函数中调用一次初始化IOC容器:ApplicationContext applicationContext =new ClassPathXmlApplicationContext(“com/johnny/annotation/beans/xml/bean-524.xml”); 即可。
但是由于Web项目的入口不确定(可以是任意页面),如果还是使用上述方法,会发现IOC容器每次在使用前都需要初始化,尤其消耗性能。因此我们的解决方案是,加入监听器,让Spring IOC 容器只在Tomcat服务器启动的时候被初始化,也只会被初始化一次,完美解决了上述问题。

Spring已经为我们提供了监听服务器启动的监听器,在Spring-web.jar提供了org.springframework.web.context.ContextLoaderListener监听器类。

Spring开发web项目

添加jar包

5个开发Java程序使用jar + commons-logging.jar(日志jar) + spring-web.jar(Spring开发web必须要用到的jar)

Tomcat 环境所依赖的jar包本身就有对servlet的支持

配置监听器

web.xml文件中

<!-- 指定SpringIOC容器(applicationContext.xml)的路径 -->
  <context-param>
  	<!-- ContextLoaderListener的父类ContextLoader有属性 contextConfigLocation
  		该属性用于指定SpringIoc容器的路径 默认为类路径(src)下
  	-->
  	<param-name>contextConfigLocation</param-name>
  	<param-value>classpath:applicationContext.xml</param-value>
  </context-param>
  
  <!-- 配置Spring-web.jar提供的监听器
  		该监听器可以服务器启动时初始化SpringIoc容器(applicationContext.xml):
  		1.SpringIoc容器配置文件路径约定是在WEB-INF,且文件名为applicationContext.xml,这是默认值。
  		2.可以通过上面<context-param> 标签指定 SpringIOC 容器配置文件的位置,此时位置和名称可以自己指定(你的配置文件放在哪 叫什么名字 就按照你放的位置和名字写)
   -->
  <listener>
  	<!-- spring-web 监听器ContextLoaderListener所在类 -->
  	<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  	
  </listener>

拆分Spring配置文件

在Java项目中

如果有多个配置文件:
applicationContext1.xml
applicationContext2.xml
applicationContext3.xml
使用ApplicationContext conext = new ClassPathXmlApplicationContext(“applicationContext3.xml”) ;
一一加载

在web项目中

可以根据三层结构或者功能结构拆分配置文件:
1.按 三层结构
UI(html/css/jsp 、Servlet) applicationController.xml
Service :applicationService.xml
Dao:applicationDao.xml
公共 数据库:applicationDB.xml

  1. 按功能结构
    学生相关配置 applicationContextStudent.xml
    班级相关配置 applicationContextClass.xml

那么如何合并、加载多个配置文件呢?有以下三种方式:

  1. 在web.xml里的监听器中直接加载spring的各个配置文件
    不同配置文件以逗号隔开
 <context-param>
  		<!--  监听器的父类ContextLoader中有一个属性contextConfigLocation,该属性值 保存着 容器配置文件applicationContext.xml的位置 -->
  <param-name>contextConfigLocation</param-name>
  		<param-value>
  			classpath:applicationContext.xml,
  			classpath:applicationContext-Dao.xml,
  			classpath:applicationContext-Service.xml,
  			classpath:applicationContext-Controller.xml
  		</param-value>
  </context-param>

推荐写法

 <context-param>
  		<!-- 使用 * 通配符 -->
  		<param-name>contextConfigLocation</param-name>
  		<param-value>
  			classpath:applicationContext.xml,
  			classpath:applicationContext-*.xml
  		</param-value>
  </context-param>
  1. 在web.xml中加载配置文件

web.xml文件中

<param-value>  classpath:applicationContext.xml  </param-value>

然后在主配置(applicationContext.xml)文件中,加载其他配置文件

<import resource="applicationContext-*.xml"/>

注意

如果使用Servlet是由Web容器的概念的,但是bean的所有实例都是在IOC容器中的。
但是web项目中除了使用ApplicationContext对象获得,还可以使用WebApplicationContextUtils.getWebApplicationContext( this.getServeltContext())来获取SpringIOC容器
在这里插入图片描述

Spring整合Mybatis

整合思路,SqlSessionFactory 工厂获取SqlSession 会话对象,SqlSession对象获取Mapper对象,通过操作Mapper对象来对数据库对应表进行CRUD。可以发现Mybatis是通过SqlsessionFactory来操作数据库的。Spring整合Mybatis其实就是将Mybatis的SqlSessionFactory交给Spring管理。

SM 整合步骤

  1. 整合需要的Jar
    Spring框架的:
    Spring-aop.jar Spring-beans.jar Spring-core.jar Spring-expression Spring-context Spring-web.jar
    Spring-tx.jar Spring-jdbc.jar

日志jar
commons-logging.jar log4j.jar
连接池和数据库驱动(mysql):
commons-dbcp.jar
Mybatis框架:
mybaits.jar
还有整合Spring和Mybatis两个框架所需要用到的中间Jar:mybatis-spring.jar

  1. 建立类和表

Student.java 类

package com.johnny.entity;

public class Student {
	private int stuNo;
	private String stuName;
	private int stuAge ;
	public int getStuNo() {
		return stuNo;
	}
	public Student(int stuNo, String stuName, int stuAge) {
		super();
		this.stuNo = stuNo;
		this.stuName = stuName;
		this.stuAge = stuAge;
	}
	public void setStuNo(int stuNo) {
		this.stuNo = stuNo;
	}
	public String getStuName() {
		return stuName;
	}
	public void setStuName(String stuName) {
		this.stuName = stuName;
	}
	public int getStuAge() {
		return stuAge;
	}
	public void setStuAge(int stuAge) {
		this.stuAge = stuAge;
	} 
	
}

student表

在这里插入图片描述

  1. 通过studentDao.xml将类、表建立起映射关系

studentDao.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">

<!-- namespace:该mapper.xml映射文件的 唯一标识 -->
<mapper namespace="com.johnny.dao.StudentDao">
	
	
	
	<insert id="addStudent" parameterType="com.johnny.entity.Student" >
		insert into student(stuno,stuname,stuage) values(#{stuNo},#{stuName},#{stuAge})
	</insert>
	
</mapper>

StudentDao.java

package com.johnny.dao;

import com.johnny.entity.Student;

public interface StudentDao {
	public void addStudent(Student student	);

}

StudentService.java

package com.johnny.service;

import com.johnny.entity.Student;

public interface StudentService {
	
	void addStudent(Student student);

}

StudentServiceImpl .java

package com.johnny.service.impl;

import com.johnny.dao.StudentDao;

import com.johnny.entity.Student;
import com.johnny.service.StudentService;

public class StudentServiceImpl implements StudentService{
	
	private StudentDao studentDao;
	

	public void setStudentDao(StudentDao studentDao) {
		this.studentDao = studentDao;
	}


	@Override
	public void addStudent(Student student) {
		//调用dao层
		studentDao.addStudent(student);
	}
	

}

  1. 配置spring配置文件applicationContext.xml,将SqlSessionFactory交给Spring管理
    现在整合的时候,需要通过Spring管理SqlSessionFacotry ,因此 产生sqlSessionFacotry 所需要的数据库信息 不在放入config.xml 而需要放入spring配置文件中

第一种实现方法

Dao层实现类继承SqlSessionDaoSupport类,该类提供了一个属性SqlSession,可通过getSqlSession()获得。

StudentDaoImpl.java

package com.johnny.dao.impl;

import org.apache.ibatis.session.SqlSession;
import org.mybatis.spring.support.SqlSessionDaoSupport;

import com.johnny.dao.StudentDao;
import com.johnny.entity.Student;

public class StudentDaoImpl extends SqlSessionDaoSupport implements StudentDao {

	@Override
	public void addStudent(Student student) {
		//SqlSessionDaoSupport中有SqlSessionFactory属性 该属性值通过applicationContext注入了
		SqlSession sqlSession = super.getSqlSession();//null
		StudentDao studentDao = sqlSession.getMapper(StudentDao.class);
		studentDao.addStudent(student);
		
	}

}

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	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">
	
	
	<!-- 加载db.properties文件 -->
	<bean  id="config" class="org.springframework.beans.factory.config.PreferencesPlaceholderConfigurer">
		<!--  PropertiesLoaderSupport类提供了
		private org.springframework.core.io.Resource[] locations -->
		<property name="locations">
			<array>
				<value>classpath:db.properties</value>
			</array>
		
		</property>
	</bean>
	
	<!-- 第一种产生Mapper对象的方式 -->
	<bean id ="studentDao" class="com.johnny.dao.impl.StudentDaoImpl">
		<!-- 将sqlSessionFactory对象交给dao管理 -->
		<property name="sqlSessionFactory" ref="sqlSessionFactory"></property>
	</bean>
	<bean id="studentService" class="com.johnny.service.impl.StudentServiceImpl">
		<property name="studentDao" ref="studentDao"></property>
	</bean>
	
	<!-- 配置数据库信息 -->
	<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
		<property name="driverClassName" value="${driver}"></property>
		<property name="url" value="${url}"></property>
		<property name="username" value="${username}"></property>
		<property name="password" value="${password}"></property>
	</bean>
	<!-- 在SpringIOC 容器中创建Mybatis的核心类SqlSessionFactory -->
	<!-- 配置数据源   org.apache.ibatis.session.SqlSessionFactory -->
	<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
		<!-- 加载mybatis配置文件 config.xml
			以前是在config.xml文件中配置数据库信息以及映射文件
			现在Spring 整合Mybatis之后就把这些配置信息的控制权交给了Spring 
			不需要再在config.xml文件中配置了 也就不需要引入config.xml文件了
		<property name="configLocation" value="classpath:config.xml"></property>
		 -->
		<property name="dataSource" ref="dataSource"></property> 	
		<!-- 加载mapper.xml路径 -->
		<property name="mapperLocations" value="com/johnny/dao/*.xml"></property>
	</bean>

			
		
</beans>

第二种实现方法

通过mybatis-spring中的MapperFactoryBean ,该类提供了Mapper接口的实现类。就不用自己手动写StudentDao接口的实现类StudentDaoImpl了。只需配置SqlSessionFactory属性和告知要实现的接口。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	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">
	
	
	<!-- 加载db.properties文件 -->
	<bean  id="config" class="org.springframework.beans.factory.config.PreferencesPlaceholderConfigurer">
		<!--  PropertiesLoaderSupport类提供了
		private org.springframework.core.io.Resource[] locations -->
		<property name="locations">
			<array>
				<value>classpath:db.properties</value>
			</array>
		
		</property>
	</bean>
	
	<!-- 第二种实现方式
		mybatis-spring中的MapperFactoryBean 提供了Mapper接口的实现类
		
	 -->
	 <bean id= "studentDao" class="org.mybatis.spring.mapper.MapperFactoryBean">
	 	<!-- 依赖注入 调用MapperFactoryBean 的 setMapperInterface -->
	 	<property name="mapperInterface"  value="com.johnny.dao.StudentDao"></property>
	 	<!--  -->
	 	<property name="sqlSessionFactory" ref="sqlSessionFactory"></property>
	 </bean>
	
	<bean id="studentService" class="com.johnny.service.impl.StudentServiceImpl">
		<property name="studentDao" ref="studentDao"></property>
	</bean>
	
	<!-- 配置数据库信息 -->
	<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
		<property name="driverClassName" value="${driver}"></property>
		<property name="url" value="${url}"></property>
		<property name="username" value="${username}"></property>
		<property name="password" value="${password}"></property>
	</bean>
	<!-- 在SpringIOC 容器中创建Mybatis的核心类SqlSessionFactory -->
	<!-- 配置数据源   org.apache.ibatis.session.SqlSessionFactory -->
	<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
		<!-- 加载mybatis配置文件 config.xml
			以前是在config.xml文件中配置数据库信息以及映射文件
			现在Spring 整合Mybatis之后就把这些配置信息的控制权交给了Spring 
			不需要再在config.xml文件中配置了 也就不需要引入config.xml文件了
		<property name="configLocation" value="classpath:config.xml"></property>
		 -->
		<property name="dataSource" ref="dataSource"></property> 	
		<!-- 加载mapper.xml路径 -->
		<property name="mapperLocations" value="com/johnny/dao/*.xml"></property>
	</bean>

			
		
</beans>

第三种方式

第二种方式虽然简单了许多,但是对于每个Mapper对象都要去配置一次SqlSessionFactory。
Mybatis提供批量产生实现类,然后获得Mapper对象(studentDao)的方法,并约定产生的Bean对象id为接口名首字母小写

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	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">
	
	
	<!-- 加载db.properties文件 -->
	<bean  id="config" class="org.springframework.beans.factory.config.PreferencesPlaceholderConfigurer">
		<!--  PropertiesLoaderSupport类提供了
		private org.springframework.core.io.Resource[] locations -->
		<property name="locations">
			<array>
				<value>classpath:db.properties</value>
			</array>
		
		</property>
	</bean>
	
	<bean id="studentService" class="com.johnny.service.impl.StudentServiceImpl">
		<property name="studentDao" ref="studentDao"></property>
	</bean>
	 
	 
	 <!-- 第三种方式 批量产生Mapper对象
	 	约定产生的Bean对象id为接口名首字母小写
	  -->
	 <bean name="mappers" class ="org.mybatis.spring.mapper.MapperScannerConfigurer">
	 	<!-- String basePackage 指定批量产生该包下的Mapper对象  -->
	 	<property name="basePackage" value="com.johnny.dao"></property>
	 	<!-- String sqlSessionFactoryBeanName -->
	 	<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"></property>
	 </bean>
	 
	<!-- 配置数据库信息 -->
	<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
		<property name="driverClassName" value="${driver}"></property>
		<property name="url" value="${url}"></property>
		<property name="username" value="${username}"></property>
		<property name="password" value="${password}"></property>
	</bean>
	<!-- 在SpringIOC 容器中创建Mybatis的核心类SqlSessionFactory -->
	<!-- 配置数据源   org.apache.ibatis.session.SqlSessionFactory -->
	<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
		<!-- 加载mybatis配置文件 config.xml
			以前是在config.xml文件中配置数据库信息以及映射文件
			现在Spring 整合Mybatis之后就把这些配置信息的控制权交给了Spring 
			不需要再在config.xml文件中配置了 也就不需要引入config.xml文件了
		<property name="configLocation" value="classpath:config.xml"></property>
		 -->
		<property name="dataSource" ref以上是关于spring框架学习:Spring整合Web项目整合Mybatis的主要内容,如果未能解决你的问题,请参考以下文章

Spring:概述,IOC(Bean管理),整合Web项目,整合JUnit单元测试

spring学习 ———— 整合web项目(SSH)

SSH框架整(12)

SSM(Spring+SpringMVC+MyBatis)高并发优化思路

SSM框架的整合

maven web项目中整合ssm框架(连接Mysql数据库)