mybatis常见注意事项

1,705 阅读4分钟
1.用resultType的时候,要保证结果集的列名与java对象的属性相同,而resultMap则不用,
经常使用 select 列名 as 对象属性名 .....from 表名 来转换

2.在mybatis调用存储过程时,传入参数的名字可以不用跟存储过程定义的参数名一致

3.parameterType或parameterMap可以不写。但是需要在mapper接口中采用注解的方式将参数注解进去
eg: getDefultBankCardByMobile( @Param("mobileNo") String mobileNo) ,注解中的参数名与xml中的名字一致

4.parameterMap(常用于存储过程)和resultMap类似,表示将查询结果集中列值的类型一一映射到java对象属性的类型上,在开发过程中不 推荐这种方式。

5.调用存储过程比较简单的方式:

parameterType="java.util.Map" statementType="CALLABLE"                          
resultType="java.util.HashMap   
6.如果是查询,则必须有resultType或resultMap其中一个,resultType不一定非要写 包名+类名

7.数据库为Date,java类型也为Date,mybatis中的jdbcType=TIMESTAMP 时间入库后才精确到秒

8.
select 传入类型
1.如果参数不是对象而是多个参数,需要在dao层的方法中加注解参数
2.参数为map,直接取map的key
insert 传入类型
1.map: insert时直接根据传入map的key取值即可
传出类型 一般没有
update 传入类型
1.String: 如果是一个参数一般不需要注解参数
传出类型 一般不写,默认返回int
delete 传入类型
1.单个属性
传出类型 一般不写,默认返回int

9.新增记录返回id

<!--新增用户关联账户信息-->
<insert id="saveLinkUserAccInfo" parameterType="linkUserAccInfo">  
<selectKey keyProperty="linkNo" resultType="String" order="BEFORE">    
   select sys_guid() from dual  
</selectKey>  
INSERT INTO LINK_USER_ACC_INFO  (LINK_NO, USER_NO)  VALUES
(#{linkNo, jdbcType=VARCHAR},#{userNo, jdbcType=VARCHAR)
</insert>                
10.这种写法不需要去掉AND就可以识别 

SELECT

<include refid="accChkResultColumns"/>

FROM acc_chk_result a

<include refid="accChkResultJoins"/>
<where>
   <if test="beginTradeDay != null and endTradeDay != null and beginTradeDay != '' and endTradeDay != ''">
      AND a.work_day BETWEEN to_char(#{beginTradeDay},'yyyymmdd') AND to_char(#{endTradeDay},'yyyymmdd')
   </if>
</where>
11.decimal(numeric ) 同义,都有两个参数:p(精度)和s(小数位数)

12.对oracle,使用MyBatis框架做更新操作时,如果不指定jdbcType,在该字段需要更新的内容为空时,就会出现1111错误,也就是无效的列类型,这个时候你就要使用jdbcType

13.选择性update的时候,后面的逗号要加,最后一个逗号不用删,会自动解析

14.参数为集合的查询

select*from kj_region a where  pregionid in
    <foreach item="item" index="index" collection="list" open="("separator="," close=")">           
       #{item}       
    </foreach>
15.1个mapper方法中可以有几个操作,比如更新,删除等,使用";"隔开

16.插入集合

<insert id="addRItem" parameterType="java.util.List"> 
   insert into lzf_rental_item_detailsl ( id, rentalInfoId,itemName, number, remark ) values 
  <foreach collection="list" item="item" index= "index" separator =","> 
   ( #{item.id}, #{item.rentalInfoId}, #{item.itemName}, #{item.number}, #{item.remark} )
  </foreach> 
</insert>

17.jdbcType类型没有String且必须大写

18.PageHelper实现分页原理:配置在mybatis-config.xml中,通过实现ibatis的Interceptor接口成为一个拦截器,SqlSessionFactory加载的时候将该拦截器加入拦截器链,通过PageHelper.startPage(...)将分页参数注入进去,执行查询sql前会进入拦截器的方法对sql语句进行改变

19.条件判断用in时,可使用如下

     <if test="riskCodeList != null">                                                                                               and b.riskCode in                                                                                                                 <foreach collection="riskCodeList" index="index" item="riskCode" open="(" separator="," close=")">                                                                                                                #{riskCode}                                                                                                                         </foreach>                                                                                                                       </if>

20.<如果不用cdata,可以用 &lt; 代替 > 用 &gt;

21. 传集合查询的方式:   字段名   in ${deleteResourceEids}