精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

MyBatis中的十個(gè)寶藏技巧!

數(shù)據(jù)庫
今天就從淺入深,分享 10 個(gè)讓人眼前一亮的 MyBatis 開發(fā)技巧,每一個(gè)都配上具體的場(chǎng)景和代碼示例,務(wù)求通俗易懂,希望對(duì)你會(huì)有所幫助。

前言

說到 MyBatis,很多小伙伴都會(huì)用,但未必用得“驚艷”。

實(shí)際上,這個(gè)輕量級(jí)的持久層框架還有很多隱藏的“寶藏技巧”。

如果你能掌握這些技巧,不但能讓開發(fā)更高效,還能避免掉入一些常見的“坑”。

今天就從淺入深,分享 10 個(gè)讓人眼前一亮的 MyBatis 開發(fā)技巧,每一個(gè)都配上具體的場(chǎng)景和代碼示例,務(wù)求通俗易懂,希望對(duì)你會(huì)有所幫助。

1. 靈活使用動(dòng)態(tài) SQL

很多小伙伴在寫 SQL 的時(shí)候,喜歡直接用拼接字符串的方式,比如:

String sql = "SELECT * FROM user WHERE 1=1";
if (name != null) {
    sql += " AND name = '" + name + "'";
}

這種寫法不僅麻煩,而且安全性很差(容易引發(fā) SQL 注入)。

MyBatis 的動(dòng)態(tài) SQL 是專門為解決這種問題設(shè)計(jì)的,你可以用 if、choose、foreach 等標(biāo)簽來動(dòng)態(tài)構(gòu)造 SQL。

示例:動(dòng)態(tài)條件查詢

<select id="findUser" resultType="User">
    SELECT * FROM user
    WHERE 1=1
    <if test="name != null and name != ''">
        AND name = #{name}
    </if>
    <if test="age != null">
        AND age = #{age}
    </if>
</select>

這個(gè)代碼的好處是,SQL 邏輯清晰,不會(huì)因?yàn)槟硞€(gè)參數(shù)為空就導(dǎo)致整個(gè) SQL 報(bào)錯(cuò)。

2. 善用 resultMap 自定義結(jié)果映射

有些小伙伴會(huì)遇到這樣的問題:數(shù)據(jù)庫表字段是下劃線命名,但 Java 對(duì)象是駝峰命名。比如 user_name 對(duì)應(yīng) userName。如果直接用默認(rèn)的 resultType,MyBatis 是無法自動(dòng)映射的。

這個(gè)時(shí)候,用 resultMap 就能完美解決。

示例:自定義結(jié)果映射

<resultMap id="userResultMap" type="User">
    <id column="id" property="id"/>
    <result column="user_name" property="userName"/>
    <result column="age" property="age"/>
</resultMap>

<select id="getUserById" resultMap="userResultMap">
    SELECT id, user_name, age FROM user WHERE id = #{id}
</select>

有了 resultMap,再復(fù)雜的字段映射都可以輕松搞定。

3. 利用 foreach 實(shí)現(xiàn)批量操作

有些小伙伴可能會(huì)遇到這種需求:傳入一個(gè) ID 列表,查詢所有匹配的用戶信息。如果用拼接字符串的方式生成 IN 條件,不但代碼丑,還容易踩坑。

MyBatis 提供了 foreach 標(biāo)簽,可以優(yōu)雅地處理這種場(chǎng)景。

示例:批量查詢

<select id="findUsersByIds" resultType="User">
    SELECT * FROM user WHERE id IN
    <foreach item="id" collection="idList" open="(" separator="," close=")">
        #{id}
    </foreach>
</select>

傳入的 idList 是一個(gè) List 或數(shù)組,MyBatis 會(huì)自動(dòng)幫你展開為 IN (1, 2, 3) 這樣的格式,完全不用擔(dān)心語法問題。

4. MyBatis-Plus 的分頁功能

很多小伙伴在做分頁的時(shí)候,習(xí)慣自己寫 LIMIT 的 SQL,這樣不僅麻煩,還容易出錯(cuò)。

其實(shí),用 MyBatis-Plus 的分頁插件能省不少事。

示例:MyBatis-Plus 分頁功能

Page<User> page = new Page<>(1, 10); // 第 1 頁,每頁 10 條
IPage<User> userPage = userMapper.selectPage(page, null);
System.out.println("總記錄數(shù):" + userPage.getTotal());
System.out.println("當(dāng)前頁數(shù)據(jù):" + userPage.getRecords());

只需引入分頁插件,就能輕松完成分頁操作,簡(jiǎn)直不要太爽。

5. 使用 @Mapper的接口代理

有些小伙伴覺得 XML 文件太多太麻煩,其實(shí) MyBatis 支持純注解的開發(fā)模式,尤其是對(duì)于簡(jiǎn)單的 SQL,非常方便。

示例:注解方式查詢

@Mapper
public interface UserMapper {

    @Select("SELECT * FROM user WHERE id = #{id}")
    User getUserById(int id);

    @Insert("INSERT INTO user(name, age) VALUES(#{name}, #{age})")
    void addUser(User user);
}

用這種方式,可以完全省掉 XML 配置,代碼更加簡(jiǎn)潔。

6. 二級(jí)緩存

MyBatis 內(nèi)置了一級(jí)緩存(SqlSession 范圍內(nèi)),但對(duì)于多次查詢的場(chǎng)景,可以開啟二級(jí)緩存來提升性能。

示例:開啟二級(jí)緩存

<configuration>
    <settings>
        <setting name="cacheEnabled" value="true"/>
    </settings>
</configuration>

<mapper namespace="com.example.mapper.UserMapper">
    <cache/>
    <select id="getUserById" resultType="User">
        SELECT * FROM user WHERE id = #{id}
    </select>
</mapper>

開啟二級(jí)緩存后,同一個(gè) Mapper 下的查詢會(huì)自動(dòng)命中緩存,大幅提高性能。

7. 動(dòng)態(tài)表名切換

有些多租戶系統(tǒng)需要在運(yùn)行時(shí)切換表名,比如按租戶分表。這種情況下,可以用 MyBatis 的動(dòng)態(tài) SQL 特性來實(shí)現(xiàn)。

示例:動(dòng)態(tài)表名

<select id="getDataFromDynamicTable" resultType="Map">
    SELECT * FROM ${tableName} WHERE id = #{id}
</select>

在調(diào)用時(shí)傳入 tableName 參數(shù),MyBatis 會(huì)動(dòng)態(tài)替換表名。

8. 用 typeHandler 自定義類型處理

有些小伙伴可能遇到過這種場(chǎng)景:數(shù)據(jù)庫存的是 1/0,但在代碼里想用 true/false 表示。

這種情況可以通過自定義 typeHandler 來實(shí)現(xiàn)。

示例:自定義 TypeHandler

@MappedTypes(Boolean.class)
@MappedJdbcTypes(JdbcType.INTEGER)
public class BooleanTypeHandler extends BaseTypeHandler<Boolean> {

    @Override
    public void setNonNullParameter(PreparedStatement ps, int i, Boolean parameter, JdbcType jdbcType) throws SQLException {
        ps.setInt(i, parameter ? 1 : 0);
    }

    @Override
    public Boolean getNullableResult(ResultSet rs, String columnName) throws SQLException {
        return rs.getInt(columnName) == 1;
    }
}

在 MyBatis 配置中注冊(cè)這個(gè) typeHandler,就可以實(shí)現(xiàn)自動(dòng)類型轉(zhuǎn)換了。

9. 日志調(diào)試,快速排查問題

開發(fā)中經(jīng)常需要排查 SQL 執(zhí)行的問題,這時(shí) MyBatis 的日志功能非常好用。

通過配置,可以輕松打印出完整的 SQL 和參數(shù)。

示例:開啟日志

<configuration>
    <settings>
        <setting name="logImpl" value="STDOUT_LOGGING"/>
    </settings>
</configuration>

日志會(huì)輸出類似下面的內(nèi)容:

==>  Preparing: SELECT * FROM user WHERE id = ?
==> Parameters: 1(Integer)
<==      Total: 1

有了這些日志,排查問題再也不頭疼了。

10. 多數(shù)據(jù)源支持

當(dāng)系統(tǒng)需要連接多個(gè)數(shù)據(jù)庫時(shí),可以通過 MyBatis 的多數(shù)據(jù)源配置輕松搞定。

示例:配置多數(shù)據(jù)源

@Configuration
@MapperScan(basePackages = "com.example.mapper", sqlSessionTemplateRef = "sqlSessionTemplate1")
public class DataSourceConfig1 {
    @Bean(name = "dataSource1")
    public DataSource dataSource() {
        return DataSourceBuilder.create().build();
    }

    @Bean(name = "sqlSessionFactory1")
    public SqlSessionFactory sqlSessionFactory(@Qualifier("dataSource1") DataSource dataSource) throws Exception {
        SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
        bean.setDataSource(dataSource);
        return bean.getObject();
    }

    @Bean(name = "sqlSessionTemplate1")
    public SqlSessionTemplate sqlSessionTemplate(@Qualifier("sqlSessionFactory1") SqlSessionFactory sqlSessionFactory) {
        return new SqlSessionTemplate(sqlSessionFactory);
    }
}

通過類似的配置,就可以輕松切換多個(gè)數(shù)據(jù)源。

總結(jié)

MyBatis 的魅力在于簡(jiǎn)單、高效,但很多時(shí)候我們用得太“基礎(chǔ)”,沒有發(fā)揮它的全部潛力。

希望這 10 個(gè)技巧能幫你更高效地使用 MyBatis,也讓你的代碼看起來更“驚艷”。

責(zé)任編輯:姜華 來源: 蘇三說技術(shù)
相關(guān)推薦

2024-12-03 14:33:42

Python遞歸編程

2023-11-08 18:05:06

Python類型技巧

2025-08-14 02:00:00

2015-08-24 09:12:00

Redis 技巧

2023-07-02 14:21:06

PythonMatplotlib數(shù)據(jù)可視化庫

2024-10-14 12:17:17

Flutter開源項(xiàng)目

2024-01-30 00:40:10

2010-09-08 14:35:22

CSS

2022-05-12 08:12:51

PythonPip技巧

2023-01-17 16:43:19

JupyterLab技巧工具

2023-10-16 07:55:15

JavaScript對(duì)象技巧

2024-01-06 18:02:18

編程記錄日志

2022-11-07 16:06:15

TypeScript開發(fā)技巧

2011-08-22 12:24:56

nagios

2024-03-04 16:32:02

JavaScript運(yùn)算符

2010-06-18 09:17:51

jQuery

2012-11-23 10:30:28

Responsive響應(yīng)式Web

2024-09-26 15:00:06

2024-09-09 18:18:45

2024-08-27 12:21:52

桌面應(yīng)用開發(fā)Python
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

久久久久成人精品无码| 五月婷婷之婷婷| 青青草免费在线视频| 日本欧美在线观看| 欧美成人精品一区| 美女又爽又黄视频毛茸茸| 日韩欧美一区二区三区在线观看| 国产精品麻豆视频| 国产精品久久久久久久久久久久午夜片 | 国产精品伦理| 一区二区三区欧美| 四虎影院一区二区三区| 欧美 日韩 国产 成人 在线 91 | 青青久草在线| 国产激情精品久久久第一区二区 | 91好色先生tv| 国产精品一区毛片| 欧美人成在线视频| 99热99这里只有精品| 亚洲色图丝袜| 亚洲成人黄色网| 国产传媒免费观看| 三级成人在线| 五月激情综合色| 337p亚洲精品色噜噜狠狠p| aaa在线观看| 91蜜桃婷婷狠狠久久综合9色| 成人国产精品日本在线| 波多野结衣二区三区| 在线亚洲精品| 久久久久久久影院| 青青草免费av| 综合亚洲视频| 久久精品电影一区二区| 奇米网一区二区| 九九久久精品| 亚洲免费中文字幕| 亚洲国产果冻传媒av在线观看| 久久久国产精品入口麻豆| 在线亚洲高清视频| 人妻无码视频一区二区三区| 国产粉嫩在线观看| 亚洲国产成人av好男人在线观看| 成人午夜免费剧场| 尤物网在线观看| 日本一区二区三区四区| 日韩久久久久久久| www免费网站在线观看| 国产午夜精品久久久久久免费视| 欧美激情专区| 国外av在线| 欧美激情一区在线观看| 日韩资源av在线| 国内三级在线观看| 国产欧美一区二区在线| 日本一区二区三区精品视频| 精品无人乱码| 国产欧美久久久精品影院| 天天综合狠狠精品| 日本视频在线免费观看| 成人欧美一区二区三区黑人麻豆| 日本一级淫片演员| 影音先锋中文在线视频| 亚洲自拍欧美精品| 精品国产一区三区| 影视一区二区三区| 欧美高清精品3d| 乳色吐息在线观看| 国产毛片精品| 亚洲欧美制服丝袜| 国产黄色录像视频| 综合亚洲视频| 69视频在线免费观看| 国产成人精品777777| 日本亚洲欧美天堂免费| 91久久精品国产91久久性色| www久久久久久| 91丨九色丨国产丨porny| 日韩精品一区二区三区外面 | 亚洲精品一区二区18漫画| 日韩成人在线看| 亚洲成人a**站| 一级黄色性视频| 99热国内精品| 91禁外国网站| 一级α片免费看刺激高潮视频| 国产一区久久久| 久久久久久久久四区三区| 国产视频福利在线| 亚洲精品乱码久久久久| 日韩精品视频一区二区在线观看| 久久精品嫩草影院| 欧美va亚洲va在线观看蝴蝶网| 精品人妻无码一区二区三区| 91精品秘密在线观看| 97国产精品久久| 中文字幕精品一区二| 丁香亚洲综合激情啪啪综合| 欧美一区二区在线| 一色桃子av在线| 日本道色综合久久| 久久久久久久久久影视| 成人精品影院| 97精品伊人久久久大香线蕉| 中文字幕 欧美激情| youjizz国产精品| 成人手机视频在线| 欧美黑人粗大| 欧美va亚洲va| 日韩欧美国产成人精品免费| 午夜在线a亚洲v天堂网2018| 亚洲在线免费看| 国际av在线| 精品美女久久久久久免费| 国产无色aaa| 国产一区二区在线| 久久久综合av| 亚洲av无码一区二区三区dv| 亚洲国产高清在线观看视频| 日韩欧美国产免费| 高潮按摩久久久久久av免费| 久久久999精品视频| 高潮无码精品色欲av午夜福利| 懂色av一区二区三区蜜臀| 色中文字幕在线观看| 亚洲成人av观看| 亚洲美女性视频| 丰满少妇乱子伦精品看片| 国产精品夜夜嗨| 午夜欧美一区二区三区免费观看| 涩涩涩视频在线观看| 亚洲国产精品悠悠久久琪琪| 久久丫精品久久丫| 国产福利电影一区二区三区| 中文字幕色一区二区| 国产毛片精品久久| 国产丝袜一区二区| 国产成人在线视频观看| 99精品国产视频| 久久久久久久久久久99| 黄色网一区二区| 国产69精品99久久久久久宅男| 国产黄色av片| 亚洲午夜免费电影| 999精品免费视频| 激情综合视频| 精品在线观看一区二区| 捆绑调教日本一区二区三区| 亚洲国产小视频| 天天操中文字幕| 久久久久免费观看| 午夜免费精品视频| 日韩欧美视频| 91精品国产综合久久香蕉| 午夜激情视频在线观看| 欧美顶级少妇做爰| 欧美黄色aaa| 懂色av一区二区三区蜜臀| 波多野结衣综合网| 女人丝袜激情亚洲| 国产精品麻豆va在线播放| 日本成人网址| 日韩精品中文字幕在线不卡尤物| 国产亚洲精品久久久久久无几年桃| 风间由美一区二区三区在线观看| 97视频久久久| 久久99久久人婷婷精品综合 | 国产精品乱码人人做人人爱 | 99久久精品免费看国产| 日日橹狠狠爱欧美超碰| 久久99免费视频| 91精品综合久久久久久五月天| www.久久久久.com| 日韩av影视在线| 中文精品久久久久人妻不卡| 亚洲欧美日韩中文播放 | 精品久久国产视频| 偷拍与自拍一区| 少妇愉情理伦三级| 国产黑丝在线一区二区三区| 缅甸午夜性猛交xxxx| 欧美综合另类| 国产福利久久| 欧美日韩精品一区二区三区视频| 久久精品青青大伊人av| 黄片毛片在线看| 欧美丝袜丝交足nylons| 国产亚洲精品女人久久久久久| 久久综合色婷婷| 日韩视频在线观看一区二区三区| 亚洲裸体俱乐部裸体舞表演av| 亚洲精品tv久久久久久久久| 综合伊人久久| 国产精品老女人精品视频| 成全电影大全在线观看| 中文字幕精品一区二区精品| 六月丁香综合网| 欧美日韩一级黄| 日韩精品视频免费看| 中文字幕在线观看不卡| av网页在线观看| 国内外成人在线| 少妇性饥渴无码a区免费| 一区二区三区网站| 日韩精品一区二区三区外面| 国产一级成人av| 91久久久久久| av一区在线| 777精品视频| 亚洲丝袜精品| 久久九九国产精品怡红院 | 精品国产一区一区二区三亚瑟| 91传媒视频免费| 成人av色网站| 日本视频久久久| 久久电影网站| 久久精品精品电影网| 高h视频在线| 亚洲人午夜精品| 婷婷开心激情网| 欧美成人a在线| 国产成人三级在线播放| 欧美精品在线一区二区| 中国一级特黄视频| 91久久一区二区| 欧美啪啪小视频| 天天综合天天综合色| 久久久全国免费视频| 亚洲欧美一区二区三区国产精品| 夫妇露脸对白88av| 国产欧美精品区一区二区三区| 97人妻天天摸天天爽天天| 成人国产精品免费观看动漫| 欧美人与性动交α欧美精品| 韩国一区二区三区| 亚洲精品视频三区| 久久se这里有精品| 在线观看免费污视频| 日本三级亚洲精品| 久久午夜夜伦鲁鲁一区二区| 乱人伦精品视频在线观看| av观看免费在线| 免费在线观看成人av| 欧美视频第一区| 久久九九99| 日本成人黄色网| 免费视频最近日韩| 性chinese极品按摩| 久久99精品久久久久久动态图| 色婷婷一区二区三区av免费看| 蜜臀av亚洲一区中文字幕| 天天干天天草天天| 国内精品伊人久久久久av影院| 亚洲色图欧美自拍| 国产精品1区二区.| 在线黄色免费网站| 久久这里只有精品首页| 一级肉体全黄裸片| 亚洲视频一区二区在线| 印度午夜性春猛xxx交| 亚洲综合图片区| 影音先锋亚洲天堂| 欧洲视频一区二区| 91精品国产乱码久久久久| 欧美一区二区视频在线观看2020 | 天堂久久一区| 999久久久| 牲欧美videos精品| 亚洲视频精品一区| 国产精品v一区二区三区| 精品久久一二三| 琪琪一区二区三区| 蜜桃视频无码区在线观看| 91蝌蚪porny九色| 成年人网站在线观看视频| 一区二区欧美视频| 中文字幕一区在线播放| 欧美军同video69gay| 亚洲女同志亚洲女同女播放| 亚洲欧美日韩中文视频| 二区三区四区高清视频在线观看| 欧美精品videosex牲欧美| 浪潮色综合久久天堂| 亚洲一区二区三区四区视频| 欧美黄色录像| 一区二区免费电影| 亚洲精品一级| 99热一区二区| 26uuu欧美日本| 岛国毛片在线观看| 91传媒视频在线播放| www黄色网址| 日韩在线中文视频| 日韩脚交footjobhd| 成人在线视频网站| 日本一道高清一区二区三区| 超碰97免费观看| 久久精品免费| 日本一区二区免费视频| 一色屋精品亚洲香蕉网站| 五月婷婷开心网| 日韩午夜av电影| 在线观看完整版免费| 青草青草久热精品视频在线观看| 高清不卡一区| 亚洲欧美国产精品桃花| 99精品福利视频| 欧美熟妇精品一区二区| 国产精品视频一二| 亚洲乱码国产乱码精品| 精品久久国产老人久久综合| 九七久久人人| 国产精品一香蕉国产线看观看| 成人福利一区| 免费在线黄网站| 韩国欧美国产一区| 国产馆在线观看| 欧美图片一区二区三区| 欧美日韩在线中文字幕| 97精品一区二区三区| 一区二区三区亚洲变态调教大结局| 在线观看福利一区| 蜜桃精品视频在线观看| 免费在线观看污| 婷婷丁香久久五月婷婷| 免费观看的毛片| 欧美疯狂性受xxxxx另类| 成人污污www网站免费丝瓜| 亚洲视频sss| 精品一区二区日韩| 91狠狠综合久久久久久| 欧美丝袜第三区| 91大神xh98hx在线播放| 国产成+人+综合+亚洲欧美丁香花| 农村少妇一区二区三区四区五区 | 蜜桃导航-精品导航| 国产日韩欧美三级| 色婷婷免费视频| 黄网动漫久久久| 午夜视频www| 欧美亚州一区二区三区| 亚洲+变态+欧美+另类+精品| 阿v天堂2017| 久久久www成人免费无遮挡大片| 国产精品一区二区三区四| 日韩精品在线视频| 成人私拍视频| 色播亚洲婷婷| 麻豆视频一区二区| 好吊日在线视频| 日韩精品专区在线| 黄在线观看免费网站ktv| 久久久国产精品一区二区三区| 亚洲欧美激情诱惑| 国产精品久久久久无码av色戒| 一本到不卡精品视频在线观看| 国产日韩精品在线看| 国产精品视频自在线| 91精品综合久久久久久久久久久 | 亚洲免费黄色片| 97国产精品久久| 欧美视频网址| 中文字幕剧情在线观看| 亚洲一二三四区不卡| 蜜桃视频在线观看网站| 国产精品香蕉国产| 中文字幕人成人乱码| 国产精品成人无码专区| 在线视频综合导航| 四虎影视成人| 久久久久久欧美精品色一二三四| 日本va欧美va欧美va精品| 国产一二三区精品| 日韩av网站在线| 久久久精品一区二区毛片免费看| 欧美性受xxxx黑人猛交88| www.视频一区| 在线免费看毛片| 欧美精品18videos性欧| av永久不卡| 性感美女一区二区三区| 在线中文字幕一区| 三级福利片在线观看| 免费国产一区二区| 国产一区免费电影| 无码人妻精品一区二区三区9厂 | 欧美h在线观看| 欧美老女人性生活| 欧美人与拘性视交免费看| 日韩精品视频网址| 一本大道久久a久久综合婷婷| 国产一区久久精品| 久久久影院一区二区三区| 国产乱码精品一区二区三区忘忧草| 天天操天天爽天天干| 久久国产精品免费视频| 国产精品自拍区| 在线观看免费视频黄| 欧美精品aⅴ在线视频| 午夜久久中文|