1.MapperFactoryBean 生成 mapper代理的方式
在mybatis-spring.xml添加一个bean
MapperFactoryBean是mapper接口生成代理 ,此方法配置mapper的话,有几个mapper.xml就得写几个bean标签,比较麻烦。
在mybatis-spring.xml <beans></beans> 中增加下面代码
<bean id="ordersMapper" class="org.mybatis.spring.mapper.MapperFactoryBean">
<!-- mapperInterface是mybatis-spring.jar 中 MapperFactoryBean类中 的mapperInterface接口属性 -->
<property name="mapperInterface" value="com.shao.ssm.mapper.OrdersMapper"/>
<property name="sqlSessionFactory" ref="sqlSessionFactory" />
<!-- 是为了自动注入SqlSessionFactory ,ref="sqlSessionFactory 是引用了上面配置的sqlSessionFactoryBean 的id"-->
</bean>
- id=”ordersMapper” 意味 定义了此mapper接口生成代理 的id为‘ordersMapper’ ,在service类中调用时需要通过id来获取该bean。
mapperInterface 是org.mybatis.spring.mapper.MapperFactoryBean.java 类中的一个mapper类型的接口属性,赋予它的value是某个mapper.java的权限定名。
name = “sqlSessionFactory” 中sqlSessionFactory是org.mybatis.spring.mapper.MapperFactoryBean.java 类中的一个属性, 他的 ref=”sqlSessionFactory” 是参照绑定了org.mybatis.spring.SqlSessionFactoryBean 配置bean的id名称, 其也是在此文件中定义的 如下<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <!-- 加载mybatis的配置文件 --> <property name="configLocation" value="mybatis/SqlMapConfig.xml" /> <!-- 关联上边配置的dataSource --> <property name="dataSource" ref="dataSource" /> </bean>
mapper.java
public List findOrdersAndUser() throws Exception ;
mapper.xml
<!-- 使用resultType 一对一映射 -->
<select id="findOrdersAndUser" resultType="OrderCustom">
SELECT
a.*,b.name,b.sex
FROM orders a,user b
WHERE a.`id`=b.`id` ;
</select>
这里写代码片
- 1
测试
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.shao.ssm.pojo.OrderCustom;
public class OrdersMapperTest {
private ApplicationContext applicationContext ;
@Before
public void setUp() throws Exception {
applicationContext = new ClassPathXmlApplicationContext("classpath:spring/applicationContext.xml");
}
@Test
public void testFindOrdersAndUser() throws Exception {
OrdersMapper orderMapper = (OrdersMapper) applicationContext.getBean("ordersMapper") ;
//从容器里getBean 括号里边与 Mybatis-spring配置文件中的bean id 一致
List<OrderCustom> orderCustomList = orderMapper.findOrdersAndUser() ;
for(int i = 0 ; i<orderCustomList.size();i++)
System.out.println(orderCustomList.get(i).getName());
}
2.MapperScannerConfigurer批量扫描自动创建代理对象并在Spring容器中注册的方式。
在mybatis-spring.xml添加一个bean
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.shao.ssm.mapper" />
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
<!-- 是为了自动注入SqlSessionFactory ,ref="sqlSessionFactory 是引用了上面配置的sqlSessionFactoryBean 的id"-->
</bean>
basePackage和 sqlSessionFactoryBeanName 都是 MapperScannerConfigurer类中的属性
basePackage 的value 指定mapper 所在的包的包名。
sqlSessionFactoryBeanName 的value 指定sqlSessionFactory 也是 参照SqlSessionFactoryBean 的配置信息id。
注意一下几点:
1. mapper批量扫描,从mapper包中扫描出mapper接口,自动创建代理对象并且在spring容器中注册
2. 遵循的规范:将mapper.java和mapper.xml映射文件名称保持一致,并且在一个目录中
3. 如果在此配置了批量扫描,SqlMapConfig类中的mapper 中可以不配置 package批量扫描
4. MapperScannerConfigurer这不同于MapperFactoryBean有id 它的id为每个mapper接口的类名,且首字母为小写
5. 指定扫描多个包,每个包中间使用半角逗号分隔
mapper.java
同上MapperFactoryBean 生成 mapper代理的方式。
mapper.xml
同上MapperFactoryBean 生成 mapper代理的方式。
测试
同上MapperFactoryBean 生成 mapper代理的方式 。