Mybatis-代码走查问题整理
實踐篇
1、#{}和${}的區別
${}
直接替換變量 (有sql注入風險),使用場景:當表名、字段名作為變量傳入時。
#{}
(PreparedStatement) 預處理編譯,先替換為? 然后賦值 添加單引號。
2、使用注解和xml文件sql的方式區別?
注解:簡單明了,無需額外文件。但長sql格式不友好,且無法額外做if等邏輯處理。
sql:能彌補注解sql的缺點,但對于不同場景下共用sql的情況,要處理好參數是否必須傳入的問題。
3、使用map接收結果集時,有時會遇到屬性的類型與預想的不一致。
在使用Map接收時,“type”的數據類型并非Integer,而是Long。這里涉及到JavaType和JDBCType之間的對應關系,在給參數賦值和結果集兩個地方都會遇到。
盡量不要用map(好存不好取,不透明),改用dto等對象實體。明確每個字段的類型。
select case a.type when 1 then 2 when 2 then 3 else 0 end as type from table4、使用druid時,默認批量插入失效?
druid為了安全考慮,默認不開啟批量操作。需要手動配置,以下是在Springboot中的配置。
5、使用ResultMap接收結果集時,需要注意的問題
當遇到map中新增或刪除屬性或數據類型變更等問題時,要考慮其他使用該map的方法。
<resultMap id="BaseResultMap" type="com.aoji.model.TaskTemplateInfo"><id column="id" jdbcType="INTEGER" property="id" /><result column="code" jdbcType="VARCHAR" property="code" /><result column="message" jdbcType="VARCHAR" property="message" /></resultMap>6、批量插入sql時,foreach兩種方式的比較
第一種:?
第二種:? (本質是多條insert,并非一條sql的批量操作。)
<foreach collection="add" item="item" separator=",">insert into table (user_id,create_time, delete_status ) VALUES (#{item.userId},#{item.createTime}, #{item.deleteStatus})</foreach>7、需要并發校驗的場景,不要直接扔給數據庫。
服務層面需處理并發同步問題,若直接扔給數據庫,會加劇數據庫壓力。也會產生很多報錯信息。
<insert id="insertOrUpdateStudentMaterialManage" parameterType="list">INSERT INTO table (`id`,`business_id`,`material_name`,`business_type`,`material_url`,`only_read`,`material_describe`,`material_sort`,`delete_status`,`operator_no`,`operator_name`)VALUES<foreach collection="list" item="material" separator=",">(#{material.id},#{material.businessId}, #{material.materialName}, #{material.businessType}, #{material.materialUrl},#{material.onlyRead},#{material.materialDescribe},#{material.materialSort},#{material.deleteStatus}, #{material.operatorNo},#{material.operatorName})</foreach>on duplicate key updatematerial_name=values(material_name),business_type = values(business_type),material_url = values(material_url),only_read = values(only_read),material_describe = values(material_describe),material_sort = values(material_sort),delete_status=values(delete_status),operator_no=values(operator_no),operator_name=values(operator_name)</insert>8、mapper中方法考慮是否復用時,一定要慎重!
一味的考慮sql語句的復用,會使得原本簡單的sql變得十分復雜臃腫,難以維護。盡量參考單一原則,不能只看當前業務。
原理篇
1、為什么Mybatis不需要為Mapper接口提供實現類?
Mybatis通過動態代理,根據我們提供的xml文件或者CRUD注解,為mapper接口動態的生成實現類。
2、Mybatis的攔截器如何實現?
參見之前博客《【Review】Mybatis-以PageHelper為例分析攔截器》
未完待續…
總結
以上是生活随笔為你收集整理的Mybatis-代码走查问题整理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 第六课 从词向量到NLP分类问题
- 下一篇: RGB/YUV/YCbCr--关于显示,