`

浅谈MyBatis及与Spring的整合

阅读更多

MyBatis作为持久化层的一个ORM实现,完成了对象模型到关系数据模型之间的转换,协调了对象模型和关系模型之间的不协调,其减少了以往以jdbc编程的大部分代码量,使得应用开发者将注意力集中到业务逻辑层代码的编写,大大提高了工作效率。
MyBatis是一种半自动化的持久层框架,除了常规的配置文件外,域对象的映射文件了,还有通过插件完成最终SQL映射的辅助功能,如分页拦截插件,映射文件中定义了一系列的动态SQL,每个预定义的SQL语句之上都有相应的入参和最终的返回结果,根据运行时的传入的参数,判断其属性便可以动态完成SQL语句的生成,进而产生需要的结果集。
从域对象到最终的返回,需要定义结果集映射,SQL映射,结果集映射中定义了域对象和关系数据行之间的映射关系,确定的定义了基于java对象的属性和基于关系模型的数据列之间的映射,以便于在检索出原始的结果集后,利用反射技术将其精确合成目标实体对象;
动态SQL的定义,也是约定大于配置的方式,MyBatis映射文件中关于映射文件中的元素的DTD声明中规定了在其映射文件中只能以以下顺序定义约定数量的元素,如可以定义0个或者多个resultMap及其它提及元素。
如 一个常见的MyBatis映射文件如下:
假定域对象模型为:

public class DomainData{
	 private Integer id;

	 private String name;

	 private java.util.Date birthday;

	 private AuthUser createBy;

	 //省略setters and getters

	}

 

<mapper namespace="DomainData">
	   
		   <resultMap id="DomainData_Result" type="DomainData">
			   <result property="id column="ID" jdbcType ="NUMERIC" />
			   <result property="name" column="NAME" jdbcType="VARCHAR" />
			   <result property="birthday" column="BIRTHDAY" jdbcType="TIMESTAMP"/>
			   <association property="createBy" column="CREATE_BY" select="AuthUser.queryById"/>
		   </resultMap>

		   <!-- 新增 -->
		   <insert id="insert" parameterType="DomainData">
			   <selectKey resultType="java.lang.Integer" keyProperty="id" order="BEFORE">
				      SELECT SEQ_DOMAIN_DATA.nextual from dual
			   </selectKey>
			   insert into DOMAIN_DATA(
				   ID,
				   NAME,
				   BIRTHDAY,
				   CREATE_BY
				   )
			   VALUES
				   (
				   #{id,jdbcType=NUMERIC},
				   #{title,jdbcType=VARCHAR},
				   #{birthday,jdbcType=TIMESTAMP},
				   #{createBy.id,jdbcType=NUMERIC}
				   )
		   </insert>

		   <!-- 修改 -->
		   <update id="update" parameterType="DomainData">
			   update DOMAIN_DATA
			   <set>
			       <if test="name!=null">
				    NAME=#{name,jdbcType=VARCHAR},
			       </if>
			       <if test="birthday!=null">
				    BIRTHDAY = #{birthday,jdbcType=TIMESTAMP},
			       </if>
			       <if test="createBy != null and createBy.id != null" >
				    CREATE_BY=#{createBy.id,jdbcType=NUMERIC},
			       </if>
			    </set>
			    WHERE 
				ID = #{id,jdbcType=NUMERIC}
		    </update>

		    <!-- 物理删除 -->
		    <delete id="delete" parameterType="java.lang.Integer">
			delete from DOMAIN_DATA where ID = #{id,jdbcType=NUMERIC}
		    </delete>

		    <!-- 逻辑删除 -->
		    <delete id="logicDelete" parameterType="java.lang.Integer">
			update DOMAIN_DATA set ENABLE_FLAG=0 where ID = #{id,jdbcType=NUMERIC}
		    </delete>

		    <!-- 查询全部 -->
		    <select id="query" parameterType="FeedbackData" resultMap="FeedbackData_Result">
			SELECT 
				*
			FROM DOMAIN_DATA
			<where>
				<if test="id != null" >
					AND ID=#{id,jdbcType=NUMERIC}
				</if>
				<if test="name != null" >
					AND NAME like  CONCAT(CONCAT('%', #{name}), '%')
				</if>
				<if test="birthday != null" >
					AND BIRTHDAY=#{birthday,jdbcType=TIMESTAMP}
				</if>
				<if test="isHandle != null" >
					AND CREATE_BY=#{createBy,jdbcType=VARCHAR}
				</if>
			</where>
		    </select>
	</mapper>

   映射文件示例完毕,下来演示Spring对其的整合;

    1、在Spring的配置文件中,配置数据源,BasicDataSource,DriverManagerDataSource

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
			<property name="driverClassName">
				<value>${jdbc.driverClassName}</value>
			</property>
			<property name="url">
				<value>${jdbc.url}</value>  //该值来自于placeHolder
			</property>
			<property name="username">
				<value>${jdbc.username}</value>
			</property>
			<property name="password">
				<value>${jdbc.password}</value>
			</property>
		</bean>

  2、配置SqlSessionFactoryBean

<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
			<property name="dataSource" ref="dataSource" />
			<!-- 指定sqlMapConfig总配置文件,订制的environment在spring容器中不在生效-->
			<property name="configLocation">
				<value>classpath:SqlMapConfig.xml</value>    //mybatis的配置文件路径 其中是对MyBaits性能的一些调优和设置加载项,以及插件的配置(分页插件)
			</property>
			<property name="typeAliasesPackage">   //别名的java实体包路径
				<value>
					com.demo.www.test.bo
				</value>
			</property>
			<!-- 读取mybatis配置文件 -->
			<property name="mapperLocations">     //映射文件的路径
		    <list>
			<value>classpath*:mapper/**/*.xml</value>
		    </list>
		</property>
		</bean>

   3.配置MyBatis持久层操作模板类(采用构造及进行注入)

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

  4。事务的配置 (采用声明式事务,将核心业务逻辑和事务处理逻辑剥离,高内聚、低耦合)

<!-- 事务配置 -->
		<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
		     <property name="dataSource" ref="dataSource" />
		</bean>

		<tx:annotation-driven transaction-manager="transactionManager" />
		<!-- 强制使用cglib代理 如果为false则spring会自动选择-->
		<aop:aspectj-autoproxy proxy-target-class="true" />

	        <!-- 使Spring关注Annotation -->
                <context:annotation-config/>

  5、持久层Mybatis操作模板引用的注入完成相关DAO任务

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics