Mybatis的学习 2. MyBatis-Spring

2016-04-11 | 阅读

Mybatis

MyBatis是一个支持普通SQL查询,存储过程和高级映射的优秀的持久化框架,MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及对结果集的检索封装.MyBatis可以使用简单的XML或注解用于配置和原始映射,将接口和Java的POJO映射成数据库中的记录.中文文档

MyBatis-Spring的学习

MyBatis-Spring会将MyBatis代码无缝整合到spring中,

要在Spring中创建好Mybatis,至少要有 SqlSessionFactoryBean和一个mapper class .

定义一个SqlSessionFactoryBean:

<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
	<property name="dataSource" ref="dataSource"/>
</bean>

然后去设置mapper,我们使用MapperScannerConfigurer,它想Spring的静态搜索器一样工作,会为在classpath中搜索我们的mapper class,然后向MyBatis注册这些mapper类.定义这个属性,并告诉它去哪个包路径去搜索mapper.

<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
	<property name="basePackage" value="com.helloworld.testssm.mapper"/>
</bean>

然后就可以简单的使用了.

使用MyBatis-Spring,主要的原因是,它允许MyBatis 参与到Spring的事务管理中.如设置一个事务管理的DataSourceTransactionManager:

<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource" ref="dataSource" />
</bean>

MyBatis的SqlSession提供指定的方法来处理编程式的事务,当使用MyBatis-Spring时,bean将使用Spring管理SqlSession或映射器注入.不能再SPring管理的SqlSession上调用Sqlsession.commit()等方法,这样做会抛出UnsupportedOperationException异常

一般配置文件示例

<?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:context="http://www.springframework.org/schema/context"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
                        http://www.springframework.org/schema/beans/spring-beans-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/mvc
                        http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd">
    <!-- 自动扫描 -->
    <context:component-scan base-package="com.lxm.ssm" />
    <!-- 引入配置文件 -->
    <bean id="propertyConfigurer"
          class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
        <property name="location" value="classpath:jdbc.properties" />
    </bean>

    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
          destroy-method="close">
        <property name="driverClassName" value="${driver}" />
        <property name="url" value="${url}" />
        <property name="username" value="${username}" />
        <property name="password" value="${password}" />
        <!-- 初始化连接大小 -->
        <property name="initialSize" value="${initialSize}"></property>
        <!-- 连接池最大数量 -->
        <property name="maxActive" value="${maxActive}"></property>
        <!-- 连接池最大空闲 -->
        <property name="maxIdle" value="${maxIdle}"></property>
        <!-- 连接池最小空闲 -->
        <property name="minIdle" value="${minIdle}"></property>
        <!-- 获取连接最大等待时间 -->
        <property name="maxWait" value="${maxWait}"></property>
    </bean>

    <!-- spring和MyBatis完美整合,不需要mybatis的配置映射文件 -->
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="dataSource" />
        <!-- 自动扫描mapping.xml文件 -->
        <property name="mapperLocations" value="classpath*:com/lxm/ssm/mapping/*.xml"></property>
    </bean>

    <!-- DAO接口所在包名,Spring会自动查找其下的类 -->
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <property name="basePackage" value="com.lxm.ssm.dao,com.lxm.ssm.mapping" />
        <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"></property>
    </bean>

    <!-- (事务管理)transaction manager, use JtaTransactionManager for global tx -->
    <bean id="transactionManager"
          class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource" />
    </bean>

</beans>

这里要注意的是XML文件的放置

在IDEA中,资源文件要严格放在Resources目录下,如果将XMl文件也就是这里的mapper.XML文件放在了Sources下,就会被编译,而项目运行时就无法读取到XML文件中的内容,就会爆出错误:

ibatis.binding.BindingException: Invalid bound statement (not found):

解决方法,可以将mapper.xml文件放会Resources目录下,也可以直接在Maven的pom.xml上配置,加载这些放错了位置的资源文件.在build标签下,添加:

<resources>
          <resource>
              <directory>src/main/java</directory>
              <includes>
                  <include>**/*.properties</include>
                  <include>**/*.xml</include>
              </includes>
              <filtering>false</filtering>
          </resource>
      </resources>

MyBatis中常用方法的使用学习

	// 使用Example
    UserExample example = new UserExample();
    UserExample.Criteria criteria = example.createCriteria();
    criteria.andEmailEqualTo(Email);
    List<User> list = this.userMapper.selectByExample(example);