天津做手机网站建设,00908网络营销与策划,优秀商业空间设计案例分析,无极招聘信息网入门
安装
在pom.xml中导入mybatis-spring.jar包
快速入门
要把spring和mybatis一起使用#xff0c;需要定义两样东西#xff1a;SqlsessionFactory 和 至少一个数据库映射器类。
SqlSessionFactoryBean 是用于创建 SqlSessionFactory 的#xff0c;需要一个Datasource…入门
安装
在pom.xml中导入mybatis-spring.jar包
快速入门
要把spring和mybatis一起使用需要定义两样东西SqlsessionFactory 和 至少一个数据库映射器类。
SqlSessionFactoryBean 是用于创建 SqlSessionFactory 的需要一个Datasource参数。
!-- spring-config.xml --
bean idsqlSessionFactory classorg.mybatis.spring.SqlSessionFactoryBeanproperty namedataSource refdataSource /
/bean假如定义了一个如下的mapper接口
public interface UserMapper {Select(SELECT * FROM users WHERE id #{userId})User getUser(Param(userId) String userId);
}可以使用MapperFactoryBean把接口加入到Spring中
bean iduserMapper classorg.mybatis.spring.mapper.MapperFactoryBeanproperty namemapperInterface valueorg.mybatis.spring.sample.mapper.UserMapper /property namesqlSessionFactory refsqlSessionFactory /
/bean注意所指定的映射器类必须是一个接口,而不是具体的实现类。上面例子用的是注解也可以用xml配置的形式。 一旦配置好可以用相同的方式直接注入映射器到 business/service 对象中。MapperFactoryBean 处理 SqlSession 的创建和关闭它。如果使用 了 Spring 的事务,那么当事务完成时,session 将会提交或回滚。最终,任何异常都会被翻 译成 Spring 的 DataAccessException 异常。
最后调用Mybatis数据方法只需一行代码
public class FooServiceImpl implements FooService {private UserMapper userMapper;public void setUserMapper(UserMapper userMapper) {this.userMapper userMapper;
}public User doSomeBusinessStuff(String userId) {return this.userMapper.getUser(userId);
}SqlSessionFactoryBean
要创建工厂 bean,放置下面的代码在 Spring 的 XML 配置文件中
bean idsqlSessionFactory classorg.mybatis.spring.SqlSessionFactoryBeanproperty namedataSource refdataSource /property namemapperLocations valueclasspath*:sample/config/mappers/**/*.xml /
/bean属性
SqlSessionFactory 有一个单独的必须属性— JDBC 的 DataSource。
一个通用的属性是 configLocation,它是用来指定 MyBatis 的 XML 配置文件路径的。 如果基本的 MyBatis 配置需要改变, 那么这就是一个需要配置文件的地方。
和spring结合的mybatis配置文件不需要一个完整的 MyBatis 配置。任意环境,数据源 和 MyBatis 的事务管理器都会被忽略。SqlSessionFactoryBean 会创建它自己的 sqlSessionFactory。
另一个需要配置文件的地方是mybatis映射器xml文件和映射器类不在同一路径。有两个选择第一是手动在 MyBatis 的 XML 配 置文件中使用部分来指定类路径。第二是使用工厂 bean 的 mapperLocations 属 性。
mapperLocations 属性使用一个资源位置的 list。
bean idsqlSessionFactory classorg.mybatis.spring.SqlSessionFactoryBeanproperty namedataSource refdataSource /property namemapperLocations valueclasspath*:sample/config/mappers/**/*.xml /
/bean这会从类路径下加载在 sample.config.mappers 包和它的子包中所有的 映射器 文件。
从1.3.0后configuration 属性加入。它规定不用xml配置文件直接插入configuration标签。
bean idsqlSessionFactory classorg.mybatis.spring.SqlSessionFactoryBeanproperty namedataSource refdataSource /property nameconfigurationbean classorg.apache.ibatis.session.Configurationproperty namemapUnderscoreToCamelCase valuetrue//bean/property
/bean事务
一个使用 MyBatis-Spring 的主要原因是它允许 MyBatis 参与到 Spring 的事务管理中。MyBatis-Spring 利用了存在于 Spring 中的 DataSourceTransactionManager。
可以通过配置Spring的PlatformTransaction来配置自己的事务。
在事务处理期间,一个单独的 SqlSession 对象将被创建和使用。当事务完成时,这个 session 会以合适的方式提交或回滚。
标准配置
开启Spring事务处理 创建一个 DataSourceTransactionManager 对象。
bean idtransactionManager classorg.springframework.jdbc.datasource.DataSourceTransactionManagerproperty namedataSource refdataSource /
/bean要注意, 为事务管理器指定的 DataSource 必须和用来创建 SqlSessionFactoryBean 的 是同一个数据源,否则事务管理器就无法工作了。 容器管理事务
如果你想让 Spring 参与到容器管理事务CMT中,那么 Spring 应该使用 JtaTransactionManager 或它的容 器指定的子类来配置
tx:jta-transaction-manager /如果你想使用CMT , 而不想使用Spring的事务管理。 必须配置SQLSessionFactory来使用MyBatis 的 ManagedTransactionFactory 。
bean idsqlSessionFactory classorg.mybatis.spring.SqlSessionFactoryBeanproperty namedataSource refdataSource /property nametransactionFactorybean classorg.apache.ibatis.transaction.managed.ManagedTransactionFactory //property
/bean编程式事务管理
你 不 能 在 Spring 管 理 的 SqlSession 上 调 用 SqlSession.commit() , SqlSession.rollback() 或 SqlSession.close() 方 法 。 如 果 这 样 做 了 , 就 会 抛 出 UnsupportedOperationException 异常。注意在使用注入的映射器时不能访问那些方法。
如果你想编程式地控制事务这段代码展示了使用 PlatformTransactionManager 来处理事务
DefaultTransactionDefinition def new DefaultTransactionDefinition();
def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);TransactionStatus status txManager.getTransaction(def);
try {userMapper.insertUser(user);
}
catch (MyException ex) {txManager.rollback(status);throw ex;
}
txManager.commit(status);使用SQLSession
在 MyBatis 中,你可以使用 SqlSessionFactory 来创建 SqlSession。一旦你获得一个 session 之后,你可以使用它来执行映射语句,提交或回滚连接,最后,当不再需要它的时 候, 你可以关闭 session。 使用 MyBatis-Spring 之后, 你不再需要直接使用 SqlSessionFactory 了,因为你的 bean 可以通过一个线程安全的 SqlSession 来注入,基于 Spring 的事务配置 来自动提交,回滚,关闭 session。
SqlSessionTemplate
SqlSessionTemplate 是 MyBatis-Spring 的核心。 这个类负责管理 MyBatis 的 SqlSession, 调用 MyBatis 的 SQL 方法, 翻译异常。 SqlSessionTemplate 是线程安全的, 可以被多个 DAO 所共享使用。它管理 session 的生命 周期,包含必要的关闭,提交或回滚操作。
SqlSessionTemplate 实现了 SqlSession 接口在代码中无需对 MyBatis 的 SqlSession 替换。SqlSessionTemplate 通常是被用来替代默认的 MyBatis 实现的 DefaultSqlSession。
SqlSessionTemplate 对象可以使用 SqlSessionFactory 作为构造方法的参数来创建。
bean idsqlSession classorg.mybatis.spring.SqlSessionTemplateconstructor-arg index0 refsqlSessionFactory /
/bean1、这个 bean 现在可以直接注入到 DAO bean 中。你需要在 bean 中添加一个 SqlSession 属性。
public class UserDaoImpl implements UserDao {private SqlSession sqlSession;public void setSqlSession(SqlSession sqlSession) {this.sqlSession sqlSession;}public User getUser(String userId) {return (User) sqlSession.selectOne(org.mybatis.spring.sample.mapper.UserMapper.getUser, userId);}
}注入SqlSessionTemplate
bean iduserDao classorg.mybatis.spring.sample.dao.UserDaoImplproperty namesqlSession refsqlSession /
/bean2、SqlSessionTemplate 有一个使用 ExecutorType 作为参数的构造方法。这允许你用来 创建对象。
bean idsqlSession classorg.mybatis.spring.SqlSessionTemplateconstructor-arg index0 refsqlSessionFactory /constructor-arg index1 valueBATCH /
/bean现在你所有语句都可以批量操作。
public void insertUsers(User[] users) {for (User user : users) {sqlSession.insert(org.mybatis.spring.sample.mapper.UserMapper.insertUser, user);}}SqlSessionDaoSupport
SqlSessionDaoSupport 是 一 个 抽象 的支 持 类, 用来 为你 提供 SqlSession 。 调用getSqlSession()方法你会得到一个 SqlSessionTemplate,之后可以用于执行 SQL 方法。
public class UserDaoImpl extends SqlSessionDaoSupport implements UserDao {public User getUser(String userId) {return (User) getSqlSession().selectOne(org.mybatis.spring.sample.mapper.UserMapper.getUser, userId);}
}通常 MapperFactoryBean 是这个类的首选,因为它不需要额外的代码。 但是你要在dao中做其他事情那么这个类就很有用。
SqlSessionDaoSupport 需要一个 sqlSessionFactory 或 sqlSessionTemplate 属性来 设 置 。
假设类 UserMapperImpl 是 SqlSessionDaoSupport 的子类,它可以在 Spring 中进行如 下的配置
bean iduserMapper classorg.mybatis.spring.sample.mapper.UserDaoImplproperty namesqlSessionFactory refsqlSessionFactory /
/bean五 注入映射器
为了代替手工使用 SqlSessionDaoSupport 或 SqlSessionTemplate 编写数据访问对象 (DAO)的代码,MyBatis-Spring 提供了一个动态代理的实现:MapperFactoryBean。这个类 可以让你直接注入数据映射器接口到你的 service 层 bean 中。当使用映射器时,你仅仅如调 用你的 DAO 一样调用它们就可以了,但是你不需要编写任何 DAO 实现的代码,因为 MyBatis-Spring 将会为你创建代理。
使用注入的映射器代码,在 MyBatis,Spring 或 MyBatis-Spring 上面不会有直接的依赖。 MapperFactoryBean 创建的代理控制开放和关闭 session翻译任意的异常到 Spring 的 DataAccessException 异常中。此外,如果需要或参与到一个已经存在活动事务中,代理将 会开启一个新的 Spring 事务。
MapperFactoryBean
加入到Spring
bean iduserMapper classorg.mybatis.spring.mapper.MapperFactoryBeanproperty namemapperInterface valueorg.mybatis.spring.sample.mapper.UserMapper /property namesqlSessionFactory refsqlSessionFactory /
/beanmapperInterface说明 MapperFactoryBean 创建的代理类实现了 UserMapper 接口,并且注入到应用程序中。
如果 XML 文件在类路径的 位置和映射器类相同时, 它会被 MapperFactoryBean 自动解析。不需要再mybatis的配置文件中指定映射器路径除非在不同目录。
可以直接在 business/service 对象中以注入Spring bean 的方式直接注入映 射器:
bean idfooService classorg.mybatis.spring.sample.mapper.FooServiceImplproperty nameuserMapper refuserMapper /
/bean这个 bean 可以直接在应用程序逻辑中使用:
public class FooServiceImpl implements FooService {private UserMapper userMapper;public void setUserMapper(UserMapper userMapper) {this.userMapper userMapper;}public User doSomeBusinessStuff(String userId) {return this.userMapper.getUser(userId);}
}注意上面没有Session的引用打开或 关闭 session 的代码,MyBatis-Spring 会来关心它的。
MapperScannerConfigurer
没有必要在 Spring 的 XML 配置文件中注册所有的映射器。相反,你可以使用一个 MapperScannerConfigurer , 它 将 会 查 找 类 路 径 下 的 映 射 器 并 自 动 将 它 们 创 建 成 MapperFactoryBean。
创建 MapperScannerConfigurer
bean classorg.mybatis.spring.mapper.MapperScannerConfigurerproperty namebasePackage valueorg.mybatis.spring.sample.mapper /
/beanbasePackage 属性是让你为映射器接口文件设置基本的包路径。 可以使用分号或逗号 作为分隔符设置多于一个的包路径。每个映射器将会在指定的包路径中递归地被搜索到。
注 意 , 没有必要去指定 SqlSessionFactory 或 SqlSessionTemplate , 因 为 MapperScannerConfigurer 将会创建 MapperFactoryBean,之后自动装配。但是,如果你使 用了一个 以上的 DataSource ,那 么自动 装配可 能会失效。 这种 情况下 ,你可 以使用 sqlSessionFactoryBeanName 或 sqlSessionTemplateBeanName 属性来设置正确的 bean 名 称来使用。
bean 的名称是必须的,而不是 bean 的引用,因 此,value 属性在这里替代通常的 ref:
property namesqlSessionFactoryBeanName valuesqlSessionFactory /六 使用Mybatis API
使用 MyBatis-Spring,你可以继续直接使用 MyBatis 的 API。仅仅在代码中使用 Spring 中 的 SqlSessionFactoryBean 来创建一个 SqlSessionFactory。
public class UserMapperSqlSessionImpl implements UserMapper {// SqlSessionFactory would normally be set by SqlSessionDaoSupportprivate SqlSessionFactory sqlSessionFactory;public void setSqlSessionFactory(SqlSessionFactory sqlSessionFactory) {this.sqlSessionFactory sqlSessionFactory;}public User getUser(String userId) {// note standard MyBatis API usage - opening and closing the session manuallySqlSession session sqlSessionFactory.openSession();try {return (User) session.selectOne(org.mybatis.spring.sample.mapper.UserMapper.getUser, userId);} finally {session.close();}}
}小心使用此选项, 因为错误的使用会产生运行时错误, 或者更糟糕的数据一致性的问题。 这些是告诫: 1.它不会参与到 Spring 的事务之中。 2.如果 SqlSession 使用 DataSource,它也会被 Spring 事务管理器使用,而且当前 有事务在进行时,这段代码会抛出异常。 3.MyBatis 的 DefaultSqlSession 是线程不安全的。如果在 bean 中注入了它,就会 发生错误。 使用 DefaultSqlSession 创建的映射器也不是线程安全的。如果你将它们注入到 bean 中,是会发生错误的。 4.你必须保证在 finally 块中来关闭 SqlSession。 实例代码
https://github.com/mybatis/spring/tree/master/src/test/java/org/mybatis/spring/sample
Spring单元测试
https://blog.csdn.net/u013041642/article/details/71430293
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;import com.zx.dao.UserDao;
import com.zx.domain.User;
import com.zx.mapper.UserMapper;/*** Example of MyBatis-Spring batch integration usage.*/
RunWith(SpringJUnit4ClassRunner.class)
ContextConfiguration(locationsclasspath:application-base.xml)
public class UserDaoTest{Autowiredprotected UserDao userDao;Autowiredprotected UserMapper userMapper;Testpublic void testSelect() {User user this.userMapper.selectOne(1);System.out.println(user);}
}