日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Mybatis-代码走查问题整理

發布時間:2023/12/10 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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 table

4、使用druid時,默認批量插入失效?
druid為了安全考慮,默認不開啟批量操作。需要手動配置,以下是在Springboot中的配置。

@Bean@ConfigurationProperties(prefix = "spring.datasource")public DataSource dataSource() {DruidDataSource datasource = new DruidDataSource();List<Filter> filters = new ArrayList<>();filters.add(wallFilter());datasource.setProxyFilters(filters);return datasource;}@Beanpublic WallFilter wallFilter(){WallFilter wallFilter = new WallFilter();//允許執行多條SQLWallConfig config = new WallConfig();config.setMultiStatementAllow(true);wallFilter.setConfig(config);return wallFilter;}

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 into table (user_id,create_time, delete_status ) VALUES<foreach collection="add" item="item" separator=",">(#{item.userId},#{item.createTime}, #{item.deleteStatus})</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-代码走查问题整理的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。