美文网首页
三、注入映射器实现

三、注入映射器实现

作者: lifeline张 | 来源:发表于2018-08-31 10:11 被阅读0次

    一、本课目标

    能够以配置的方式生成映射器的实现:

    • 掌握MapperFactoryBean的配置
    • 掌握MapperScannerConfigurer的配置

    二、注入映射器

    2.1为什么需要注入映射器的实现

    手动编写映射器实现存在的问题

    • SqlSession.selectList()等方法需要采用字符串来指定映射项。字符串出错的话则只能在运行的时候才能发现。
    • SqlSession.getMapper()方法需要在每次调用时都实现一次映射器接口。

    那能否在IOC容器中始终存在一个映射器接口的实现呢?

    2.2注入映射器的实现

    采用数据映射(MapperFactoryBean)的方式完成对数据库操作。

    • 根据Mapper接口湖区Mapper对象,它封装了原有的SqlSession.getMapper()功能的实现。


      image.png

    配置文件:

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
        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.2.xsd
        http://www.springframework.org/schema/aop
        http://www.springframework.org/schema/aop/spring-aop-3.2.xsd
        http://www.springframework.org/schema/tx
        http://www.springframework.org/schema/tx/spring-tx-3.2.xsd">
        
        <!-- 配置数据源 -->
        <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
            <property name="driverClassName" value="com.mysql.jdbc.Driver"></property>
            <property name="url" value="jdbc:mysql://127.0.0.1:3306/smbms?
                            useUnicode=true&amp;characterEncoding=utf-8"></property>
            <property name="username" value="root"></property>
            <property name="password" value="41312019"></property>
        </bean>
        <!-- 配置SqlSessionFactoryBean -->
        <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
            <property name="dataSource" ref="dataSource"></property>
            <property name="configLocation" value="classpath:mybatis-config.xml"></property>
            <property name="mapperLocations">
                <list>
                    <value>classpath:cn/smbms/dao/**/*.xml</value>
                </list>
            </property>
        </bean>
    
        <!-- 配置SqlSessionTemplate -->
        <!-- <bean id="sqlSessionTemplate" class="org.mybatis.spring.SqlSessionTemplate">
            <constructor-arg name="sqlSessionFactory" ref="sqlSessionFactory"></constructor-arg>
        </bean> -->
        
        <bean id="userMapper" class="org.mybatis.spring.mapper.MapperFactoryBean">
            <property name="mapperInterface" value="cn.smbms.dao.user.UserMapper"></property>
            <property name="sqlSessionFactory" ref="sqlSessionFactory"></property>
        </bean>
        
        <bean id="userService" class="cn.smbms.service.user.UserServiceImpl">
            <property name="userMapper" ref="userMapper"></property>
        </bean>
    </beans>
    

    当配置文件这么写的时候,就可以把UserMapperImpl文件直接删除掉了,不需要使用这个文件的实现类去获取sqlSession以及调用sqlSession的getMapper方法去获取数据了。

    2.3注入映射器的实现2

    如果映射器很多的话,相应的配置项也会很多,如何简化配置工作量?
    MapperScannerConfigurer

    • 自动扫描指定包下面的Mapper接口,并将它们直接注册为MapperFactoryBean。
    • 这个类注册的配置文件中是没有id的,他会把相应的mapper类的首字母小写作为相应的mapper的bean的名字。


      image.png

      此时配置文件如下:

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
        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.2.xsd
        http://www.springframework.org/schema/aop
        http://www.springframework.org/schema/aop/spring-aop-3.2.xsd
        http://www.springframework.org/schema/tx
        http://www.springframework.org/schema/tx/spring-tx-3.2.xsd">
        
        <!-- 配置数据源 -->
        <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
            <property name="driverClassName" value="com.mysql.jdbc.Driver"></property>
            <property name="url" value="jdbc:mysql://127.0.0.1:3306/smbms?
                            useUnicode=true&amp;characterEncoding=utf-8"></property>
            <property name="username" value="root"></property>
            <property name="password" value="41312019"></property>
        </bean>
        <!-- 配置SqlSessionFactoryBean -->
        <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
            <property name="dataSource" ref="dataSource"></property>
            <property name="configLocation" value="classpath:mybatis-config.xml"></property>
            <property name="mapperLocations">
                <list>
                    <value>classpath:cn/smbms/dao/**/*.xml</value>
                </list>
            </property>
        </bean>
    
        <!-- 配置SqlSessionTemplate -->
        <!-- <bean id="sqlSessionTemplate" class="org.mybatis.spring.SqlSessionTemplate">
            <constructor-arg name="sqlSessionFactory" ref="sqlSessionFactory"></constructor-arg>
        </bean> -->
        
        <!-- <bean id="userMapper" class="org.mybatis.spring.mapper.MapperFactoryBean">
            <property name="mapperInterface" value="cn.smbms.dao.user.UserMapper"></property>
            <property name="sqlSessionFactory" ref="sqlSessionFactory"></property>
        </bean> -->
        
        <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
            <property name="basePackage" value="cn.smbms.dao"></property>
        </bean>
        <bean id="userService" class="cn.smbms.service.user.UserServiceImpl">
            <property name="userMapper" ref="userMapper"></property>
        </bean>
    </beans>
    

    运行结果正常。


    image.png

    此时配置文件如下:

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
        xmlns:p="http://www.springframework.org/schema/p"
        xmlns:aop="http://www.springframework.org/schema/aop" 
        xmlns:tx="http://www.springframework.org/schema/tx"
        xmlns:context="http://www.springframework.org/schema/context"
        xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
        http://www.springframework.org/schema/aop
        http://www.springframework.org/schema/aop/spring-aop-3.2.xsd
        http://www.springframework.org/schema/tx
        http://www.springframework.org/schema/tx/spring-tx-3.2.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context-3.2.xsd">
        
        <!-- 配置数据源 -->
        <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
            <property name="driverClassName" value="com.mysql.jdbc.Driver"></property>
            <property name="url" value="jdbc:mysql://127.0.0.1:3306/smbms?
                            useUnicode=true&amp;characterEncoding=utf-8"></property>
            <property name="username" value="root"></property>
            <property name="password" value="41312019"></property>
        </bean>
        <!-- 配置SqlSessionFactoryBean -->
        <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
            <property name="dataSource" ref="dataSource"></property>
            <property name="configLocation" value="classpath:mybatis-config.xml"></property>
            <property name="mapperLocations">
                <list>
                    <value>classpath:cn/smbms/dao/**/*.xml</value>
                </list>
            </property>
        </bean>
    
        <!-- 配置SqlSessionTemplate -->
        <!-- <bean id="sqlSessionTemplate" class="org.mybatis.spring.SqlSessionTemplate">
            <constructor-arg name="sqlSessionFactory" ref="sqlSessionFactory"></constructor-arg>
        </bean> -->
        
        <!-- <bean id="userMapper" class="org.mybatis.spring.mapper.MapperFactoryBean">
            <property name="mapperInterface" value="cn.smbms.dao.user.UserMapper"></property>
            <property name="sqlSessionFactory" ref="sqlSessionFactory"></property>
        </bean> -->
        
        <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
            <property name="basePackage" value="cn.smbms.dao"></property>
        </bean>
        <!-- Service -->
        <context:component-scan base-package="cn.smbms.service.user"></context:component-scan>
        <!-- <bean id="userService" class="cn.smbms.service.user.UserServiceImpl">
            <property name="userMapper" ref="userMapper"></property>
        </bean> -->
    </beans>
    

    增加一个service包,里面放service层:

    package cn.smbms.service.user;
    
    import java.util.List;
    import cn.smbms.pojo.User;
    
    public interface UserService {
        public List<User> findUsersWithConditions(User user);
    }
    

    通过注解给service实现类入参:

    package cn.smbms.service.user;
    
    import java.util.List;
    
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.beans.factory.annotation.Qualifier;
    import org.springframework.stereotype.Service;
    
    import cn.smbms.dao.user.UserMapper;
    import cn.smbms.pojo.User;
    
    @Service("userService")
    public class UserServiceImpl implements UserService {
        @Autowired
        @Qualifier("userMapper")
        private UserMapper userMapper;
    
        @Override
        public List<User> findUsersWithConditions(User user) {
            try {
                return userMapper.getUserList(user);
            } catch (RuntimeException e) {
                e.printStackTrace();
                throw e;
            }
        }
    
        public UserMapper getUserMapper() {
            return userMapper;
        }
    
        public void setUserMapper(UserMapper userMapper) {
            this.userMapper = userMapper;
        }
    
    }
    

    测试代码:

      @Test void testUserService() {
             ApplicationContext ctx = new ClassPathXmlApplicationContext(
                     "applicationContext.xml");
             UserService userService = (UserService) ctx.getBean("userService");
             List<User> userList = new ArrayList<User>();
             User userCondition = new User();
             userCondition.setUserName("赵");
             userCondition.setUserRole(3);
             userList = userService.findUsersWithConditions(userCondition);
    
             for (User userResult : userList) {
                 logger.debug("testGetUserList userCode: "
                         + userResult.getUserCode() + " and userName: "
                         + userResult.getUserName() + " and userRole: "
                         + userResult.getUserRole() + " and userRoleName: "
                         + userResult.getUserRoleName() + " and address: "
                         + userResult.getAddress());
             }
        }
    

    运行结果:


    image.png

    相关文章

      网友评论

          本文标题:三、注入映射器实现

          本文链接:https://www.haomeiwen.com/subject/fhfswftx.html