Spring整合MyBatis一共有三种整合方式
第一种整合方法
结构层次:xml+dao+impl
原理:直接把spring的sqlSessionTemplate手动注入到impl的属性中
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.bdqn.dao.goods.GoodsMapper">
<select id="getGoodsList" resultType="Goods">
select * from goods
</select>
</mapper>
dao
package com.bdqn.dao.goods;
import java.util.List;
import com.bdqn.entity.Goods;
public interface GoodsMapper {
List<Goods> getGoodsList();
}
impl实现dao的类,在第一种方法里面是核心类
第一种方法只能所使用selectList的方法来调用方法,不能使用getMapper
package com.bdqn.dao.goods;
import java.util.List;
import org.apache.ibatis.session.SqlSession;
import org.mybatis.spring.SqlSessionTemplate;
import com.bdqn.entity.Goods;
public class GoodsMapperImpl implements GoodsMapper{
//定义一个属性,等下用来连接数据库
private SqlSessionTemplate sessionT;
//经过spring注入后,sqlSessionTemplate已经有了链接数据库的资格
public List<Goods> getGoodsList() {
// TODO Auto-generated method stub
return sessionT.selectList("com.bdqn.dao.goods.GoodsMapper.getGoodsList");
}
//get方法
public SqlSession getSessionT() {
return sessionT;
}
//set方法,让bean注入用
public void setSessionT(SqlSessionTemplate sessionT) {
this.sessionT = sessionT;
}
}
test
package com.bdqn.test;
import java.util.List;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.bdqn.dao.goods.GoodsMapperImpl;
import com.bdqn.entity.Goods;
public class Test {
public static void main(String[] args) {
ApplicationContext context = new
ClassPathXmlApplicationContext("applicationContext.xml");
//这里是把配置文件中指代impl的beanid
GoodsMapperImpl gm = (GoodsMapperImpl)context.getBean("getGoodsList");
List<Goods> goo = gm.getGoodsList();
for (Goods goods : goo) {
System.out.println(goods.getGoodid());
System.out.println(goods.getName());
System.out.println(goods.getPrice());
}
}
}
配置文件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: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.bdqn.services" />
<!-- 引入配置文件 -->
<bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="location" value="classpath:database.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}" />
</bean>
<!-- spring和MyBatis完美整合,不需要mybatis的配置映射文件 -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="configLocation" value="classpath:mybatis-config.xml"/>
<!-- 自动扫描mapping.xml文件,**表示迭代查找,也可在sqlMapConfig.xml中单独指定xml文件-->
<property name="mapperLocations" value="classpath:com/bdqn/dao/**/*.xml" />
</bean>
<!-- mybatis spring sqlSessionTemplate,使用时直接让spring注入即可 -->
<bean id="sqlSessionTemplate" class="org.mybatis.spring.SqlSessionTemplate">
<constructor-arg index="0" ref="sqlSessionFactory"></constructor-arg>
</bean>
<bean id="getGoodsList" class="com.bdqn.dao.goods.GoodsMapperImpl"
p:sessionT-ref="sqlSessionTemplate">
</bean>
</beans>
database.properties
driver=com.mysql.jdbc.Driver
url=jdbc\:mysql\://localhost\:3306/goods?useUnicode\=true&characterEncoding\=utf8
username=root
password=123
mybatis-config.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!--类型别名 -->
<typeAliases>
<package name="com.bdqn.entity" />
</typeAliases>
</configuration>
spring和mybatis整合以后,在mybatis里面不用在配置很多东西了,所有的东西基本都移植到了spring的配置文件中,只用在mybatis里面配置一个实体类的包名
第二种整合方法
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.bdqn.dao.goods.GoodsMapper">
<select id="getGoodsList" resultType="Goods">
select * from goods
</select>
</mapper>
dao
package com.bdqn.dao.goods;
import java.util.List;
import com.bdqn.entity.Goods;
public interface GoodsMapper {
List<Goods> getGoodsList();
}
impl
package com.bdqn.dao.goods;
import java.util.List;
import org.apache.ibatis.session.SqlSession;
import org.mybatis.spring.support.SqlSessionDaoSupport;
import com.bdqn.entity.Goods;
public class GoodsMapperImpl extends SqlSessionDaoSupport implements GoodsMapper{
public List<Goods> getGoodsList() {
// TODO Auto-generated method stub
SqlSession session = super.getSqlSession();
return session.selectList("com.bdqn.dao.goods.GoodsMapper.getGoodsList");
}
}
这次的dao层没有设置私有属性的东西,而是直接继承了SqlSessionDaoSupport,然后继承了父类的属性SqlSession,然后通过父类该属性的getter方法来获取到该对象
test
package com.bdqn.test;
import java.util.List;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.bdqn.dao.goods.GoodsMapper;
import com.bdqn.entity.Goods;
public class Test {
public static void main(String[] args) {
ApplicationContext context = new
ClassPathXmlApplicationContext("applicationContext.xml");
GoodsMapper gm = (GoodsMapper)context.getBean("getGoodsList");
List<Goods> goo = gm.getGoodsList();
for (Goods goods : goo) {
System.out.println(goods.getGoodid());
System.out.println(goods.getName());
System.out.println(goods.getPrice());
}
}
}
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: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.bdqn.entity" />
<!-- 引入配置文件 -->
<bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="location" value="classpath:database.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}" />
</bean>
<!-- spring和MyBatis完美整合,不需要mybatis的配置映射文件 -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="configLocation" value="classpath:mybatis-config.xml"/>
<!-- 自动扫描mapping.xml文件,**表示迭代查找,也可在sqlMapConfig.xml中单独指定xml文件-->
<property name="mapperLocations" value="classpath:com/bdqn/dao/**/*.xml" />
</bean>
<!-- (事务管理)transaction manager, use JtaTransactionManager for global tx -->
<!--<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>-->
<bean id="getGoodsList" class="com.bdqn.dao.goods.GoodsMapperImpl"
p:sqlSessionFactory-ref="sqlSessionFactory"></bean>
</beans>
第二种方法的mybatis.xml和database.properties是和第一种方法的是一样的所以就不写了,可以参考第一种方法
同时他也有不一样的地方,就是我们可以看到原先的sqlSessionTemplate没有了,现在是直接通过SqlSessionFactory来直接注入数据库连接依赖,上面的getGoodsList的第二行配置是必须写成与上面beanID的名字一样
没有了以下这块:
<!-- mybatis spring sqlSessionTemplate,使用时直接让spring注入即可 -->
<bean id="sqlSessionTemplate" class="org.mybatis.spring.SqlSessionTemplate">
<constructor-arg index="0" ref="sqlSessionFactory"></constructor-arg>
</bean>
第三种整合方法
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.bdqn.dao.goods.GoodsMapper">
<select id="getGoodsList" resultType="Goods">
select * from goods
</select>
</mapper>
dao
package com.bdqn.dao.goods;
import java.util.List;
import com.bdqn.entity.Goods;
public interface GoodsMapper {
List<Goods> getGoodsList();
}
配置文件applicationContext
<?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.bdqn.entity" />
<!-- 引入配置文件 -->
<bean id="propertyConfigurer"
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="location" value="classpath:database.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}" />
</bean>
<!-- spring和MyBatis完美整合,不需要mybatis的配置映射文件 -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="configLocation" value="classpath:mybatis-config.xml" />
<!-- 自动扫描mapping.xml文件,**表示迭代查找,也可在sqlMapConfig.xml中单独指定xml文件 -->
<property name="mapperLocations" value="classpath:com/bdqn/dao/**/*.xml" />
</bean>
<!-- (事务管理)transaction manager, use JtaTransactionManager for global tx -->
<bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>
<!-- 这就是第三种方法,直接用扫包注解的方法,把所有的dao层都预先注入配置 -->
<bean id="getGoodsList" class="org.mybatis.spring.mapper.MapperFactoryBean">
<property name="mapperInterface" value="com.bdqn.dao.goods.GoodsMapper" />
<property name="sqlSessionFactory" ref="sqlSessionFactory" />
</bean>
</beans><?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.bdqn.entity" />
<!-- 引入配置文件 -->
<bean id="propertyConfigurer"
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="location" value="classpath:database.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}" />
</bean>
<!-- spring和MyBatis完美整合,不需要mybatis的配置映射文件 -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="configLocation" value="classpath:mybatis-config.xml" />
<!-- 自动扫描mapping.xml文件,**表示迭代查找,也可在sqlMapConfig.xml中单独指定xml文件 -->
<property name="mapperLocations" value="classpath:com/bdqn/dao/**/*.xml" />
</bean>
<!-- (事务管理)transaction manager, use JtaTransactionManager for global tx -->
<bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>
<!-- 这就是第三种方法,直接用扫包注解的方法,把所有的dao层都预先注入配置 -->
<bean id="getGoodsList" class="org.mybatis.spring.mapper.MapperFactoryBean">
<property name="mapperInterface" value="com.bdqn.dao.goods.GoodsMapper" />
<property name="sqlSessionFactory" ref="sqlSessionFactory" />
</bean>
</beans>
这种方法的就是直接用一个bean来把来连接数据库的所需要的资料直接赋给所有的dao层,记住这里的包一定要覆盖到所有的dao层
test
package com.bdqn.test;
import java.util.List;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.bdqn.dao.goods.GoodsMapper;
import com.bdqn.entity.Goods;
public class Test {
public static void main(String[] args) {
ApplicationContext context = new
ClassPathXmlApplicationContext("applicationContext.xml");
GoodsMapper gm = (GoodsMapper)context.getBean("getGoodsList");
List<Goods> goo = gm.getGoodsList();
for (Goods goods : goo) {
System.out.println(goods.getGoodid());
System.out.println(goods.getName());
System.out.println(goods.getPrice());
}
}
}
使用声明式事务