{"id":508,"date":"2025-03-24T08:53:19","date_gmt":"2025-03-23T23:53:19","guid":{"rendered":"https:\/\/dexall.co.jp\/articles\/?p=508"},"modified":"2025-03-24T08:53:19","modified_gmt":"2025-03-23T23:53:19","slug":"mybatis-foreach%e3%81%ae%e5%ae%8c%e5%85%a8%e3%82%ac%e3%82%a4%e3%83%89%ef%bc%9a7%e3%81%a4%e3%81%ae%e5%ae%9f%e8%b7%b5%e4%be%8b%e3%81%a83%e3%81%a4%e3%81%ae%e5%bf%9c%e7%94%a8%e3%83%91%e3%82%bf%e3%83%bc","status":"publish","type":"post","link":"https:\/\/dexall.co.jp\/articles\/?p=508","title":{"rendered":"MyBatis foreach\u306e\u5b8c\u5168\u30ac\u30a4\u30c9\uff1a7\u3064\u306e\u5b9f\u8df5\u4f8b\u30683\u3064\u306e\u5fdc\u7528\u30d1\u30bf\u30fc\u30f3\u3067\u4f7f\u3044\u3053\u306a\u3059"},"content":{"rendered":"\n<div class=\"toc\"><br \/>\n<b>Warning<\/b>:  Undefined array key \"is_admin\" in <b>\/home\/xs392991\/dexall.co.jp\/public_html\/articles\/wp-content\/themes\/sango-theme\/library\/gutenberg\/dist\/classes\/Toc.php<\/b> on line <b>116<\/b><br \/>\n<br \/>\n<b>Warning<\/b>:  Undefined array key \"is_category_top\" in <b>\/home\/xs392991\/dexall.co.jp\/public_html\/articles\/wp-content\/themes\/sango-theme\/library\/gutenberg\/dist\/classes\/Toc.php<\/b> on line <b>121<\/b><br \/>\n<br \/>\n<b>Warning<\/b>:  Undefined array key \"is_top\" in <b>\/home\/xs392991\/dexall.co.jp\/public_html\/articles\/wp-content\/themes\/sango-theme\/library\/gutenberg\/dist\/classes\/Toc.php<\/b> on line <b>128<\/b><br \/>\n    <div id=\"toc_container\" class=\"sgb-toc--bullets js-smooth-scroll\" data-dialog-title=\"\u76ee\u6b21\">\n      <p class=\"toc_title\">\u76ee\u6b21 <\/p>\n      <ul class=\"toc_list\">  <li class=\"first\">    <a href=\"#i-0\">MyBatis foreach\u3068\u306f\uff1f\u57fa\u790e\u304b\u3089\u7406\u89e3\u3059\u308b\u52d5\u7684SQL\u306e\u5fc5\u9808\u6a5f\u80fd<\/a>    <ul class=\"menu_level_1\">      <li class=\"first\">        <a href=\"#i-1\">foreach\u30bf\u30b0\u306e\u57fa\u672c\u69cb\u6587\u3068\u4f7f\u7528\u76ee\u7684<\/a>      <\/li>      <li class=\"last\">        <a href=\"#i-2\">\u52d5\u7684SQL\u306b\u304a\u3051\u308bforeach\u306e\u91cd\u8981\u6027<\/a>      <\/li>    <\/ul>  <\/li>  <li>    <a href=\"#i-4\">MyBatis foreach\u306e\u57fa\u672c\u7684\u306a\u4f7f\u3044\u65b9\uff1a7\u3064\u306e\u5b9f\u8df5\u4f8b<\/a>    <ul class=\"menu_level_1\">      <li class=\"first\">        <a href=\"#i-5\">IN\u53e5\u3067\u306eforeach\u306e\u6d3b\u7528\u65b9\u6cd5<\/a>      <\/li>      <li>        <a href=\"#i-6\">INSERT\u6587\u3067\u306e\u4e00\u62ec\u767b\u9332\u30d1\u30bf\u30fc\u30f3<\/a>      <\/li>      <li>        <a href=\"#i-7\">UPDATE\u6587\u3067\u306e\u4e00\u62ec\u66f4\u65b0\u30c6\u30af\u30cb\u30c3\u30af<\/a>      <\/li>      <li>        <a href=\"#i-8\">DELETE\u6587\u3067\u306e\u8907\u6570\u6761\u4ef6\u524a\u9664<\/a>      <\/li>      <li>        <a href=\"#i-9\">WHERE\u53e5\u3067\u306e\u8907\u6570\u6761\u4ef6\u691c\u7d22<\/a>      <\/li>      <li>        <a href=\"#i-10\">VALUES\u53e5\u3067\u306e\u8907\u6570\u30ec\u30b3\u30fc\u30c9\u4f5c\u6210<\/a>      <\/li>      <li class=\"last\">        <a href=\"#i-11\">JOIN\u53e5\u3067\u306e\u8907\u6570\u30c6\u30fc\u30d6\u30eb\u7d50\u5408<\/a>      <\/li>    <\/ul>  <\/li>  <li>    <a href=\"#i-13\">MyBatis foreach\u306e\u5fdc\u7528\u30d1\u30bf\u30fc\u30f3\uff1a3\u3064\u306e\u5b9f\u8df5\u7684\u306a\u30b1\u30fc\u30b9\u30b9\u30bf\u30c7\u30a3<\/a>    <ul class=\"menu_level_1\">      <li class=\"first\">        <a href=\"#i-14\">\u30cd\u30b9\u30c8\u3057\u305fforeach\u3067\u8907\u96d1\u306a\u968e\u5c64\u69cb\u9020\u3092\u51e6\u7406\u3059\u308b<\/a>      <\/li>      <li>        <a href=\"#i-17\">\u52d5\u7684\u306a\u30ab\u30e9\u30e0\u540d\u306e\u751f\u6210\u3067\u30af\u30a8\u30ea\u3092\u6700\u9069\u5316\u3059\u308b<\/a>      <\/li>      <li class=\"last\">        <a href=\"#i-19\">\u6761\u4ef6\u5206\u5c90\u3068\u7d44\u307f\u5408\u308f\u305b\u3066\u67d4\u8edf\u306a\u30af\u30a8\u30ea\u3092\u69cb\u7bc9\u3059\u308b<\/a>      <\/li>    <\/ul>  <\/li>  <li>    <a href=\"#i-21\">MyBatis foreach\u306e\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u6700\u9069\u5316\u3068\u30d9\u30b9\u30c8\u30d7\u30e9\u30af\u30c6\u30a3\u30b9<\/a>    <ul class=\"menu_level_1\">      <li class=\"first\">        <a href=\"#i-22\">\u5927\u91cf\u30c7\u30fc\u30bf\u51e6\u7406\u6642\u306e\u6ce8\u610f\u70b9\u3068\u5bfe\u7b56<\/a>      <\/li>      <li>        <a href=\"#i-25\">N+1\u554f\u984c\u3092\u9632\u3050\u305f\u3081\u306e\u5b9f\u88c5\u65b9\u6cd5<\/a>      <\/li>      <li>        <a href=\"#i-28\">\u4fdd\u5b88\u6027\u3092\u9ad8\u3081\u308b\u305f\u3081\u306e\u30b3\u30fc\u30c7\u30a3\u30f3\u30b0\u898f\u7d04<\/a>      <\/li>      <li class=\"last\">        <a href=\"#i-33\">\u5b9f\u88c5\u306e\u30c1\u30a7\u30c3\u30af\u30ea\u30b9\u30c8<\/a>      <\/li>    <\/ul>  <\/li>  <li>    <a href=\"#i-34\">MyBatis foreach\u3067\u3088\u304f\u3042\u308b\u30a8\u30e9\u30fc\u3068\u89e3\u6c7a\u65b9\u6cd5<\/a>    <ul class=\"menu_level_1\">      <li class=\"first\">        <a href=\"#i-35\">\u69cb\u6587\u30a8\u30e9\u30fc\u306e\u4e3b\u306a\u539f\u56e0\u3068\u5bfe\u51e6\u6cd5<\/a>      <\/li>      <li>        <a href=\"#i-38\">\u5b9f\u884c\u6642\u30a8\u30e9\u30fc\u306e\u30c8\u30e9\u30d6\u30eb\u30b7\u30e5\u30fc\u30c6\u30a3\u30f3\u30b0<\/a>      <\/li>      <li class=\"last\">        <a href=\"#i-41\">\u30c7\u30d0\u30c3\u30b0\u306e\u305f\u3081\u306e\u30ed\u30b0\u8a2d\u5b9a\u3068\u6d3b\u7528\u65b9\u6cd5<\/a>      <\/li>    <\/ul>  <\/li>  <li class=\"last\">    <a href=\"#i-45\">\u307e\u3068\u3081\uff1aMyBatis foreach\u30de\u30b9\u30bf\u30fc\u3078\u306e\u6b21\u306e\u30b9\u30c6\u30c3\u30d7<\/a>    <ul class=\"menu_level_1\">      <li class=\"first\">        <a href=\"#i-46\">\u5b9f\u88c5\u6642\u306e\u91cd\u8981\u30dd\u30a4\u30f3\u30c8\u7dcf\u307e\u3068\u3081<\/a>      <\/li>      <li>        <a href=\"#i-49\">\u3055\u3089\u306a\u308b\u5b66\u7fd2\u30ea\u30bd\u30fc\u30b9\u306e\u7d39\u4ecb<\/a>      <\/li>      <li>        <a href=\"#i-55\">\u6700\u7d42\u30c1\u30a7\u30c3\u30af\u30ea\u30b9\u30c8<\/a>      <\/li>      <li class=\"last\">        <a href=\"#i-56\">\u6b21\u306e\u30b9\u30c6\u30c3\u30d7\u306b\u5411\u3051\u3066<\/a>      <\/li>    <\/ul>  <\/li><\/ul>\n      <a href=\"#\" class=\"sgb-toc-button js-toc-button\" rel=\"nofollow\" data-open-dialog=\"true\"><i class=\"fa fa-list\"><\/i><span class=\"sgb-toc-button__text\">\u76ee\u6b21\u3078<\/span><\/a>\n    <\/div><\/div><h2 class=\"wp-block-heading\" id=\"i-0\">MyBatis foreach\u3068\u306f\uff1f\u57fa\u790e\u304b\u3089\u7406\u89e3\u3059\u308b\u52d5\u7684SQL\u306e\u5fc5\u9808\u6a5f\u80fd<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-1\">foreach\u30bf\u30b0\u306e\u57fa\u672c\u69cb\u6587\u3068\u4f7f\u7528\u76ee\u7684<\/h3>\n\n\n\n<p>MyBatis\u306eforeach\u30bf\u30b0\u306f\u3001\u30b3\u30ec\u30af\u30b7\u30e7\u30f3\u3084\u30de\u30c3\u30d7\u3092\u53cd\u5fa9\u51e6\u7406\u3059\u308b\u305f\u3081\u306e\u5f37\u529b\u306a\u6a5f\u80fd\u3067\u3059\u3002\u4e3b\u306bIN\u53e5\u3067\u306e\u8907\u6570\u6761\u4ef6\u6307\u5b9a\u3084\u3001\u30d0\u30c3\u30c1\u51e6\u7406\u3067\u306e\u4e00\u62ec\u30c7\u30fc\u30bf\u64cd\u4f5c\u306b\u4f7f\u7528\u3055\u308c\u307e\u3059\u3002<\/p>\n\n\n\n<div class=\"wp-block-sgb-block-simple sgb-box-simple sgb-box-simple--title-normal sgb-box-simple--with-border\"><div style=\"background-color:var(--wp--preset--color--sango-main);color:#FFF\" class=\"sgb-box-simple__title\">\u57fa\u672c\u69cb\u6587<\/div><div class=\"sgb-box-simple__body\" style=\"border-color:var(--wp--preset--color--sango-main);background-color:#FFF\">\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">&lt;foreach collection=\"\u30b3\u30ec\u30af\u30b7\u30e7\u30f3\u540d\" \n         item=\"\u8981\u7d20\u3092\u53c2\u7167\u3059\u308b\u969b\u306e\u5909\u6570\u540d\"\n         index=\"\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u3092\u53c2\u7167\u3059\u308b\u969b\u306e\u5909\u6570\u540d\"\n         open=\"\u958b\u59cb\u6587\u5b57\u5217\"\n         separator=\"\u533a\u5207\u308a\u6587\u5b57\"\n         close=\"\u7d42\u4e86\u6587\u5b57\u5217\"&gt;\n  #{item}\n&lt;\/foreach&gt;<\/pre>\n<\/div><\/div>\n\n\n\n<div class=\"wp-block-sgb-message\"><div class=\"memo sng-shadow-0\" style=\"border-radius:0px;background-color:#fff9e6;color:#ffb36b\"><div class=\"memo_ttl dfont\"><span class=\"sng-box-msg__icon\" style=\"background:#ffb36b\"><i class=\"fas fa-pencil-alt\"><\/i><\/span><div class=\"sng-box-msg__title\">\u4e3b\u306a\u5c5e\u6027\u306e\u8aac\u660e\uff1a<\/div><\/div><div class=\"sng-box-msg__contents\">\n<ul class=\"wp-block-list\">\n<li><code>collection<\/code>: \u53cd\u5fa9\u51e6\u7406\u3059\u308b\u5bfe\u8c61\uff08List\u3001\u914d\u5217\u3001Map\uff09\u3092\u6307\u5b9a<\/li>\n\n\n\n<li><code>item<\/code>: \u5404\u8981\u7d20\u3092\u53c2\u7167\u3059\u308b\u969b\u306e\u5909\u6570\u540d<\/li>\n\n\n\n<li><code>index<\/code>: \u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u307e\u305f\u306fMap\u306e\u30ad\u30fc\u3092\u53c2\u7167\u3059\u308b\u5909\u6570\u540d<\/li>\n\n\n\n<li><code>open<\/code>: \u7d50\u679c\u306e\u5148\u982d\u306b\u4ed8\u52a0\u3059\u308b\u6587\u5b57\u5217<\/li>\n\n\n\n<li><code>separator<\/code>: \u8981\u7d20\u9593\u306e\u533a\u5207\u308a\u6587\u5b57<\/li>\n\n\n\n<li><code>close<\/code>: \u7d50\u679c\u306e\u672b\u5c3e\u306b\u4ed8\u52a0\u3059\u308b\u6587\u5b57\u5217<\/li>\n<\/ul>\n<\/div><\/div><\/div>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-2\">\u52d5\u7684SQL\u306b\u304a\u3051\u308bforeach\u306e\u91cd\u8981\u6027<\/h3>\n\n\n\n<p>foreach\u30bf\u30b0\u304c\u52d5\u7684SQL\u306b\u304a\u3044\u3066\u91cd\u8981\u306a\u7406\u7531\u306f\u3001\u4ee5\u4e0b\u306e3\u3064\u306e\u89b3\u70b9\u304b\u3089\u8aac\u660e\u3067\u304d\u307e\u3059\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u30af\u30a8\u30ea\u306e\u52d5\u7684\u751f\u6210<\/strong>\n<ul class=\"wp-block-list\">\n<li>\u5b9f\u884c\u6642\u306e\u6761\u4ef6\u306b\u5fdc\u3058\u3066\u6700\u9069\u306aSQL\u3092\u751f\u6210<\/li>\n\n\n\n<li>\u53ef\u5909\u9577\u306e\u6761\u4ef6\u306b\u5bfe\u5fdc\u53ef\u80fd<\/li>\n\n\n\n<li>\u30b3\u30fc\u30c9\u306e\u5197\u9577\u6027\u3092\u524a\u6e1b<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>\u30d0\u30c3\u30c1\u51e6\u7406\u306e\u52b9\u7387\u5316<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">   &lt;!-- \u8907\u6570\u30ec\u30b3\u30fc\u30c9\u306e\u4e00\u62ecINSERT\u4f8b --&gt;\n   &lt;insert id=\"bulkInsert\" parameterType=\"list\"&gt;\n     INSERT INTO users (name, email) VALUES\n     &lt;foreach collection=\"list\" item=\"user\" separator=\",\"&gt;\n       (#{user.name}, #{user.email})\n     &lt;\/foreach&gt;\n   &lt;\/insert&gt;<\/pre>\n\n\n\n<ol start=\"3\" class=\"wp-block-list\">\n<li><strong>\u4fdd\u5b88\u6027\u3068\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u306e\u5411\u4e0a<\/strong>\n<ul class=\"wp-block-list\">\n<li>\u30d7\u30ea\u30da\u30a2\u30c9\u30b9\u30c6\u30fc\u30c8\u30e1\u30f3\u30c8\u306e\u6d3b\u7528\u306b\u3088\u308bSQL\u30a4\u30f3\u30b8\u30a7\u30af\u30b7\u30e7\u30f3\u5bfe\u7b56<\/li>\n\n\n\n<li>\u30d1\u30e9\u30e1\u30fc\u30bf\u306e\u30a8\u30b9\u30b1\u30fc\u30d7\u51e6\u7406\u306e\u81ea\u52d5\u5316<\/li>\n\n\n\n<li>\u30b3\u30fc\u30c9\u306e\u53ef\u8aad\u6027\u5411\u4e0a<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-3\">foreach\u306e\u6d3b\u7528\u30b7\u30fc\u30f3\u3068\u5229\u70b9<\/h4>\n\n\n<div id=\"id-e18cc03b-403b-4ae3-9558-1447fa55b556\">\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>\u6d3b\u7528\u30b7\u30fc\u30f3<\/th><th>\u5229\u70b9<\/th><th>\u5177\u4f53\u4f8b<\/th><\/tr><\/thead><tbody><tr><td>IN\u53e5\u3067\u306e\u6761\u4ef6\u6307\u5b9a<\/td><td>\u8907\u6570\u306e\u6761\u4ef6\u3092\u52d5\u7684\u306b\u6307\u5b9a\u53ef\u80fd<\/td><td>ID\u4e00\u89a7\u3067\u306e\u691c\u7d22<\/td><\/tr><tr><td>\u30d0\u30c3\u30c1INSERT<\/td><td>\u4e00\u62ec\u767b\u9332\u51e6\u7406\u306e\u52b9\u7387\u5316<\/td><td>\u8907\u6570\u30e6\u30fc\u30b6\u30fc\u306e\u540c\u6642\u767b\u9332<\/td><\/tr><tr><td>\u8907\u6570UPDATE<\/td><td>\u30c8\u30e9\u30f3\u30b6\u30af\u30b7\u30e7\u30f3\u5236\u5fa1\u304c\u5bb9\u6613<\/td><td>\u30b9\u30c6\u30fc\u30bf\u30b9\u4e00\u62ec\u66f4\u65b0<\/td><\/tr><tr><td>\u52d5\u7684\u30ab\u30e9\u30e0\u6307\u5b9a<\/td><td>\u5fc5\u8981\u306a\u30ab\u30e9\u30e0\u306e\u307f\u3092\u64cd\u4f5c<\/td><td>\u53ef\u5909\u30d1\u30e9\u30e1\u30fc\u30bf\u3067\u306e\u66f4\u65b0<\/td><\/tr><\/tbody><\/table><\/figure>\n<\/div>\n\n\n<div class=\"wp-block-sgb-message\"><div class=\"memo sng-shadow-0\" style=\"border-radius:0px;background-color:#ffebeb;color:#f88080\"><div class=\"memo_ttl dfont\"><span class=\"sng-box-msg__icon\" style=\"background:#f88080\"><i class=\"fas fa-exclamation\"><\/i><\/span><div class=\"sng-box-msg__title\">\u5b9f\u88c5\u6642\u306e\u6ce8\u610f\u70b9<\/div><\/div><div class=\"sng-box-msg__contents\">\n<ol class=\"wp-block-list\">\n<li><strong>\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u3078\u306e\u914d\u616e<\/strong>\n<ul class=\"wp-block-list\">\n<li>\u5927\u91cf\u30c7\u30fc\u30bf\u51e6\u7406\u6642\u306f\u30d0\u30c3\u30c1\u30b5\u30a4\u30ba\u306e\u9069\u5207\u306a\u8a2d\u5b9a\u304c\u91cd\u8981<\/li>\n\n\n\n<li>\u4e0d\u8981\u306a\u30eb\u30fc\u30d7\u3092\u907f\u3051\u308b\u305f\u3081\u306e\u6761\u4ef6\u8a2d\u8a08<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>\u53ef\u8aad\u6027\u306e\u7dad\u6301<\/strong>\n<ul class=\"wp-block-list\">\n<li>\u9069\u5207\u306a\u30a4\u30f3\u30c7\u30f3\u30c8\u3068\u30b3\u30e1\u30f3\u30c8\u306e\u6d3b\u7528<\/li>\n\n\n\n<li>\u8907\u96d1\u306a\u30cd\u30b9\u30c8\u3092\u907f\u3051\u305f\u8a2d\u8a08<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>\u30a8\u30e9\u30fc\u30cf\u30f3\u30c9\u30ea\u30f3\u30b0<\/strong>\n<ul class=\"wp-block-list\">\n<li>\u30b3\u30ec\u30af\u30b7\u30e7\u30f3\u306enull\u30c1\u30a7\u30c3\u30af<\/li>\n\n\n\n<li>\u8981\u7d20\u6570\u306e\u59a5\u5f53\u6027\u691c\u8a3c<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n<\/div><\/div><\/div>\n\n\n\n<p>\u3053\u306e\u3088\u3046\u306bforeach\u30bf\u30b0\u306f\u3001MyBatis\u306b\u304a\u3051\u308b\u52d5\u7684SQL\u306e\u4e2d\u6838\u3092\u62c5\u3046\u6a5f\u80fd\u3068\u3057\u3066\u3001\u52b9\u7387\u7684\u306a\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u64cd\u4f5c\u306b\u4e0d\u53ef\u6b20\u306a\u8981\u7d20\u3068\u306a\u3063\u3066\u3044\u307e\u3059\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-4\">MyBatis foreach\u306e\u57fa\u672c\u7684\u306a\u4f7f\u3044\u65b9\uff1a7\u3064\u306e\u5b9f\u8df5\u4f8b<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-5\">IN\u53e5\u3067\u306eforeach\u306e\u6d3b\u7528\u65b9\u6cd5<\/h3>\n\n\n\n<p>IN\u53e5\u3067\u306e\u691c\u7d22\u306f\u3001foreach\u306e\u6700\u3082\u4e00\u822c\u7684\u306a\u4f7f\u7528\u4f8b\u3067\u3059\u3002\u8907\u6570\u306e\u6761\u4ef6\u306b\u4e00\u81f4\u3059\u308b\u30ec\u30b3\u30fc\u30c9\u3092\u52b9\u7387\u7684\u306b\u53d6\u5f97\u3067\u304d\u307e\u3059\u3002<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">&lt;!-- \u30e6\u30fc\u30b6\u30fcID\u30ea\u30b9\u30c8\u306b\u57fa\u3065\u3044\u3066\u8907\u6570\u30e6\u30fc\u30b6\u30fc\u3092\u53d6\u5f97 --&gt;\n&lt;select id=\"findUsersByIds\" resultType=\"com.example.User\"&gt;\n  SELECT * FROM users\n  WHERE id IN\n  &lt;foreach collection=\"list\" item=\"userId\" open=\"(\" separator=\",\" close=\")\"&gt;\n    #{userId}\n  &lt;\/foreach&gt;\n&lt;\/select&gt;<\/pre>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ Java\u3067\u306e\u547c\u3073\u51fa\u3057\u4f8b\nList&lt;Integer&gt; userIds = Arrays.asList(1, 2, 3);\nList&lt;User&gt; users = mapper.findUsersByIds(userIds);<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-6\">INSERT\u6587\u3067\u306e\u4e00\u62ec\u767b\u9332\u30d1\u30bf\u30fc\u30f3<\/h3>\n\n\n\n<p>\u5927\u91cf\u306e\u30c7\u30fc\u30bf\u3092\u52b9\u7387\u7684\u306b\u767b\u9332\u3059\u308b\u969b\u306b\u6d3b\u7528\u3067\u304d\u307e\u3059\u3002<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">&lt;!-- \u8907\u6570\u30e6\u30fc\u30b6\u30fc\u306e\u4e00\u62ec\u767b\u9332 --&gt;\n&lt;insert id=\"bulkInsertUsers\" parameterType=\"list\"&gt;\n  INSERT INTO users (name, email, status)\n  VALUES\n  &lt;foreach collection=\"list\" item=\"user\" separator=\",\"&gt;\n    (#{user.name}, #{user.email}, #{user.status})\n  &lt;\/foreach&gt;\n&lt;\/insert&gt;<\/pre>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ \u4f7f\u7528\u4f8b\nList&lt;User&gt; users = Arrays.asList(\n    new User(\"\u5c71\u7530\u592a\u90ce\", \"yamada@example.com\", \"ACTIVE\"),\n    new User(\"\u9234\u6728\u82b1\u5b50\", \"suzuki@example.com\", \"PENDING\")\n);\nmapper.bulkInsertUsers(users);<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-7\">UPDATE\u6587\u3067\u306e\u4e00\u62ec\u66f4\u65b0\u30c6\u30af\u30cb\u30c3\u30af<\/h3>\n\n\n\n<p>\u8907\u6570\u30ec\u30b3\u30fc\u30c9\u3092\u52b9\u7387\u7684\u306b\u66f4\u65b0\u3059\u308b\u65b9\u6cd5\u3067\u3059\u3002<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">&lt;!-- \u30b9\u30c6\u30fc\u30bf\u30b9\u4e00\u62ec\u66f4\u65b0 --&gt;\n&lt;update id=\"updateUserStatuses\"&gt;\n  UPDATE users\n  &lt;set&gt;\n    &lt;foreach collection=\"statusUpdates\" item=\"status\" index=\"userId\" separator=\",\"&gt;\n      WHEN id = #{userId} THEN #{status}\n    &lt;\/foreach&gt;\n  &lt;\/set&gt;\n  WHERE id IN\n  &lt;foreach collection=\"statusUpdates.keySet()\" item=\"userId\" open=\"(\" separator=\",\" close=\")\"&gt;\n    #{userId}\n  &lt;\/foreach&gt;\n&lt;\/update&gt;<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-8\">DELETE\u6587\u3067\u306e\u8907\u6570\u6761\u4ef6\u524a\u9664<\/h3>\n\n\n\n<p>\u8907\u6570\u306e\u6761\u4ef6\u306b\u57fa\u3065\u3044\u3066\u524a\u9664\u3092\u884c\u3046\u4f8b\u3067\u3059\u3002<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">&lt;!-- \u8907\u6570\u6761\u4ef6\u3067\u306e\u524a\u9664 --&gt;\n&lt;delete id=\"deleteUsersByConditions\"&gt;\n  DELETE FROM users\n  WHERE \n  &lt;foreach collection=\"conditions\" item=\"condition\" separator=\"OR\"&gt;\n    (\n      name LIKE #{condition.name}\n      AND status = #{condition.status}\n    )\n  &lt;\/foreach&gt;\n&lt;\/delete&gt;<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-9\">WHERE\u53e5\u3067\u306e\u8907\u6570\u6761\u4ef6\u691c\u7d22<\/h3>\n\n\n\n<p>\u52d5\u7684\u306a\u691c\u7d22\u6761\u4ef6\u3092\u69cb\u7bc9\u3059\u308b\u4f8b\u3067\u3059\u3002<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">&lt;!-- \u8907\u6570\u6761\u4ef6\u3067\u306e\u691c\u7d22 --&gt;\n&lt;select id=\"findUsersByConditions\" resultType=\"com.example.User\"&gt;\n  SELECT * FROM users\n  &lt;where&gt;\n    &lt;foreach collection=\"conditions\" item=\"condition\" separator=\"AND\"&gt;\n      &lt;if test=\"condition.name != null\"&gt;\n        name LIKE #{condition.name}\n      &lt;\/if&gt;\n      &lt;if test=\"condition.status != null\"&gt;\n        AND status = #{condition.status}\n      &lt;\/if&gt;\n    &lt;\/foreach&gt;\n  &lt;\/where&gt;\n&lt;\/select&gt;<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-10\">VALUES\u53e5\u3067\u306e\u8907\u6570\u30ec\u30b3\u30fc\u30c9\u4f5c\u6210<\/h3>\n\n\n\n<p>\u4e00\u5ea6\u306b\u8907\u6570\u306e\u30ec\u30b3\u30fc\u30c9\u3092\u4f5c\u6210\u3059\u308b\u9ad8\u5ea6\u306a\u4f8b\u3067\u3059\u3002<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">&lt;!-- \u8907\u6570\u30ec\u30b3\u30fc\u30c9\u306e\u4e00\u62ec\u4f5c\u6210\uff08\u91cd\u8907\u30ad\u30fc\u306e\u51e6\u7406\u4ed8\u304d\uff09 --&gt;\n&lt;insert id=\"createMultipleRecords\"&gt;\n  INSERT INTO products (id, name, price)\n  VALUES\n  &lt;foreach collection=\"products\" item=\"product\" separator=\",\"&gt;\n    (#{product.id}, #{product.name}, #{product.price})\n  &lt;\/foreach&gt;\n  ON DUPLICATE KEY UPDATE\n  name = VALUES(name),\n  price = VALUES(price)\n&lt;\/insert&gt;<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-11\">JOIN\u53e5\u3067\u306e\u8907\u6570\u30c6\u30fc\u30d6\u30eb\u7d50\u5408<\/h3>\n\n\n\n<p>\u8907\u6570\u30c6\u30fc\u30d6\u30eb\u3092\u52d5\u7684\u306b\u7d50\u5408\u3059\u308b\u4f8b\u3067\u3059\u3002<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">&lt;!-- \u52d5\u7684\u30c6\u30fc\u30d6\u30eb\u7d50\u5408 --&gt;\n&lt;select id=\"findUsersWithRoles\" resultMap=\"userWithRolesResult\"&gt;\n  SELECT u.*, r.*\n  FROM users u\n  &lt;foreach collection=\"roleIds\" item=\"roleId\" separator=\" \"&gt;\n    LEFT JOIN user_roles ur_${roleId}\n      ON u.id = ur_${roleId}.user_id\n      AND ur_${roleId}.role_id = #{roleId}\n    LEFT JOIN roles r_${roleId}\n      ON ur_${roleId}.role_id = r_${roleId}.id\n  &lt;\/foreach&gt;\n  WHERE u.status = 'ACTIVE'\n&lt;\/select&gt;<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-12\">\u5b9f\u88c5\u306e\u30d9\u30b9\u30c8\u30d7\u30e9\u30af\u30c6\u30a3\u30b9<\/h4>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u30d1\u30e9\u30e1\u30fc\u30bf\u306e\u578b\u5b89\u5168\u6027\u78ba\u4fdd<\/strong>\n<ul class=\"wp-block-list\">\n<li>DTO\u30af\u30e9\u30b9\u306e\u6d3b\u7528<\/li>\n\n\n\n<li>\u9069\u5207\u306a\u578b\u5909\u63db\u306e\u5b9f\u88c5<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>\u30a8\u30e9\u30fc\u30cf\u30f3\u30c9\u30ea\u30f3\u30b0<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">   \/\/ \u5b9f\u88c5\u4f8b\n   public List&lt;User&gt; bulkInsertUsers(List&lt;User&gt; users) {\n       if (users == null || users.isEmpty()) {\n           throw new IllegalArgumentException(\"Users list cannot be empty\");\n       }\n       try {\n           mapper.bulkInsertUsers(users);\n           return users;\n       } catch (Exception e) {\n           log.error(\"Bulk insert failed\", e);\n           throw new DatabaseException(\"Failed to insert users\", e);\n       }\n   }<\/pre>\n\n\n\n<ol start=\"3\" class=\"wp-block-list\">\n<li><strong>\u6027\u80fd\u6700\u9069\u5316<\/strong>\n<ul class=\"wp-block-list\">\n<li>\u30d0\u30c3\u30c1\u30b5\u30a4\u30ba\u306e\u9069\u5207\u306a\u8a2d\u5b9a<\/li>\n\n\n\n<li>\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u306e\u6d3b\u7528<\/li>\n\n\n\n<li>\u5b9f\u884c\u8a08\u753b\u306e\u78ba\u8a8d<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n\n\n\n<p>\u3053\u308c\u3089\u306e\u5b9f\u8df5\u4f8b\u306f\u3001\u5b9f\u969b\u306e\u958b\u767a\u73fe\u5834\u3067\u983b\u7e41\u306b\u4f7f\u7528\u3055\u308c\u308b\u30d1\u30bf\u30fc\u30f3\u3067\u3059\u3002\u72b6\u6cc1\u306b\u5fdc\u3058\u3066\u9069\u5207\u306a\u65b9\u6cd5\u3092\u9078\u629e\u3057\u3001\u5fc5\u8981\u306b\u5fdc\u3058\u3066\u30ab\u30b9\u30bf\u30de\u30a4\u30ba\u3059\u308b\u3053\u3068\u3067\u3001\u52b9\u7387\u7684\u306a\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u64cd\u4f5c\u3092\u5b9f\u73fe\u3067\u304d\u307e\u3059\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-13\">MyBatis foreach\u306e\u5fdc\u7528\u30d1\u30bf\u30fc\u30f3\uff1a3\u3064\u306e\u5b9f\u8df5\u7684\u306a\u30b1\u30fc\u30b9\u30b9\u30bf\u30c7\u30a3<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-14\">\u30cd\u30b9\u30c8\u3057\u305fforeach\u3067\u8907\u96d1\u306a\u968e\u5c64\u69cb\u9020\u3092\u51e6\u7406\u3059\u308b<\/h3>\n\n\n\n<p>\u8907\u96d1\u306a\u968e\u5c64\u69cb\u9020\u3092\u6301\u3064\u30c7\u30fc\u30bf\u3092\u51e6\u7406\u3059\u308b\u969b\u3001foreach\u306e\u30cd\u30b9\u30c8\u304c\u52b9\u679c\u7684\u3067\u3059\u3002<\/p>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-15\">1. \u90e8\u9580\u30fb\u5f93\u696d\u54e1\u306e\u4e00\u62ec\u767b\u9332\u4f8b<\/h4>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">&lt;!-- \u90e8\u9580\u3068\u6240\u5c5e\u5f93\u696d\u54e1\u306e\u4e00\u62ec\u767b\u9332 --&gt;\n&lt;insert id=\"bulkInsertDepartmentsWithEmployees\"&gt;\n    INSERT INTO departments (id, name, created_at)\n    VALUES\n    &lt;foreach collection=\"departments\" item=\"dept\" separator=\",\"&gt;\n        (#{dept.id}, #{dept.name}, NOW())\n    &lt;\/foreach&gt;\n    ;\n\n    INSERT INTO employees (id, dept_id, name, position)\n    VALUES\n    &lt;foreach collection=\"departments\" item=\"dept\"&gt;\n        &lt;foreach collection=\"dept.employees\" item=\"emp\" separator=\",\"&gt;\n            (#{emp.id}, #{dept.id}, #{emp.name}, #{emp.position})\n        &lt;\/foreach&gt;\n    &lt;\/foreach&gt;\n&lt;\/insert&gt;<\/pre>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ \u4f7f\u7528\u4f8b\n@Data\npublic class Department {\n    private Long id;\n    private String name;\n    private List&lt;Employee&gt; employees;\n}\n\n@Data\npublic class Employee {\n    private Long id;\n    private String name;\n    private String position;\n}\n\n\/\/ \u5b9f\u884c\u4f8b\nList&lt;Department&gt; departments = Arrays.asList(\n    new Department(1L, \"\u958b\u767a\u90e8\", Arrays.asList(\n        new Employee(1L, \"\u5c71\u7530\u592a\u90ce\", \"\u30a8\u30f3\u30b8\u30cb\u30a2\"),\n        new Employee(2L, \"\u9234\u6728\u82b1\u5b50\", \"\u30ea\u30fc\u30c9\u30a8\u30f3\u30b8\u30cb\u30a2\")\n    )),\n    new Department(2L, \"\u55b6\u696d\u90e8\", Arrays.asList(\n        new Employee(3L, \"\u7530\u4e2d\u5b9f\", \"\u30bb\u30fc\u30eb\u30b9\")\n    ))\n);\nmapper.bulkInsertDepartmentsWithEmployees(departments);<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-16\">2. \u8907\u96d1\u306a\u691c\u7d22\u6761\u4ef6\u306e\u69cb\u7bc9<\/h4>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">&lt;!-- \u8907\u6570\u306e\u90e8\u9580\u306b\u304a\u3051\u308b\u5f79\u8077\u3054\u3068\u306e\u691c\u7d22 --&gt;\n&lt;select id=\"findEmployeesByDepartmentsAndPositions\" resultMap=\"employeeResult\"&gt;\n    SELECT e.*, d.name as dept_name\n    FROM employees e\n    JOIN departments d ON e.dept_id = d.id\n    WHERE\n    &lt;foreach collection=\"criteria\" item=\"deptCriteria\" separator=\"OR\"&gt;\n        (\n            d.id = #{deptCriteria.deptId}\n            AND\n            &lt;foreach collection=\"deptCriteria.positions\" item=\"position\" separator=\"OR\"&gt;\n                e.position = #{position}\n            &lt;\/foreach&gt;\n        )\n    &lt;\/foreach&gt;\n&lt;\/select&gt;<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-17\">\u52d5\u7684\u306a\u30ab\u30e9\u30e0\u540d\u306e\u751f\u6210\u3067\u30af\u30a8\u30ea\u3092\u6700\u9069\u5316\u3059\u308b<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-18\">1. \u52d5\u7684\u30ab\u30e9\u30e0\u9078\u629e\u30b7\u30b9\u30c6\u30e0<\/h4>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">&lt;!-- \u52d5\u7684\u30ab\u30e9\u30e0\u9078\u629e\u3092\u884c\u3046\u691c\u7d22\u30af\u30a8\u30ea --&gt;\n&lt;select id=\"selectDynamicColumns\" resultType=\"map\"&gt;\n    SELECT\n    &lt;foreach collection=\"columns\" item=\"column\" separator=\",\"&gt;\n        &lt;choose&gt;\n            &lt;when test=\"column.aggregate != null\"&gt;\n                ${column.aggregate}(${column.name}) as ${column.alias}\n            &lt;\/when&gt;\n            &lt;otherwise&gt;\n                ${column.name}\n            &lt;\/otherwise&gt;\n        &lt;\/choose&gt;\n    &lt;\/foreach&gt;\n    FROM ${tableName}\n    &lt;where&gt;\n        &lt;foreach collection=\"conditions\" item=\"condition\" separator=\"AND\"&gt;\n            ${condition.column} ${condition.operator} #{condition.value}\n        &lt;\/foreach&gt;\n    &lt;\/where&gt;\n    &lt;if test=\"groupBy != null\"&gt;\n        GROUP BY\n        &lt;foreach collection=\"groupBy\" item=\"column\" separator=\",\"&gt;\n            ${column}\n        &lt;\/foreach&gt;\n    &lt;\/if&gt;\n&lt;\/select&gt;<\/pre>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ \u4f7f\u7528\u4f8b\nMap&lt;String, Object&gt; params = new HashMap&lt;&gt;();\nparams.put(\"tableName\", \"sales\");\nparams.put(\"columns\", Arrays.asList(\n    new Column(\"date\", null, null),\n    new Column(\"amount\", \"SUM\", \"total_amount\"),\n    new Column(\"product_id\", \"COUNT\", \"product_count\")\n));\nparams.put(\"conditions\", Arrays.asList(\n    new Condition(\"date\", \"&gt;=\", \"2024-01-01\"),\n    new Condition(\"status\", \"=\", \"COMPLETED\")\n));\nparams.put(\"groupBy\", Arrays.asList(\"date\", \"product_id\"));\n\nList&lt;Map&lt;String, Object&gt;&gt; result = mapper.selectDynamicColumns(params);<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-19\">\u6761\u4ef6\u5206\u5c90\u3068\u7d44\u307f\u5408\u308f\u305b\u3066\u67d4\u8edf\u306a\u30af\u30a8\u30ea\u3092\u69cb\u7bc9\u3059\u308b<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-20\">1. \u9ad8\u5ea6\u306a\u691c\u7d22\u6761\u4ef6\u30d3\u30eb\u30c0\u30fc<\/h4>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">&lt;!-- \u8907\u96d1\u306a\u6761\u4ef6\u3092\u52d5\u7684\u306b\u69cb\u7bc9\u3059\u308b\u691c\u7d22\u30af\u30a8\u30ea --&gt;\n&lt;select id=\"searchWithComplexConditions\" resultMap=\"searchResult\"&gt;\n    SELECT DISTINCT t.*\n    FROM transactions t\n    &lt;foreach collection=\"joins\" item=\"join\"&gt;\n        ${join.type} JOIN ${join.table} ${join.alias}\n        ON ${join.condition}\n    &lt;\/foreach&gt;\n    &lt;where&gt;\n        &lt;foreach collection=\"conditions\" item=\"condition\"&gt;\n            &lt;choose&gt;\n                &lt;when test=\"condition.type == 'AND'\"&gt;\n                    AND\n                    &lt;foreach collection=\"condition.criteria\" item=\"criteria\" separator=\"AND\"&gt;\n                        (${criteria})\n                    &lt;\/foreach&gt;\n                &lt;\/when&gt;\n                &lt;when test=\"condition.type == 'OR'\"&gt;\n                    OR\n                    &lt;foreach collection=\"condition.criteria\" item=\"criteria\" separator=\"OR\"&gt;\n                        (${criteria})\n                    &lt;\/foreach&gt;\n                &lt;\/when&gt;\n            &lt;\/choose&gt;\n        &lt;\/foreach&gt;\n    &lt;\/where&gt;\n&lt;\/select&gt;<\/pre>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ \u5b9f\u88c5\u4f8b\n@Data\n@Builder\npublic class SearchCriteria {\n    private List&lt;JoinClause&gt; joins;\n    private List&lt;ConditionGroup&gt; conditions;\n}\n\n@Data\n@Builder\npublic class ConditionGroup {\n    private String type; \/\/ \"AND\" or \"OR\"\n    private List&lt;String&gt; criteria;\n}\n\n\/\/ \u4f7f\u7528\u4f8b\nSearchCriteria criteria = SearchCriteria.builder()\n    .joins(Arrays.asList(\n        new JoinClause(\"LEFT\", \"users\", \"u\", \"t.user_id = u.id\"),\n        new JoinClause(\"LEFT\", \"products\", \"p\", \"t.product_id = p.id\")\n    ))\n    .conditions(Arrays.asList(\n        new ConditionGroup(\"AND\", Arrays.asList(\n            \"t.status = 'COMPLETED'\",\n            \"t.amount &gt; 1000\"\n        )),\n        new ConditionGroup(\"OR\", Arrays.asList(\n            \"u.type = 'PREMIUM'\",\n            \"p.category IN ('A', 'B')\"\n        ))\n    ))\n    .build();\n\nList&lt;Transaction&gt; results = mapper.searchWithComplexConditions(criteria);<\/pre>\n\n\n\n<div class=\"wp-block-sgb-message\"><div class=\"memo sng-shadow-0\" style=\"border-radius:0px;background-color:#ffebeb;color:#f88080\"><div class=\"memo_ttl dfont\"><span class=\"sng-box-msg__icon\" style=\"background:#f88080\"><i class=\"fas fa-exclamation\"><\/i><\/span><div class=\"sng-box-msg__title\">\u5b9f\u88c5\u6642\u306e\u6ce8\u610f\u70b9<\/div><\/div><div class=\"sng-box-msg__contents\">\n<ol class=\"wp-block-list\">\n<li><strong>\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u8003\u616e\u4e8b\u9805<\/strong>\n<ul class=\"wp-block-list\">\n<li>\u52d5\u7684SQL\u3067\u306e${} \u4f7f\u7528\u6642\u306fSQL\u30a4\u30f3\u30b8\u30a7\u30af\u30b7\u30e7\u30f3\u5bfe\u7b56\u3092\u5fb9\u5e95<\/li>\n\n\n\n<li>\u5165\u529b\u5024\u306e\u30d0\u30ea\u30c7\u30fc\u30b7\u30e7\u30f3\u5b9f\u88c5<\/li>\n\n\n\n<li>\u30a2\u30af\u30bb\u30b9\u6a29\u9650\u306e\u78ba\u8a8d<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>\u4fdd\u5b88\u6027\u306e\u78ba\u4fdd<\/strong>\n<ul class=\"wp-block-list\">\n<li>\u8907\u96d1\u306a\u30af\u30a8\u30ea\u306e\u30e6\u30cb\u30c3\u30c8\u30c6\u30b9\u30c8\u4f5c\u6210<\/li>\n\n\n\n<li>\u30af\u30a8\u30ea\u7d50\u679c\u306e\u691c\u8a3c\u30ed\u30b8\u30c3\u30af\u5b9f\u88c5<\/li>\n\n\n\n<li>\u30c7\u30d0\u30c3\u30b0\u60c5\u5831\u306e\u9069\u5207\u306a\u51fa\u529b<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u6700\u9069\u5316<\/strong><\/li>\n<\/ol>\n<\/div><\/div><\/div>\n\n\n\n<p>\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u6700\u9069\u5316\u306e\u4f8b\u3092\u4ee5\u4e0b\u306b\u793a\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">   \/\/ \u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u30e2\u30cb\u30bf\u30ea\u30f3\u30b0\u5b9f\u88c5\u4f8b\n   @Around(\"execution(* com.example.mapper.*Mapper.*(..))\")\n   public Object monitorQueryPerformance(ProceedingJoinPoint joinPoint) throws Throwable {\n       long startTime = System.currentTimeMillis();\n       Object result = joinPoint.proceed();\n       long executionTime = System.currentTimeMillis() - startTime;\n\n       if (executionTime &gt; threshold) {\n           log.warn(\"Slow query detected: {} ms\", executionTime);\n       }\n\n       return result;\n   }<\/pre>\n\n\n\n<p>\u3053\u308c\u3089\u306e\u5fdc\u7528\u30d1\u30bf\u30fc\u30f3\u306f\u3001\u8907\u96d1\u306a\u30d3\u30b8\u30cd\u30b9\u30ed\u30b8\u30c3\u30af\u3092\u52b9\u7387\u7684\u306b\u5b9f\u88c5\u3059\u308b\u969b\u306b\u5f79\u7acb\u3061\u307e\u3059\u3002\u9069\u5207\u306a\u4f7f\u7528\u306b\u3088\u308a\u3001\u4fdd\u5b88\u6027\u3068\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u306e\u4e21\u7acb\u304c\u53ef\u80fd\u306b\u306a\u308a\u307e\u3059\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-21\">MyBatis foreach\u306e\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u6700\u9069\u5316\u3068\u30d9\u30b9\u30c8\u30d7\u30e9\u30af\u30c6\u30a3\u30b9<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-22\">\u5927\u91cf\u30c7\u30fc\u30bf\u51e6\u7406\u6642\u306e\u6ce8\u610f\u70b9\u3068\u5bfe\u7b56<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-23\">1. \u30d0\u30c3\u30c1\u51e6\u7406\u306e\u6700\u9069\u5316<\/h4>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ \u30d0\u30c3\u30c1\u30b5\u30a4\u30ba\u306e\u8a2d\u5b9a\u4f8b\n@Configuration\npublic class MyBatisConfig {\n    @Bean\n    public SqlSessionFactory sqlSessionFactory() throws Exception {\n        SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();\n        \/\/ ... other configurations ...\n\n        \/\/ ExecutorType.BATCH \u306e\u8a2d\u5b9a\n        factoryBean.setDefaultExecutorType(ExecutorType.BATCH);\n\n        Properties props = new Properties();\n        props.setProperty(\"defaultExecutorType\", \"BATCH\");\n        props.setProperty(\"defaultFetchSize\", \"100\");\n        factoryBean.setConfigurationProperties(props);\n\n        return factoryBean.getObject();\n    }\n}<\/pre>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ \u30d0\u30c3\u30c1\u51e6\u7406\u306e\u5b9f\u88c5\u4f8b\n@Service\n@Transactional\npublic class BulkOperationService {\n    private static final int BATCH_SIZE = 1000;\n\n    public void bulkInsert(List&lt;User&gt; users) {\n        int totalSize = users.size();\n        for (int i = 0; i &lt; totalSize; i += BATCH_SIZE) {\n            int endIndex = Math.min(i + BATCH_SIZE, totalSize);\n            List&lt;User&gt; batch = users.subList(i, endIndex);\n            mapper.bulkInsertUsers(batch);\n        }\n    }\n}<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-24\">2. \u30e1\u30e2\u30ea\u4f7f\u7528\u91cf\u306e\u6700\u9069\u5316<\/h4>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">&lt;!-- \u30b9\u30c8\u30ea\u30fc\u30df\u30f3\u30b0\u51e6\u7406\u3092\u6d3b\u7528\u3057\u305f\u5927\u91cf\u30c7\u30fc\u30bf\u53d6\u5f97 --&gt;\n&lt;select id=\"streamUsers\" resultType=\"com.example.User\" fetchSize=\"100\"&gt;\n    SELECT * FROM users\n    &lt;where&gt;\n        &lt;foreach collection=\"conditions\" item=\"condition\" separator=\"AND\"&gt;\n            ${condition.column} = #{condition.value}\n        &lt;\/foreach&gt;\n    &lt;\/where&gt;\n&lt;\/select&gt;<\/pre>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ \u30b9\u30c8\u30ea\u30fc\u30df\u30f3\u30b0\u51e6\u7406\u306e\u5b9f\u88c5\u4f8b\n@Transactional(readOnly = true)\npublic void processLargeData() {\n    try (SqlSession session = sqlSessionFactory.openSession(ExecutorType.BATCH)) {\n        UserMapper mapper = session.getMapper(UserMapper.class);\n        try (ResultHandler&lt;User&gt; handler = new ResultHandler&lt;User&gt;() {\n            @Override\n            public void handleResult(ResultContext&lt;? extends User&gt; context) {\n                User user = context.getResultObject();\n                \/\/ \u30e1\u30e2\u30ea\u52b9\u7387\u306e\u826f\u3044\u51e6\u7406\n                processUser(user);\n            }\n        }) {\n            mapper.streamUsers(conditions, handler);\n        }\n    }\n}<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-25\">N+1\u554f\u984c\u3092\u9632\u3050\u305f\u3081\u306e\u5b9f\u88c5\u65b9\u6cd5<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-26\">1. JOIN\u53e5\u306e\u9069\u5207\u306a\u4f7f\u7528<\/h4>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">&lt;!-- N+1\u554f\u984c\u3092\u56de\u907f\u3059\u308bJOIN\u306e\u4f8b --&gt;\n&lt;select id=\"findUsersWithRoles\" resultMap=\"userWithRolesResultMap\"&gt;\n    SELECT u.*, r.*\n    FROM users u\n    LEFT JOIN user_roles ur ON u.id = ur.user_id\n    LEFT JOIN roles r ON ur.role_id = r.id\n    WHERE u.id IN\n    &lt;foreach collection=\"userIds\" item=\"userId\" open=\"(\" separator=\",\" close=\")\"&gt;\n        #{userId}\n    &lt;\/foreach&gt;\n&lt;\/select&gt;\n\n&lt;resultMap id=\"userWithRolesResultMap\" type=\"com.example.User\"&gt;\n    &lt;id property=\"id\" column=\"id\"\/&gt;\n    &lt;result property=\"name\" column=\"name\"\/&gt;\n    &lt;collection property=\"roles\" ofType=\"com.example.Role\"&gt;\n        &lt;id property=\"id\" column=\"role_id\"\/&gt;\n        &lt;result property=\"name\" column=\"role_name\"\/&gt;\n    &lt;\/collection&gt;\n&lt;\/resultMap&gt;<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-27\">2. \u30d0\u30c3\u30c1\u53d6\u5f97\u306e\u5b9f\u88c5<\/h4>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">&lt;!-- \u30d0\u30c3\u30c1\u53d6\u5f97\u3092\u6d3b\u7528\u3057\u305f\u95a2\u9023\u30c7\u30fc\u30bf\u306e\u52b9\u7387\u7684\u306a\u8aad\u307f\u8fbc\u307f --&gt;\n&lt;select id=\"findRolesByUserIds\" resultType=\"com.example.Role\"&gt;\n    SELECT r.*, ur.user_id\n    FROM roles r\n    JOIN user_roles ur ON r.id = ur.role_id\n    WHERE ur.user_id IN\n    &lt;foreach collection=\"userIds\" item=\"userId\" open=\"(\" separator=\",\" close=\")\"&gt;\n        #{userId}\n    &lt;\/foreach&gt;\n&lt;\/select&gt;<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-28\">\u4fdd\u5b88\u6027\u3092\u9ad8\u3081\u308b\u305f\u3081\u306e\u30b3\u30fc\u30c7\u30a3\u30f3\u30b0\u898f\u7d04<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-29\">1. \u547d\u540d\u898f\u5247\u3068\u30b3\u30e1\u30f3\u30c8<\/h4>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">&lt;!-- \u826f\u3044\u4f8b\uff1a\u660e\u78ba\u306a\u547d\u540d\u3068\u9069\u5207\u306a\u30b3\u30e1\u30f3\u30c8 --&gt;\n&lt;select id=\"findActiveUsersByDepartment\" \n        resultType=\"com.example.User\"\n        parameterType=\"map\"&gt;\n    &lt;!-- \u90e8\u9580\u3054\u3068\u306e\u30a2\u30af\u30c6\u30a3\u30d6\u30e6\u30fc\u30b6\u30fc\u691c\u7d22 --&gt;\n    SELECT u.* FROM users u\n    JOIN departments d ON u.department_id = d.id\n    WHERE u.status = 'ACTIVE'\n    AND d.id IN\n    &lt;foreach collection=\"departmentIds\" \n             item=\"deptId\" \n             open=\"(\" \n             separator=\",\" \n             close=\")\"&gt;\n        #{deptId} &lt;!-- \u90e8\u9580ID --&gt;\n    &lt;\/foreach&gt;\n&lt;\/select&gt;<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-30\">2. \u30a8\u30e9\u30fc\u30cf\u30f3\u30c9\u30ea\u30f3\u30b0\u3068\u30ed\u30b0\u8a18\u9332<\/h4>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ \u30a8\u30e9\u30fc\u30cf\u30f3\u30c9\u30ea\u30f3\u30b0\u306e\u5b9f\u88c5\u4f8b\n@Slf4j\n@Service\npublic class UserService {\n    @Transactional\n    public List&lt;User&gt; bulkUpdateUsers(List&lt;UserUpdateRequest&gt; requests) {\n        try {\n            validateRequests(requests);\n            return mapper.bulkUpdateUsers(requests);\n        } catch (DuplicateKeyException e) {\n            log.error(\"Duplicate key found during bulk update\", e);\n            throw new BusinessException(\"\u65e2\u306b\u5b58\u5728\u3059\u308b\u30e6\u30fc\u30b6\u30fc\u30c7\u30fc\u30bf\u304c\u542b\u307e\u308c\u3066\u3044\u307e\u3059\", e);\n        } catch (DataIntegrityViolationException e) {\n            log.error(\"Data integrity violation during bulk update\", e);\n            throw new BusinessException(\"\u30c7\u30fc\u30bf\u6574\u5408\u6027\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f\", e);\n        }\n    }\n\n    private void validateRequests(List&lt;UserUpdateRequest&gt; requests) {\n        if (requests == null || requests.isEmpty()) {\n            throw new IllegalArgumentException(\"\u66f4\u65b0\u30ea\u30af\u30a8\u30b9\u30c8\u304c\u7a7a\u3067\u3059\");\n        }\n        if (requests.size() &gt; MAX_BATCH_SIZE) {\n            throw new IllegalArgumentException(\"\u30d0\u30c3\u30c1\u30b5\u30a4\u30ba\u304c\u4e0a\u9650\u3092\u8d85\u3048\u3066\u3044\u307e\u3059\");\n        }\n    }\n}<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-31\">\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u30e2\u30cb\u30bf\u30ea\u30f3\u30b0<\/h4>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">@Aspect\n@Component\n@Slf4j\npublic class SqlPerformanceMonitor {\n    private static final long SLOW_QUERY_THRESHOLD = 1000; \/\/ 1\u79d2\n\n    @Around(\"execution(* com.example.mapper.*Mapper.*(..))\")\n    public Object monitorPerformance(ProceedingJoinPoint joinPoint) throws Throwable {\n        long startTime = System.currentTimeMillis();\n        String methodName = joinPoint.getSignature().getName();\n\n        try {\n            return joinPoint.proceed();\n        } finally {\n            long executionTime = System.currentTimeMillis() - startTime;\n            if (executionTime &gt; SLOW_QUERY_THRESHOLD) {\n                log.warn(\"\u30b9\u30ed\u30fc\u30af\u30a8\u30ea\u691c\u51fa: {} - \u5b9f\u884c\u6642\u9593: {}ms\", methodName, executionTime);\n                \/\/ \u30e1\u30c8\u30ea\u30af\u30b9\u53ce\u96c6\u3084\u30a2\u30e9\u30fc\u30c8\u901a\u77e5\u306e\u5b9f\u88c5\n            }\n        }\n    }\n}<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-32\">\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u30c1\u30e5\u30fc\u30cb\u30f3\u30b0\u306e\u30d9\u30b9\u30c8\u30d7\u30e9\u30af\u30c6\u30a3\u30b9<\/h4>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u6700\u9069\u5316<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">-- \u8907\u6570\u6761\u4ef6\u3067\u306eIN\u53e5\u691c\u7d22\u7528\u306e\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\nCREATE INDEX idx_user_status_department ON users(status, department_id);\n\n-- \u8907\u5408\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u306e\u6d3b\u7528\u4f8b\nCREATE INDEX idx_transaction_date_status ON transactions(created_at, status);<\/pre>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li><strong>\u5b9f\u884c\u8a08\u753b\u306e\u78ba\u8a8d\u3068\u6700\u9069\u5316<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">@Slf4j\npublic class QueryPlanAnalyzer {\n    public void analyzeQueryPlan(String sql) {\n        try (Connection conn = dataSource.getConnection()) {\n            try (PreparedStatement stmt = conn.prepareStatement(\"EXPLAIN \" + sql)) {\n                ResultSet rs = stmt.executeQuery();\n                while (rs.next()) {\n                    log.info(\"\u5b9f\u884c\u8a08\u753b: {}\", rs.getString(1));\n                }\n            }\n        }\n    }\n}<\/pre>\n\n\n\n<ol start=\"3\" class=\"wp-block-list\">\n<li><strong>\u30ad\u30e3\u30c3\u30b7\u30e5\u6226\u7565<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">&lt;!-- MyBatis\u306e\u30ad\u30e3\u30c3\u30b7\u30e5\u8a2d\u5b9a\u4f8b --&gt;\n&lt;cache\n    eviction=\"LRU\"\n    flushInterval=\"60000\"\n    size=\"512\"\n    readOnly=\"true\"\/&gt;\n\n&lt;select id=\"findUsersByDepartment\" resultType=\"User\" useCache=\"true\"&gt;\n    SELECT * FROM users\n    WHERE department_id IN\n    &lt;foreach collection=\"departmentIds\" item=\"deptId\" \n             open=\"(\" separator=\",\" close=\")\"&gt;\n        #{deptId}\n    &lt;\/foreach&gt;\n&lt;\/select&gt;<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-33\">\u5b9f\u88c5\u306e\u30c1\u30a7\u30c3\u30af\u30ea\u30b9\u30c8<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u6700\u9069\u5316<\/strong>\n<ul class=\"wp-block-list\">\n<li>[ ] \u30d0\u30c3\u30c1\u30b5\u30a4\u30ba\u306e\u9069\u5207\u306a\u8a2d\u5b9a<\/li>\n\n\n\n<li>[ ] \u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u306e\u78ba\u8a8d\u3068\u6700\u9069\u5316<\/li>\n\n\n\n<li>[ ] \u30af\u30a8\u30ea\u306e\u5b9f\u884c\u8a08\u753b\u306e\u78ba\u8a8d<\/li>\n\n\n\n<li>[ ] \u30e1\u30e2\u30ea\u4f7f\u7528\u91cf\u306e\u76e3\u8996<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>\u4fdd\u5b88\u6027\u5411\u4e0a<\/strong>\n<ul class=\"wp-block-list\">\n<li>[ ] \u547d\u540d\u898f\u5247\u306e\u7d71\u4e00<\/li>\n\n\n\n<li>[ ] \u9069\u5207\u306a\u30b3\u30e1\u30f3\u30c8\u8a18\u8ff0<\/li>\n\n\n\n<li>[ ] \u30a8\u30e9\u30fc\u30cf\u30f3\u30c9\u30ea\u30f3\u30b0\u306e\u5b9f\u88c5<\/li>\n\n\n\n<li>[ ] \u30ed\u30b0\u51fa\u529b\u306e\u6574\u5099<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u5bfe\u7b56<\/strong>\n<ul class=\"wp-block-list\">\n<li>[ ] SQL\u30a4\u30f3\u30b8\u30a7\u30af\u30b7\u30e7\u30f3\u5bfe\u7b56<\/li>\n\n\n\n<li>[ ] \u30d1\u30e9\u30e1\u30fc\u30bf\u30d0\u30ea\u30c7\u30fc\u30b7\u30e7\u30f3<\/li>\n\n\n\n<li>[ ] \u30a2\u30af\u30bb\u30b9\u5236\u5fa1\u306e\u5b9f\u88c5<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n\n\n\n<p>\u3053\u308c\u3089\u306e\u6700\u9069\u5316\u3068\u30d9\u30b9\u30c8\u30d7\u30e9\u30af\u30c6\u30a3\u30b9\u3092\u9069\u5207\u306b\u5b9f\u88c5\u3059\u308b\u3053\u3068\u3067\u3001\u5b89\u5b9a\u3057\u305f\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u3068\u9ad8\u3044\u4fdd\u5b88\u6027\u3092\u5b9f\u73fe\u3067\u304d\u307e\u3059\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-34\">MyBatis foreach\u3067\u3088\u304f\u3042\u308b\u30a8\u30e9\u30fc\u3068\u89e3\u6c7a\u65b9\u6cd5<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-35\">\u69cb\u6587\u30a8\u30e9\u30fc\u306e\u4e3b\u306a\u539f\u56e0\u3068\u5bfe\u51e6\u6cd5<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-36\">1. Collection\u95a2\u9023\u306e\u30a8\u30e9\u30fc<\/h4>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">&lt;!-- \u30a8\u30e9\u30fc\u30d1\u30bf\u30fc\u30f31: collection\u306e\u6307\u5b9a\u30df\u30b9 --&gt;\n&lt;foreach collection=\"list\" item=\"item\"&gt;  &lt;!-- Error: list\u304c\u672a\u5b9a\u7fa9 --&gt;\n    #{item}\n&lt;\/foreach&gt;\n\n&lt;!-- \u6b63\u3057\u3044\u5b9f\u88c5 --&gt;\n&lt;foreach collection=\"userList\" item=\"item\"&gt;  &lt;!-- \u30d1\u30e9\u30e1\u30fc\u30bf\u540d\u3068\u4e00\u81f4 --&gt;\n    #{item}\n&lt;\/foreach&gt;<\/pre>\n\n\n\n<p class=\"is-style-sango-paragraph-exclamation-alt\"><strong>\u3088\u304f\u3042\u308b\u30a8\u30e9\u30fc\u30e1\u30c3\u30bb\u30fc\u30b8\uff1a<\/strong><\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">org.apache.ibatis.binding.BindingException: Parameter 'list' not found<\/pre>\n\n\n\n<p class=\"is-style-sango-paragraph-idea-alt\"><strong>\u5bfe\u51e6\u65b9\u6cd5\uff1a<\/strong><\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u30d1\u30e9\u30e1\u30fc\u30bf\u540d\u306e\u78ba\u8a8d<\/li>\n\n\n\n<li><code>@Param<\/code>\u30a2\u30ce\u30c6\u30fc\u30b7\u30e7\u30f3\u306e\u4f7f\u7528<\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">public List&lt;User&gt; findUsers(@Param(\"userList\") List&lt;Integer&gt; ids);<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-37\">2. \u69cb\u6587\u306e\u9589\u3058\u5fd8\u308c<\/h4>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">&lt;!-- \u30a8\u30e9\u30fc\u30d1\u30bf\u30fc\u30f32: \u30ab\u30c3\u30b3\u306e\u9589\u3058\u5fd8\u308c --&gt;\n&lt;select id=\"findUsers\"&gt;\n    SELECT * FROM users WHERE id IN\n    &lt;foreach collection=\"ids\" item=\"id\" open=\"(\"\n        separator=\",\"&gt;  &lt;!-- close\u304c\u672a\u6307\u5b9a --&gt;\n        #{id}\n    &lt;\/foreach&gt;\n&lt;\/select&gt;\n\n&lt;!-- \u6b63\u3057\u3044\u5b9f\u88c5 --&gt;\n&lt;select id=\"findUsers\"&gt;\n    SELECT * FROM users WHERE id IN\n    &lt;foreach collection=\"ids\" item=\"id\" \n             open=\"(\" separator=\",\" close=\")\"&gt;\n        #{id}\n    &lt;\/foreach&gt;\n&lt;\/select&gt;<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-38\">\u5b9f\u884c\u6642\u30a8\u30e9\u30fc\u306e\u30c8\u30e9\u30d6\u30eb\u30b7\u30e5\u30fc\u30c6\u30a3\u30f3\u30b0<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-39\">1. SQL\u30a8\u30e9\u30fc\u306e\u51e6\u7406<\/h4>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ \u30a8\u30e9\u30fc\u30cf\u30f3\u30c9\u30ea\u30f3\u30b0\u306e\u5b9f\u88c5\u4f8b\n@Slf4j\n@Service\npublic class ErrorHandlingService {\n    @Transactional\n    public void executeBatchOperation(List&lt;Operation&gt; operations) {\n        try {\n            mapper.batchOperation(operations);\n        } catch (SQLException e) {\n            log.error(\"SQL\u5b9f\u884c\u30a8\u30e9\u30fc: {}\", e.getMessage());\n            if (e.getSQLState().equals(\"23505\")) {  \/\/ \u4e00\u610f\u5236\u7d04\u9055\u53cd\n                throw new DuplicateKeyException(\"\u91cd\u8907\u30c7\u30fc\u30bf\u304c\u5b58\u5728\u3057\u307e\u3059\", e);\n            }\n            throw new DatabaseException(\"\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u64cd\u4f5c\u306b\u5931\u6557\u3057\u307e\u3057\u305f\", e);\n        }\n    }\n}<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-40\">2. \u30e1\u30e2\u30ea\u4e0d\u8db3\u30a8\u30e9\u30fc\u306e\u5bfe\u7b56<\/h4>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ \u30e1\u30e2\u30ea\u52b9\u7387\u306e\u826f\u3044\u5b9f\u88c5\u4f8b\n@Service\npublic class LargeDataProcessor {\n    private static final int CHUNK_SIZE = 1000;\n\n    public void processLargeData(List&lt;Long&gt; ids) {\n        \/\/ \u30ea\u30b9\u30c8\u3092\u9069\u5207\u306a\u30b5\u30a4\u30ba\u306e\u30c1\u30e3\u30f3\u30af\u306b\u5206\u5272\n        Lists.partition(ids, CHUNK_SIZE)\n            .forEach(chunk -&gt; {\n                processChunk(chunk);\n                \/\/ GC\u306e\u30d2\u30f3\u30c8\u3092\u63d0\u4f9b\n                System.gc();\n            });\n    }\n\n    private void processChunk(List&lt;Long&gt; chunk) {\n        try {\n            mapper.processIds(chunk);\n        } catch (OutOfMemoryError e) {\n            log.error(\"\u30e1\u30e2\u30ea\u4e0d\u8db3\u30a8\u30e9\u30fc\u767a\u751f: \u30c1\u30e3\u30f3\u30af\u30b5\u30a4\u30ba={}\", chunk.size());\n            throw new ProcessingException(\"\u30e1\u30e2\u30ea\u4e0d\u8db3\u306b\u3088\u308a\u51e6\u7406\u3092\u4e2d\u65ad\u3057\u307e\u3057\u305f\", e);\n        }\n    }\n}<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-41\">\u30c7\u30d0\u30c3\u30b0\u306e\u305f\u3081\u306e\u30ed\u30b0\u8a2d\u5b9a\u3068\u6d3b\u7528\u65b9\u6cd5<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-42\">1. MyBatis\u306e\u30ed\u30b0\u8a2d\u5b9a<\/h4>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\"># application.properties\n# SQL\u30ed\u30b0\u306e\u8a73\u7d30\u8a2d\u5b9a\nlogging.level.org.apache.ibatis=DEBUG\nlogging.level.com.example.mapper=TRACE\n\n# \u5b9f\u884c\u6642\u30d1\u30e9\u30e1\u30fc\u30bf\u306e\u8868\u793a\nmybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-43\">2. \u30ab\u30b9\u30bf\u30e0\u30ed\u30b0\u5b9f\u88c5<\/h4>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">@Aspect\n@Component\n@Slf4j\npublic class SqlLoggingAspect {\n    @Around(\"execution(* com.example.mapper.*Mapper.*(..))\")\n    public Object logSqlExecution(ProceedingJoinPoint joinPoint) throws Throwable {\n        String methodName = joinPoint.getSignature().getName();\n        Object[] args = joinPoint.getArgs();\n\n        log.debug(\"SQL\u5b9f\u884c\u958b\u59cb: {} - \u30d1\u30e9\u30e1\u30fc\u30bf: {}\", methodName, \n                 Arrays.toString(args));\n\n        try {\n            Object result = joinPoint.proceed();\n            log.debug(\"SQL\u5b9f\u884c\u5b8c\u4e86: {} - \u7d50\u679c\u6570: {}\", methodName, \n                     getResultSize(result));\n            return result;\n        } catch (Exception e) {\n            log.error(\"SQL\u5b9f\u884c\u30a8\u30e9\u30fc: {} - \u30a8\u30e9\u30fc: {}\", methodName, \n                     e.getMessage());\n            throw e;\n        }\n    }\n\n    private int getResultSize(Object result) {\n        if (result instanceof Collection) {\n            return ((Collection&lt;?&gt;) result).size();\n        }\n        return 1;\n    }\n}<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-44\">\u30c7\u30d0\u30c3\u30b0\u306e\u30d9\u30b9\u30c8\u30d7\u30e9\u30af\u30c6\u30a3\u30b9<\/h4>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u6bb5\u968e\u7684\u306a\u30c7\u30d0\u30c3\u30b0\u624b\u9806<\/strong>\n<ul class=\"wp-block-list\">\n<li>SQL\u6587\u306e\u76f4\u63a5\u5b9f\u884c\u306b\u3088\u308b\u691c\u8a3c<\/li>\n\n\n\n<li>\u30d1\u30e9\u30e1\u30fc\u30bf\u5024\u306e\u78ba\u8a8d<\/li>\n\n\n\n<li>\u5b9f\u884c\u8a08\u753b\u306e\u78ba\u8a8d<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>\u30c8\u30e9\u30d6\u30eb\u30b7\u30e5\u30fc\u30c6\u30a3\u30f3\u30b0\u30c1\u30a7\u30c3\u30af\u30ea\u30b9\u30c8<\/strong>\n<ul class=\"wp-block-list\">\n<li>[ ] \u30ed\u30b0\u30ec\u30d9\u30eb\u306e\u9069\u5207\u306a\u8a2d\u5b9a<\/li>\n\n\n\n<li>[ ] \u30d1\u30e9\u30e1\u30fc\u30bf\u578b\u306e\u78ba\u8a8d<\/li>\n\n\n\n<li>[ ] SQL\u306e\u69cb\u6587\u30c1\u30a7\u30c3\u30af<\/li>\n\n\n\n<li>[ ] \u30c8\u30e9\u30f3\u30b6\u30af\u30b7\u30e7\u30f3\u5883\u754c\u306e\u78ba\u8a8d<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>\u30a8\u30e9\u30fc\u60c5\u5831\u306e\u53ce\u96c6<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">   \/\/ \u30a8\u30e9\u30fc\u60c5\u5831\u53ce\u96c6\u306e\u5b9f\u88c5\u4f8b\n   public class ErrorCollector {\n       public static String collectErrorInfo(Exception e, \n                                          Map&lt;String, Object&gt; params) {\n           StringBuilder info = new StringBuilder();\n           info.append(\"\u30a8\u30e9\u30fc\u767a\u751f\u6642\u523b: \")\n               .append(LocalDateTime.now())\n               .append(\"\\n\u30a8\u30e9\u30fc\u30bf\u30a4\u30d7: \")\n               .append(e.getClass().getName())\n               .append(\"\\n\u30e1\u30c3\u30bb\u30fc\u30b8: \")\n               .append(e.getMessage())\n               .append(\"\\n\u30d1\u30e9\u30e1\u30fc\u30bf: \")\n               .append(params);\n\n           return info.toString();\n       }\n   }<\/pre>\n\n\n\n<p>\u3053\u308c\u3089\u306e\u30a8\u30e9\u30fc\u5bfe\u5fdc\u3068\u30c7\u30d0\u30c3\u30b0\u624b\u6cd5\u3092\u9069\u5207\u306b\u5b9f\u88c5\u3059\u308b\u3053\u3068\u3067\u3001\u554f\u984c\u306e\u65e9\u671f\u767a\u898b\u3068\u89e3\u6c7a\u304c\u53ef\u80fd\u306b\u306a\u308a\u307e\u3059\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-45\">\u307e\u3068\u3081\uff1aMyBatis foreach\u30de\u30b9\u30bf\u30fc\u3078\u306e\u6b21\u306e\u30b9\u30c6\u30c3\u30d7<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-46\">\u5b9f\u88c5\u6642\u306e\u91cd\u8981\u30dd\u30a4\u30f3\u30c8\u7dcf\u307e\u3068\u3081<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-47\">1. \u57fa\u672c\u539f\u5247<\/h4>\n\n\n<div id=\"id-a855c4ae-5b17-4cb6-ba39-9343927ecdde\">\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>\u9805\u76ee<\/th><th>\u30dd\u30a4\u30f3\u30c8<\/th><th>\u5b9f\u8df5\u4f8b<\/th><\/tr><\/thead><tbody><tr><td>\u69cb\u6587\u7406\u89e3<\/td><td>collection, item, separator\u306e\u9069\u5207\u306a\u4f7f\u7528<\/td><td>IN\u53e5\u3001\u30d0\u30c3\u30c1\u51e6\u7406<\/td><\/tr><tr><td>\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9<\/td><td>\u30d0\u30c3\u30c1\u30b5\u30a4\u30ba\u3001\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u6700\u9069\u5316<\/td><td>\u5927\u91cf\u30c7\u30fc\u30bf\u51e6\u7406<\/td><\/tr><tr><td>\u4fdd\u5b88\u6027<\/td><td>\u547d\u540d\u898f\u5247\u3001\u30b3\u30e1\u30f3\u30c8\u3001\u30a8\u30e9\u30fc\u30cf\u30f3\u30c9\u30ea\u30f3\u30b0<\/td><td>\u30b3\u30fc\u30c7\u30a3\u30f3\u30b0\u898f\u7d04<\/td><\/tr><tr><td>\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3<\/td><td>SQL\u30a4\u30f3\u30b8\u30a7\u30af\u30b7\u30e7\u30f3\u5bfe\u7b56\u3001\u5165\u529b\u691c\u8a3c<\/td><td>\u30d1\u30e9\u30e1\u30fc\u30bf\u30d0\u30a4\u30f3\u30c9<\/td><\/tr><\/tbody><\/table><\/figure>\n<\/div>\n\n\n<h4 class=\"wp-block-heading\" id=\"i-48\">2. \u5b9f\u88c5\u30c1\u30a7\u30c3\u30af\u30ea\u30b9\u30c8<\/h4>\n\n\n\n<ul class=\"wp-block-list\">\n<li>[ ] \u57fa\u672c\u6a5f\u80fd\u306e\u7406\u89e3\u3068\u9069\u7528\n<ul class=\"wp-block-list\">\n<li>foreach\u306e\u57fa\u672c\u69cb\u6587\u306e\u7406\u89e3<\/li>\n\n\n\n<li>\u9069\u5207\u306a\u30b3\u30ec\u30af\u30b7\u30e7\u30f3\u51e6\u7406<\/li>\n\n\n\n<li>\u30a8\u30e9\u30fc\u30cf\u30f3\u30c9\u30ea\u30f3\u30b0\u306e\u5b9f\u88c5<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>[ ] \u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u6700\u9069\u5316\n<ul class=\"wp-block-list\">\n<li>\u30d0\u30c3\u30c1\u51e6\u7406\u306e\u9069\u7528<\/li>\n\n\n\n<li>\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u306e\u6700\u9069\u5316<\/li>\n\n\n\n<li>\u30ad\u30e3\u30c3\u30b7\u30e5\u6226\u7565\u306e\u691c\u8a0e<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>[ ] \u30b3\u30fc\u30c9\u54c1\u8cea\u306e\u78ba\u4fdd\n<ul class=\"wp-block-list\">\n<li>\u30e6\u30cb\u30c3\u30c8\u30c6\u30b9\u30c8\u306e\u4f5c\u6210<\/li>\n\n\n\n<li>\u30b3\u30fc\u30c9\u30ec\u30d3\u30e5\u30fc\u306e\u5b9f\u65bd<\/li>\n\n\n\n<li>\u30c9\u30ad\u30e5\u30e1\u30f3\u30c8\u306e\u6574\u5099<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-49\">\u3055\u3089\u306a\u308b\u5b66\u7fd2\u30ea\u30bd\u30fc\u30b9\u306e\u7d39\u4ecb<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-50\">1. \u63a8\u5968\u5b66\u7fd2\u30d1\u30b9<\/h4>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u57fa\u790e\u5f37\u5316<\/strong>\n<ul class=\"wp-block-list\">\n<li>MyBatis\u516c\u5f0f\u30c9\u30ad\u30e5\u30e1\u30f3\u30c8<\/li>\n\n\n\n<li>SQL\u306e\u6700\u9069\u5316\u624b\u6cd5<\/li>\n\n\n\n<li>Java\u30b9\u30c8\u30ea\u30fc\u30e0\u51e6\u7406<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>\u5fdc\u7528\u6280\u8853<\/strong>\n<ul class=\"wp-block-list\">\n<li>\u30b9\u30d7\u30ea\u30f3\u30b0\u30d5\u30ec\u30fc\u30e0\u30ef\u30fc\u30af\u3068\u306e\u7d71\u5408<\/li>\n\n\n\n<li>\u30de\u30a4\u30af\u30ed\u30b5\u30fc\u30d3\u30b9\u3067\u306eMyBatis\u6d3b\u7528<\/li>\n\n\n\n<li>\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u30c1\u30e5\u30fc\u30cb\u30f3\u30b0<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>\u5b9f\u8df5\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u6848<\/strong>\n<ul class=\"wp-block-list\">\n<li>\u30d0\u30c3\u30c1\u51e6\u7406\u30b7\u30b9\u30c6\u30e0\u306e\u5b9f\u88c5<\/li>\n\n\n\n<li>\u52d5\u7684\u691c\u7d22\u30b7\u30b9\u30c6\u30e0\u306e\u958b\u767a<\/li>\n\n\n\n<li>\u30de\u30b9\u30bf\u30fc\u30c7\u30fc\u30bf\u7ba1\u7406\u30b7\u30b9\u30c6\u30e0<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-51\">2. \u6b21\u306e\u30b9\u30c6\u30c3\u30d7\u3078\u306e\u6e96\u5099<\/h4>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ \u5b9f\u8df5\u7684\u306a\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u4f8b\uff1a\u9ad8\u5ea6\u306a\u691c\u7d22\u30b7\u30b9\u30c6\u30e0\n@Service\npublic class AdvancedSearchService {\n    \/\/ \u52d5\u7684\u691c\u7d22\u6761\u4ef6\u306e\u69cb\u7bc9\n    public SearchResult search(SearchCriteria criteria) {\n        return Optional.of(criteria)\n            .map(this::validateCriteria)\n            .map(this::enrichCriteria)\n            .map(this::executeSearch)\n            .map(this::processResults)\n            .orElseThrow(() -&gt; new SearchException(\"\u691c\u7d22\u51e6\u7406\u306b\u5931\u6557\u3057\u307e\u3057\u305f\"));\n    }\n\n    \/\/ \u691c\u7d22\u6761\u4ef6\u306e\u691c\u8a3c\n    private SearchCriteria validateCriteria(SearchCriteria criteria) {\n        \/\/ \u5165\u529b\u5024\u306e\u691c\u8a3c\u30ed\u30b8\u30c3\u30af\n        return criteria;\n    }\n\n    \/\/ \u691c\u7d22\u6761\u4ef6\u306e\u62e1\u5f35\n    private SearchCriteria enrichCriteria(SearchCriteria criteria) {\n        \/\/ \u8ffd\u52a0\u6761\u4ef6\u306e\u8a2d\u5b9a\n        return criteria;\n    }\n\n    \/\/ \u691c\u7d22\u306e\u5b9f\u884c\n    private List&lt;SearchResult&gt; executeSearch(SearchCriteria criteria) {\n        \/\/ MyBatis foreach\u3092\u4f7f\u7528\u3057\u305f\u691c\u7d22\u306e\u5b9f\u884c\n        return mapper.search(criteria);\n    }\n\n    \/\/ \u7d50\u679c\u306e\u5f8c\u51e6\u7406\n    private SearchResult processResults(List&lt;SearchResult&gt; results) {\n        \/\/ \u691c\u7d22\u7d50\u679c\u306e\u52a0\u5de5\u30fb\u96c6\u8a08\n        return new SearchResult(results);\n    }\n}<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-52\">3. \u767a\u5c55\u7684\u306a\u30c8\u30d4\u30c3\u30af<\/h4>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u30c1\u30e5\u30fc\u30cb\u30f3\u30b0<\/strong>\n<ul class=\"wp-block-list\">\n<li>\u5b9f\u884c\u8a08\u753b\u306e\u6700\u9069\u5316<\/li>\n\n\n\n<li>\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u6226\u7565<\/li>\n\n\n\n<li>\u30ad\u30e3\u30c3\u30b7\u30e5\u7ba1\u7406<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u5f37\u5316<\/strong>\n<ul class=\"wp-block-list\">\n<li>\u5165\u529b\u5024\u691c\u8a3c\u306e\u5f37\u5316<\/li>\n\n\n\n<li>\u30a2\u30af\u30bb\u30b9\u5236\u5fa1\u306e\u5b9f\u88c5<\/li>\n\n\n\n<li>\u76e3\u67fb\u30ed\u30b0\u306e\u5b9f\u88c5<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>\u4fdd\u5b88\u6027\u5411\u4e0a<\/strong>\n<ul class=\"wp-block-list\">\n<li>\u30c6\u30b9\u30c8\u81ea\u52d5\u5316<\/li>\n\n\n\n<li>CI\/CD\u5bfe\u5fdc<\/li>\n\n\n\n<li>\u30e2\u30cb\u30bf\u30ea\u30f3\u30b0\u5f37\u5316<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n\n\n\n<p>MyBatis foreach\u306e\u7fd2\u5f97\u306f\u3001\u52b9\u7387\u7684\u306a\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u64cd\u4f5c\u306e\u7b2c\u4e00\u6b69\u3067\u3059\u3002\u3053\u306e\u6a5f\u80fd\u3092\u5b9f\u8df5\u7684\u306b\u6d3b\u7528\u3059\u308b\u3053\u3068\u3067\u3001\u3088\u308a\u5805\u7262\u3067\u4fdd\u5b88\u6027\u306e\u9ad8\u3044\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u958b\u767a\u304c\u53ef\u80fd\u306b\u306a\u308a\u307e\u3059\u3002\u4ee5\u4e0b\u306f\u3001\u3055\u3089\u306a\u308b\u6210\u9577\u306e\u305f\u3081\u306e\u30ed\u30fc\u30c9\u30de\u30c3\u30d7\u3067\u3059\u3002<\/p>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-53\">4. \u5fdc\u7528\u958b\u767a\u306e\u30d9\u30b9\u30c8\u30d7\u30e9\u30af\u30c6\u30a3\u30b9<\/h4>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u8a2d\u8a08\u30d1\u30bf\u30fc\u30f3\u306e\u6d3b\u7528<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ \u30ea\u30dd\u30b8\u30c8\u30ea\u30d1\u30bf\u30fc\u30f3\u306e\u5b9f\u88c5\u4f8b\n@Repository\npublic class UserRepository {\n    private final UserMapper mapper;\n\n    @Transactional(readOnly = true)\n    public List&lt;User&gt; findByDynamicConditions(SearchCondition condition) {\n        return Optional.of(condition)\n            .filter(this::validateCondition)\n            .map(this::convertToQueryParams)\n            .map(mapper::findByConditions)\n            .orElse(Collections.emptyList());\n    }\n\n    @Transactional\n    public void bulkUpdate(List&lt;UserUpdateRequest&gt; requests) {\n        BatchExecutor.executeInBatches(requests, 1000, mapper::bulkUpdate);\n    }\n}\n\n\/\/ \u30d0\u30c3\u30c1\u51e6\u7406\u30e6\u30fc\u30c6\u30a3\u30ea\u30c6\u30a3\npublic class BatchExecutor {\n    public static &lt;T&gt; void executeInBatches(List&lt;T&gt; items, \n                                          int batchSize, \n                                          Consumer&lt;List&lt;T&gt;&gt; operation) {\n        Lists.partition(items, batchSize)\n            .forEach(batch -&gt; {\n                operation.accept(batch);\n                TransactionSynchronizationManager.clear();\n            });\n    }\n}<\/pre>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li><strong>\u30c6\u30b9\u30c8\u99c6\u52d5\u958b\u767a\u306e\u9069\u7528<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">@SpringBootTest\nclass UserRepositoryTest {\n    @Autowired\n    private UserRepository repository;\n\n    @Test\n    void testDynamicSearch() {\n        \/\/ \u30c6\u30b9\u30c8\u30c7\u30fc\u30bf\u306e\u30bb\u30c3\u30c8\u30a2\u30c3\u30d7\n        List&lt;User&gt; testUsers = createTestUsers();\n        repository.saveAll(testUsers);\n\n        \/\/ \u691c\u7d22\u6761\u4ef6\u306e\u4f5c\u6210\n        SearchCondition condition = SearchCondition.builder()\n            .statuses(Arrays.asList(\"ACTIVE\", \"PENDING\"))\n            .departments(Arrays.asList(1L, 2L))\n            .build();\n\n        \/\/ \u691c\u7d22\u5b9f\u884c\u3068\u7d50\u679c\u691c\u8a3c\n        List&lt;User&gt; results = repository.findByDynamicConditions(condition);\n        assertThat(results)\n            .hasSize(2)\n            .allMatch(user -&gt; \n                condition.getStatuses().contains(user.getStatus()));\n    }\n}<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-54\">5. \u4eca\u5f8c\u306e\u6280\u8853\u30c8\u30ec\u30f3\u30c9\u3068\u5bfe\u5fdc<\/h4>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u30af\u30e9\u30a6\u30c9\u30cd\u30a4\u30c6\u30a3\u30d6\u5bfe\u5fdc<\/strong>\n<ul class=\"wp-block-list\">\n<li>\u30b3\u30f3\u30c6\u30ca\u5316\u5bfe\u5fdc<\/li>\n\n\n\n<li>\u30de\u30a4\u30af\u30ed\u30b5\u30fc\u30d3\u30b9\u30a2\u30fc\u30ad\u30c6\u30af\u30c1\u30e3<\/li>\n\n\n\n<li>\u30b9\u30b1\u30fc\u30e9\u30d3\u30ea\u30c6\u30a3\u78ba\u4fdd<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>\u65b0\u6280\u8853\u3068\u306e\u7d71\u5408<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ R2DBC\u3068\u306e\u7d71\u5408\u4f8b\n@Configuration\npublic class DatabaseConfig {\n    @Bean\n    public ConnectionFactory connectionFactory() {\n        return PostgresqlConnectionFactory.builder()\n            .host(\"localhost\")\n            .database(\"testdb\")\n            .username(\"user\")\n            .password(\"pass\")\n            .build();\n    }\n\n    @Bean\n    public DatabaseClient databaseClient(ConnectionFactory connectionFactory) {\n        return DatabaseClient.builder()\n            .connectionFactory(connectionFactory)\n            .namedParameters(true)\n            .build();\n    }\n}<\/pre>\n\n\n\n<ol start=\"3\" class=\"wp-block-list\">\n<li><strong>\u30e2\u30cb\u30bf\u30ea\u30f3\u30b0\u3068\u904b\u7528<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">@Aspect\n@Component\npublic class OperationMonitor {\n    private final MeterRegistry registry;\n\n    @Around(\"execution(* com.example.repository.*.*(..))\")\n    public Object monitorOperation(ProceedingJoinPoint joinPoint) \n            throws Throwable {\n        Timer.Sample sample = Timer.start(registry);\n        try {\n            return joinPoint.proceed();\n        } finally {\n            sample.stop(Timer.builder(\"database.operation\")\n                .tag(\"method\", joinPoint.getSignature().getName())\n                .register(registry));\n        }\n    }\n}<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-55\">\u6700\u7d42\u30c1\u30a7\u30c3\u30af\u30ea\u30b9\u30c8<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u57fa\u672c\u30b9\u30ad\u30eb<\/strong>\n<ul class=\"wp-block-list\">\n<li>[] foreach\u306e\u57fa\u672c\u6587\u6cd5\u306e\u7406\u89e3<\/li>\n\n\n\n<li>[] \u52d5\u7684SQL\u306e\u69cb\u7bc9\u65b9\u6cd5\u306e\u7fd2\u5f97<\/li>\n\n\n\n<li>[] \u30a8\u30e9\u30fc\u30cf\u30f3\u30c9\u30ea\u30f3\u30b0\u306e\u5b9f\u88c5<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>\u5fdc\u7528\u30b9\u30ad\u30eb<\/strong>\n<ul class=\"wp-block-list\">\n<li>[] \u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u6700\u9069\u5316<\/li>\n\n\n\n<li>[] \u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u5bfe\u7b56<\/li>\n\n\n\n<li>[] \u4fdd\u5b88\u6027\u306e\u78ba\u4fdd<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>\u767a\u5c55\u30b9\u30ad\u30eb<\/strong>\n<ul class=\"wp-block-list\">\n<li>[ ] \u30de\u30a4\u30af\u30ed\u30b5\u30fc\u30d3\u30b9\u5bfe\u5fdc<\/li>\n\n\n\n<li>[ ] \u30af\u30e9\u30a6\u30c9\u30cd\u30a4\u30c6\u30a3\u30d6\u5316<\/li>\n\n\n\n<li>[ ] \u65b0\u6280\u8853\u3068\u306e\u7d71\u5408<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-56\">\u6b21\u306e\u30b9\u30c6\u30c3\u30d7\u306b\u5411\u3051\u3066<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u7d99\u7d9a\u7684\u306a\u5b66\u7fd2<\/strong>\n<ul class=\"wp-block-list\">\n<li>\u516c\u5f0f\u30c9\u30ad\u30e5\u30e1\u30f3\u30c8\u306e\u5b9a\u671f\u7684\u306a\u78ba\u8a8d<\/li>\n\n\n\n<li>\u30b3\u30df\u30e5\u30cb\u30c6\u30a3\u3078\u306e\u53c2\u52a0<\/li>\n\n\n\n<li>\u5b9f\u8df5\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u306e\u9042\u884c<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>\u30b9\u30ad\u30eb\u5411\u4e0a\u306e\u6a5f\u4f1a<\/strong>\n<ul class=\"wp-block-list\">\n<li>\u6280\u8853\u52c9\u5f37\u4f1a\u3078\u306e\u53c2\u52a0<\/li>\n\n\n\n<li>\u30aa\u30fc\u30d7\u30f3\u30bd\u30fc\u30b9\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u3078\u306e\u8ca2\u732e<\/li>\n\n\n\n<li>\u6280\u8853\u30d6\u30ed\u30b0\u306e\u57f7\u7b46<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>\u30ad\u30e3\u30ea\u30a2\u30d1\u30b9<\/strong>\n<ul class=\"wp-block-list\">\n<li>\u30d0\u30c3\u30af\u30a8\u30f3\u30c9\u30b9\u30da\u30b7\u30e3\u30ea\u30b9\u30c8<\/li>\n\n\n\n<li>\u30a2\u30fc\u30ad\u30c6\u30af\u30c8<\/li>\n\n\n\n<li>\u30c6\u30c3\u30af\u30ea\u30fc\u30c9<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n\n\n\n<p>MyBatis foreach\u306e\u7fd2\u5f97\u306f\u3001\u52b9\u7387\u7684\u306a\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u64cd\u4f5c\u306e\u57fa\u790e\u3068\u306a\u308a\u307e\u3059\u3002\u3053\u306e\u6a5f\u80fd\u3092\u5165\u308a\u53e3\u3068\u3057\u3066\u3001\u3055\u3089\u306a\u308b\u6280\u8853\u7684\u306a\u63a2\u6c42\u3092\u7d9a\u3051\u308b\u3053\u3068\u3067\u3001\u3088\u308a\u9ad8\u5ea6\u306a\u30b7\u30b9\u30c6\u30e0\u958b\u767a\u306e\u30b9\u30ad\u30eb\u3092\u8eab\u306b\u3064\u3051\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u3059\u3002<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Warning: Undefined array key &#8220;is_admin&#8221; in \/home\/xs392991\/dexall.co.jp\/public_html\/articles\/wp-content\/themes\/ &#8230; <\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":{"0":"post-508","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-uncategorized","7":"nothumb"},"_links":{"self":[{"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=\/wp\/v2\/posts\/508","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=508"}],"version-history":[{"count":2,"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=\/wp\/v2\/posts\/508\/revisions"}],"predecessor-version":[{"id":516,"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=\/wp\/v2\/posts\/508\/revisions\/516"}],"wp:attachment":[{"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=508"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=508"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=508"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}