【MyBatis学习14】MyBatis和Spring整合
2017-03-21 20:06
483 查看
本文博客地址:http://blog.csdn.net/soonfly/article/details/64495909 (转载请注明出处)
MyBatis和Spring整合可以有很多种方式,只要明白几个重要的类,就能随心所欲整合了。
导入包
我们可以从Mybatis官网上下载Mybatis-Spring的jar包添加到我们项目的类路径下。
当然不要忘记添加Mybatis的相关jar包和Spring的相关jar包。
(点击下载相关包)
接下来要在Spring的applicationContext.xml配置文件中进行主要类的配置
Mybatis-Spring包(org.mybatis.spring)封装了一个SqlSessionFactoryBean,在这个bean里面也是通过SqlSessionFactoryBuilder来建立对应的SqlSessionFactory,进而获取到对应的SqlSession。
![](https://img-blog.csdn.net/20170321194919225?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvc29vbmZseQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
所以无论哪种方式,第一步必须配置SqlSessionFactoryBean (首先还得配置数据源)
除了必填的dataSource属性外,还有几个重要属性:
configLocation:指定Mybatis的配置文件位置,并以该配置信息构建SqlSessionFactoryBuilder。后续属性指定的内容会覆盖该配置文件里面指定的对应内容。
mapperLocations:指定Mapper配置文件位置,批量载入。当Mapper文件跟对应的Mapper接口处于同一位置的时候可以不用指定该属性的值。同mybatis配置中的
typeAliasesPackage:指定实体POJO类所在的包,并取类名作为别名。多个package之间可以用逗号或者分号等来进行分隔。同mybatis配置中的
typeAliases:数组类型。用来指定别名的。指定了这个属性后,Mybatis会把这个类型的短名称作为这个类型的别名。类上标注
plugins:数组类型,用来指定Mybatis的Interceptor。
typeHandlersPackage:用来指定TypeHandler所在的包,如果指定了该属性,SqlSessionFactoryBean会自动把该包下面的类注册为对应的TypeHandler。多个package之间可以用逗号或者分号等来进行分隔。
typeHandlers:数组类型,表示TypeHandler。
有了上面这些参数,可以发现,原来
接下来,就要获取Mapper对象进行业务开发了。
在Spring的applicationContext文件中定义Mapper对象,是通过Mybatis-Spring包中MapperFactoryBean类实现的
有两个属性需要我们注入:sqlSessionFactory和mapperInterface(对应的Mapper接口)
定义好后,spring容器已经接管UserMapper对象,这时可以开始业务逻辑的编写了:
一切OK!成功
很简单的配置,只需两个类搞定整合。当然,我们还要继续探讨。
为此Mybatis-Spring为我们提供了一个叫做
多个包之间可以使用逗号或者分号进行分隔。
因此,可以直接把上面那段
如果要缩小搜索和注册范围:
annotationClass:当指定了annotationClass的时候,只有使用annotationClass注解标记的接口才会被注册。
markerInterface:markerInterface用于指定一个接口的,当指定了markerInterface之后,MapperScannerConfigurer将只注册继承自markerInterface的接口。
如果上述两个属性都指定了的话,那么MapperScannerConfigurer将取它们的并集,而不是交集。也就是接口需要同时满足上述两个条件。
sqlSessionFactoryBeanName:用于指定选择一个sqlSessionFactory对象。如果在前面定义了多个sqlSessionFactory,这里不指定的话,系统会出错,不知道使用哪个,所以必须指定一个。如果整个配置中只有一个sqlSessionFactory,就可以不用指定。
在使用mybatis进行业务层开发中,我们还有一种不使用Mapper接口的方式,而是直接用sqlsession访问Mapper配置文件,在《【MyBatis学习03】调用Mapper映射的3种使用方式》可以看到:
因此,我们需要在代码中直接获取Sqlsession对象。
Mybatis-Spring为我们提供了一种直接使用SqlSession的方式,就是一个实现了SqlSession接口的SqlSessionTemplate类(它是线程安全的,可以被多个Dao同时使用)。
然后我们在业务层调用:
如果继承该类的都可以通过
它是一个抽象类,本身使用场景就是作为 DAO 的基类来使用的。它需要一个 SqlSessionTemplate 或一个 SqlSessionFactory ,若两者都设置了,则 SqlSessionFactory 会被忽略(实际上它接收了 SqlSessionFactory 后也会利用 SqlSessionFactory 创建一个 SqlSessionTemplate )。
这样,我们在子类中就能通过调用 SqlSessionDaoSupport 类的
来看一个例子:
映射器接口:
DAO层:
Mapper配置文件:
applicationContext.xml配置:
本文博客地址:http://blog.csdn.net/soonfly/article/details/64495909 (转载请注明出处)
MyBatis和Spring整合可以有很多种方式,只要明白几个重要的类,就能随心所欲整合了。
导入包
我们可以从Mybatis官网上下载Mybatis-Spring的jar包添加到我们项目的类路径下。
当然不要忘记添加Mybatis的相关jar包和Spring的相关jar包。
(点击下载相关包)
接下来要在Spring的applicationContext.xml配置文件中进行主要类的配置
一、SqlSessionFactoryBean
我们知道在Mybatis的所有操作都是基于SqlSession的。SqlSession是由SqlSessionFactory来产生的,SqlSessionFactory又是由SqlSessionFactoryBuilder来生成的。Mybatis-Spring包(org.mybatis.spring)封装了一个SqlSessionFactoryBean,在这个bean里面也是通过SqlSessionFactoryBuilder来建立对应的SqlSessionFactory,进而获取到对应的SqlSession。
所以无论哪种方式,第一步必须配置SqlSessionFactoryBean (首先还得配置数据源)
<!-- 加载db.properties数据库连接信息 --> <context:property-placeholder location="classpath:db.properties"/> <!-- 配置数据源 --> <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 name="maxActive" value="${maxActive}" /> <!-- 连接池最大空闲 --> <property name="maxIdle" value="${maxIdle}" /> <!-- 连接池最小空闲 --> <property name="minIdle" value="${minIdle}" /> <!-- 获取连接最大等待时间 --> <property name="maxWait" value="${maxWait}" /> </bean> <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <!-- 加载mybatis的全局配置文件 --> <property name="configLocation" value="classpath:SqlMapConfig.xml" /> <!-- 加载数据源 --> <property name="dataSource" ref="dataSource" /> </bean>
除了必填的dataSource属性外,还有几个重要属性:
configLocation:指定Mybatis的配置文件位置,并以该配置信息构建SqlSessionFactoryBuilder。后续属性指定的内容会覆盖该配置文件里面指定的对应内容。
mapperLocations:指定Mapper配置文件位置,批量载入。当Mapper文件跟对应的Mapper接口处于同一位置的时候可以不用指定该属性的值。同mybatis配置中的
<mappers>作用。
typeAliasesPackage:指定实体POJO类所在的包,并取类名作为别名。多个package之间可以用逗号或者分号等来进行分隔。同mybatis配置中的
<typeAliases>作用。
typeAliases:数组类型。用来指定别名的。指定了这个属性后,Mybatis会把这个类型的短名称作为这个类型的别名。类上标注
@Alias注解,将优先使用注解。同mybatis配置中的
<typeAliases>作用。
<property name="typeAliases"> <array> <value>twm.mybatisdemo.pojo.User</value> <value>twm.mybatisdemo.pojo.Order</value> </array> </property>
plugins:数组类型,用来指定Mybatis的Interceptor。
typeHandlersPackage:用来指定TypeHandler所在的包,如果指定了该属性,SqlSessionFactoryBean会自动把该包下面的类注册为对应的TypeHandler。多个package之间可以用逗号或者分号等来进行分隔。
typeHandlers:数组类型,表示TypeHandler。
有了上面这些参数,可以发现,原来
SqlMapConfig.xml的配置全都可以在
SqlSessionFactoryBean的属性中完成。
二、MapperFactoryBean
我们已经完成通过Mybatis-Spring包(org.mybatis.spring)中的SqlSessionFactoryBean获取Sqlsession了。接下来,就要获取Mapper对象进行业务开发了。
在Spring的applicationContext文件中定义Mapper对象,是通过Mybatis-Spring包中MapperFactoryBean类实现的
<bean id="UserMapper" class="org.mybatis.spring.mapper.MapperFactoryBean"> <property name="mapperInterface" value="twm.mybatisdemo.mapper.UserMapper" /> <!-- 上面定义的sqlSessionFactory --> <property name="sqlSessionFactory" ref="sqlSessionFactory" /> </bean>
有两个属性需要我们注入:sqlSessionFactory和mapperInterface(对应的Mapper接口)
定义好后,spring容器已经接管UserMapper对象,这时可以开始业务逻辑的编写了:
public static void main(String[] args) throws Exception { ApplicationContext context = new ClassPathXmlApplicationContext("classpath:applicationContext.xml"); UserMapper usermp = context.getBean(UserMapper.class); System.out.println(usermp.selectAll().size()); }
一切OK!成功
很简单的配置,只需两个类搞定整合。当然,我们还要继续探讨。
三、MapperScannerConfigurer
利用上面的方法进行整合的时候,我们要一个一个的定义MapperFactoryBean来生成Mapper对象。如果mapper数量一多就傻了。为此Mybatis-Spring为我们提供了一个叫做
MapperScannerConfigurer的类,这个会自动为我们注册Mapper对应的MapperFactoryBean对象。
多个包之间可以使用逗号或者分号进行分隔。
因此,可以直接把上面那段
org.mybatis.spring.mapper.MapperFactoryBean的定义删掉,改用:
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <property name="basePackage" value="twm.mybatisdemo.mapper" /> </bean>
如果要缩小搜索和注册范围:
annotationClass:当指定了annotationClass的时候,只有使用annotationClass注解标记的接口才会被注册。
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <property name="basePackage" value="twm.mybatisdemo.mapper" /> <property name="annotationClass" value="twm.mybatisdemo.mapper.testannotation"/> </bean>
markerInterface:markerInterface用于指定一个接口的,当指定了markerInterface之后,MapperScannerConfigurer将只注册继承自markerInterface的接口。
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <property name="basePackage" value="twm.mybatisdemo.mapper" /> <property name="markerInterface" value=""twm.mybatisdemo.mapper.baseMapper"/> </bean>
如果上述两个属性都指定了的话,那么MapperScannerConfigurer将取它们的并集,而不是交集。也就是接口需要同时满足上述两个条件。
sqlSessionFactoryBeanName:用于指定选择一个sqlSessionFactory对象。如果在前面定义了多个sqlSessionFactory,这里不指定的话,系统会出错,不知道使用哪个,所以必须指定一个。如果整个配置中只有一个sqlSessionFactory,就可以不用指定。
四、SqlSessionTemplate
上面都是针对Mapper接口(含用注解实现的接口)的配置。在使用mybatis进行业务层开发中,我们还有一种不使用Mapper接口的方式,而是直接用sqlsession访问Mapper配置文件,在《【MyBatis学习03】调用Mapper映射的3种使用方式》可以看到:
SqlSession session = SqlSessionAssist.getSession(); session.insert("twm.mybatisdemo.mapper.User2Mapper.insert",aPerson);
因此,我们需要在代码中直接获取Sqlsession对象。
Mybatis-Spring为我们提供了一种直接使用SqlSession的方式,就是一个实现了SqlSession接口的SqlSessionTemplate类(它是线程安全的,可以被多个Dao同时使用)。
<bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate"> <constructor-arg index="0" ref="sqlSessionFactory" /> </bean>
然后我们在业务层调用:
ApplicationContext context = new ClassPathXmlApplicationContext("classpath:applicationContext.xml"); SqlSession session = context.getBean("sqlSession",SqlSession.class); User userEntity=session.selectOne("twm.mybatisdemo.mapper.UserMapper.selectById",86); System.out.println(userEntity.getUsername());
五、SqlSessionDaoSupport类
这一个不是配置,而是一个类。如果继承该类的都可以通过
this.getSqlSession()获取到SqlSession,进而进行业务操作。
它是一个抽象类,本身使用场景就是作为 DAO 的基类来使用的。它需要一个 SqlSessionTemplate 或一个 SqlSessionFactory ,若两者都设置了,则 SqlSessionFactory 会被忽略(实际上它接收了 SqlSessionFactory 后也会利用 SqlSessionFactory 创建一个 SqlSessionTemplate )。
public void setSqlSessionFactory(SqlSessionFactory sqlSessionFactory) { if (!this.externalSqlSession) { this.sqlSession = new SqlSessionTemplate(sqlSessionFactory); } } public void setSqlSessionTemplate(SqlSessionTemplate sqlSessionTemplate) { this.sqlSession = sqlSessionTemplate; this.externalSqlSession = true; }
这样,我们在子类中就能通过调用 SqlSessionDaoSupport 类的
getSqlSession()方法来获取这个 SqlSessionTemplate 对象。
来看一个例子:
映射器接口:
interface UserDaoService{ public User selectUserById(int id); }
DAO层:
class UserDaoServiceImpl extends SqlSessionDaoSupport implements User{ SqlSession session; UserDaoServiceImpl(){ session=this.getSqlSession(); } public User selectUserById(int id){ User userEntity = session.selectOne( "twm.mybatisdemo.mapper.UserMapper.selectById", id); return userEntity; } }
Mapper配置文件:
<?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="twm.mybatisdemo.mapper.UserMapper"> <select id="selectById" parameterType="int" resultType="User" useCache="true"> select * from user where id=#{id} </select> </mapper>
applicationContext.xml配置:
<bean id="userDaoServiceImpl" class="twm.mybatisdemo.DaoImpl.UserDaoServiceImpl"> <property name="sqlSessionFactory" ref="sqlSessionFactory" /> </bean>
本文博客地址:http://blog.csdn.net/soonfly/article/details/64495909 (转载请注明出处)
相关文章推荐
- mybatis学习笔记(14)-spring和mybatis整合
- 【MyBatis学习14】MyBatis和Spring整合
- 【MyBatis学习14】MyBatis和Spring整合
- 【MyBatis学习14】MyBatis和Spring整合
- 【MyBatis学习14】MyBatis和Spring整合
- 【Java EE 学习 79 下】【动态SQL】【mybatis和spring的整合】
- MyBatis学习总结(八)——Mybatis3.x与Spring4.x整合
- MyBatis学习总结(八)——Mybatis3.x与Spring4.x整合
- Mybatis学习记录(八)----Mybatis整合Spring
- MyBatis整合Spring的实现(14)
- MyBatis学习总结(8)——Mybatis3.x与Spring4.x整合
- Spring注解整合(hibernate+mybatis) 学习笔记
- Spring学习笔记----三大框架(Spring+SpringMVC+MyBatis)整合详细教程
- Mybatis学习笔记-Mybatis与Spring的整合
- 学习sharding-jdbc(二)之spring+mybatis+sharding-jdbc整合
- MyBatis学习七:spring和MyBatis整合、逆向工程
- MyBatis学习总结——Mybatis3.x与Spring4.x整合
- Java学习笔记32:Spring整合mybatis使用
- myBatis学习笔记(9)——spring整合mybatis
- SpringMvc+Spring+Mybatis+Maven整合学习