SSM整合——持久层的整合(spring和mybatis的整合)

学完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—日志 配置文件
SSM整合——持久层的整合(spring和mybatis的整合)_第1张图片
第三步:创建我们的工程结构
创建我们的包:
SSM整合——持久层的整合(spring和mybatis的整合)_第2张图片
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整合就结束了

你可能感兴趣的:(SSM)