问题

手动编写映射器实现存在的问题:
    1.SqlSession.selectList()等方法需要采用字符串来指定映射项

    2.SqlSession.getMapper()方法需要在每次调用时都实现一次映射器接口

能不能在ioc容器中始终存在一个映射器接口的实现呢?

解决方案

配置文件

<?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
">
    <!-- 使用dbcp数据源 -->
    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
        <property name="driverClassName" value="com.mysql.jdbc.Driver" />
        <property name="url" value="jdbc:mysql://mysql.1zyan.cc:3306/smbms?useUnicode=true&amp;characterEncoding=utf-8" />
        <property name="username" value="yizhiyan" />
        <property name="password" value="464312406" />
    </bean>
    <!-- 配置数据库操作 -->
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <!-- 引用数据源 -->
        <property name="dataSource" ref="dataSource" />
        <!-- 将mybatis配置文件引入 -->
        <property name="configLocation" value="classpath:mybatis-config.xml"/>
    </bean>
    <!-- dao -->
    <bean id="userMapperImpl" class="org.mybatis.spring.mapper.MapperFactoryBean">
        <property name="mapperInterface" value="cn.smbms.dao.UserMapper" />
        <property name="sqlSessionFactory" ref="sqlSessionFactory"/>
    </bean>
</beans>

测试方法:

    @Test
    public void ts1(){
        ApplicationContext ctx=new ClassPathXmlApplicationContext("ApplicationContext.xml");
        UserMapper um=(UserMapper)ctx.getBean("userMapperImpl");
        List<User> userList=um.getUserListByName("李");
        for (User user : userList) {
            System.out.println(user.getId()+"."+user.getUserName());
        }
    }


这样就不需要UserMapperImpl这个类了。博主在这里踩了个坑,那就是死坑那个UserMapperImpl。在上一篇文章中可以看到博主是使用UserMapperImpl来获取实例的,在我改了时候没注意把测试方法getBean的类型强制设置为UserMapperImpl然后把bean节点里面的mapperinterface也强制设置成立UserMapperImpl导致报错。所以注意了在使用映射器的时候就没有中间的UserMapperImpl了直接写dao的接口就可以了。一定注意!!!

那好问题又来了,如果有多个dao呢?这样写岂不是要写很多个MapperFactoryBean?

经过修改后的配置文件如下

<?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
">
    <!-- 使用dbcp数据源 -->
    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
        <property name="driverClassName" value="com.mysql.jdbc.Driver" />
        <property name="url" value="jdbc:mysql://mysql.1zyan.cc:3306/smbms?useUnicode=true&amp;characterEncoding=utf-8" />
        <property name="username" value="yizhiyan" />
        <property name="password" value="464312406" />
    </bean>
    <!-- 配置数据库操作 -->
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <!-- 引用数据源 -->
        <property name="dataSource" ref="dataSource" />
        <!-- 将mybatis配置文件引入 -->
        <property name="configLocation" value="classpath:mybatis-config.xml"/>
    </bean>
    <!-- 通过dao批量映射 -->
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <!-- 会自动创建一个MapperFactoryBean节点 id就是接口名首字母小写,如UserMapper接口的id就是userMapper -->
        <property name="basePackage" value="cn.smbms.dao" />
    </bean>
</beans>


标签: spring, MyBatis

添加新评论