Mybatis使用过程中的一些总结

1. myBatis choose when:条件查询,以前不太清楚它的含义,都是使用if判断,或在程序里判断,使用了之后,发觉有些场景下还是挺不错的。

场景1:默认排序
<choose>
	<when test="sortName != null and sortType != null">
		ORDER BY ${sortName} ${sortType}
	</when>
	<otherwise>
		ORDER BY order_create_time DESC
	</otherwise>
</choose>

场景2:通过一个字段判断是否支持模糊查询
<choose>
	<when test="isLike != null and isLike !=''">
		<if test="sellerName != null">
			seller_name like #{sellerName,jdbcType=VARCHAR} and
		</if>
	</when>
	<otherwise>
		<if test="sellerName != null">
			seller_name = #{sellerName,jdbcType=VARCHAR} and
		</if>
	</otherwise>
</choose>

2. mybatis的sum()函数返回类型是BigDecimal类型,所以我们处理的时候需要注意下:

   1> 返回 Object 值,然后通过 Integer.parseInt(obj.toString()); 来得到int值;

    2> 返回 BigDecimal 值,然后通过 BigDecimal.intValue()得到需要的值,应该说我们推荐使用第二种方法。

   3> 如果指定resultType为Long类型的话,则不用考虑BigDecimal;

<select id="selectByParams" resultType="java.util.Map" parameterType="java.util.Map">
		select sum(amount) as amountTotal,company_id as companyId
		from test
		<include refid="selectByParamsWhere" />
</select>

3. 同理,mybatis的count()函数返回类型是Long;


4. mybatis的#{} 和 ${}的不同场景,或者说区别:

  1) #{},预编译SQL时,会将传入的数据都当成一个字符串,会对自动传入的数据加一个引号; ${}仅仅是文本替换。如:

select * from student order by #{stuId}
会转化为:
select * from student order by 'stu_id'
select * from student order by ${stuId}
会转化为:
select * from student order by stu_id
  2) ${}一般用在order by, limit, group by等场景
<if test=" offset != null and limit != null">
	limit ${offset}, ${limit}
</if>
  3) 能用#{}实现的方式就不要用${}来实现,主要是为了防止sql注入问题;比如:

select * from ${tableName} where id = #{name}
假如,我们的参数 tableName 为  
user; delete user; --
那么 SQL 动态解析阶段之后,预编译之前的 sql 将变为:
select * from user; delete user; -- where name = ?;
-- 之后的语句将作为注释,不起作用,因此本来的一条查询语句偷偷的包含了一个删除表数据的 SQL。

  4) 直接接受从用户传入的内容并直接访问数据库,这种做法是不安全的。这会导致潜在的SQL注入攻击,因此不应该允许用户输入的数据直接访问数据库,应该对输入的数据自行转义并检查。


5. mybatis在查询的时候,如果返回的是map而不是实体对象的话,map中的value如果为null的话,那这个字段就没有返回,这样的话可能会有空指针的出现;

  1)  一种方式就是不返回map,返回实体对象,然后映射一下;

  2)  另一种方式,网上说的,不过还没验证过;

在mybatis的配置文件中加入,mybatis必须3.2版本以上
<settings>  
  	<setting name="cacheEnabled" value="true"/>   
    <setting name="callSettersOnNulls" value="true"/>  
</settings>  

  3)  调用到这个接口的地方进行非空判断;


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值