根据官方的说法,在ibatis3,也就是Mybatis3问世以前,Spring3的开发工做就已经完成了,因此Spring3中仍是没有对Mybatis3的支持。所以由Mybatis社区本身开发了一个Mybatis-Spring用来知足Mybatis用户整合Spring的需求。下面就将经过Mybatis-Spring来整合Mybatis跟Spring的用法作一个简单的介绍。java
MapperFactoryBean
首先,咱们须要从Mybatis官网上下载Mybatis-Spring的jar包添加到咱们项目的类路径下,固然也须要添加Mybatis的相关jar包和Spring的相关jar包。咱们知道在Mybatis的全部操做都是基于一个SqlSession的,而SqlSession是由SqlSessionFactory来产生的,SqlSessionFactory又是由SqlSessionFactoryBuilder来生成的。可是Mybatis-Spring是基于SqlSessionFactoryBean的。在使用Mybatis-Spring的时候,咱们也须要SqlSession,并且这个SqlSession是内嵌在程序中的,通常不须要咱们直接访问。SqlSession也是由SqlSessionFactory来产生的,可是Mybatis-Spring给咱们封装了一个SqlSessionFactoryBean,在这个bean里面仍是经过SqlSessionFactoryBuilder来创建对应的SqlSessionFactory,进而获取到对应的SqlSession。经过SqlSessionFactoryBean咱们能够经过对其指定一些属性来提供Mybatis的一些配置信息。因此接下来咱们须要在Spring的applicationContext配置文件中定义一个SqlSessionFactoryBean。spring
Xml代码 sql
- <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
- <property name="dataSource" ref="dataSource" />
- <property name="mapperLocations"
- value="classpath:com/tiantian/ckeditor/mybatis/mappers/*Mapper.xml" />
- <property name="typeAliasesPackage" value="com.tiantian.ckeditor.model" />
- </bean>
在定义SqlSessionFactoryBean的时候,dataSource属性是必须指定的,它表示用于链接数据库的数据源。固然,咱们也能够指定一些其余的属性,下面简单列举几个:数据库
- mapperLocations:它表示咱们的Mapper文件存放的位置,当咱们的Mapper文件跟对应的Mapper接口处于同一位置的时候能够不用指定该属性的值。
- configLocation:用于指定Mybatis的配置文件位置。若是指定了该属性,那么会以该配置文件的内容做为配置信息构建对应的SqlSessionFactoryBuilder,可是后续属性指定的内容会覆盖该配置文件里面指定的对应内容。
- typeAliasesPackage:它通常对应咱们的实体类所在的包,这个时候会自动取对应包中不包括包名的简单类名做为包括包名的别名。多个package之间能够用逗号或者分号等来进行分隔。
- typeAliases:数组类型,用来指定别名的。指定了这个属性后,Mybatis会把这个类型的短名称做为这个类型的别名,前提是该类上没有标注@Alias注解,不然将使用该注解对应的值做为此种类型的别名。
Xml代码 apache
- <property name="typeAliases">
- <array>
- <value>com.tiantian.mybatis.model.Blo
- <value>com.tiantian.mybatis.model.Comment</value>
- </array>
- </property>
- plugins:数组类型,用来指定Mybatis的Interceptor。
- typeHandlersPackage:用来指定TypeHandler所在的包,若是指定了该属性,SqlSessionFactoryBean会自动把该包下面的类注册为对应的TypeHandler。多个package之间能够用逗号或者分号等来进行分隔。
- typeHandlers:数组类型,表示TypeHandler。
接下来就是在Spring的applicationContext文件中定义咱们想要的Mapper对象对应的MapperFactoryBean了。经过MapperFactoryBean能够获取到咱们想要的Mapper对象。MapperFactoryBean实现了Spring的FactoryBean接口,因此MapperFactoryBean是经过FactoryBean接口中定义的getObject方法来获取对应的Mapper对象的。在定义一个MapperFactoryBean的时候有两个属性须要咱们注入,一个是Mybatis-Spring用来生成实现了SqlSession接口的SqlSessionTemplate对象的sqlSessionFactory;另外一个就是咱们所要返回的对应的Mapper接口了。编程
定义好相应Mapper接口对应的MapperFactoryBean以后,咱们就能够把咱们对应的Mapper接口注入到由Spring管理的bean对象中了,好比Service bean对象。这样当咱们须要使用到相应的Mapper接口时,MapperFactoryBean会从它的getObject方法中获取对应的Mapper接口,而getObject内部仍是经过咱们注入的属性调用SqlSession接口的getMapper(Mapper接口)方法来返回对应的Mapper接口的。这样就经过把SqlSessionFactory和相应的Mapper接口交给Spring管理实现了Mybatis跟Spring的整合。数组
Spring的applicationContext.xml配置文件:spring-mvc
Xml代码 缓存
- <?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: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.0.xsd
- http://www.springframework.org/schema/context
- http://www.springframework.org/schema/context/spring-context-3.0.xsd
- http://www.springframework.org/schema/mvc
- http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd">
- <context:component-scan base-package="com.tiantian.mybatis"/>
- <context:property-placeholder location="classpath:config/jdbc.properties"/>
- <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
- destroy-method="close">
- <property name="driverClassName" value="${jdbc.driver}" />
- <property name="url" value="${jdbc.url}" />
- <property name="username" value="${jdbc.username}" />
- <property name="password" value="${jdbc.password}" />
- </bean>
-
- <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
- <property name="dataSource" ref="dataSource" />
- <property name="mapperLocations" value="classpath:com/tiantian/mybatis/mapper/*.xml"/>
- <property name="typeAliasesPackage" value="com.tiantian.mybatis.model" />
- </bean>
-
- <bean id="blogMapper" class="org.mybatis.spring.mapper.MapperFactoryBean">
- <property name="mapperInterface"
- value="com.tiantian.mybatis.mapper.BlogMapper" />
- <property name="sqlSessionFactory" ref="sqlSessionFactory" />
- </bean>
-
- </beans>
BlogMapper.xml文件:安全
Xml代码
- <?xml version="1.0" encoding="UTF-8" ?>
- <!DOCTYPE mapper
- PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
- "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
- <mapper namespace="com.tiantian.mybatis.mapper.BlogMapper">
- <!-- 新增记录 -->
- <insert id="insertBlog" parameterType="Blog" useGeneratedKeys="true" keyProperty="id">
- insert into t_blog(title,content,owner) values(#{title},#{content},#{owner})
- </insert>
- <!-- 查询单条记录 -->
- <select id="selectBlog" parameterType="int" resultMap="BlogResult">
- select * from t_blog where id = #{id}
- </select>
- <!-- 修改记录 -->
- <update id="updateBlog" parameterType="Blog">
- update t_blog set title = #{title},content = #{content},owner = #{owner} where id = #{id}
- </update>
- <!-- 查询全部记录 -->
- <select id="selectAll" resultType="Blog">
- select * from t_blog
- </select>
- <!-- 删除记录 -->
- <delete id="deleteBlog" parameterType="int">
- delete from t_blog where id = #{id}
- </delete>
-
- </mapper>
BlogMapper.java:
Java代码
- package com.tiantian.mybatis.mapper;
-
- import java.util.List;
- import com.tiantian.mybatis.model.Blog;
-
- publicinterface BlogMapper {
-
- public Blog selectBlog(int id);
-
- publicvoid insertBlog(Blog blog);
-
- publicvoid updateBlog(Blog blog);
-
- publicvoid deleteBlog(int id);
-
- public List<Blog> selectAll();
-
- }
BlogServiceImpl.java:
Java代码
- package com.tiantian.mybatis.service.impl;
-
- import java.util.List;
- import javax.annotation.Resource;
- import org.springframework.stereotype.Service;
- import com.tiantian.mybatis.mapper.BlogMapper;
- import com.tiantian.mybatis.model.Blog;
- import com.tiantian.mybatis.service.BlogService;
-
- @Service
- publicclass BlogServiceImpl implements BlogService {
-
- private BlogMapper blogMapper;
-
- publicvoid deleteBlog(int id) {
- blogMapper.deleteBlog(id);
- }
-
- public Blog find(int id) {
- returnblogMapper.selectBlog(id);
- }
-
- public List<Blog> find() {
- returnblogMapper.selectAll();
- }
-
- publicvoid insertBlog(Blog blog) {
- blogMapper.insertBlog(blog);
- }
-
- publicvoid updateBlog(Blog blog) {
- blogMapper.updateBlog(blog);
- }
-
- public BlogMapper getBlogMapper() {
- returnblogMapper;
- }
-
- @Resource
- publicvoid setBlogMapper(BlogMapper blogMapper) {
- this.blogMapper = blogMapper;
- }
-
- }
MapperScannerConfigurer
利用上面的方法进行整合的时候,咱们有一个Mapper就须要定义一个对应的MapperFactoryBean,当咱们的Mapper比较少的时候,这样作也还能够,可是当咱们的Mapper至关多时咱们再这样定义一个个Mapper对应的MapperFactoryBean就显得速度比较慢了。为此Mybatis-Spring为咱们提供了一个叫作MapperScannerConfigurer的类,经过这个类Mybatis-Spring会自动为咱们注册Mapper对应的MapperFactoryBean对象。
若是咱们须要使用MapperScannerConfigurer来帮咱们自动扫描和注册Mapper接口的话咱们须要在Spring的applicationContext配置文件中定义一个MapperScannerConfigurer对应的bean。对于MapperScannerConfigurer而言有一个属性是咱们必须指定的,那就是basePackage。basePackage是用来指定Mapper接口文件所在的基包的,在这个基包或其全部子包下面的Mapper接口都将被搜索到。多个基包之间可使用逗号或者分号进行分隔。最简单的MapperScannerConfigurer定义就是只指定一个basePackage属性,如:
Xml代码
- <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
- <property name="basePackage" value="com.tiantian.mybatis.mapper" />
- </bean>
这样MapperScannerConfigurer就会扫描指定基包下面的全部接口,并把它们注册为一个个MapperFactoryBean对象。当使用MapperScannerConfigurer加basePackage属性的时候,咱们上面例子的applicationContext配置文件将变为这样:
Xml代码
- <?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: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.0.xsd
- http://www.springframework.org/schema/context
- http://www.springframework.org/schema/context/spring-context-3.0.xsd
- http://www.springframework.org/schema/mvc
- http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd">
-
- <context:component-scan base-package="com.tiantian.mybatis" />
- <context:property-placeholder location="classpath:config/jdbc.properties" />
- <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
- destroy-method="close">
- <property name="driverClassName" value="${jdbc.driver}" />
- <property name="url" value="${jdbc.url}" />
- <property name="username" value="${jdbc.username}" />
- <property name="password" value="${jdbc.password}" />
- </bean>
- <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
- <property name="dataSource" ref="dataSource" />
- <property name="mapperLocations" value="classpath:com/tiantian/mybatis/mapper/*.xml" />
- <property name="typeAliasesPackage" value="com.tiantian.mybatis.model" />
- </bean>
- <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
- <property name="basePackage" value="com.tiantian.mybatis.mapper" />
- </bean>
- </beans>
有时候咱们指定的基包下面的并不全是咱们定义的Mapper接口,为此MapperScannerConfigurer还为咱们提供了另外两个能够缩小搜索和注册范围的属性。一个是annotationClass,另外一个是markerInterface。
- annotationClass:当指定了annotationClass的时候,MapperScannerConfigurer将只注册使用了annotationClass注解标记的接口。
- markerInterface:markerInterface是用于指定一个接口的,当指定了markerInterface以后,MapperScannerConfigurer将只注册继承自markerInterface的接口。
若是上述两个属性都指定了的话,那么MapperScannerConfigurer将取它们的并集,而不是交集。即便用了annotationClass进行标记或者继承自markerInterface的接口都将被注册为一个MapperFactoryBean。
如今假设咱们的Mapper接口都继承了一个SuperMapper接口,那么咱们就能够这样来定义咱们的MapperScannerConfigurer。
Xml代码
- <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
- <property name="basePackage" value="com.tiantian.mybatis.mapper" />
- <property name="markerInterface" value="com.tiantian.mybatis.mapper.SuperMapper"/>
- </bean>
若是是都使用了注解MybatisMapper标记的话,那么咱们就能够这样来定义咱们的MapperScannerConfigurer。
Xml代码
- <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
- <property name="basePackage" value="com.tiantian.mybatis.mapper" />
- <property name="annotationClass" value="com.tiantian.mybatis.annotation.MybatisMapper"/>
- </bean>
除了用于缩小注册Mapper接口范围的属性以外,咱们还能够指定一些其余属性,如:
- sqlSessionFactory:这个属性已经废弃。当咱们使用了多个数据源的时候咱们就须要经过sqlSessionFactory来指定在注册MapperFactoryBean的时候须要使用的SqlSessionFactory,由于在没有指定sqlSessionFactory的时候,会以Autowired的方式自动注入一个。换言之当咱们只使用一个数据源的时候,即只定义了一个SqlSessionFactory的时候咱们就能够不给MapperScannerConfigurer指定SqlSessionFactory。
- sqlSessionFactoryBeanName:它的功能跟sqlSessionFactory是同样的,只是它指定的是定义好的SqlSessionFactory对应的bean名称。
- sqlSessionTemplate:这个属性已经废弃。它的功能也是至关于sqlSessionFactory的,由于就像前面说的那样,MapperFactoryBean最终仍是使用的SqlSession的getMapper方法取的对应的Mapper对象。当定义有多个SqlSessionTemplate的时候才须要指定它。对于一个MapperFactoryBean来讲SqlSessionFactory和SqlSessionTemplate只须要其中一个就能够了,当二者都指定了的时候,SqlSessionFactory会被忽略。
- sqlSessionTemplateBeanName:指定须要使用的sqlSessionTemplate对应的bean名称。
注意:因为使用sqlSessionFactory和sqlSessionTemplate属性时会使一些内容在PropertyPlaceholderConfigurer以前加载,致使在配置文件中使用到的外部属性信息没法被及时替换而出错,所以官方如今新的Mybatis-Spring中已经把sqlSessionFactory和sqlSessionTemplate属性废弃了,推荐你们使用sqlSessionFactoryBeanName属性和sqlSessionTemplateBeanName属性。
Xml代码
- <?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:context="http://www.springframework.org/schema/context"
- xmlns:mvc="http://www.springframework.org/schema/mvc"
- xmlns:mybatis="http://www.mybatis.org/schema/mybatis"
- xsi:schemaLocation="http://www.springframework.org/schema/beans
- http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
- http://www.springframework.org/schema/context
- http://www.springframework.org/schema/context/spring-context-3.0.xsd
- http://www.mybatis.org/schema/mybatis
- http://www.mybatis.org/schema/mybatis/mybatis-spring.xsd
- http://www.springframework.org/schema/mvc
- http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd">
-
- <context:component-scan base-package="com.tiantian.mybatis" />
- <context:property-placeholder location="classpath:config/jdbc.properties" />
- <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
- destroy-method="close">
- <property name="driverClassName" value="${jdbc.driver}" />
- <property name="url" value="${jdbc.url}" />
- <property name="username" value="${jdbc.username}" />
- <property name="password" value="${jdbc.password}" />
- </bean>
- <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
- <property name="dataSource" ref="dataSource" />
- <property name="mapperLocations" value="classpath:com/tiantian/mybatis/mapper/*.xml" />
- <property name="typeAliasesPackage" value="com.tiantian.mybatis.model" />
- </bean>
- <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
- <property name="basePackage" value="com.tiantian.mybatis.mapper" />
- <property name="markerInterface" value="com.tiantian.mybatis.mapper.SuperMapper"/>
- <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
- </bean>
- </beans>
SqlSessionTemplate
除了上述整合以后直接使用Mapper接口以外,Mybatis-Spring还为咱们提供了一种直接使用SqlSession的方式。Mybatis-Spring为咱们提供了一个实现了SqlSession接口的SqlSessionTemplate类,它是线程安全的,能够被多个Dao同时使用。同时它还跟Spring的事务进行了关联,确保当前被使用的SqlSession是一个已经和Spring的事务进行绑定了的。并且它还能够本身管理Session的提交和关闭。当使用了Spring的事务管理机制后,SqlSession还能够跟着Spring的事务一块儿提交和回滚。
使用SqlSessionTemplate时咱们能够在Spring的applicationContext配置文件中以下定义:
<bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">
<constructor-arg index="0" ref="sqlSessionFactory" />
</bean>
这样咱们就能够经过Spring的依赖注入在Dao中直接使用SqlSessionTemplate来编程了,这个时候咱们的Dao多是这个样子:
Java代码
- package com.tiantian.mybatis.dao;
-
- import java.util.List;
- import javax.annotation.Resource;
- import org.mybatis.spring.SqlSessionTemplate;
- import org.springframework.stereotype.Repository;
- import com.tiantian.mybatis.model.Blog;
-
- @Repository
- publicclass BlogDaoImpl implements BlogDao {
-
- private SqlSessionTemplate sqlSessionTemplate;
-
- publicvoid deleteBlog(int id) {
- sqlSessionTemplate.delete("com.tiantian.mybatis.mapper.BlogMapper.deleteBlog", id);
- }
-
- public Blog find(int id) {
- returnsqlSessionTemplate.selectOne("com.tiantian.mybatis.mapper.BlogMapper.selectBlog", id);
- }
-
- public List<Blog> find() {
- returnthis.sqlSessionTemplate.selectList("com.tiantian.mybatis.mapper.BlogMapper.selectAll");
- }
-
- publicvoid insertBlog(Blog blog) {
- this.sqlSessionTemplate.insert("com.tiantian.mybatis.mapper.BlogMapper.insertBlog", blog);
- }
-
- publicvoid updateBlog(Blog blog) {
- this.sqlSessionTemplate.update("com.tiantian.mybatis.mapper.BlogMapper.updateBlog", blog);
- }
-
- public SqlSessionTemplate getSqlSessionTemplate() {
- returnsqlSessionTemplate;
- }
-
- @Resource
- publicvoid setSqlSessionTemplate(SqlSessionTemplate sqlSessionTemplate) {
- this.sqlSessionTemplate = sqlSessionTemplate;
- }
-
- }
-
框架/平台构成:
Maven+Springmvc + Mybatis + Shiro(权限)+ Tiles(模板) +ActiveMQ(消息队列) + Rest(服务) + WebService(服务)+ EHcache(缓存) + Quartz(定时调度)+ Html5(支持PC、IOS、Android)
用户权限系统:
组织结构:角色、用户、用户组、组织机构;权限点:页面、方法、按钮、数据权限、分级受权
项目管理新体验:
快速出原型系统、组件树、版本控制、模块移植、协同开发、实时监控、发布管理
可持续集成:
全部组件可移植、可定制、可扩充,开发成果不断积累,造成可持续发展的良性循环
支持平台平台:
Windows XP、Windows 7 、Windows 10 、 Linux 、 Unix
服务器容器:
Tomcat 5/6/7 、Jetty、JBoss、WebSphere 8.5










































