Spring整合MyBatis

发表时间:2017-07-11 17:04:19 浏览量( 31 ) 留言数( 0 )

学习目标:

1、了解Spring-batis的使用

2、掌握spring和mybatis的整合


学习过程:

spring整合mybatis非常简单,和hibernate类似,只是把mybatis的SqlSessionFactory交给spring容器进行管理,和hibernate一样提供了一个SqlSessionTemplate模板类,这样我们就不用直接操作session了

一、导包

首先把mybatis和spring的相关的核心包导入进来,mybatis提供了一个spring的支持包mybatis-spring-1.1.1.jar,这个包也需要在mybatis的官方网站中下载,把这些包导入后就可以建立spring的配置文件了。

如果使用maven,那么修改pom.xml

		<dependency>
			<groupId>org.mybatis</groupId>
			<artifactId>mybatis</artifactId>
			<version>3.4.1</version>
		</dependency>

		<dependency>
			<groupId>org.mybatis</groupId>
			<artifactId>mybatis-spring</artifactId>
			<version>1.3.1</version>
		</dependency>


二、修改spring的配置文件

<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"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

	<bean id="dataSource"
		class=" org.springframework.jdbc.datasource.DriverManagerDataSource">
		<property name="driverClassName" value="com.mysql.jdbc.Driver">
		</property>
		<property name="url"
			value="jdbc:mysql://localhost:3306/mybatis_db?useUnicode=true&amp;characterEncoding=utf8">
		</property>
		<property name="username" value="root"></property>
		<property name="password" value="123456"></property>
	</bean>

	<!-- SqlSessionFactory -->
	<!-- mybatis文件配置,扫描所有mapper文件 -->
	<bean id="sessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
		<property name="configLocation" value="classpath:mybatis-config.xml"></property>
		<property name="dataSource" ref="dataSource"></property>
		<!-- classpath:只会到你指定的class路径中查找找文件; classpath*:不仅包含class路径,还包括jar文件中(class路径)进行查找. -->
		<property name="mapperLocations" value="classpath:mybatis/*Mapper.xml"></property>
	</bean>

	<bean id="sessionTemplate" class="org.mybatis.spring.SqlSessionTemplate">
		<constructor-arg index="0" ref="sessionFactory"></constructor-arg>
	</bean>

	<bean id="goodsDao" class="com.dao.GoodsDao">
		<property name="sessionTemplate" ref="sessionTemplate"></property>
	</bean>

</beans>


三、修改mybatis的实现

1、修改mybatis链接配置文件。因为链接信息都已经由spring提供了,所以不需要在mybatis中配置了。删除原来的链接配置就可以了。代码如下:

<?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>
	<settings>
		<!-- 全局映射器启用缓存 -->
		<setting name="cacheEnabled" value="false" />
		<!-- 查询时,关闭关联对象即时加载以提高性能 -->
		<setting name="lazyLoadingEnabled" value="true" />
		<!-- 设置关联对象加载的形态,此处为按需加载字段(加载字段由SQL指 定),不会加载关联表的所有字段,以提高性能 -->
		<setting name="aggressiveLazyLoading" value="false" />
		<!-- 对于未知的SQL查询,允许返回不同的结果集以达到通用的效果 -->
		<setting name="multipleResultSetsEnabled" value="true" />
		<!-- 允许使用列标签代替列名 -->
		<setting name="useColumnLabel" value="true" />
		<!-- 允许使用自定义的主键值(比如由程序生成的UUID 32位编码作为键值),数据表的PK生成策略将被覆盖 -->
		<setting name="useGeneratedKeys" value="true" />
		<!-- 给予被嵌套的resultMap以字段-属性的映射支持 -->
		<setting name="autoMappingBehavior" value="FULL" />
		<!-- 对于批量更新操作缓存SQL以提高性能 -->
		<setting name="defaultExecutorType" value="BATCH" />
		<!-- 数据库超过25000秒仍未响应则超时 -->
		<setting name="defaultStatementTimeout" value="25000" />
		
		 <!-- 打印查询语句 -->
        <setting name="logImpl" value="STDOUT_LOGGING" />
		
	</settings>
	<!-- 全局别名设置,在映射文件中只需写别名,而不必写出整个类路径 -->
	<typeAliases>
		<!-- 别名声明写这里 -->
		 <typeAlias type="com.pojo.Goods" alias="Goods"></typeAlias>
	</typeAliases>

	
	<!-- 非注解的sql映射文件配置,如果使用mybatis注解,该mapper无需配置,但是如果mybatis注解中包含@resultMap注解,则mapper必须配置,给resultMap注解使用 -->
	<mappers>
		<!-- 显式指定mapper配置文件写这里 采用与SqlMapper同名,并且放在同一个包下,可以自动配置,所以这里不写了 -->
	</mappers>


</configuration>


3、goods的映射我写了比较多的方法

<?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.javadayup.stuormmybatis.Goods">

	<!-- 定义对象映射结果 -->
	<resultMap type="Goods" id="goodsMap">
		<id property="goodsId" column="goods_id" />
		<result property="goodsName" column="goods_name" />
		<result property="goodsCash" column="goods_cash" />
		<result property="goodsDesc" column="goods_desc" />
	</resultMap>



	<!-- sql映射 parameterType 参数类型 resultType结果类型 写原始sql语言 -->
	<select id="selectGoods" parameterType="int" resultMap="goodsMap">
		select *
		from goods where goods_id=#{id}
	</select>

	<select id="selectALlGoods" resultMap="goodsMap">
		select * from goods
	</select>

	<insert id="addGoods" parameterType="Goods" flushCache="true">
		insert
		into goods(goods_name,goods_desc,goods_cash)
		values(#{goodsName},#{goodsDesc},#{goodsCash})
	</insert>

	<delete id="delGoods" parameterType="int" flushCache="true">
		delete from
		goods where goods_id=#{id}
	</delete>

	<update id="updateGoods" parameterType="Goods" flushCache="true">
		update goods set
		goods_name=#{goodsName},goods_desc=#{goodsDesc},goods_cash=#{goodsCash}
		where goods_id=#{goodsId}
	</update>


	<select id="selectConditon" parameterType="Goods" resultMap="goodsMap">
		select * from goods where 1=1
		<if test="goodsName != null">
			and goods_name like #{goodsName}
		</if>
		<if test="goodsDesc != null">
			and goods_desc like #{goodsDesc}
		</if>

	</select>

</mapper>

2、修改GoodsDao的实现。GoodsDao可以通过注入SqlSessionTemplate简化操作,你不需要显示的获得session和关闭session了。这里只给出添加商品的代码,其它代码类似,大家可以自己尝试写一下。

public class GoodsDao {
	private SqlSessionTemplate sessionTemplate;

	public int addGoods(Goods goods) {
		return sessionTemplate.insert("addGoods", goods);
	}

	public void setSessionTemplate(SqlSessionTemplate sessionTemplate) {
		this.sessionTemplate = sessionTemplate;
	}

}

4、测试类

@RunWith(SpringJUnit4ClassRunner.class) // 
@ContextConfiguration(locations = { "classpath:applicationContext.xml" }) // 
public class GoodDaoTest {
	
	@Autowired
	private GoodsDao goodsDao;
	
	@Test
	public void testGetUserCache() {
		
		Goods good=new Goods();
		good.setGoodsName("测试的");
		good.setGoodsCash(12.2);
		good.setGoodsDesc("描述");
		goodsDao.addGoods(good);
		
	}

}

日志有sql的输出:

Creating a new SqlSession

SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@3d6f0054] was not registered for synchronization because synchronization is not active

JDBC Connection [com.mysql.jdbc.JDBC4Connection@298a5e20] will not be managed by Spring

==>  Preparing: insert into goods(goods_name,goods_desc,goods_cash) values(?,?,?) 

==> Parameters: 测试的(String), 描述(String), 12.2(Double)

Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@3d6f0054]