学完ssm后,需要把三大框架整合起来,下面我们就来看一下。
第一步:搭建环境:
将所需要的jar包导入,jar包包括:
1.Mybatis核心和Mybatis依赖包
2.Mybatis和spring整合包
3.Spring的jar(包括springmvc的jar包)
4.数据库驱动包
5.第三方数据库连接池
由于jar包比较多,不一一解释。需要的可以留下你的邮箱,我可以发给你。
第二步:创建配置文件:
按照我的习惯,在和src目录同级的地方创建一个config文件夹,里面存放所有的配置文件,在这个文件夹中,我们基于框架分成,spring的配置和mybatis的配置。
在mybatis中,我们需要创建mybatis全局配置文件——SqlMapCoonfig配置文件:主要为了加载我们的映射文件。
在spring中,我们需要创建applicationContext.xml——spring配置文件(配置公用内容:数据源、事务)
springmvc.xml———-springmvc的全局配置文件
applicationContext- dao.xml—spring和mybatis整合的配置(SqlSessionFactory、mapper配置)
applicationContext-service.xml—配置业务接口
还有db.properties——数据库连接参数
log4j.properties—日志 配置文件
第三步:创建我们的工程结构
创建我们的包:
com.my.ssm.action:Action层
com.my.ssm.dao.mapper:(此处用不到,是用动态代理方法时候用到的)
com.my.ssm.test:做测试用到
com.my.ssm.dao:里面存放原始的dao和daoImpl。(建议大家讲接口和实现类分开)
com.my.ssm.po:存放bean
com.my.ssm.service:业务层。
第四步:填写配置文件:
首先我们看一下整合步骤:
整合步骤:
1、整合持久层
Mybatis和spring整合
整合目标:mapper创建由spring来管理
SqlSessionFactory由spring管理(设置单例 )
2、整合业务层
Spring管理service
整合目标:Service通过spring调用mapper
3、整合控制层
因为springmvc是spring一个模块,只要加入jar包,配置springmvc.xml和web.xml即可。
整合目标:action中通过spring调用service
先来看整合持久层:
我们整合持久层的目标是什么?就是让spring来管理mapper的创建。
这里我们讲两种方法:
1.通过spring开发原始的dao:
首先在applicastion中配置我们的数据源:
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-3.1.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.1.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.1.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-3.1.xsd ">
<context:property-placeholder location="classpath:db.properties" />
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
destroy-method="close">
<property name="driverClassName" value="${jdbc.driver}" />
<property name="url" value="${jdbc.url}" />
<property name="username" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
<property name="maxActive" value="${jdbc.maxActive}" />
<property name="maxIdle" value="${jdbc.maxIdle}" />
bean>
beans>
配置完数据源以后,谁用呢。肯定是操作数据库地方会用到,所以在com.my.ssm.dao.old下创建UserDao和UserDaoImpl。
UserDao:
/**
* Dao接口
* @author user
*
*/
public interface UserDao {
public User findUserById(int id) throws Exception;
}
UserDaoImpl:
/**
* UserDaoImpl
* @author user
*
*/
public class UserDaoImpl extends SqlSessionDaoSupport implements UserDao {
@Override
public User findUserById(int id) throws Exception {
//SqlSession
SqlSession sqlSession = this.getSqlSession();
return sqlSession.selectOne("test.findUserById", id);
}
}
这里为什么要继承SqlSessionDaoSupport 呢,因为我们之前学mybatis中说过,SqlSessionDaoSupport 中可以获取SqlSession。所以我们要继承SqlSessionDaoSupport,这样就可以操作数据库了。
可以获取SqlSession,但是获取SqlSession需要在SqlSessionFactory中获取,所以在我们的applicationContext-dao.xml中需要配置SqlSessionFactory:
还要配置UserDao的sqlSessionFactory属性(从SqlSessionDaoSupport 继承而来):
applicationContext-dao.xml:
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-3.1.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.1.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.1.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-3.1.xsd ">
<bean id="sqlSessionFactoryBean" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="configLocation" value="classpath:mybatis/SqlMapConfig.xml"/>
bean>
<bean id="userDao" class="com.my.ssm.dao.old.UserDaoImpl">
<property name="sqlSessionFactory" ref="sqlSessionFactoryBean"/>
bean>
beans>
再来看UserDaoImpl的返回值,
return sqlSession.selectOne("test.findUserById", id);
test.findUserById是nameSpace+id拼接出来的,id是参数,所以我们还要在mapper中配置sql语句:
<mapper namespace="test">
-->
<select id="findUserById" parameterType="int" resultType="com.my.ssm.po.User">
SELECT * FROM user1 WHERE id = #{id}
select>
mapper>
那这个mapper在哪加载呢,肯定实在SqlMapConfig中加载:
<configuration>
<mappers>
<mapper resource="sqlmap/User.xml"/>
mappers>
configuration>
这样就配置完了,下面我们做一个测试:
/**
* 测试类
* @author user
*
*/
public class DaoTest {
private ApplicationContext applicationContext;
public void test() throws Exception {
applicationContext = new ClassPathXmlApplicationContext(new String[] {
"spring/applicationContext.xml",
"spring/applicationContext-dao.xml"
});
UserDao userDao = (UserDao) applicationContext.getBean("userDao");
User user = userDao.findUserById(1);
System.out.println(user.toString());
}
public static void main(String[] args) throws Exception {
DaoTest test = new DaoTest();
test.test();
}
}
2.动态代理方法
在我们的com.my.ssm.dao.mapper下创建mapper接口和mapper类:
UserMapper.xml:
<mapper namespace="com.my.ssm.dao.mapper.UserMapper">
<select id="findUserById" parameterType="int" resultType="com.my.ssm.po.User" >
SELECT * FROM user1 WHERE id = #{id}
select>
说明:
1.这里注意namespace命名空间的特殊作用:是mapper接口的地址,就是为了mapper接口能够找到mapper.xml。
2.注意select 的id,应该和mapper中的接口方法名字一致,parameterType和接口方法的参数一致,resultType和接口方法的返回值一致。
这样接口方法才会找到并且执行。
然后在我们的applicationContext-dao.xml中配置mapper动态代理
<bean id="userMapper" class="org.mybatis.spring.mapper.MapperFactoryBean">
<property name="sqlSessionFactory" ref="sqlSessionFactoryBean"/>
<property name="mapperInterface" value="com.my.ssm.dao.mapper.UserMapper"/>
bean>
说明:
1.bean的calss是用于用于生成 代理对象,需要配置两个参数:第一个是会话工厂,第二个是mapper接口。
最后在我们的sqlMapConfig.xml中包含该xml即可
但是这样配置,如果我们有n个mapper接口,需要配置n次的动态代理,所以我们要把他升级一下。
也就是我们的批量扫描:
在applicationContext.xml中配置如下:
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactoryBean"/>
<property name="basePackage" value="com.my.ssm.dao.mapper"/>
bean>
获取时候bean的id就是mapper类名的小写。
这样配置了,我们也可以把sqlMapConfig的
省略即可。
这样我们的持久层的 spring和mybatis整合就结束了