mybatis学习笔记

公司查询数据库的方式是利用的mybatis框架,在期间遇到了mybatis相关的困难,同时也学习了很多。特把在工作和学习的过程中关于mybatis的知识整理下来。

=================================

Mybatis的入门

=================================

如果想先对Mybatis做个大致了解,可以通过如下文章学习

http://blog.csdn.net/nlwangxin/article/details/25997893

http://lsxy117.iteye.com/blog/1407416

=================================

ECP框架是我们公司的框架。ECP是由mybatis和spring框架综合而成,虽然语言方面可能与正常的JAVA语言有些许差别,但是主题思想是相通的,
对于数据库的框架是使用的mybatis。
applicationContext.xml 是配置JDBC连接的文件
其中包括 sqlSessionFactory 和 transactionManager。这两个都要引入数据源的连接,该连接是JDBC格式的bean,id为myDataSource
<bean id="myDataSource"
		class="org.apache.commons.dbcp.BasicDataSource">
		<property name="driverClassName"
			value="oracle.jdbc.driver.OracleDriver">
		</property>
		<property name="url"
			value="jdbc:oracle:thin:@127.0.0.1:1521:xe">
		</property>
		<property name="username" value="demo"></property>
		<property name="password" value="demo"></property>
	</bean>

	<bean id="sqlSessionFactory"
		class="org.mybatis.spring.SqlSessionFactoryBean">
		<property name="dataSource" ref="myDataSource" />
	</bean>
        <bean id="EXT_userMapper" class="com.hisun.ics.spring.exam01.DumpETF">
        </bean>
	<bean id="transactionManager"
		class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
		<property name="dataSource" ref="myDataSource" />
	</bean>
后台JAVA代码调用进行增删改查
./app/mbu/classes/com/murong/ecp/app/mbu/action/bmbuurm7/T4800721.java
./app/mbu/classes/com/murong/ecp/app/mbu/mapper/bmbuurm7/T4800721Mapper.xml
ECP框架中每个交易 java类对应一个Mapper.xml文件
JAVA类负责后台逻辑的处理
Mapper.xml负责后台JAVA类调用数据库查询的mybatis格式的语句
例子 交易T4800721.java 是后台主交易,T4800721Mapper.xml 是调用数据库的文件
后面以T4800721.java和T4800721Mapper.xml为主讲述,ECP框架中以交易码串联一个逻辑,
比如前面两个文件属于交易码4800721
Mapper文件的namespace以交易码4800721命名,这样T4800721.java在调用Mapper.xml时,可唯一调用到T4800721Mapper.xml,
<?xml version='1.0' encoding='GBK' ?>
<mapper namespace="4800721" >
	<update id="upd_urm_detail_s">
        <![CDATA[
		UPDATE T_MER_PREDEPOSIT  SET CHECK_TIME=#{check_time},
			where jrn_no=#{jrn_no}
        ]]>
	</update>
	<delete id="del_predeposit">
        <![CDATA[
		delete from T_MER_PREDEPOSIT where JRN_NO = #{delete_jrn_no} and MERC_ID = #{delete_merc_id}
			and BUS_MMO = #{delete_bus_mmo} and RMK1 = #{delete_merc_nm}
        ]]>
	</delete>
	<update id="upd_predeposit">
        <![CDATA[
		update T_MER_PREDEPOSIT set merc_id = #{new_merc_id},rmk1 = #{new_merc_nm},rmk2 = #{bus_mmo_des},
			bus_mmo = #{bus_mmo_set},cur_amt=#{cur_amt},warn_line_amt = #{warn_line},
			warn_mbl = #{warn_mbl},warn_msg=#{warn_msg}
			where jrn_no = #{modify_jrn_no}
        ]]>
	</update>
	<select id="qry_delete_mercnm">
        <![CDATA[
		select RMK1 as d_mercnm, RMK2 as d_bustype from T_MER_PREDEPOSIT where JRN_NO = #{delete_jrn_no} and MERC_ID = #{delete_merc_id}
			and BUS_MMO = #{delete_bus_mmo} and RMK1 = #{delete_merc_nm}
        ]]>
	</select>
	<insert id="insert_banner_info">
        <![CDATA[
		insert into t_cmw_banner_info(BANNER_NO,PRJ_NO,BANNER_URL,BANNER_LEVEL,PRJ_NME,PRJ_DONATE_TYP,
			PRJ_CYCLE,TARGET_AMT,PRJ_STATUS,PRJ_RAISE_COUNT,RAISED_AMT,CRE_DT,CRE_TM,TM_SMP) 
		values(#{banner_no},#{prj_no},#{prj_poster},#{banner_level},#{prj_name},#{prj_donate_type},
			#{prj_cycle},#{prj_raise_amt},#{prj_status},#{ord_count},#{ord_amt},#{prj_cre_dt},#{prj_cre_tm},#{tm_smp})
		
        ]]>
	</insert>
</mapper>
=================================
Mybatis中#和$
=================================
首先对于Mybatis中获取数据的值,我们公司的代码中有用#的,有用$的,甚是疑惑,便从网上查到#和$都可以使用,但是最好使用#,我查看我们公司的代码获取值得方式也是用#的多
MyBatis中#和$的区别
1. #将传入的数据都当成一个字符串,会对自动传入的数据加一个双引号。如:order by #user_id#,如果传入的值是111,那么解析成sql时的值为order by "111", 如果传入的值是id,则解析成的sql为order by "id".
2. $将传入的数据直接显示生成在sql中。如:order by $user_id$,如果传入的值是111,那么解析成sql时的值为order by user_id,  如果传入的值是id,则解析成的sql为order by id.
3. #方式能够很大程度防止sql注入。
4.$方式无法防止Sql注入。
5.$方式一般用于传入数据库对象,例如传入表名. 
6.一般能用#的就别用$.
但是在进行模糊查询时。
比如说 卡券名称 要进行模糊查询 关键字like后面跟的的$符号,对于是否为空可以用#
coup_nm like '%${coup_nm}%' or #{coup_nm} is null
介绍完mybatis中使用#还是$。当然这个映射配置是设置在我们另一个映射配置文件中,这不是重点,只要知道java和Mapper是一一对应的,就可以了。查询ECP框架使用方法PUBATCUtil.queryForObjectIgnore,第一个参数是数据总线,第二个是调用Mapper文件的查询id,
该方法的功能是把查询到的数据存入到数据总线bizCtx中
PUBATCUtil.queryForObjectIgnore(bizCtx, "qry_delete_mercnm");
==================================================================
Mapper.xml使用的节点是select节点 id设置在本交易码中是唯一的qry_delete_mercnm,与java代码中PUBATCUtil.queryForObjectIgnore的第二个参数对应
<select id="qry_delete_mercnm">
        <![CDATA[
		select RMK1 as d_mercnm, RMK2 as d_bustype from T_MER_PREDEPOSIT where JRN_NO = #{delete_jrn_no} and MERC_ID = #{delete_merc_id}
			and BUS_MMO = #{delete_bus_mmo} and RMK1 = #{delete_merc_nm}
        ]]>
	</select>
更新
ECP框架使用方法PUBATCUtil.updateSqlIgnore,第一个参数是数据总线,第二个是调用Mapper文件的查询id,
该方法的功能是把查询到的数据存入到数据总线bizCtx中
PUBATCUtil.updateSqlIgnore(bizCtx, "upd_predeposit");
Mapper.xml使用的节点是update节点 id设置在本交易码中是唯一的upd_predeposit,与java代码中PUBATCUtil.updateSqlIgnore的第二个参数对应
<update id="upd_urm_detail_s">
        <![CDATA[
		UPDATE T_MER_PREDEPOSIT  SET CHECK_TIME=#{check_time},
			where jrn_no=#{jrn_no}
        ]]>
	</update>
删除
ECP框架使用方法PUBATCUtil.updateSqlIgnore,删除跟更新调用的方法一样,第一个参数是数据总线,第二个是调用Mapper文件的查询id,
该方法的功能是把查询到的数据存入到数据总线bizCtx中
PUBATCUtil.updateSqlIgnore(bizCtx, "del_predeposit");
Mapper.xml使用的节点是delete节点 id设置在本交易码中是唯一的del_predeposit,与java代码中PUBATCUtil.updateSqlIgnore的第二个参数对应
	<delete id="del_predeposit">
        <![CDATA[
		delete from T_MER_PREDEPOSIT where JRN_NO = #{delete_jrn_no} and MERC_ID = #{delete_merc_id}
			and BUS_MMO = #{delete_bus_mmo} and RMK1 = #{delete_merc_nm}
        ]]>
	</delete>
插入
ECP框架使用方法PUBATCUtil.updateSql,插入,删除跟更新调用的方法一样,第一个参数是数据总线,第二个是调用Mapper文件的查询id,
该方法的功能是把查询到的数据存入到数据总线bizCtx中
PUBATCUtil.updateSql(bizCtx,"insert_banner_info");
Mapper.xml使用的节点是insert节点 id设置在本交易码中是唯一的insert_banner_info,与java代码中PUBATCUtil.updateSql的第二个参数对应
<insert id="insert_banner_info">
        <![CDATA[
		insert into t_cmw_banner_info(BANNER_NO,PRJ_NO,BANNER_URL,BANNER_LEVEL,PRJ_NME,PRJ_DONATE_TYP,
			PRJ_CYCLE,TARGET_AMT,PRJ_STATUS,PRJ_RAISE_COUNT,RAISED_AMT,CRE_DT,CRE_TM,TM_SMP) 
		values(#{banner_no},#{prj_no},#{prj_poster},#{banner_level},#{prj_name},#{prj_donate_type},
			#{prj_cycle},#{prj_raise_amt},#{prj_status},#{ord_count},#{ord_amt},#{prj_cre_dt},#{prj_cre_tm},#{tm_smp})
		
        ]]>
	</insert>

ECP中没有使用自动生成SQL的方式,如果想使用自动生成的方式,可参考
文章
使用Mybatis Generator自动生成Mybatis相关代码
这篇文章介绍的生成方式,亲自测试过,可以使用
后续继续整理完善


  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值