spring框架学习:Spring整合Web项目整合Mybatis
Posted Johnny*
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了spring框架学习:Spring整合Web项目整合Mybatis相关的知识,希望对你有一定的参考价值。
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
- 按功能结构
学生相关配置 applicationContextStudent.xml
班级相关配置 applicationContextClass.xml
那么如何合并、加载多个配置文件呢?有以下三种方式:
- 在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>
- 在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 整合步骤
- 整合需要的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
- 建立类和表
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表
- 通过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);
}
}
- 配置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单元测试