设为首页 收藏本站
查看: 1243|回复: 0

[经验分享] 浅谈MyBatis及与Spring的整合

[复制链接]

尚未签到

发表于 2016-11-26 07:53:59 | 显示全部楼层 |阅读模式
  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任务

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-305628-1-1.html 上篇帖子: mybatis ,列名不一样进行映射。 下篇帖子: [安全] MyBatis如何防止SQL注入
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表