{"id":495,"date":"2025-03-24T08:53:20","date_gmt":"2025-03-23T23:53:20","guid":{"rendered":"https:\/\/dexall.co.jp\/articles\/?p=495"},"modified":"2025-03-24T08:53:20","modified_gmt":"2025-03-23T23:53:20","slug":"%e3%80%902024%e5%b9%b4%e4%bf%9d%e5%ad%98%e7%89%88%e3%80%91mybatis%e3%81%a7%e5%ae%9f%e7%8f%be%e3%81%99%e3%82%8b%e9%ab%98%e9%80%9f%e5%ae%89%e5%85%a8%e3%81%aadb%e6%93%8d%e4%bd%9c-%e3%80%9c%e8%a8%ad","status":"publish","type":"post","link":"https:\/\/dexall.co.jp\/articles\/?p=495","title":{"rendered":"\u30102024\u5e74\u4fdd\u5b58\u7248\u3011MyBatis\u3067\u5b9f\u73fe\u3059\u308b\u9ad8\u901f&amp;\u5b89\u5168\u306aDB\u64cd\u4f5c \u301c\u8a2d\u5b9a\u304b\u3089\u5b9f\u8df5\u7684\u306a\u5b9f\u88c5\u307e\u3067\u5b8c\u5168\u89e3\u8aac"},"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\u3068\u306f\uff1f\u521d\u5fc3\u8005\u306b\u3082\u308f\u304b\u308b\u57fa\u790e\u77e5\u8b58<\/a>    <ul class=\"menu_level_1\">      <li class=\"first\">        <a href=\"#i-1\">Java\u306eO\/R\u30de\u30c3\u30d1\u30fc\u306e\u6c7a\u5b9a\u7248\uff1aMyBatis\u306e\u7279\u5fb4\u3068\u5f37\u307f<\/a>      <\/li>      <li>        <a href=\"#i-2\">\u5f93\u6765\u306eJDBC\u3068\u6bd4\u8f03\u3057\u305fMyBatis\u306e\u30e1\u30ea\u30c3\u30c8<\/a>      <\/li>      <li class=\"last\">        <a href=\"#i-3\">\u4ed6\u306eO\/R\u30de\u30c3\u30d1\u30fc\u3068\u306e\u9055\u3044\u3092\u7406\u89e3\u3057\u3088\u3046<\/a>      <\/li>    <\/ul>  <\/li>  <li>    <a href=\"#i-4\">MyBatis\u74b0\u5883\u69cb\u7bc9\u306e\u5b8c\u5168\u30ac\u30a4\u30c9<\/a>    <ul class=\"menu_level_1\">      <li class=\"first\">        <a href=\"#i-5\">Maven\/Gradle\u3067\u306e\u4f9d\u5b58\u95a2\u4fc2\u306e\u8a2d\u5b9a\u65b9\u6cd5<\/a>      <\/li>      <li>        <a href=\"#i-6\">Spring Boot\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u3067\u306e\u8a2d\u5b9a\u624b\u9806<\/a>      <\/li>      <li class=\"last\">        <a href=\"#i-7\">\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u63a5\u7d9a\u8a2d\u5b9a\u306e\u30d9\u30b9\u30c8\u30d7\u30e9\u30af\u30c6\u30a3\u30b9<\/a>      <\/li>    <\/ul>  <\/li>  <li>    <a href=\"#i-8\">\u57fa\u672c\u7684\u306aCRUD\u64cd\u4f5c\u306e\u5b9f\u88c5\u65b9\u6cd5<\/a>    <ul class=\"menu_level_1\">      <li class=\"first\">        <a href=\"#i-9\">\u30a2\u30ce\u30c6\u30fc\u30b7\u30e7\u30f3\u3092\u4f7f\u7528\u3057\u305f\u30b7\u30f3\u30d7\u30eb\u306a\u5b9f\u88c5\u4f8b<\/a>      <\/li>      <li>        <a href=\"#i-10\">XML\u30de\u30c3\u30d4\u30f3\u30b0\u306b\u3088\u308b\u67d4\u8edf\u306aSQL\u5b9a\u7fa9<\/a>      <\/li>      <li class=\"last\">        <a href=\"#i-11\">\u52d5\u7684SQL\u3067\u6761\u4ef6\u5206\u5c90\u3092\u5b9f\u73fe\u3059\u308b\u65b9\u6cd5<\/a>      <\/li>    <\/ul>  <\/li>  <li>    <a href=\"#i-12\">\u5b9f\u8df5\u7684\u306aMyBatis\u6d3b\u7528\u30c6\u30af\u30cb\u30c3\u30af<\/a>    <ul class=\"menu_level_1\">      <li class=\"first\">        <a href=\"#i-13\">\u8907\u96d1\u306a\u691c\u7d22\u6761\u4ef6\u3092\u52b9\u7387\u7684\u306b\u5b9f\u88c5\u3059\u308b\u30b3\u30c4<\/a>      <\/li>      <li>        <a href=\"#i-14\">N+1\u554f\u984c\u3092\u89e3\u6c7a\u3059\u308b\u305f\u3081\u306e\u5b9f\u88c5\u65b9\u6cd5<\/a>      <\/li>      <li class=\"last\">        <a href=\"#i-15\">\u5927\u91cf\u30c7\u30fc\u30bf\u51e6\u7406\u6642\u306e\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u6700\u9069\u5316<\/a>      <\/li>    <\/ul>  <\/li>  <li>    <a href=\"#i-16\">MyBatis\u306b\u3088\u308b\u30bb\u30ad\u30e5\u30a2\u306a\u5b9f\u88c5\u306e\u30dd\u30a4\u30f3\u30c8<\/a>    <ul class=\"menu_level_1\">      <li class=\"first\">        <a href=\"#i-17\">SQL\u30a4\u30f3\u30b8\u30a7\u30af\u30b7\u30e7\u30f3\u5bfe\u7b56\u306e\u5b9f\u88c5\u65b9\u6cd5<\/a>      <\/li>      <li>        <a href=\"#i-18\">\u30c8\u30e9\u30f3\u30b6\u30af\u30b7\u30e7\u30f3\u7ba1\u7406\u306e\u6b63\u3057\u3044\u4f7f\u3044\u65b9<\/a>      <\/li>      <li class=\"last\">        <a href=\"#i-19\">\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u3092\u8003\u616e\u3057\u305f\u30de\u30c3\u30d4\u30f3\u30b0\u8a2d\u8a08<\/a>      <\/li>    <\/ul>  <\/li>  <li>    <a href=\"#i-20\">\u30c8\u30e9\u30d6\u30eb\u30b7\u30e5\u30fc\u30c6\u30a3\u30f3\u30b0\u3068\u30d9\u30b9\u30c8\u30d7\u30e9\u30af\u30c6\u30a3\u30b9<\/a>    <ul class=\"menu_level_1\">      <li class=\"first\">        <a href=\"#i-21\">\u3088\u304f\u3042\u308b\u30a8\u30e9\u30fc\u3068\u305d\u306e\u89e3\u6c7a\u65b9\u6cd5<\/a>      <\/li>      <li>        <a href=\"#i-22\">\u30e6\u30cb\u30c3\u30c8\u30c6\u30b9\u30c8\u306e\u5b9f\u88c5\u65b9\u6cd5\u3068\u6ce8\u610f\u70b9<\/a>      <\/li>      <li class=\"last\">        <a href=\"#i-23\">\u4fdd\u5b88\u6027\u3092\u9ad8\u3081\u308b\u305f\u3081\u306e\u30b3\u30fc\u30c7\u30a3\u30f3\u30b0\u898f\u7d04<\/a>      <\/li>    <\/ul>  <\/li>  <li class=\"last\">    <a href=\"#i-24\">\u307e\u3068\u3081\uff1aMyBatis\u3067\u5b9f\u73fe\u3059\u308b\u52b9\u7387\u7684\u306aDB\u64cd\u4f5c<\/a>    <ul class=\"menu_level_1\">      <li class=\"first\">        <a href=\"#i-25\">\u672c\u8a18\u4e8b\u3067\u5b66\u3093\u3060\u30dd\u30a4\u30f3\u30c8<\/a>      <\/li>      <li>        <a href=\"#i-26\">\u6b21\u306e\u30b9\u30c6\u30c3\u30d7<\/a>      <\/li>      <li class=\"last\">        <a href=\"#i-27\">\u6700\u5f8c\u306b<\/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\u3068\u306f\uff1f\u521d\u5fc3\u8005\u306b\u3082\u308f\u304b\u308b\u57fa\u790e\u77e5\u8b58<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-1\">Java\u306eO\/R\u30de\u30c3\u30d1\u30fc\u306e\u6c7a\u5b9a\u7248\uff1aMyBatis\u306e\u7279\u5fb4\u3068\u5f37\u307f<\/h3>\n\n\n\n<p>MyBatis\u306f\u3001Java\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3067\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u64cd\u4f5c\u3092\u7c21\u5358\u304b\u3064\u52b9\u7387\u7684\u306b\u884c\u3046\u305f\u3081\u306eO\/R\u30de\u30c3\u30d4\u30f3\u30b0\u30d5\u30ec\u30fc\u30e0\u30ef\u30fc\u30af\u3067\u3059\u3002\u4ee5\u4e0b\u306e\u7279\u5fb4\u306b\u3088\u308a\u3001\u591a\u304f\u306e\u958b\u767a\u73fe\u5834\u3067\u63a1\u7528\u3055\u308c\u3066\u3044\u307e\u3059\uff1a<\/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\"><strong>\u4e3b\u306a\u7279\u5fb4\uff1a<\/strong><\/div><div class=\"sgb-box-simple__body\" style=\"border-color:var(--wp--preset--color--sango-main);background-color:#FFF\">\n<ul class=\"wp-block-list\">\n<li>SQL\u3092\u76f4\u63a5\u8a18\u8ff0\u3067\u304d\u308b\u67d4\u8edf\u6027<\/li>\n\n\n\n<li>\u30b7\u30f3\u30d7\u30eb\u306a\u8a2d\u5b9a\u3068API<\/li>\n\n\n\n<li>\u52d5\u7684SQL\u306e\u30b5\u30dd\u30fc\u30c8<\/li>\n\n\n\n<li>\u8c4a\u5bcc\u306a\u30bf\u30a4\u30d7\u30cf\u30f3\u30c9\u30e9\u30fc<\/li>\n\n\n\n<li>\u512a\u308c\u305f\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9<\/li>\n<\/ul>\n<\/div><\/div>\n\n\n\n<p>\u7279\u306b\u3001SQL\u3092\u76f4\u63a5\u8a18\u8ff0\u3067\u304d\u308b\u70b9\u306f\u3001\u8907\u96d1\u306a\u30af\u30a8\u30ea\u306e\u6700\u9069\u5316\u3084\u65e2\u5b58\u30b7\u30b9\u30c6\u30e0\u306e\u79fb\u884c\u306b\u304a\u3044\u3066\u5927\u304d\u306a\u5f37\u307f\u3068\u306a\u3063\u3066\u3044\u307e\u3059\u3002<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-2\">\u5f93\u6765\u306eJDBC\u3068\u6bd4\u8f03\u3057\u305fMyBatis\u306e\u30e1\u30ea\u30c3\u30c8<\/h3>\n\n\n\n<p>JDBC\u3068\u6bd4\u8f03\u3057\u305f\u969b\u306e\u3001MyBatis\u306e\u5177\u4f53\u7684\u306a\u30e1\u30ea\u30c3\u30c8\u3092\u8868\u3067\u6574\u7406\u3057\u307e\u3057\u305f\uff1a<\/p>\n\n\n<div id=\"id-a3ab7a52-3742-4b33-b8e7-214eb8c6170c\">\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>\u89b3\u70b9<\/th><th>JDBC<\/th><th>MyBatis<\/th><th>MyBatis\u306e\u30e1\u30ea\u30c3\u30c8<\/th><\/tr><\/thead><tbody><tr><td>\u30b3\u30fc\u30c9\u91cf<\/td><td>\u591a\u3044<\/td><td>\u5c11\u306a\u3044<\/td><td>\u30dc\u30a4\u30e9\u30fc\u30d7\u30ec\u30fc\u30c8\u30b3\u30fc\u30c9\u3092\u524a\u6e1b<\/td><\/tr><tr><td>SQL\u7ba1\u7406<\/td><td>Java\u30b3\u30fc\u30c9\u5185\u306b\u8a18\u8ff0<\/td><td>XML\/\u30a2\u30ce\u30c6\u30fc\u30b7\u30e7\u30f3\u3067\u5206\u96e2\u53ef\u80fd<\/td><td>\u4fdd\u5b88\u6027\u304c\u5411\u4e0a<\/td><\/tr><tr><td>\u30d1\u30e9\u30e1\u30fc\u30bf\u8a2d\u5b9a<\/td><td>\u624b\u52d5\u3067\u30d0\u30a4\u30f3\u30c9<\/td><td>\u81ea\u52d5\u30de\u30c3\u30d4\u30f3\u30b0<\/td><td>\u958b\u767a\u52b9\u7387\u304c\u5411\u4e0a<\/td><\/tr><tr><td>\u30ea\u30bd\u30fc\u30b9\u7ba1\u7406<\/td><td>\u624b\u52d5<\/td><td>\u81ea\u52d5<\/td><td>\u30b3\u30cd\u30af\u30b7\u30e7\u30f3\u7ba1\u7406\u304c\u5bb9\u6613<\/td><\/tr><tr><td>\u5b9f\u88c5\u306e\u8907\u96d1\u3055<\/td><td>\u9ad8\u3044<\/td><td>\u4f4e\u3044<\/td><td>\u5b66\u7fd2\u30b3\u30b9\u30c8\u304c\u4f4e\u6e1b<\/td><\/tr><\/tbody><\/table><\/figure>\n<\/div>\n\n\n<h3 class=\"wp-block-heading\" id=\"i-3\">\u4ed6\u306eO\/R\u30de\u30c3\u30d1\u30fc\u3068\u306e\u9055\u3044\u3092\u7406\u89e3\u3057\u3088\u3046<\/h3>\n\n\n\n<p>\u4ee3\u8868\u7684\u306aO\/R\u30de\u30c3\u30d1\u30fc\u3068MyBatis\u3092\u6bd4\u8f03\u3059\u308b\u3068\u3001\u4ee5\u4e0b\u306e\u3088\u3046\u306a\u7279\u5fb4\u304c\u3042\u308a\u307e\u3059\uff1a<\/p>\n\n\n\n<p><strong>1. JPA\/Hibernate \u3068\u306e\u6bd4\u8f03<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>MyBatis\uff1aSQL\u3092\u76f4\u63a5\u5236\u5fa1\u3057\u305f\u3044\u5834\u5408\u306b\u6700\u9069<\/li>\n\n\n\n<li>JPA\uff1a\u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u6307\u5411\u7684\u306a\u30a2\u30d7\u30ed\u30fc\u30c1\u3092\u91cd\u8996<\/li>\n<\/ul>\n\n\n\n<p><strong>2. Doma\u3068\u306e\u6bd4\u8f03<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>MyBatis\uff1a\u3088\u308a\u5e83\u304f\u4f7f\u308f\u308c\u3066\u304a\u308a\u3001\u60c5\u5831\u304c\u8c4a\u5bcc<\/li>\n\n\n\n<li>Doma\uff1a\u3088\u308a\u578b\u5b89\u5168\u6027\u304c\u9ad8\u3044<\/li>\n<\/ul>\n\n\n\n<p><strong>3. Spring JDBC\u3068\u306e\u6bd4\u8f03<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>MyBatis\uff1a\u3088\u308a\u9ad8\u5ea6\u306a\u30de\u30c3\u30d4\u30f3\u30b0\u6a5f\u80fd\u3092\u63d0\u4f9b<\/li>\n\n\n\n<li>Spring JDBC\uff1a\u3088\u308a\u30b7\u30f3\u30d7\u30eb\u306a\u5b9f\u88c5\u304c\u53ef\u80fd<\/li>\n<\/ul>\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\">MyBatis\u304c\u9078\u3070\u308c\u308b\u7406\u7531\uff1a<\/div><div class=\"sgb-box-simple__body\" style=\"border-color:var(--wp--preset--color--sango-main);background-color:#FFF\">\n<ul class=\"wp-block-list\">\n<li>\u5b66\u7fd2\u66f2\u7dda\u304c\u7de9\u3084\u304b<\/li>\n\n\n\n<li>SQL\u6700\u9069\u5316\u306e\u81ea\u7531\u5ea6\u304c\u9ad8\u3044<\/li>\n\n\n\n<li>Spring\u3068\u306e\u89aa\u548c\u6027\u304c\u9ad8\u3044<\/li>\n\n\n\n<li>\u5b9f\u7e3e\u306e\u3042\u308b\u5b89\u5b9a\u3057\u305f\u30d5\u30ec\u30fc\u30e0\u30ef\u30fc\u30af<\/li>\n\n\n\n<li>\u5927\u898f\u6a21\u30b7\u30b9\u30c6\u30e0\u3067\u306e\u63a1\u7528\u5b9f\u7e3e\u304c\u8c4a\u5bcc<\/li>\n<\/ul>\n\n\n\n<p>\u3053\u308c\u3089\u306e\u7279\u5fb4\u304b\u3089\u3001MyBatis\u306f\u7279\u306b\u4ee5\u4e0b\u306e\u3088\u3046\u306a\u5834\u9762\u3067\u771f\u4fa1\u3092\u767a\u63ee\u3057\u307e\u3059\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u8907\u96d1\u306aSQL\u3092\u4f7f\u7528\u3059\u308b\u5fc5\u8981\u304c\u3042\u308b\u5834\u5408<\/li>\n\n\n\n<li>\u30ec\u30ac\u30b7\u30fc\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u3068\u306e\u9023\u643a\u304c\u5fc5\u8981\u306a\u5834\u5408<\/li>\n\n\n\n<li>\u30c1\u30fc\u30e0\u306e\u30b9\u30ad\u30eb\u30ec\u30d9\u30eb\u306b\u3070\u3089\u3064\u304d\u304c\u3042\u308b\u5834\u5408<\/li>\n\n\n\n<li>\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u30c1\u30e5\u30fc\u30cb\u30f3\u30b0\u306e\u81ea\u7531\u5ea6\u304c\u5fc5\u8981\u306a\u5834\u5408<\/li>\n<\/ul>\n<\/div><\/div>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-4\">MyBatis\u74b0\u5883\u69cb\u7bc9\u306e\u5b8c\u5168\u30ac\u30a4\u30c9<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-5\">Maven\/Gradle\u3067\u306e\u4f9d\u5b58\u95a2\u4fc2\u306e\u8a2d\u5b9a\u65b9\u6cd5<\/h3>\n\n\n\n<p>MyBatis\u3092\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u306b\u5c0e\u5165\u3059\u308b\u969b\u306e\u4f9d\u5b58\u95a2\u4fc2\u8a2d\u5b9a\u306b\u3064\u3044\u3066\u8aac\u660e\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<p><strong>Maven\u306e\u5834\u5408\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=\"\">&lt;!-- pom.xml\u306b\u8ffd\u52a0 --&gt;\n&lt;dependencies&gt;\n    &lt;!-- MyBatis --&gt;\n    &lt;dependency&gt;\n        &lt;groupId&gt;org.mybatis&lt;\/groupId&gt;\n        &lt;artifactId&gt;mybatis&lt;\/artifactId&gt;\n        &lt;version&gt;3.5.13&lt;\/version&gt;\n    &lt;\/dependency&gt;\n\n    &lt;!-- MySQL Connector (\u5fc5\u8981\u306b\u5fdc\u3058\u3066) --&gt;\n    &lt;dependency&gt;\n        &lt;groupId&gt;mysql&lt;\/groupId&gt;\n        &lt;artifactId&gt;mysql-connector-java&lt;\/artifactId&gt;\n        &lt;version&gt;8.0.33&lt;\/version&gt;\n    &lt;\/dependency&gt;\n&lt;\/dependencies&gt;<\/pre>\n\n\n\n<p><strong>Gradle\u306e\u5834\u5408\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=\"\">\/\/ build.gradle\u306b\u8ffd\u52a0\ndependencies {\n    implementation 'org.mybatis:mybatis:3.5.13'\n    implementation 'mysql:mysql-connector-java:8.0.33'\n}<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-6\">Spring Boot\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u3067\u306e\u8a2d\u5b9a\u624b\u9806<\/h3>\n\n\n\n<p>Spring Boot\u3067MyBatis\u3092\u4f7f\u7528\u3059\u308b\u5834\u5408\u306e\u8a2d\u5b9a\u624b\u9806\u3067\u3059\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306e\u30a8\u30f3\u30c8\u30ea\u30fc\u30dd\u30a4\u30f3\u30c8\u8a2d\u5b9a<\/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=\"\">@SpringBootApplication\n@MapperScan(\"com.example.mapper\")  \/\/ Mapper\u30a4\u30f3\u30bf\u30fc\u30d5\u30a7\u30fc\u30b9\u306e\u81ea\u52d5\u30b9\u30ad\u30e3\u30f3\npublic class Application {\n    public static void main(String[] args) {\n        SpringApplication.run(Application.class, args);\n    }\n\n    \/\/ MyBatis\u8a2d\u5b9a\u306e\u30ab\u30b9\u30bf\u30de\u30a4\u30ba\uff08\u5fc5\u8981\u306a\u5834\u5408\uff09\n    @Bean\n    public ConfigurationCustomizer mybatisConfigurationCustomizer() {\n        return configuration -&gt; {\n            configuration.setMapUnderscoreToCamelCase(true);  \/\/ \u30b9\u30cd\u30fc\u30af\u30b1\u30fc\u30b9\u2192\u30ad\u30e3\u30e1\u30eb\u30b1\u30fc\u30b9\u5909\u63db\n            configuration.setCallSettersOnNulls(true);        \/\/ NULL\u5024\u306e\u51e6\u7406\u8a2d\u5b9a\n            configuration.setUseGeneratedKeys(true);          \/\/ \u751f\u6210\u30ad\u30fc\u306e\u53d6\u5f97\u6709\u52b9\u5316\n        };\n    }\n}<\/pre>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li><strong>application.properties\u306e\u8a73\u7d30\u8a2d\u5b9a<\/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=\"\"># \u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u63a5\u7d9a\u8a2d\u5b9a\nspring.datasource.url=jdbc:mysql:\/\/localhost:3306\/your_database\nspring.datasource.username=your_username\nspring.datasource.password=your_password\nspring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver\n\n# MyBatis\u8a2d\u5b9a\nmybatis.mapper-locations=classpath:mapper\/*.xml\nmybatis.type-aliases-package=com.example.domain\nmybatis.configuration.map-underscore-to-camel-case=true\nmybatis.configuration.default-fetch-size=100\nmybatis.configuration.default-statement-timeout=30\n\n# HikariCP\u8a2d\u5b9a\u306e\u6700\u9069\u5316\nspring.datasource.hikari.maximum-pool-size=10\nspring.datasource.hikari.minimum-idle=5\nspring.datasource.hikari.idle-timeout=300000\nspring.datasource.hikari.connection-timeout=20000\nspring.datasource.hikari.max-lifetime=1200000<\/pre>\n\n\n\n<ol start=\"3\" class=\"wp-block-list\">\n<li><strong>\u74b0\u5883\u5225\u306e\u8a2d\u5b9a\u30d5\u30a1\u30a4\u30eb\u5206\u96e2<\/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=\"\"># application-dev.yml\nspring:\n  datasource:\n    url: jdbc:mysql:\/\/localhost:3306\/dev_db\n    username: dev_user\n    password: dev_pass\n    hikari:\n      maximum-pool-size: 5\n\n# application-prod.yml\nspring:\n  datasource:\n    url: jdbc:mysql:\/\/${DB_HOST}:${DB_PORT}\/${DB_NAME}\n    username: ${DB_USER}\n    password: ${DB_PASS}\n    hikari:\n      maximum-pool-size: 20<\/pre>\n\n\n\n<ol start=\"4\" class=\"wp-block-list\">\n<li><strong>Mapper\u30a4\u30f3\u30bf\u30fc\u30d5\u30a7\u30fc\u30b9\u306e\u5b9f\u88c5<\/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=\"\">@Mapper\npublic interface UserMapper {\n    @Select(\"SELECT * FROM users WHERE id = #{id}\")\n    @Results({\n        @Result(property = \"userId\", column = \"user_id\"),\n        @Result(property = \"createdAt\", column = \"created_at\")\n    })\n    User findById(@Param(\"id\") Long id);\n}<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-7\">\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u63a5\u7d9a\u8a2d\u5b9a\u306e\u30d9\u30b9\u30c8\u30d7\u30e9\u30af\u30c6\u30a3\u30b9<\/h3>\n\n\n\n<p>\u30bb\u30ad\u30e5\u30a2\u3067\u52b9\u7387\u7684\u306a\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u63a5\u7d9a\u8a2d\u5b9a\u306e\u30d9\u30b9\u30c8\u30d7\u30e9\u30af\u30c6\u30a3\u30b9\u3092\u7d39\u4ecb\u3057\u307e\u3059\uff1a<\/p>\n\n\n\n<p><strong>1. \u30b3\u30cd\u30af\u30b7\u30e7\u30f3\u30d7\u30fc\u30eb\u306e\u8a2d\u5b9a<\/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=\"\"># HikariCP\u8a2d\u5b9a\nspring.datasource.hikari.maximum-pool-size=10\nspring.datasource.hikari.minimum-idle=5\nspring.datasource.hikari.idle-timeout=300000<\/pre>\n\n\n\n<p><strong>2. \u74b0\u5883\u5225\u8a2d\u5b9a\u306e\u5206\u96e2<\/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=\"\"># application-dev.yml\nspring:\n  datasource:\n    url: jdbc:mysql:\/\/localhost:3306\/dev_db\n    username: dev_user\n    password: dev_pass\n\n# application-prod.yml\nspring:\n  datasource:\n    url: jdbc:mysql:\/\/${DB_HOST}:${DB_PORT}\/${DB_NAME}\n    username: ${DB_USER}\n    password: ${DB_PASS}<\/pre>\n\n\n\n<p><strong>3. \u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u8a2d\u5b9a\u306e\u30d9\u30b9\u30c8\u30d7\u30e9\u30af\u30c6\u30a3\u30b9<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u74b0\u5883\u5909\u6570\u306e\u4f7f\u7528<\/li>\n\n\n\n<li>SSL\/TLS\u63a5\u7d9a\u306e\u6709\u52b9\u5316<\/li>\n\n\n\n<li>\u6700\u5c0f\u6a29\u9650\u539f\u5247\u306e\u9069\u7528<\/li>\n<\/ul>\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=\"\"># SSL\u63a5\u7d9a\u306e\u8a2d\u5b9a\nspring.datasource.url=jdbc:mysql:\/\/localhost:3306\/your_database?useSSL=true&amp;requireSSL=true<\/pre>\n\n\n\n<p><strong>4. \u76e3\u8996\u8a2d\u5b9a<\/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=\"\"># \u30a2\u30af\u30c6\u30a3\u30d6\u306a\u63a5\u7d9a\u306e\u76e3\u8996\nmanagement.endpoints.web.exposure.include=health,metrics\nmanagement.metrics.enable.jdbc=true<\/pre>\n\n\n\n<p>\u3053\u308c\u3089\u306e\u8a2d\u5b9a\u3092\u9069\u5207\u306b\u884c\u3046\u3053\u3068\u3067\u3001\u5b89\u5168\u3067\u52b9\u7387\u7684\u306aMyBatis\u74b0\u5883\u3092\u69cb\u7bc9\u3059\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u3059\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-8\">\u57fa\u672c\u7684\u306aCRUD\u64cd\u4f5c\u306e\u5b9f\u88c5\u65b9\u6cd5<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-9\">\u30a2\u30ce\u30c6\u30fc\u30b7\u30e7\u30f3\u3092\u4f7f\u7528\u3057\u305f\u30b7\u30f3\u30d7\u30eb\u306a\u5b9f\u88c5\u4f8b<\/h3>\n\n\n\n<p>\u30a2\u30ce\u30c6\u30fc\u30b7\u30e7\u30f3\u3092\u4f7f\u7528\u3057\u305fMyBatis\u306e\u5b9f\u88c5\u65b9\u6cd5\u3092\u3001\u30e6\u30fc\u30b6\u30fc\u60c5\u5831\u3092\u7ba1\u7406\u3059\u308b\u4f8b\u3067\u8aac\u660e\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<p><strong>1. \u30a8\u30f3\u30c6\u30a3\u30c6\u30a3\u30af\u30e9\u30b9\u306e\u5b9a\u7fa9<\/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=\"\">public class User {\n    private Long id;\n    private String username;\n    private String email;\n    private LocalDateTime createdAt;\n\n    \/\/ getters and setters\n}<\/pre>\n\n\n\n<p><strong>2. Mapper\u30a4\u30f3\u30bf\u30fc\u30d5\u30a7\u30fc\u30b9\u306e\u5b9f\u88c5<\/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=\"\">@Mapper\npublic interface UserMapper {\n    \/\/ Create\n    @Insert(\"INSERT INTO users (username, email, created_at) \" +\n            \"VALUES (#{username}, #{email}, #{createdAt})\")\n    @Options(useGeneratedKeys = true, keyProperty = \"id\")\n    void insert(User user);\n\n    \/\/ Read\n    @Select(\"SELECT * FROM users WHERE id = #{id}\")\n    User findById(@Param(\"id\") Long id);\n\n    \/\/ Update\n    @Update(\"UPDATE users SET username = #{username}, \" +\n            \"email = #{email} WHERE id = #{id}\")\n    int update(User user);\n\n    \/\/ Delete\n    @Delete(\"DELETE FROM users WHERE id = #{id}\")\n    int deleteById(@Param(\"id\") Long id);\n}<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-10\">XML\u30de\u30c3\u30d4\u30f3\u30b0\u306b\u3088\u308b\u67d4\u8edf\u306aSQL\u5b9a\u7fa9<\/h3>\n\n\n\n<p>\u3088\u308a\u8907\u96d1\u306aSQL\u3092\u7ba1\u7406\u3059\u308b\u5834\u5408\u306f\u3001XML\u30de\u30c3\u30d4\u30f3\u30b0\u304c\u52b9\u679c\u7684\u3067\u3059\u3002<\/p>\n\n\n\n<p><strong>1. Mapper\u30a4\u30f3\u30bf\u30fc\u30d5\u30a7\u30fc\u30b9<\/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=\"\">@Mapper\npublic interface UserMapper {\n    List&lt;User&gt; findByCondition(UserSearchCondition condition);\n    void batchInsert(List&lt;User&gt; users);\n    List&lt;UserDTO&gt; findWithDetails(Long userId);\n}<\/pre>\n\n\n\n<p><strong>2. XML\u30de\u30c3\u30d4\u30f3\u30b0\u30d5\u30a1\u30a4\u30eb (UserMapper.xml)<\/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=\"\">&lt;?xml version=\"1.0\" encoding=\"UTF-8\" ?&gt;\n&lt;!DOCTYPE mapper PUBLIC \"-\/\/mybatis.org\/\/DTD Mapper 3.0\/\/EN\"\n        \"http:\/\/mybatis.org\/dtd\/mybatis-3-mapper.dtd\"&gt;\n&lt;mapper namespace=\"com.example.mapper.UserMapper\"&gt;\n\n    &lt;!-- \u8907\u96d1\u306a\u691c\u7d22\u6761\u4ef6\u3067\u306e\u691c\u7d22 --&gt;\n    &lt;select id=\"findByCondition\" resultType=\"User\"&gt;\n        SELECT * FROM users\n        WHERE 1=1\n        &lt;if test=\"username != null\"&gt;\n            AND username LIKE CONCAT('%', #{username}, '%')\n        &lt;\/if&gt;\n        &lt;if test=\"email != null\"&gt;\n            AND email = #{email}\n        &lt;\/if&gt;\n        &lt;if test=\"startDate != null\"&gt;\n            AND created_at &gt;= #{startDate}\n        &lt;\/if&gt;\n    &lt;\/select&gt;\n\n    &lt;!-- \u30d0\u30c3\u30c1\u633f\u5165 --&gt;\n    &lt;insert id=\"batchInsert\" parameterType=\"java.util.List\"&gt;\n        INSERT INTO users (username, email, created_at)\n        VALUES\n        &lt;foreach collection=\"list\" item=\"user\" separator=\",\"&gt;\n            (#{user.username}, #{user.email}, #{user.createdAt})\n        &lt;\/foreach&gt;\n    &lt;\/insert&gt;\n\n    &lt;!-- \u7d50\u5408\u3092\u4f7f\u7528\u3057\u305f\u8a73\u7d30\u60c5\u5831\u306e\u53d6\u5f97 --&gt;\n    &lt;select id=\"findWithDetails\" resultMap=\"UserDetailMap\"&gt;\n        SELECT u.*, p.* \n        FROM users u\n        LEFT JOIN user_profiles p ON u.id = p.user_id\n        WHERE u.id = #{userId}\n    &lt;\/select&gt;\n\n    &lt;resultMap id=\"UserDetailMap\" type=\"UserDTO\"&gt;\n        &lt;id property=\"id\" column=\"id\"\/&gt;\n        &lt;result property=\"username\" column=\"username\"\/&gt;\n        &lt;result property=\"email\" column=\"email\"\/&gt;\n        &lt;association property=\"profile\" javaType=\"UserProfile\"&gt;\n            &lt;result property=\"bio\" column=\"bio\"\/&gt;\n            &lt;result property=\"avatarUrl\" column=\"avatar_url\"\/&gt;\n        &lt;\/association&gt;\n    &lt;\/resultMap&gt;\n&lt;\/mapper&gt;<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-11\">\u52d5\u7684SQL\u3067\u6761\u4ef6\u5206\u5c90\u3092\u5b9f\u73fe\u3059\u308b\u65b9\u6cd5<\/h3>\n\n\n\n<p>MyBatis\u306e\u52d5\u7684SQL\u6a5f\u80fd\u3092\u4f7f\u7528\u3057\u305f\u5b9f\u88c5\u4f8b\u3092\u7d39\u4ecb\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<p><strong>1. \u691c\u7d22\u6761\u4ef6\u30af\u30e9\u30b9<\/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=\"\">public class UserSearchCondition {\n    private String username;\n    private List&lt;String&gt; roles;\n    private LocalDate startDate;\n    private LocalDate endDate;\n    private Boolean active;\n\n    \/\/ getters and setters\n}<\/pre>\n\n\n\n<p><strong>2. \u52d5\u7684SQL\u306e\u5b9f\u88c5\u4f8b<\/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=\"\">&lt;select id=\"searchUsers\" resultType=\"User\"&gt;\n    SELECT * FROM users\n    &lt;where&gt;\n        &lt;!-- LIKE\u691c\u7d22 --&gt;\n        &lt;if test=\"username != null and username != ''\"&gt;\n            username LIKE CONCAT('%', #{username}, '%')\n        &lt;\/if&gt;\n\n        &lt;!-- IN\u53e5\u306b\u3088\u308b\u8907\u6570\u6761\u4ef6 --&gt;\n        &lt;if test=\"roles != null and roles.size() &gt; 0\"&gt;\n            AND role IN\n            &lt;foreach collection=\"roles\" item=\"role\" open=\"(\" separator=\",\" close=\")\"&gt;\n                #{role}\n            &lt;\/foreach&gt;\n        &lt;\/if&gt;\n\n        &lt;!-- \u65e5\u4ed8\u7bc4\u56f2\u6307\u5b9a --&gt;\n        &lt;if test=\"startDate != null\"&gt;\n            AND created_at &gt;= #{startDate}\n        &lt;\/if&gt;\n        &lt;if test=\"endDate != null\"&gt;\n            AND created_at &amp;lt;= #{endDate}\n        &lt;\/if&gt;\n\n        &lt;!-- CASE\u5f0f\u306e\u4f7f\u7528 --&gt;\n        &lt;choose&gt;\n            &lt;when test=\"active != null\"&gt;\n                AND active = #{active}\n            &lt;\/when&gt;\n            &lt;otherwise&gt;\n                AND (deleted_at IS NULL)\n            &lt;\/otherwise&gt;\n        &lt;\/choose&gt;\n    &lt;\/where&gt;\n    ORDER BY created_at DESC\n&lt;\/select&gt;<\/pre>\n\n\n\n<p><strong>\u4e3b\u306a\u52d5\u7684SQL\u8981\u7d20\u306e\u4f7f\u3044\u65b9\uff1a<\/strong><\/p>\n\n\n<div id=\"id-b52869e6-95d1-4c78-8b25-830b4838392c\">\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>\u8981\u7d20<\/th><th>\u7528\u9014<\/th><th>\u4f7f\u7528\u4f8b<\/th><\/tr><\/thead><tbody><tr><td><code>&lt;if&gt;<\/code><\/td><td>\u6761\u4ef6\u5206\u5c90<\/td><td>\u5024\u304c\u5b58\u5728\u3059\u308b\u5834\u5408\u306e\u307f\u6761\u4ef6\u3092\u8ffd\u52a0<\/td><\/tr><tr><td><code>&lt;choose&gt;<\/code><\/td><td>\u8907\u6570\u6761\u4ef6\u304b\u30891\u3064\u9078\u629e<\/td><td>if-else\u7684\u306a\u5206\u5c90\u51e6\u7406<\/td><\/tr><tr><td><code>&lt;where&gt;<\/code><\/td><td>WHERE\u53e5\u306e\u81ea\u52d5\u5236\u5fa1<\/td><td>\u6761\u4ef6\u306e\u6709\u7121\u306b\u5fdc\u3058\u3066WHERE\u3092\u5236\u5fa1<\/td><\/tr><tr><td><code>&lt;foreach&gt;<\/code><\/td><td>\u30b3\u30ec\u30af\u30b7\u30e7\u30f3\u306e\u7e70\u308a\u8fd4\u3057<\/td><td>IN\u53e5\u3084\u30d0\u30c3\u30c1\u51e6\u7406\u3067\u4f7f\u7528<\/td><\/tr><tr><td><code>&lt;trim&gt;<\/code><\/td><td>SQL\u6587\u306e\u6574\u5f62<\/td><td>\u4e0d\u8981\u306a\u30ab\u30f3\u30de\u3084\u63a5\u7d9a\u8a5e\u306e\u9664\u53bb<\/td><\/tr><\/tbody><\/table><\/figure>\n<\/div>\n\n\n<p>\u3053\u308c\u3089\u306e\u6a5f\u80fd\u3092\u7d44\u307f\u5408\u308f\u305b\u308b\u3053\u3068\u3067\u3001\u67d4\u8edf\u3067\u4fdd\u5b88\u6027\u306e\u9ad8\u3044\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u30a2\u30af\u30bb\u30b9\u51e6\u7406\u3092\u5b9f\u88c5\u3067\u304d\u307e\u3059\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-12\">\u5b9f\u8df5\u7684\u306aMyBatis\u6d3b\u7528\u30c6\u30af\u30cb\u30c3\u30af<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-13\">\u8907\u96d1\u306a\u691c\u7d22\u6761\u4ef6\u3092\u52b9\u7387\u7684\u306b\u5b9f\u88c5\u3059\u308b\u30b3\u30c4<\/h3>\n\n\n\n<p>\u8907\u96d1\u306a\u691c\u7d22\u6761\u4ef6\u3092\u6271\u3046\u969b\u306e\u52b9\u7387\u7684\u306a\u5b9f\u88c5\u65b9\u6cd5\u3092\u7d39\u4ecb\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<p><strong>1. \u691c\u7d22\u6761\u4ef6\u3092\u30d3\u30eb\u30c0\u30fc\u30d1\u30bf\u30fc\u30f3\u3067\u5b9f\u88c5<\/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=\"\">@Getter\n@Builder\npublic class UserSearchBuilder {\n    private final String username;\n    private final List&lt;String&gt; departments;\n    private final LocalDate startDate;\n    private final LocalDate endDate;\n    private final Boolean isActive;\n    private final Integer minAge;\n    private final Integer maxAge;\n    private final List&lt;String&gt; skills;\n}\n\n\/\/ \u4f7f\u7528\u4f8b\nUserSearchBuilder condition = UserSearchBuilder.builder()\n    .username(\"john\")\n    .departments(Arrays.asList(\"IT\", \"HR\"))\n    .startDate(LocalDate.now().minusMonths(3))\n    .isActive(true)\n    .build();<\/pre>\n\n\n\n<p><strong>2. \u8907\u96d1\u306a\u691c\u7d22\u7528\u306eXML\u30de\u30c3\u30d4\u30f3\u30b0<\/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=\"\">&lt;select id=\"searchUsers\" resultType=\"User\" parameterType=\"UserSearchBuilder\"&gt;\n    SELECT DISTINCT u.*\n    FROM users u\n    &lt;if test=\"skills != null and skills.size() &gt; 0\"&gt;\n        JOIN user_skills us ON u.id = us.user_id\n        JOIN skills s ON us.skill_id = s.id\n    &lt;\/if&gt;\n    &lt;where&gt;\n        &lt;if test=\"username != null\"&gt;\n            AND u.username LIKE CONCAT('%', #{username}, '%')\n        &lt;\/if&gt;\n        &lt;if test=\"departments != null and departments.size() &gt; 0\"&gt;\n            AND u.department_id IN\n            &lt;foreach collection=\"departments\" item=\"dept\" open=\"(\" separator=\",\" close=\")\"&gt;\n                #{dept}\n            &lt;\/foreach&gt;\n        &lt;\/if&gt;\n        &lt;if test=\"startDate != null\"&gt;\n            AND u.created_at &gt;= #{startDate}\n        &lt;\/if&gt;\n        &lt;if test=\"endDate != null\"&gt;\n            AND u.created_at &amp;lt;= #{endDate}\n        &lt;\/if&gt;\n        &lt;if test=\"minAge != null\"&gt;\n            AND u.age &gt;= #{minAge}\n        &lt;\/if&gt;\n        &lt;if test=\"maxAge != null\"&gt;\n            AND u.age &amp;lt;= #{maxAge}\n        &lt;\/if&gt;\n        &lt;if test=\"skills != null and skills.size() &gt; 0\"&gt;\n            AND s.name IN\n            &lt;foreach collection=\"skills\" item=\"skill\" open=\"(\" separator=\",\" close=\")\"&gt;\n                #{skill}\n            &lt;\/foreach&gt;\n        &lt;\/if&gt;\n    &lt;\/where&gt;\n    ORDER BY u.created_at DESC\n&lt;\/select&gt;<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-14\">N+1\u554f\u984c\u3092\u89e3\u6c7a\u3059\u308b\u305f\u3081\u306e\u5b9f\u88c5\u65b9\u6cd5<\/h3>\n\n\n\n<p>N+1\u554f\u984c\u306e\u89e3\u6c7a\u65b9\u6cd5\u306b\u3064\u3044\u3066\u3001\u5177\u4f53\u7684\u306a\u5b9f\u88c5\u4f8b\u3092\u793a\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<p><strong>1. \u95a2\u9023\u30a8\u30f3\u30c6\u30a3\u30c6\u30a3\u306e\u5b9a\u7fa9<\/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=\"\">@Data\npublic class Department {\n    private Long id;\n    private String name;\n    private List&lt;User&gt; users;\n}\n\n@Data\npublic class User {\n    private Long id;\n    private String name;\n    private Department department;\n    private List&lt;Role&gt; roles;\n}<\/pre>\n\n\n\n<p><strong>2. N+1\u554f\u984c\u3092\u89e3\u6c7a\u3059\u308b\u30de\u30c3\u30d4\u30f3\u30b0\u8a2d\u5b9a<\/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=\"\">&lt;!-- ResultMap\u306e\u5b9a\u7fa9 --&gt;\n&lt;resultMap id=\"DepartmentWithUsers\" type=\"Department\"&gt;\n    &lt;id property=\"id\" column=\"dept_id\"\/&gt;\n    &lt;result property=\"name\" column=\"dept_name\"\/&gt;\n    &lt;collection property=\"users\" ofType=\"User\"&gt;\n        &lt;id property=\"id\" column=\"user_id\"\/&gt;\n        &lt;result property=\"name\" column=\"user_name\"\/&gt;\n        &lt;collection property=\"roles\" column=\"user_id\" select=\"findRolesByUserId\"\/&gt;\n    &lt;\/collection&gt;\n&lt;\/resultMap&gt;\n\n&lt;!-- \u4e00\u5ea6\u306e\u30af\u30a8\u30ea\u3067\u90e8\u7f72\u3068\u6240\u5c5e\u30e6\u30fc\u30b6\u30fc\u3092\u53d6\u5f97 --&gt;\n&lt;select id=\"findAllDepartmentsWithUsers\" resultMap=\"DepartmentWithUsers\"&gt;\n    SELECT \n        d.id as dept_id,\n        d.name as dept_name,\n        u.id as user_id,\n        u.name as user_name\n    FROM departments d\n    LEFT JOIN users u ON d.id = u.department_id\n&lt;\/select&gt;\n\n&lt;!-- \u30ed\u30fc\u30eb\u306e\u53d6\u5f97\uff08\u5fc5\u8981\u306a\u5834\u5408\u306e\u307f\u5b9f\u884c\uff09 --&gt;\n&lt;select id=\"findRolesByUserId\" resultType=\"Role\"&gt;\n    SELECT r.* \n    FROM roles r\n    JOIN user_roles ur ON r.id = ur.role_id\n    WHERE ur.user_id = #{userId}\n&lt;\/select&gt;<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-15\">\u5927\u91cf\u30c7\u30fc\u30bf\u51e6\u7406\u6642\u306e\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u6700\u9069\u5316<\/h3>\n\n\n\n<p>\u5927\u91cf\u30c7\u30fc\u30bf\u3092\u6271\u3046\u969b\u306e\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u6700\u9069\u5316\u30c6\u30af\u30cb\u30c3\u30af\u3092\u7d39\u4ecb\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<p><strong>1. \u30d0\u30c3\u30c1\u51e6\u7406\u306e\u5b9f\u88c5<\/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=\"\">@Mapper\npublic interface UserMapper {\n    @Insert(\"&lt;script&gt;\" +\n            \"INSERT INTO users (name, email, department_id) VALUES \" +\n            \"&lt;foreach collection='users' item='user' separator=','&gt;\" +\n            \"(#{user.name}, #{user.email}, #{user.departmentId})\" +\n            \"&lt;\/foreach&gt;\" +\n            \"&lt;\/script&gt;\")\n    void batchInsert(@Param(\"users\") List&lt;User&gt; users);\n}<\/pre>\n\n\n\n<p><strong>2. \u30da\u30fc\u30b8\u30cd\u30fc\u30b7\u30e7\u30f3\u51e6\u7406\u306e\u5b9f\u88c5<\/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=\"\">&lt;!-- \u30da\u30fc\u30b8\u30f3\u30b0\u7528\u306eMapper --&gt;\n&lt;select id=\"findUsersWithPaging\" resultType=\"User\"&gt;\n    SELECT * FROM users\n    &lt;where&gt;\n        &lt;if test=\"condition != null\"&gt;\n            &lt;!-- \u691c\u7d22\u6761\u4ef6 --&gt;\n        &lt;\/if&gt;\n    &lt;\/where&gt;\n    ORDER BY id\n    LIMIT #{pageSize} OFFSET #{offset}\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=\"\">\/\/ \u30da\u30fc\u30b8\u30cd\u30fc\u30b7\u30e7\u30f3\u306e\u4f7f\u7528\u4f8b\npublic class PageRequest {\n    private int page;\n    private int size;\n\n    public int getOffset() {\n        return page * size;\n    }\n}\n\n@Service\npublic class UserService {\n    public List&lt;User&gt; findUsers(PageRequest pageRequest) {\n        Map&lt;String, Object&gt; params = new HashMap&lt;&gt;();\n        params.put(\"pageSize\", pageRequest.getSize());\n        params.put(\"offset\", pageRequest.getOffset());\n        return userMapper.findUsersWithPaging(params);\n    }\n}<\/pre>\n\n\n\n<p><strong>3. \u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u6700\u9069\u5316\u306e\u305f\u3081\u306e\u30d9\u30b9\u30c8\u30d7\u30e9\u30af\u30c6\u30a3\u30b9<\/strong><\/p>\n\n\n<div id=\"id-be1af127-4850-4f06-b7ca-ce9cf02d6f3d\">\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>\u6700\u9069\u5316\u30dd\u30a4\u30f3\u30c8<\/th><th>\u5b9f\u88c5\u65b9\u6cd5<\/th><th>\u52b9\u679c<\/th><\/tr><\/thead><tbody><tr><td>\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u6d3b\u7528<\/td><td>\u691c\u7d22\u6761\u4ef6\u306b\u5408\u308f\u305b\u305f\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u8a2d\u8a08<\/td><td>\u691c\u7d22\u901f\u5ea6\u306e\u5411\u4e0a<\/td><\/tr><tr><td>\u30af\u30a8\u30ea\u30c1\u30e5\u30fc\u30cb\u30f3\u30b0<\/td><td>EXPLAIN\u3092\u4f7f\u7528\u3057\u305f\u5b9f\u884c\u8a08\u753b\u306e\u78ba\u8a8d<\/td><td>\u30dc\u30c8\u30eb\u30cd\u30c3\u30af\u306e\u7279\u5b9a<\/td><\/tr><tr><td>\u30ad\u30e3\u30c3\u30b7\u30e5\u8a2d\u5b9a<\/td><td>MyBatis\u306e2\u6b21\u30ad\u30e3\u30c3\u30b7\u30e5\u3092\u9069\u5207\u306b\u8a2d\u5b9a<\/td><td>\u8aad\u307f\u53d6\u308a\u6027\u80fd\u306e\u5411\u4e0a<\/td><\/tr><tr><td>\u30d0\u30c3\u30c1\u51e6\u7406<\/td><td>foreach\u8981\u7d20\u3092\u4f7f\u7528\u3057\u305f\u30d0\u30eb\u30af\u64cd\u4f5c<\/td><td>\u4e00\u62ec\u51e6\u7406\u306e\u52b9\u7387\u5316<\/td><\/tr><tr><td>\u63a5\u7d9a\u30d7\u30fc\u30eb<\/td><td>HikariCP\u306e\u9069\u5207\u306a\u8a2d\u5b9a<\/td><td>\u30b3\u30cd\u30af\u30b7\u30e7\u30f3\u7ba1\u7406\u306e\u6700\u9069\u5316<\/td><\/tr><\/tbody><\/table><\/figure>\n<\/div>\n\n\n<p>\u3053\u308c\u3089\u306e\u30c6\u30af\u30cb\u30c3\u30af\u3092\u9069\u5207\u306b\u7d44\u307f\u5408\u308f\u305b\u308b\u3053\u3068\u3067\u3001\u5927\u898f\u6a21\u30b7\u30b9\u30c6\u30e0\u3067\u3082\u5b89\u5b9a\u3057\u305f\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u3092\u5b9f\u73fe\u3067\u304d\u307e\u3059\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-16\">MyBatis\u306b\u3088\u308b\u30bb\u30ad\u30e5\u30a2\u306a\u5b9f\u88c5\u306e\u30dd\u30a4\u30f3\u30c8<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-17\">SQL\u30a4\u30f3\u30b8\u30a7\u30af\u30b7\u30e7\u30f3\u5bfe\u7b56\u306e\u5b9f\u88c5\u65b9\u6cd5<\/h3>\n\n\n\n<p>SQL\u30a4\u30f3\u30b8\u30a7\u30af\u30b7\u30e7\u30f3\u653b\u6483\u3092\u9632\u3050\u305f\u3081\u306e\u5177\u4f53\u7684\u306a\u5b9f\u88c5\u65b9\u6cd5\u3092\u89e3\u8aac\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<p><strong>1. \u30d7\u30ea\u30da\u30a2\u30c9\u30b9\u30c6\u30fc\u30c8\u30e1\u30f3\u30c8\u306e\u5fb9\u5e95\u4f7f\u7528<\/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=\"\">\/\/ \u274c \u5371\u967a\u306a\u5b9f\u88c5\uff08\u6587\u5b57\u5217\u9023\u7d50\uff09\n@Select(\"SELECT * FROM users WHERE status = '\" + status + \"'\")\nList&lt;User&gt; findByStatus(String status);\n\n\/\/ \u2705 \u5b89\u5168\u306a\u5b9f\u88c5\uff08\u30d7\u30ea\u30da\u30a2\u30c9\u30b9\u30c6\u30fc\u30c8\u30e1\u30f3\u30c8\uff09\n@Select(\"SELECT * FROM users WHERE status = #{status}\")\nList&lt;User&gt; findByStatus(@Param(\"status\") String status);\n\n\/\/ \u2705 IN\u53e5\u3067\u306e\u5b89\u5168\u306a\u5b9f\u88c5\n@Select(\"&lt;script&gt;\" +\n        \"SELECT * FROM users WHERE status IN \" +\n        \"&lt;foreach item='item' index='index' collection='statuses' \" +\n        \"open='(' separator=',' close=')'&gt;\" +\n        \"#{item}\" +\n        \"&lt;\/foreach&gt;\" +\n        \"&lt;\/script&gt;\")\nList&lt;User&gt; findByStatuses(@Param(\"statuses\") List&lt;String&gt; statuses);<\/pre>\n\n\n\n<p><strong>2. \u52d5\u7684\u30af\u30a8\u30ea\u3067\u306e\u5b89\u5168\u5bfe\u7b56<\/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=\"\">&lt;!-- \u274c \u5371\u967a\u306a\u5b9f\u88c5 --&gt;\n&lt;select id=\"findUsers\"&gt;\n    SELECT * FROM users ORDER BY ${sortColumn}\n&lt;\/select&gt;\n\n&lt;!-- \u2705 \u5b89\u5168\u306a\u5b9f\u88c5 --&gt;\n&lt;select id=\"findUsers\"&gt;\n    SELECT * FROM users\n    &lt;choose&gt;\n        &lt;when test=\"sortColumn == 'username'\"&gt;\n            ORDER BY username\n        &lt;\/when&gt;\n        &lt;when test=\"sortColumn == 'created_at'\"&gt;\n            ORDER BY created_at\n        &lt;\/when&gt;\n        &lt;otherwise&gt;\n            ORDER BY id\n        &lt;\/otherwise&gt;\n    &lt;\/choose&gt;\n&lt;\/select&gt;<\/pre>\n\n\n\n<p><strong>3. \u30bb\u30f3\u30b7\u30c6\u30a3\u30d6\u30c7\u30fc\u30bf\u306e\u6697\u53f7\u5316\u5b9f\u88c5<\/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=\"\">@Component\npublic class AESEncryptionTypeHandler extends BaseTypeHandler&lt;String&gt; {\n    private static final String KEY = System.getenv(\"ENCRYPTION_KEY\");\n    private final Cipher encryptCipher;\n    private final Cipher decryptCipher;\n\n    public AESEncryptionTypeHandler() throws Exception {\n        SecretKey key = new SecretKeySpec(KEY.getBytes(), \"AES\");\n        encryptCipher = Cipher.getInstance(\"AES\");\n        encryptCipher.init(Cipher.ENCRYPT_MODE, key);\n        decryptCipher = Cipher.getInstance(\"AES\");\n        decryptCipher.init(Cipher.DECRYPT_MODE, key);\n    }\n\n    @Override\n    public void setNonNullParameter(PreparedStatement ps, int i, String parameter, JdbcType jdbcType) \n            throws SQLException {\n        try {\n            byte[] encryptedData = encryptCipher.doFinal(parameter.getBytes());\n            ps.setString(i, Base64.getEncoder().encodeToString(encryptedData));\n        } catch (Exception e) {\n            throw new SQLException(\"Encryption failed\", e);\n        }\n    }\n\n    @Override\n    public String getNullableResult(ResultSet rs, String columnName) throws SQLException {\n        return decryptValue(rs.getString(columnName));\n    }\n\n    private String decryptValue(String encryptedValue) throws SQLException {\n        try {\n            if (encryptedValue == null) return null;\n            byte[] decryptedData = decryptCipher.doFinal(\n                Base64.getDecoder().decode(encryptedValue));\n            return new String(decryptedData);\n        } catch (Exception e) {\n            throw new SQLException(\"Decryption failed\", e);\n        }\n    }\n}<\/pre>\n\n\n\n<p><strong>4. \u5165\u529b\u5024\u306e\u30d0\u30ea\u30c7\u30fc\u30b7\u30e7\u30f3\u5b9f\u88c5<\/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=\"\">@Service\npublic class UserService {\n    private static final Pattern USERNAME_PATTERN = \n        Pattern.compile(\"^[a-zA-Z0-9_]{3,20}$\");\n\n    public User findByUsername(String username) {\n        if (!USERNAME_PATTERN.matcher(username).matches()) {\n            throw new InvalidInputException(\"Invalid username format\");\n        }\n        return userMapper.findByUsername(username);\n    }\n}<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-18\">\u30c8\u30e9\u30f3\u30b6\u30af\u30b7\u30e7\u30f3\u7ba1\u7406\u306e\u6b63\u3057\u3044\u4f7f\u3044\u65b9<\/h3>\n\n\n\n<p>\u30c8\u30e9\u30f3\u30b6\u30af\u30b7\u30e7\u30f3\u7ba1\u7406\u3092\u9069\u5207\u306b\u5b9f\u88c5\u3059\u308b\u65b9\u6cd5\u3092\u8aac\u660e\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<p><strong>1. \u30a2\u30ce\u30c6\u30fc\u30b7\u30e7\u30f3\u30d9\u30fc\u30b9\u306e\u30c8\u30e9\u30f3\u30b6\u30af\u30b7\u30e7\u30f3\u7ba1\u7406<\/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=\"\">@Service\npublic class UserService {\n    private final UserMapper userMapper;\n    private final ProfileMapper profileMapper;\n\n    @Transactional(rollbackFor = Exception.class)\n    public void createUserWithProfile(User user, Profile profile) {\n        \/\/ \u30e6\u30fc\u30b6\u30fc\u4f5c\u6210\n        userMapper.insert(user);\n\n        \/\/ \u30d7\u30ed\u30d5\u30a3\u30fc\u30eb\u4f5c\u6210\n        profile.setUserId(user.getId());\n        profileMapper.insert(profile);\n    }\n\n    @Transactional(readOnly = true)\n    public List&lt;User&gt; findAllUsers() {\n        return userMapper.findAll();\n    }\n}<\/pre>\n\n\n\n<p><strong>2. \u30c8\u30e9\u30f3\u30b6\u30af\u30b7\u30e7\u30f3\u5206\u96e2\u30ec\u30d9\u30eb\u306e\u8a2d\u5b9a<\/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=\"\">@Transactional(\n    isolation = Isolation.READ_COMMITTED,\n    propagation = Propagation.REQUIRED,\n    timeout = 30\n)\npublic void processLargeTransaction() {\n    \/\/ \u30c8\u30e9\u30f3\u30b6\u30af\u30b7\u30e7\u30f3\u51e6\u7406\n}<\/pre>\n\n\n\n<p>\u30c8\u30e9\u30f3\u30b6\u30af\u30b7\u30e7\u30f3\u8a2d\u5b9a\u306e\u63a8\u5968\u5024\uff1a<\/p>\n\n\n<div id=\"id-d516c848-f08e-4899-bfdb-2dd3d6432923\">\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>\u8a2d\u5b9a\u9805\u76ee<\/th><th>\u63a8\u5968\u5024<\/th><th>\u7528\u9014<\/th><\/tr><\/thead><tbody><tr><td>isolation<\/td><td>READ_COMMITTED<\/td><td>\u4e00\u822c\u7684\u306a\u30c8\u30e9\u30f3\u30b6\u30af\u30b7\u30e7\u30f3<\/td><\/tr><tr><td><\/td><td>SERIALIZABLE<\/td><td>\u53b3\u5bc6\u306a\u6574\u5408\u6027\u304c\u5fc5\u8981\u306a\u5834\u5408<\/td><\/tr><tr><td>propagation<\/td><td>REQUIRED<\/td><td>\u65b0\u898f\u307e\u305f\u306f\u65e2\u5b58\u306e\u30c8\u30e9\u30f3\u30b6\u30af\u30b7\u30e7\u30f3\u3067\u5b9f\u884c<\/td><\/tr><tr><td><\/td><td>REQUIRES_NEW<\/td><td>\u5e38\u306b\u65b0\u898f\u30c8\u30e9\u30f3\u30b6\u30af\u30b7\u30e7\u30f3\u3067\u5b9f\u884c<\/td><\/tr><tr><td>timeout<\/td><td>5-30\u79d2<\/td><td>\u51e6\u7406\u306e\u8907\u96d1\u3055\u306b\u5fdc\u3058\u3066\u8a2d\u5b9a<\/td><\/tr><\/tbody><\/table><\/figure>\n<\/div>\n\n\n<h3 class=\"wp-block-heading\" id=\"i-19\">\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u3092\u8003\u616e\u3057\u305f\u30de\u30c3\u30d4\u30f3\u30b0\u8a2d\u8a08<\/h3>\n\n\n\n<p>\u30bb\u30ad\u30e5\u30a2\u306a\u30de\u30c3\u30d4\u30f3\u30b0\u8a2d\u8a08\u306e\u30d9\u30b9\u30c8\u30d7\u30e9\u30af\u30c6\u30a3\u30b9\u3092\u7d39\u4ecb\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<p><strong>1. \u30bb\u30f3\u30b7\u30c6\u30a3\u30d6\u30c7\u30fc\u30bf\u306e\u6271\u3044<\/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=\"\">@Data\npublic class User {\n    private Long id;\n    private String username;\n    @JsonIgnore  \/\/ API\u30ec\u30b9\u30dd\u30f3\u30b9\u304b\u3089\u9664\u5916\n    private String password;\n    @Sensitive   \/\/ \u30ab\u30b9\u30bf\u30e0\u30a2\u30ce\u30c6\u30fc\u30b7\u30e7\u30f3\u3067\u30de\u30b9\u30af\u51e6\u7406\n    private String phoneNumber;\n}\n\n\/\/ TypeHandler\u3067\u306e\u6697\u53f7\u5316\u51e6\u7406\npublic class EncryptedStringTypeHandler implements TypeHandler&lt;String&gt; {\n    private final EncryptionService encryptionService;\n\n    @Override\n    public void setParameter(PreparedStatement ps, int i, String parameter, JdbcType jdbcType) \n            throws SQLException {\n        ps.setString(i, encryptionService.encrypt(parameter));\n    }\n\n    @Override\n    public String getResult(ResultSet rs, String columnName) throws SQLException {\n        return encryptionService.decrypt(rs.getString(columnName));\n    }\n    \/\/ \u305d\u306e\u4ed6\u306e\u30e1\u30bd\u30c3\u30c9\u5b9f\u88c5\n}<\/pre>\n\n\n\n<p><strong>2. \u30bb\u30ad\u30e5\u30a2\u306a\u30de\u30c3\u30d4\u30f3\u30b0\u8a2d\u5b9a<\/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=\"\">&lt;resultMap id=\"SecureUserMap\" type=\"User\"&gt;\n    &lt;id property=\"id\" column=\"id\"\/&gt;\n    &lt;result property=\"username\" column=\"username\"\/&gt;\n    &lt;result property=\"password\" column=\"password\" typeHandler=\"com.example.handler.EncryptedStringTypeHandler\"\/&gt;\n    &lt;result property=\"phoneNumber\" column=\"phone_number\" typeHandler=\"com.example.handler.SensitiveDataTypeHandler\"\/&gt;\n&lt;\/resultMap&gt;\n\n&lt;select id=\"findUserSecurely\" resultMap=\"SecureUserMap\"&gt;\n    SELECT * FROM users WHERE id = #{id}\n&lt;\/select&gt;<\/pre>\n\n\n\n<p><strong>3. \u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u30c1\u30a7\u30c3\u30af\u30ea\u30b9\u30c8<\/strong><\/p>\n\n\n<div id=\"id-2d4c3c4a-befe-4697-8770-b9806035b98a\">\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>\u30c1\u30a7\u30c3\u30af\u9805\u76ee<\/th><th>\u5b9f\u88c5\u65b9\u6cd5<\/th><th>\u91cd\u8981\u5ea6<\/th><\/tr><\/thead><tbody><tr><td>SQL \u30a4\u30f3\u30b8\u30a7\u30af\u30b7\u30e7\u30f3\u5bfe\u7b56<\/td><td>\u30d1\u30e9\u30e1\u30fc\u30bf\u30d0\u30a4\u30f3\u30c7\u30a3\u30f3\u30b0\u4f7f\u7528<\/td><td>\u6700\u91cd\u8981<\/td><\/tr><tr><td>\u30bb\u30f3\u30b7\u30c6\u30a3\u30d6\u30c7\u30fc\u30bf\u306e\u4fdd\u8b77<\/td><td>\u6697\u53f7\u5316\u3068\u30de\u30b9\u30ad\u30f3\u30b0<\/td><td>\u91cd\u8981<\/td><\/tr><tr><td>\u30a2\u30af\u30bb\u30b9\u5236\u5fa1<\/td><td>Spring Security\u3068\u306e\u9023\u643a<\/td><td>\u91cd\u8981<\/td><\/tr><tr><td>\u76e3\u67fb\u30ed\u30b0<\/td><td>AOP \u3067\u64cd\u4f5c\u30ed\u30b0\u3092\u8a18\u9332<\/td><td>\u4e2d<\/td><\/tr><tr><td>\u30d1\u30b9\u30ef\u30fc\u30c9\u7ba1\u7406<\/td><td>\u30cf\u30c3\u30b7\u30e5\u5316\u3057\u3066\u4fdd\u5b58<\/td><td>\u6700\u91cd\u8981<\/td><\/tr><\/tbody><\/table><\/figure>\n<\/div>\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\">\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u5b9f\u88c5\u306e\u30d9\u30b9\u30c8\u30d7\u30e9\u30af\u30c6\u30a3\u30b9\uff1a<\/div><div class=\"sgb-box-simple__body\" style=\"border-color:var(--wp--preset--color--sango-main);background-color:#FFF\">\n<ol class=\"wp-block-list\">\n<li>\u5fc5\u8981\u6700\u5c0f\u9650\u306e\u6a29\u9650\u3067DB\u30a2\u30af\u30bb\u30b9<\/li>\n\n\n\n<li>\u30bb\u30f3\u30b7\u30c6\u30a3\u30d6\u30c7\u30fc\u30bf\u306e\u6697\u53f7\u5316<\/li>\n\n\n\n<li>\u5165\u529b\u5024\u306e\u53b3\u5bc6\u306a\u30d0\u30ea\u30c7\u30fc\u30b7\u30e7\u30f3<\/li>\n\n\n\n<li>\u30c8\u30e9\u30f3\u30b6\u30af\u30b7\u30e7\u30f3\u7ba1\u7406\u306e\u9069\u5207\u306a\u5b9f\u88c5<\/li>\n\n\n\n<li>\u76e3\u67fb\u30ed\u30b0\u306e\u53d6\u5f97<\/li>\n\n\n\n<li>\u30a8\u30e9\u30fc\u30e1\u30c3\u30bb\u30fc\u30b8\u306e\u9069\u5207\u306a\u5236\u5fa1<\/li>\n<\/ol>\n<\/div><\/div>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-20\">\u30c8\u30e9\u30d6\u30eb\u30b7\u30e5\u30fc\u30c6\u30a3\u30f3\u30b0\u3068\u30d9\u30b9\u30c8\u30d7\u30e9\u30af\u30c6\u30a3\u30b9<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-21\">\u3088\u304f\u3042\u308b\u30a8\u30e9\u30fc\u3068\u305d\u306e\u89e3\u6c7a\u65b9\u6cd5<\/h3>\n\n\n\n<p>MyBatis\u4f7f\u7528\u6642\u306b\u3088\u304f\u906d\u9047\u3059\u308b\u30a8\u30e9\u30fc\u3068\u305d\u306e\u5bfe\u51e6\u65b9\u6cd5\u3092\u89e3\u8aac\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<p><strong>1. \u30de\u30c3\u30d4\u30f3\u30b0\u30a8\u30e9\u30fc\u306e\u89e3\u6c7a<\/strong><\/p>\n\n\n<div id=\"id-f7287228-9ecb-482d-8d45-d878efba3034\">\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>\u30a8\u30e9\u30fc\u5185\u5bb9<\/th><th>\u539f\u56e0<\/th><th>\u89e3\u6c7a\u65b9\u6cd5<\/th><\/tr><\/thead><tbody><tr><td>TypeException<\/td><td>Java\u3068DB\u306e\u578b\u306e\u4e0d\u4e00\u81f4<\/td><td>TypeHandler\u306e\u5b9f\u88c5\u307e\u305f\u306f\u9069\u5207\u306a\u578b\u5909\u63db\u306e\u8a2d\u5b9a<\/td><\/tr><tr><td>BindingException<\/td><td>\u30d7\u30ed\u30d1\u30c6\u30a3\u540d\u306e\u4e0d\u4e00\u81f4<\/td><td>\u30de\u30c3\u30d4\u30f3\u30b0\u5b9a\u7fa9\u306e\u4fee\u6b63\u307e\u305f\u306falias\u8a2d\u5b9a<\/td><\/tr><tr><td>SqlSessionException<\/td><td>DB\u63a5\u7d9a\u306e\u554f\u984c<\/td><td>\u63a5\u7d9a\u8a2d\u5b9a\u306e\u78ba\u8a8d\u3068\u30b3\u30cd\u30af\u30b7\u30e7\u30f3\u30d7\u30fc\u30eb\u306e\u9069\u5207\u306a\u8a2d\u5b9a<\/td><\/tr><\/tbody><\/table><\/figure>\n<\/div>\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=\"\">\/\/ TypeHandler\u306e\u5b9f\u88c5\u4f8b\uff08\u4f8b\uff1aJSON\u30c7\u30fc\u30bf\u306e\u5909\u63db\uff09\npublic class JsonTypeHandler&lt;T&gt; extends BaseTypeHandler&lt;T&gt; {\n    private final Class&lt;T&gt; type;\n    private final ObjectMapper objectMapper = new ObjectMapper();\n\n    public JsonTypeHandler(Class&lt;T&gt; type) {\n        this.type = type;\n    }\n\n    @Override\n    public void setNonNullParameter(PreparedStatement ps, int i, T parameter, JdbcType jdbcType) \n            throws SQLException {\n        try {\n            ps.setString(i, objectMapper.writeValueAsString(parameter));\n        } catch (JsonProcessingException e) {\n            throw new SQLException(\"Failed to convert object to JSON string\", e);\n        }\n    }\n\n    @Override\n    public T getNullableResult(ResultSet rs, String columnName) throws SQLException {\n        return parseJSON(rs.getString(columnName));\n    }\n\n    private T parseJSON(String json) throws SQLException {\n        try {\n            return objectMapper.readValue(json, type);\n        } catch (IOException e) {\n            throw new SQLException(\"Failed to parse JSON string\", e);\n        }\n    }\n    \/\/ \u305d\u306e\u4ed6\u306e\u30e1\u30bd\u30c3\u30c9\u5b9f\u88c5\n}<\/pre>\n\n\n\n<p><strong>2.\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u30c1\u30e5\u30fc\u30cb\u30f3\u30b0\u3068\u30c8\u30e9\u30d6\u30eb\u5bfe\u7b56<\/strong><\/p>\n\n\n\n<p><strong>\u30ed\u30b0\u306e\u8a2d\u5b9a<\/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=\"\">&lt;!-- SQL\u5b9f\u884c\u6642\u306e\u30ed\u30b0\u8a2d\u5b9a --&gt;\n&lt;configuration&gt;\n    &lt;settings&gt;\n        &lt;!-- SQL\u306e\u30ed\u30b0\u51fa\u529b\u3092\u6709\u52b9\u5316 --&gt;\n        &lt;setting name=\"logImpl\" value=\"SLF4J\"\/&gt;\n        &lt;!-- \u5b9f\u884c\u8a08\u753b\u306e\u8868\u793a --&gt;\n        &lt;setting name=\"logExecutor\" value=\"true\"\/&gt;\n        &lt;!-- \u30d1\u30e9\u30e1\u30fc\u30bf\u5024\u306e\u30ed\u30b0\u51fa\u529b --&gt;\n        &lt;setting name=\"logStatement\" value=\"true\"\/&gt;\n    &lt;\/settings&gt;\n&lt;\/configuration&gt;<\/pre>\n\n\n\n<p><strong>\u30b3\u30cd\u30af\u30b7\u30e7\u30f3\u30d7\u30fc\u30eb\u8a2d\u5b9a\u306e\u6700\u9069\u5316<\/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=\"\"># HikariCP\u6700\u9069\u5316\u8a2d\u5b9a\nspring.datasource.hikari.maximum-pool-size=20\nspring.datasource.hikari.minimum-idle=5\nspring.datasource.hikari.idle-timeout=300000\nspring.datasource.hikari.max-lifetime=1200000\nspring.datasource.hikari.connection-timeout=20000\nspring.datasource.hikari.validation-timeout=3000\nspring.datasource.hikari.login-timeout=5000<\/pre>\n\n\n\n<p><strong>\u30e1\u30e2\u30ea\u4f7f\u7528\u91cf\u306e\u6700\u9069\u5316<\/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=\"\">@Select(\"SELECT * FROM large_table\")\n@Options(fetchSize = 1000, timeout = 5000)\nStream&lt;LargeData&gt; streamLargeData();\n\n\/\/ \u4f7f\u7528\u4f8b\npublic void processLargeData() {\n    try (Stream&lt;LargeData&gt; stream = mapper.streamLargeData()) {\n        stream.forEach(this::processData);\n    }\n}<\/pre>\n\n\n\n<p><strong>\u30c7\u30c3\u30c9\u30ed\u30c3\u30af\u5bfe\u7b56\u306e\u5b9f\u88c5<\/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=\"\">@Service\npublic class UserService {\n    @Transactional(rollbackFor = Exception.class)\n    @Retryable(value = DeadlockLoserDataAccessException.class, \n               maxAttempts = 3, backoff = @Backoff(delay = 500))\n    public void updateUsers(List&lt;User&gt; users) {\n        \/\/ \u66f4\u65b0\u51e6\u7406\u306e\u9806\u5e8f\u3092\u4e00\u5b9a\u306b\u4fdd\u3064\n        users.sort(Comparator.comparing(User::getId));\n\n        for (User user : users) {\n            userMapper.update(user);\n        }\n    }\n}<\/pre>\n\n\n\n<p><strong>N+1\u554f\u984c\u306e\u56de\u907f\u30d1\u30bf\u30fc\u30f3<\/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=\"\">&lt;!-- N+1\u554f\u984c\u3092\u5f15\u304d\u8d77\u3053\u3059\u5b9f\u88c5 --&gt;\n&lt;select id=\"findAllDepartments\" resultMap=\"DepartmentMap\"&gt;\n    SELECT * FROM departments\n&lt;\/select&gt;\n&lt;select id=\"findUsersByDepartmentId\" resultType=\"User\"&gt;\n    SELECT * FROM users WHERE department_id = #{departmentId}\n&lt;\/select&gt;\n\n&lt;!-- \u6700\u9069\u5316\u3055\u308c\u305f\u5b9f\u88c5 --&gt;\n&lt;select id=\"findAllDepartmentsWithUsers\" resultMap=\"DepartmentMap\"&gt;\n    SELECT d.*, u.*\n    FROM departments d\n    LEFT JOIN users u ON d.id = u.department_id\n    ORDER BY d.id, u.id\n&lt;\/select&gt;<\/pre>\n\n\n\n<p><strong>\u30af\u30a8\u30ea\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u6700\u9069\u5316\u30c1\u30a7\u30c3\u30af\u30ea\u30b9\u30c8<\/strong><\/p>\n\n\n<div id=\"id-89eff3c3-7c58-464e-b2a4-805648fb4c39\">\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>\u78ba\u8a8d\u9805\u76ee<\/th><th>\u5bfe\u7b56<\/th><th>\u52b9\u679c<\/th><\/tr><\/thead><tbody><tr><td>\u30a4\u30f3\u30c7\u30c3\u30af\u30b9<\/td><td>\u9069\u5207\u306a\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u8a2d\u8a08<\/td><td>\u691c\u7d22\u901f\u5ea6\u5411\u4e0a<\/td><\/tr><tr><td>\u7d50\u5408\u6761\u4ef6<\/td><td>\u7d50\u5408\u9806\u5e8f\u306e\u6700\u9069\u5316<\/td><td>\u51e6\u7406\u52b9\u7387\u5411\u4e0a<\/td><\/tr><tr><td>\u30c7\u30fc\u30bf\u91cf<\/td><td>\u30da\u30fc\u30b8\u30cd\u30fc\u30b7\u30e7\u30f3\u5b9f\u88c5<\/td><td>\u30e1\u30e2\u30ea\u4f7f\u7528\u91cf\u524a\u6e1b<\/td><\/tr><tr><td>\u30ad\u30e3\u30c3\u30b7\u30e5<\/td><td>2\u6b21\u30ad\u30e3\u30c3\u30b7\u30e5\u306e\u6d3b\u7528<\/td><td>\u5fdc\u7b54\u901f\u5ea6\u5411\u4e0a<\/td><\/tr><tr><td>\u30d0\u30c3\u30c1\u51e6\u7406<\/td><td>\u30d0\u30eb\u30af\u64cd\u4f5c\u306e\u5b9f\u88c5<\/td><td>\u51e6\u7406\u6642\u9593\u77ed\u7e2e<\/td><\/tr><\/tbody><\/table><\/figure>\n<\/div>\n\n\n<h3 class=\"wp-block-heading\" id=\"i-22\">\u30e6\u30cb\u30c3\u30c8\u30c6\u30b9\u30c8\u306e\u5b9f\u88c5\u65b9\u6cd5\u3068\u6ce8\u610f\u70b9<\/h3>\n\n\n\n<p>\u52b9\u679c\u7684\u306a\u30e6\u30cb\u30c3\u30c8\u30c6\u30b9\u30c8\u306e\u5b9f\u88c5\u65b9\u6cd5\u3092\u89e3\u8aac\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<p><strong>1. \u30c6\u30b9\u30c8\u74b0\u5883\u306e\u30bb\u30c3\u30c8\u30a2\u30c3\u30d7<\/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=\"\">@SpringBootTest\n@TestPropertySource(locations = \"classpath:application-test.properties\")\nclass UserMapperTest {\n    @Autowired\n    private UserMapper userMapper;\n\n    @Autowired\n    private DataSource dataSource;\n\n    @BeforeEach\n    void setUp() {\n        \/\/ \u30c6\u30b9\u30c8\u30c7\u30fc\u30bf\u306e\u30bb\u30c3\u30c8\u30a2\u30c3\u30d7\n        try (Connection conn = dataSource.getConnection()) {\n            ScriptUtils.executeSqlScript(conn, \n                new ClassPathResource(\"test-data.sql\"));\n        }\n    }\n\n    @Test\n    void testFindById() {\n        \/\/ \u30c6\u30b9\u30c8\u30b1\u30fc\u30b9\n        User user = userMapper.findById(1L);\n        assertNotNull(user);\n        assertEquals(\"testUser\", user.getUsername());\n    }\n}<\/pre>\n\n\n\n<p><strong>2. \u30e2\u30c3\u30af\u3092\u4f7f\u7528\u3057\u305f\u30c6\u30b9\u30c8<\/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=\"\">@ExtendWith(MockitoExtension.class)\nclass UserServiceTest {\n    @Mock\n    private UserMapper userMapper;\n\n    @InjectMocks\n    private UserService userService;\n\n    @Test\n    void testCreateUser() {\n        \/\/ \u30c6\u30b9\u30c8\u30c7\u30fc\u30bf\u6e96\u5099\n        User user = new User();\n        user.setUsername(\"testUser\");\n\n        \/\/ \u30e2\u30c3\u30af\u306e\u8a2d\u5b9a\n        when(userMapper.insert(any(User.class))).thenReturn(1);\n\n        \/\/ \u30c6\u30b9\u30c8\u5b9f\u884c\n        userService.createUser(user);\n\n        \/\/ \u691c\u8a3c\n        verify(userMapper, times(1)).insert(user);\n    }\n}<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-23\">\u4fdd\u5b88\u6027\u3092\u9ad8\u3081\u308b\u305f\u3081\u306e\u30b3\u30fc\u30c7\u30a3\u30f3\u30b0\u898f\u7d04<\/h3>\n\n\n\n<p>\u4fdd\u5b88\u6027\u306e\u9ad8\u3044MyBatis\u30b3\u30fc\u30c9\u3092\u66f8\u304f\u305f\u3081\u306e\u30d9\u30b9\u30c8\u30d7\u30e9\u30af\u30c6\u30a3\u30b9\u3092\u7d39\u4ecb\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<p><strong>1. \u30d5\u30a1\u30a4\u30eb\u69cb\u6210\u306e\u30d9\u30b9\u30c8\u30d7\u30e9\u30af\u30c6\u30a3\u30b9<\/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=\"\">src\/\n\u251c\u2500\u2500 main\/\n\u2502   \u251c\u2500\u2500 java\/\n\u2502   \u2502   \u2514\u2500\u2500 com\/example\/\n\u2502   \u2502       \u251c\u2500\u2500 domain\/\n\u2502   \u2502       \u2502   \u251c\u2500\u2500 User.java\n\u2502   \u2502       \u2502   \u2514\u2500\u2500 UserDTO.java\n\u2502   \u2502       \u251c\u2500\u2500 mapper\/\n\u2502   \u2502       \u2502   \u2514\u2500\u2500 UserMapper.java\n\u2502   \u2502       \u2514\u2500\u2500 service\/\n\u2502   \u2502           \u2514\u2500\u2500 UserService.java\n\u2502   \u2514\u2500\u2500 resources\/\n\u2502       \u2514\u2500\u2500 mapper\/\n\u2502           \u2514\u2500\u2500 UserMapper.xml<\/pre>\n\n\n\n<p><strong>2. \u30b3\u30fc\u30c7\u30a3\u30f3\u30b0\u898f\u7d04<\/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=\"\">\/\/ \u2705 \u63a8\u5968\u3055\u308c\u308b\u547d\u540d\u898f\u5247\n@Mapper\npublic interface UserMapper {\n    \/\/ \u30e1\u30bd\u30c3\u30c9\u540d\u306f\u52d5\u8a5e\u3067\u59cb\u3081\u308b\n    User findById(Long id);\n    List&lt;User&gt; findAllActive();\n    int updateStatus(Long id, String status);\n    void deleteByIds(List&lt;Long&gt; ids);\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=\"\">&lt;!-- \u2705 XML\u30de\u30c3\u30d4\u30f3\u30b0\u30d5\u30a1\u30a4\u30eb\u306e\u63a8\u5968\u69cb\u9020 --&gt;\n&lt;mapper namespace=\"com.example.mapper.UserMapper\"&gt;\n    &lt;!-- \u5171\u901a\u306eResultMap\u3092\u6700\u521d\u306b\u5b9a\u7fa9 --&gt;\n    &lt;resultMap id=\"BaseResultMap\" type=\"User\"&gt;\n        &lt;id column=\"id\" property=\"id\"\/&gt;\n        &lt;result column=\"username\" property=\"username\"\/&gt;\n    &lt;\/resultMap&gt;\n\n    &lt;!-- \u5171\u901a\u306eSQL\u30d5\u30e9\u30b0\u30e1\u30f3\u30c8\u3092\u5b9a\u7fa9 --&gt;\n    &lt;sql id=\"Base_Column_List\"&gt;\n        id, username, email, created_at\n    &lt;\/sql&gt;\n\n    &lt;!-- \u691c\u7d22\u7cfb\u306e\u30af\u30a8\u30ea\u3092\u5148\u306b\u914d\u7f6e --&gt;\n    &lt;select id=\"findById\" resultMap=\"BaseResultMap\"&gt;\n        SELECT &lt;include refid=\"Base_Column_List\"\/&gt;\n        FROM users\n        WHERE id = #{id}\n    &lt;\/select&gt;\n\n    &lt;!-- \u66f4\u65b0\u7cfb\u306e\u30af\u30a8\u30ea\u3092\u5f8c\u306b\u914d\u7f6e --&gt;\n    &lt;update id=\"updateStatus\"&gt;\n        UPDATE users\n        SET status = #{status}\n        WHERE id = #{id}\n    &lt;\/update&gt;\n&lt;\/mapper&gt;<\/pre>\n\n\n\n<p><strong>3. \u4fdd\u5b88\u6027\u3092\u9ad8\u3081\u308b\u305f\u3081\u306e\u30c1\u30a7\u30c3\u30af\u30ea\u30b9\u30c8<\/strong><\/p>\n\n\n<div id=\"id-6117fb6f-0169-4f24-9383-fdfed456d4b3\">\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>\u30ab\u30c6\u30b4\u30ea<\/th><th>\u30d9\u30b9\u30c8\u30d7\u30e9\u30af\u30c6\u30a3\u30b9<\/th><th>\u7406\u7531<\/th><\/tr><\/thead><tbody><tr><td>\u547d\u540d\u898f\u5247<\/td><td>\u4e00\u8cab\u6027\u306e\u3042\u308b\u547d\u540d<\/td><td>\u30b3\u30fc\u30c9\u306e\u53ef\u8aad\u6027\u5411\u4e0a<\/td><\/tr><tr><td>\u30b3\u30e1\u30f3\u30c8<\/td><td>\u8907\u96d1\u306aSQL\u306b\u306f\u8aac\u660e\u3092\u8ffd\u52a0<\/td><td>\u4fdd\u5b88\u6027\u306e\u5411\u4e0a<\/td><\/tr><tr><td>\u69cb\u9020\u5316<\/td><td>\u5171\u901aSQL\u306e\u90e8\u54c1\u5316<\/td><td>\u518d\u5229\u7528\u6027\u306e\u5411\u4e0a<\/td><\/tr><tr><td>\u30d0\u30fc\u30b8\u30e7\u30f3\u7ba1\u7406<\/td><td>\u30de\u30a4\u30b0\u30ec\u30fc\u30b7\u30e7\u30f3\u7ba1\u7406\u306e\u5fb9\u5e95<\/td><td>\u30b9\u30ad\u30fc\u30de\u5909\u66f4\u306e\u8ffd\u8de1\u5bb9\u6613\u5316<\/td><\/tr><tr><td>\u30c6\u30b9\u30c8<\/td><td>\u30ab\u30d0\u30ec\u30c3\u30b8\u306e\u7dad\u6301<\/td><td>\u54c1\u8cea\u306e\u78ba\u4fdd<\/td><\/tr><\/tbody><\/table><\/figure>\n<\/div>\n\n\n<p>\u3053\u308c\u3089\u306e\u30d9\u30b9\u30c8\u30d7\u30e9\u30af\u30c6\u30a3\u30b9\u3092\u9075\u5b88\u3059\u308b\u3053\u3068\u3067\u3001\u9577\u671f\u7684\u306a\u4fdd\u5b88\u6027\u3068\u54c1\u8cea\u3092\u78ba\u4fdd\u3067\u304d\u307e\u3059\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-24\">\u307e\u3068\u3081\uff1aMyBatis\u3067\u5b9f\u73fe\u3059\u308b\u52b9\u7387\u7684\u306aDB\u64cd\u4f5c<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-25\">\u672c\u8a18\u4e8b\u3067\u5b66\u3093\u3060\u30dd\u30a4\u30f3\u30c8<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>MyBatis\u306e\u57fa\u672c\u3068\u7279\u5fb4<\/strong>\n<ul class=\"wp-block-list\">\n<li>SQL\u3092\u76f4\u63a5\u5236\u5fa1\u3067\u304d\u308b\u67d4\u8edf\u6027<\/li>\n\n\n\n<li>\u30b7\u30f3\u30d7\u30eb\u306a\u8a2d\u5b9a\u3068API<\/li>\n\n\n\n<li>\u5b66\u7fd2\u30b3\u30b9\u30c8\u306e\u4f4e\u3055<\/li>\n\n\n\n<li>\u9ad8\u3044\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>\u5b9f\u88c5\u306e\u30d9\u30b9\u30c8\u30d7\u30e9\u30af\u30c6\u30a3\u30b9<\/strong>\n<ul class=\"wp-block-list\">\n<li>\u9069\u5207\u306a\u74b0\u5883\u69cb\u7bc9<\/li>\n\n\n\n<li>\u30bb\u30ad\u30e5\u30a2\u306a\u30b3\u30fc\u30c7\u30a3\u30f3\u30b0<\/li>\n\n\n\n<li>\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u6700\u9069\u5316<\/li>\n\n\n\n<li>\u52b9\u679c\u7684\u306a\u30c6\u30b9\u30c8\u624b\u6cd5<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>\u5b9f\u8df5\u7684\u306a\u6d3b\u7528\u30dd\u30a4\u30f3\u30c8<\/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=\"\">   \/\/ \u30d9\u30b9\u30c8\u30d7\u30e9\u30af\u30c6\u30a3\u30b9\u306e\u4f8b\n   @Mapper\n   public interface UserMapper {\n       \/\/ \u660e\u78ba\u306a\u547d\u540d\n       @Select(\"SELECT * FROM users WHERE status = #{status}\")\n       List&lt;User&gt; findByStatus(@Param(\"status\") String status);\n\n       \/\/ \u30d0\u30c3\u30c1\u51e6\u7406\u306e\u6d3b\u7528\n       @Insert(\"&lt;script&gt;...&lt;\/script&gt;\")\n       void batchInsert(@Param(\"users\") List&lt;User&gt; users);\n\n       \/\/ \u52d5\u7684SQL\u306e\u9069\u5207\u306a\u4f7f\u7528\n       @Select(\"&lt;script&gt;...\")\n       List&lt;User&gt; findByDynamicConditions(SearchCondition condition);\n   }<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-26\">\u6b21\u306e\u30b9\u30c6\u30c3\u30d7<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u30b9\u30ad\u30eb\u30a2\u30c3\u30d7\u306e\u65b9\u5411\u6027<\/strong> \u5b66\u7fd2\u9805\u76ee \u6982\u8981 \u512a\u5148\u5ea6 Spring\u9023\u643a Spring Boot\u3068MyBatis\u306e\u7d71\u5408 \u9ad8 \u6027\u80fd\u6539\u5584 \u30af\u30a8\u30ea\u30c1\u30e5\u30fc\u30cb\u30f3\u30b0\u3068\u30ad\u30e3\u30c3\u30b7\u30e5\u8a2d\u5b9a \u4e2d \u30c6\u30b9\u30c8\u5f37\u5316 \u5358\u4f53\u30c6\u30b9\u30c8\u3068\u7d71\u5408\u30c6\u30b9\u30c8\u306e\u5145\u5b9f \u9ad8 \u76e3\u8996\u8a2d\u5b9a \u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u30e2\u30cb\u30bf\u30ea\u30f3\u30b0 \u4e2d<\/li>\n\n\n\n<li><strong>\u63a8\u5968\u3055\u308c\u308b\u5b66\u7fd2\u30ea\u30bd\u30fc\u30b9<\/strong>\n<ul class=\"wp-block-list\">\n<li>MyBatis\u516c\u5f0f\u30c9\u30ad\u30e5\u30e1\u30f3\u30c8<\/li>\n\n\n\n<li>Spring Boot with MyBatis\u30ac\u30a4\u30c9<\/li>\n\n\n\n<li>\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u8a2d\u8a08\u30d1\u30bf\u30fc\u30f3<\/li>\n\n\n\n<li>\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u30c1\u30e5\u30fc\u30cb\u30f3\u30b0\u624b\u6cd5<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>\u5b9f\u8df5\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u306e\u30a2\u30a4\u30c7\u30a2<\/strong>\n<ul class=\"wp-block-list\">\n<li>\u30e6\u30fc\u30b6\u30fc\u7ba1\u7406\u30b7\u30b9\u30c6\u30e0<\/li>\n\n\n\n<li>\u5546\u54c1\u5728\u5eab\u7ba1\u7406\u30b7\u30b9\u30c6\u30e0<\/li>\n\n\n\n<li>\u30d6\u30ed\u30b0\u30d7\u30e9\u30c3\u30c8\u30d5\u30a9\u30fc\u30e0<\/li>\n\n\n\n<li>\u4e88\u7d04\u7ba1\u7406\u30b7\u30b9\u30c6\u30e0<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-27\">\u6700\u5f8c\u306b<\/h3>\n\n\n\n<p>MyBatis\u306f\u3001\u305d\u306e\u67d4\u8edf\u6027\u3068\u4f7f\u3044\u3084\u3059\u3055\u304b\u3089\u3001Java\u958b\u767a\u8005\u306b\u3068\u3063\u3066\u975e\u5e38\u306b\u91cd\u8981\u306aO\/R\u30de\u30c3\u30d4\u30f3\u30b0\u30d5\u30ec\u30fc\u30e0\u30ef\u30fc\u30af\u3068\u306a\u3063\u3066\u3044\u307e\u3059\u3002\u672c\u8a18\u4e8b\u3067\u89e3\u8aac\u3057\u305f\u5185\u5bb9\u3092\u5b9f\u8df5\u3059\u308b\u3053\u3068\u3067\u3001\u4ee5\u4e0b\u306e\u3088\u3046\u306a\u52b9\u679c\u304c\u671f\u5f85\u3067\u304d\u307e\u3059\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u4fdd\u5b88\u6027\u306e\u9ad8\u3044\u30b3\u30fc\u30c9\u30d9\u30fc\u30b9\u306e\u78ba\u7acb<\/li>\n\n\n\n<li>\u30bb\u30ad\u30e5\u30a2\u306a\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u30a2\u30af\u30bb\u30b9\u306e\u5b9f\u73fe<\/li>\n\n\n\n<li>\u9ad8\u3044\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u306e\u9054\u6210<\/li>\n\n\n\n<li>\u52b9\u7387\u7684\u306a\u958b\u767a\u30d7\u30ed\u30bb\u30b9\u306e\u78ba\u7acb<\/li>\n<\/ol>\n\n\n\n<p>\u3053\u308c\u3089\u306e\u77e5\u8b58\u3092\u57fa\u306b\u3001\u5b9f\u969b\u306e\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u3067MyBatis\u3092\u6d3b\u7528\u3057\u3001\u3055\u3089\u306a\u308b\u7d4c\u9a13\u3092\u7a4d\u3093\u3067\u3044\u304f\u3053\u3068\u3092\u304a\u52e7\u3081\u3057\u307e\u3059\u3002\u307e\u305f\u3001\u65b0\u3057\u3044\u30d0\u30fc\u30b8\u30e7\u30f3\u304c\u30ea\u30ea\u30fc\u30b9\u3055\u308c\u305f\u969b\u306f\u3001\u305d\u306e\u7279\u5fb4\u3084\u6539\u5584\u70b9\u3092\u30ad\u30e3\u30c3\u30c1\u30a2\u30c3\u30d7\u3059\u308b\u3053\u3068\u3067\u3001\u3088\u308a\u52b9\u679c\u7684\u306a\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u64cd\u4f5c\u3092\u5b9f\u73fe\u3067\u304d\u308b\u3067\u3057\u3087\u3046\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-495","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\/495","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=495"}],"version-history":[{"count":1,"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=\/wp\/v2\/posts\/495\/revisions"}],"predecessor-version":[{"id":507,"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=\/wp\/v2\/posts\/495\/revisions\/507"}],"wp:attachment":[{"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=495"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=495"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=495"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}