mybatis 高级映射和spring整合之与Spring整合(6)

mybatis 高级映射和spring整合之mybatis与Spring整合

3.0 mybatis和spring整合(掌握)
    3.1 整合思路
    需求spring通过单例方式管理SqlSessionFactory。
    spring和mybatis整合生成代理对象,使用SqlSessionFactory创建SqlSession。(spring和mybatis整合自动完成)
    持久层的mapper都需要有spring进行管理。 

    3.2 整合环境
    创建一个新的java工程(接近实际开发的工程结构)
    jar包:
    mybatis3.2.7的jar包
    spring3.2.0的jar包
    mybatis和spring的整合包:早期ibatis和spring整合是由spring官方提供的,mybatis和spring整合由mybatis提供。


    3.3 sqlSessionFactory        
        在applicationContext.xml配置sqlSession 和 数据源
        sqlSessionFactory在mybatis 和spring的整合包下
        applicationContext.xml

        <!-- 加载配置文件 -->
        <context:property-placeholder location="classpath:db.properties">
        <!-- 数据源,使用dbcp -->
        <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destory-method="close">
            <property name="driverClassName" value="${jdbc.driver}"/>
            <property name="url" value="${jdbc.driver}"/>
            <property name="username" value="${jdbc.username}"/>
            <property name="password" value="${jdbc.password}"/>
            <property name="maxActive" value="10"/>
            <property name="maxIdle" value="5"/>
        </bean>
        <!-- sqlSessionFactory -->
        <bean id="SqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
            <!-- 加载mybatis的配置文件 -->
            <property name="configLocation" value="mybatis/SqlMapConfig.xml"/>
            <!-- 数据源 -->
            <property name="dataSource" ref="dataSource">
            </property>
        </bean>
    3.4 原始dao开发(和spring整合后) 
        3.4.1 User.xml (mapper映射文件)
        User.xml
        <mapper namespace="test">
            <select id="findUserById" parameterType="int" resultType="com.demo.mybatis.ssm.po.User">
                SELECT * FROM USER WHERE id=#{value}
            </select>
        </mapper>

        在SqlMapconfig.xml中加载User.xml
            <!-- 加载映射文件 -->
            <mapper>
                <mapper resource="sqlmap/User.xml">
        3.4.2 dao(实现类继承SqlSessionDaoSupport)
        public interface UserDao {
            //根据id查询用户信息
            public User findUserById(int id) throws Exception;
        }

        dao接口实现类需要注入SqlSessionFactory,通过spring进行注入。
        这里使用spring的声明配置方式,配置dao的bean


        让UserDaoImpl实现类继承SqlSessionDaoSupport

            UserDaoImpl.java
            public class UserDaoImpl extends SqlSessionDaoSupport implements UserDao{
                //继承 SqlSessionDaoSupport,通过 this.getSqlSession()得到sqlSession
                SqlSession sqlSession = this.getSqlSession)();
                User user = sqlSession.select("test.findUserById",id);
                return user;
            }
        3.4.3 配置dao
        在applicationContext.xml中配置dao。
             applicationContext.xml
            <!-- 原始的dao接口-->
            <bean id="userDao" class="com.demo.ssm.dao.UserDaoImpl">
                <property name="sqlSessionFactory" ref="sqlSessionFactory"/>
            </bean>
        3.4.4 测试程序

            package com.demo.ssm.dao;

            public class UserDaoImplTest{
                //private ApplicationContext applicationContext;
                //在setUp这个方法得到spring容器
                @Before
                public void setUp() throws Exception{
                    applicationContext =  new ClassPathXmlApplicationContext("classpath:spring/applicationContext.xml")
                }

                @Test
                public void testFindUserByID(){
                    UserDao userDao = applicationContext.getBean("userDao");
                    //调用userDao的方法
                    User user = userDao.findUserById(1);
                    System.out.println(user);
                }
            }
        3.5 mapper代理开发
            3.5.1 mapper.xml和mapper.java
            3.5.2 spring通过MapperFactoryBean来创建代理对象
            <!-- mapper配置
                mapperFactoryBean:根据mapper接口生成代理对象
            -->
            <bean id="userMapper" class="org.mybatis.spring.MapperFactoryBean">
                <!-- mapperInterface指定mapper接口 -->
                <property name="mapperInterface" value="com.demo.ssm.mapper.UserMapper"/>
                <property name="sqlSessionFactory" ref="sqlSessionFactory"/>
            </bean>
            此方法问题:
            需要针对每个mapper进行配置,麻烦。
            所以 解决办法3.5.3(屏蔽3.5.2)

            3.5.3 通过MapperScannerConfigurer进行mapper扫描(建议使用)
            <!-- mapper批量扫描,从mapper包中扫描出mapper接口,自动创建代理对象并且在spring容器中注册
            遵循规范:将mapper.java 和 mapper.xml 映射文件名称保持一致,且在一个目录中。
            自动扫描出来的mapper的bean的id为mapper类名(首字母小写)
            -->
            <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
                <!-- 指定扫描的包名
                    如果扫描多个包,每个包中间使用半角逗号分隔 
                -->
                <property name="basePackage" value="com.demo.ssm.mapper"/>
                <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
            </bean>


            3.5.4 测试代码

            @Test
            public void testFindUserByID() throws Exception{
                UserMapper userMapper = (UserMapper) applicationContext.getBean("userBean");
                System.out.println(user);
            }
原文地址:https://www.cnblogs.com/lanzhi/p/6468014.html