{"id":517,"date":"2025-03-24T08:53:18","date_gmt":"2025-03-23T23:53:18","guid":{"rendered":"https:\/\/dexall.co.jp\/articles\/?p=517"},"modified":"2025-03-24T08:53:18","modified_gmt":"2025-03-23T23:53:18","slug":"%e3%80%90%e4%bf%9d%e5%ae%88%e6%80%a7%e6%8a%9c%e7%be%a4%e3%80%91mybatis-generator%e5%ae%8c%e5%85%a8%e3%82%ac%e3%82%a4%e3%83%892024%ef%bc%9a%e8%a8%ad%e5%ae%9a%e3%81%8b%e3%82%89%e6%b4%bb%e7%94%a8","status":"publish","type":"post","link":"https:\/\/dexall.co.jp\/articles\/?p=517","title":{"rendered":"\u3010\u4fdd\u5b88\u6027\u629c\u7fa4\u3011MyBatis Generator\u5b8c\u5168\u30ac\u30a4\u30c92024\uff1a\u8a2d\u5b9a\u304b\u3089\u6d3b\u7528\u307e\u30675\u30b9\u30c6\u30c3\u30d7\u3067\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 Generator\u3068\u306f\uff1f\u958b\u767a\u52b9\u7387\u30923\u500d\u306b\u3059\u308b\u81ea\u52d5\u751f\u6210\u30c4\u30fc\u30eb<\/a>    <ul class=\"menu_level_1\">      <li class=\"first last\">        <a href=\"#i-1\">\u5f93\u6765\u306e\u5b9f\u88c5\u65b9\u6cd5\u3068\u6bd4\u8f03\u3057\u305f\u969b\u306e\u30e1\u30ea\u30c3\u30c8<\/a>      <\/li>    <\/ul>  <\/li>  <li>    <a href=\"#i-2\">MyBatis Generator\u5c0e\u5165\u624b\u9806\uff1a5\u5206\u3067\u74b0\u5883\u69cb\u7bc9<\/a>    <ul class=\"menu_level_1\">      <li class=\"first\">        <a href=\"#i-3\">Maven\/Gradle\u3067\u306e\u4f9d\u5b58\u95a2\u4fc2\u306e\u8ffd\u52a0\u65b9\u6cd5<\/a>      <\/li>      <li>        <a href=\"#i-6\">\u8a2d\u5b9a\u30d5\u30a1\u30a4\u30eb\u306e\u57fa\u672c\u69cb\u6210\u3068\u89e3\u8aac<\/a>      <\/li>      <li class=\"last\">        <a href=\"#i-7\">\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u63a5\u7d9a\u8a2d\u5b9a\u306e\u30dd\u30a4\u30f3\u30c8<\/a>      <\/li>    <\/ul>  <\/li>  <li>    <a href=\"#i-8\">\u5b9f\u8df5\u7684\u306a\u30b3\u30fc\u30c9\u751f\u6210\uff1a5\u3064\u306e\u91cd\u8981\u8a2d\u5b9a<\/a>    <ul class=\"menu_level_1\">      <li class=\"first\">        <a href=\"#i-9\">\u30a8\u30f3\u30c6\u30a3\u30c6\u30a3\u30af\u30e9\u30b9\u306e\u30ab\u30b9\u30bf\u30de\u30a4\u30ba\u65b9\u6cd5<\/a>      <\/li>      <li>        <a href=\"#i-12\">\u30de\u30c3\u30d1\u30fc\u30a4\u30f3\u30bf\u30fc\u30d5\u30a7\u30fc\u30b9\u306e\u8a2d\u5b9a\u30dd\u30a4\u30f3\u30c8<\/a>      <\/li>      <li>        <a href=\"#i-15\">XML\u30de\u30c3\u30d4\u30f3\u30b0\u30d5\u30a1\u30a4\u30eb\u306e\u751f\u6210\u30aa\u30d7\u30b7\u30e7\u30f3<\/a>      <\/li>      <li>        <a href=\"#i-18\">\u65e5\u672c\u8a9e\u30ab\u30e9\u30e0\u540d\u306e\u9069\u5207\u306a\u51e6\u7406\u65b9\u6cd5<\/a>      <\/li>      <li class=\"last\">        <a href=\"#i-21\">\u578b\u5909\u63db\u306e\u7d30\u304b\u306a\u5236\u5fa1\u65b9\u6cd5<\/a>      <\/li>    <\/ul>  <\/li>  <li>    <a href=\"#i-24\">\u4fdd\u5b88\u6027\u3092\u9ad8\u3081\u308b\u5b9f\u88c5\u30c6\u30af\u30cb\u30c3\u30af\u96c6<\/a>    <ul class=\"menu_level_1\">      <li class=\"first\">        <a href=\"#i-25\">\u751f\u6210\u30b3\u30fc\u30c9\u306e\u30d0\u30fc\u30b8\u30e7\u30f3\u7ba1\u7406\u6226\u7565<\/a>      <\/li>      <li>        <a href=\"#i-29\">\u30ab\u30b9\u30bf\u30e0\u30d7\u30e9\u30b0\u30a4\u30f3\u306e\u6d3b\u7528\u65b9\u6cd5<\/a>      <\/li>      <li class=\"last\">        <a href=\"#i-32\">\u30c6\u30b9\u30c8\u30b3\u30fc\u30c9\u306e\u81ea\u52d5\u751f\u6210\u3068\u6d3b\u7528<\/a>      <\/li>    <\/ul>  <\/li>  <li>    <a href=\"#i-36\">MyBatis Generator\u6d3b\u7528\u306e\u30d9\u30b9\u30c8\u30d7\u30e9\u30af\u30c6\u30a3\u30b9<\/a>    <ul class=\"menu_level_1\">      <li class=\"first\">        <a href=\"#i-37\">\u5927\u898f\u6a21\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u3067\u306e\u904b\u7528\u30dd\u30a4\u30f3\u30c8<\/a>      <\/li>      <li>        <a href=\"#i-40\">\u30c8\u30e9\u30d6\u30eb\u30b7\u30e5\u30fc\u30c6\u30a3\u30f3\u30b0\u3068\u89e3\u6c7a\u7b56<\/a>      <\/li>      <li class=\"last\">        <a href=\"#i-43\">\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u30c1\u30e5\u30fc\u30cb\u30f3\u30b0\u306e\u52d8\u6240<\/a>      <\/li>    <\/ul>  <\/li>  <li class=\"last\">    <a href=\"#i-47\">\u6b21\u306e\u30b9\u30c6\u30c3\u30d7\uff1a\u3055\u3089\u306a\u308b\u958b\u767a\u52b9\u7387\u5316\u306b\u5411\u3051\u3066<\/a>    <ul class=\"menu_level_1\">      <li class=\"first\">        <a href=\"#i-48\">\u95a2\u9023\u30c4\u30fc\u30eb\u3068\u306e\u9023\u643a\u3067\u3055\u3089\u306a\u308b\u52b9\u7387\u5316<\/a>      <\/li>      <li>        <a href=\"#i-52\">\u6700\u65b0\u30a2\u30c3\u30d7\u30c7\u30fc\u30c8\u3068\u4eca\u5f8c\u306e\u5c55\u671b<\/a>      <\/li>      <li class=\"last\">        <a href=\"#i-56\">\u307e\u3068\u3081\u3068\u6b21\u306e\u30b9\u30c6\u30c3\u30d7<\/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 Generator\u3068\u306f\uff1f\u958b\u767a\u52b9\u7387\u30923\u500d\u306b\u3059\u308b\u81ea\u52d5\u751f\u6210\u30c4\u30fc\u30eb<\/h2>\n\n\n\n<p>MyBatis Generator\u306f\u3001MyBatis\u30d5\u30ec\u30fc\u30e0\u30ef\u30fc\u30af\u306b\u304a\u3051\u308b\u30dc\u30a4\u30e9\u30fc\u30d7\u30ec\u30fc\u30c8\u30b3\u30fc\u30c9\u3092\u81ea\u52d5\u751f\u6210\u3059\u308b\u5f37\u529b\u306a\u30c4\u30fc\u30eb\u3067\u3059\u3002\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u30c6\u30fc\u30d6\u30eb\u306e\u5b9a\u7fa9\u304b\u3089\u3001Java\u306e\u30a8\u30f3\u30c6\u30a3\u30c6\u30a3\u30af\u30e9\u30b9\u3001SQL\u30de\u30c3\u30d1\u30fc\u30a4\u30f3\u30bf\u30fc\u30d5\u30a7\u30fc\u30b9\u3001XML\u30de\u30c3\u30d4\u30f3\u30b0\u30d5\u30a1\u30a4\u30eb\u3092\u81ea\u52d5\u751f\u6210\u3059\u308b\u3053\u3068\u3067\u3001\u958b\u767a\u52b9\u7387\u3092\u5927\u5e45\u306b\u5411\u4e0a\u3055\u305b\u307e\u3059\u3002<\/p>\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-bell\"><\/i><\/span><div class=\"sng-box-msg__title\"><strong>MyBatis Generator\u304c\u89e3\u6c7a\u3059\u308b3\u3064\u306e\u8ab2\u984c<\/strong><\/div><\/div><div class=\"sng-box-msg__contents\">\n<ol class=\"wp-block-list\">\n<li><strong>\u624b\u4f5c\u696d\u306b\u3088\u308b\u30b3\u30fc\u30c7\u30a3\u30f3\u30b0\u306e\u975e\u52b9\u7387\u6027<\/strong>\n<ul class=\"wp-block-list\">\n<li>\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u5b9a\u7fa9\u306e\u5909\u66f4\u306b\u4f34\u3046\u624b\u52d5\u3067\u306e\u30b3\u30fc\u30c9\u4fee\u6b63<\/li>\n\n\n\n<li>\u30bf\u30a4\u30d7\u30df\u30b9\u3084\u547d\u540d\u898f\u5247\u306e\u4e0d\u4e00\u81f4\u306b\u3088\u308b\u30d0\u30b0<\/li>\n\n\n\n<li>\u5927\u898f\u6a21\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u3067\u306e\u81a8\u5927\u306a\u4f5c\u696d\u91cf<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>\u4fdd\u5b88\u6027\u306e\u4f4e\u4e0b<\/strong>\n<ul class=\"wp-block-list\">\n<li>\u30c1\u30fc\u30e0\u30e1\u30f3\u30d0\u30fc\u9593\u3067\u306e\u30b3\u30fc\u30c7\u30a3\u30f3\u30b0\u30b9\u30bf\u30a4\u30eb\u306e\u9055\u3044<\/li>\n\n\n\n<li>\u30c9\u30ad\u30e5\u30e1\u30f3\u30c8\u3068\u30b3\u30fc\u30c9\u306e\u4e0d\u4e00\u81f4<\/li>\n\n\n\n<li>\u30ea\u30d5\u30a1\u30af\u30bf\u30ea\u30f3\u30b0\u6642\u306e\u5f71\u97ff\u7bc4\u56f2\u306e\u7279\u5b9a\u304c\u56f0\u96e3<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>\u54c1\u8cea\u7ba1\u7406\u306e\u56f0\u96e3\u3055<\/strong>\n<ul class=\"wp-block-list\">\n<li>\u30c6\u30b9\u30c8\u30b1\u30fc\u30b9\u306e\u4f5c\u6210\u30fb\u30e1\u30f3\u30c6\u30ca\u30f3\u30b9\u306e\u624b\u9593<\/li>\n\n\n\n<li>\u30b3\u30fc\u30c9\u898f\u7d04\u306e\u9075\u5b88\u78ba\u8a8d<\/li>\n\n\n\n<li>\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u30b9\u30ad\u30fc\u30de\u3068\u306e\u6574\u5408\u6027\u78ba\u4fdd<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n<\/div><\/div><\/div>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-1\">\u5f93\u6765\u306e\u5b9f\u88c5\u65b9\u6cd5\u3068\u6bd4\u8f03\u3057\u305f\u969b\u306e\u30e1\u30ea\u30c3\u30c8<\/h3>\n\n\n\n<p>\u4ee5\u4e0b\u306e\u8868\u3067\u3001\u5f93\u6765\u306e\u624b\u52d5\u5b9f\u88c5\u3068MyBatis Generator\u3092\u4f7f\u7528\u3057\u305f\u5834\u5408\u3092\u6bd4\u8f03\u3057\u307e\u3059\uff1a<\/p>\n\n\n<div id=\"id-5317bfcb-3f26-4ffa-a1f6-b7dbb6867f81\">\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>\u8a55\u4fa1\u9805\u76ee<\/th><th>\u5f93\u6765\u306e\u5b9f\u88c5\u65b9\u6cd5<\/th><th>MyBatis Generator\u4f7f\u7528\u6642<\/th><th>\u6539\u5584\u52b9\u679c<\/th><\/tr><\/thead><tbody><tr><td>\u5b9f\u88c5\u6642\u9593<\/td><td>1\u30c6\u30fc\u30d6\u30eb\u3042\u305f\u308a2-3\u6642\u9593<\/td><td>1\u30c6\u30fc\u30d6\u30eb\u3042\u305f\u308a5-10\u5206<\/td><td>\u7d0480%\u524a\u6e1b<\/td><\/tr><tr><td>\u30d0\u30b0\u767a\u751f\u7387<\/td><td>100\u884c\u3042\u305f\u308a1.2\u4ef6<\/td><td>100\u884c\u3042\u305f\u308a0.3\u4ef6<\/td><td>\u7d0475%\u524a\u6e1b<\/td><\/tr><tr><td>\u30b3\u30fc\u30c9\u4e00\u8cab\u6027<\/td><td>\u958b\u767a\u8005\u4f9d\u5b58<\/td><td>\u5b8c\u5168\u306a\u4e00\u8cab\u6027\u3092\u78ba\u4fdd<\/td><td>100%\u5411\u4e0a<\/td><\/tr><tr><td>\u30e1\u30f3\u30c6\u30ca\u30f3\u30b9\u30b3\u30b9\u30c8<\/td><td>\u9ad8\u3044<\/td><td>\u4f4e\u3044<\/td><td>\u7d0460%\u524a\u6e1b<\/td><\/tr><\/tbody><\/table><\/figure>\n<\/div>\n\n\n<p>\u5b9f\u969b\u306e\u5c0e\u5165\u52b9\u679c\u3068\u3057\u3066\u3001\u4ee5\u4e0b\u306e\u3088\u3046\u306a\u5177\u4f53\u7684\u306a\u6570\u5024\u304c\u5831\u544a\u3055\u308c\u3066\u3044\u307e\u3059\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u958b\u767a\u901f\u5ea6\u306e\u5411\u4e0a<\/strong>\n<ul class=\"wp-block-list\">\n<li>DAO\u30ec\u30a4\u30e4\u30fc\u306e\u5b9f\u88c5\u6642\u9593: \u7d0470%\u524a\u6e1b<\/li>\n\n\n\n<li>\u30b9\u30ad\u30fc\u30de\u5909\u66f4\u3078\u306e\u5bfe\u5fdc\u6642\u9593: \u7d0480%\u524a\u6e1b<\/li>\n\n\n\n<li>\u30c6\u30b9\u30c8\u30b3\u30fc\u30c9\u4f5c\u6210\u6642\u9593: \u7d0450%\u524a\u6e1b<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>\u54c1\u8cea\u306e\u6539\u5584<\/strong>\n<ul class=\"wp-block-list\">\n<li>\u30b3\u30fc\u30c9\u30ec\u30d3\u30e5\u30fc\u6642\u9593: \u7d0440%\u524a\u6e1b<\/li>\n\n\n\n<li>\u30d0\u30b0\u4fee\u6b63\u56de\u6570: \u7d0460%\u524a\u6e1b<\/li>\n\n\n\n<li>\u30c9\u30ad\u30e5\u30e1\u30f3\u30c8\u4f5c\u6210\u6642\u9593: \u7d0450%\u524a\u6e1b<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>\u904b\u7528\u52b9\u7387\u306e\u5411\u4e0a<\/strong>\n<ul class=\"wp-block-list\">\n<li>\u65b0\u898f\u958b\u767a\u8005\u306e\u7acb\u3061\u4e0a\u3052\u6642\u9593: \u7d0450%\u77ed\u7e2e<\/li>\n\n\n\n<li>\u30b3\u30fc\u30c9\u4fdd\u5b88\u306e\u5de5\u6570: \u7d0440%\u524a\u6e1b<\/li>\n\n\n\n<li>CI\/CD\u30d1\u30a4\u30d7\u30e9\u30a4\u30f3\u306e\u69cb\u7bc9\u6642\u9593: \u7d0430%\u524a\u6e1b<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n\n\n\n<p>\u4ee5\u4e0b\u306f\u3001MyBatis Generator\u3092\u4f7f\u7528\u3057\u305f\u5834\u5408\u306e\u57fa\u672c\u7684\u306a\u30ef\u30fc\u30af\u30d5\u30ed\u30fc\u306e\u4f8b\u3067\u3059\uff1a<\/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;!-- generatorConfig.xml \u306e\u57fa\u672c\u69cb\u6210\u4f8b --&gt;\n&lt;!DOCTYPE generatorConfiguration PUBLIC\n        \"-\/\/mybatis.org\/\/DTD MyBatis Generator Configuration 1.0\/\/EN\"\n        \"http:\/\/mybatis.org\/dtd\/mybatis-generator-config_1_0.dtd\"&gt;\n&lt;generatorConfiguration&gt;\n    &lt;!-- \u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u63a5\u7d9a\u8a2d\u5b9a --&gt;\n    &lt;context id=\"MyTables\" targetRuntime=\"MyBatis3\"&gt;\n        &lt;jdbcConnection\n            driverClass=\"com.mysql.cj.jdbc.Driver\"\n            connectionURL=\"jdbc:mysql:\/\/localhost:3306\/mydb\"\n            userId=\"root\"\n            password=\"password\"&gt;\n        &lt;\/jdbcConnection&gt;\n\n        &lt;!-- \u751f\u6210\u3055\u308c\u308b\u30d5\u30a1\u30a4\u30eb\u306e\u8a2d\u5b9a --&gt;\n        &lt;javaModelGenerator \n            targetPackage=\"com.example.model\" \n            targetProject=\"src\/main\/java\"&gt;\n        &lt;\/javaModelGenerator&gt;\n\n        &lt;!-- \u30c6\u30fc\u30d6\u30eb\u8a2d\u5b9a --&gt;\n        &lt;table tableName=\"users\" \/&gt;\n    &lt;\/context&gt;\n&lt;\/generatorConfiguration&gt;<\/pre>\n\n\n\n<p>\u3053\u306e\u8a2d\u5b9a\u306b\u3088\u308a\u3001\u4ee5\u4e0b\u306e\u3088\u3046\u306a\u30a8\u30f3\u30c6\u30a3\u30c6\u30a3\u30af\u30e9\u30b9\u304c\u81ea\u52d5\u751f\u6210\u3055\u308c\u307e\u3059\uff1a<\/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=\"\">\/\/ \u751f\u6210\u3055\u308c\u308b\u30a8\u30f3\u30c6\u30a3\u30c6\u30a3\u30af\u30e9\u30b9\u306e\u4f8b\npublic class User {\n    private Long id;\n    private String username;\n    private String email;\n    \/\/ getter\/setter\u30e1\u30bd\u30c3\u30c9\n    \/\/ equals\/hashCode\u5b9f\u88c5\n    \/\/ toString\u5b9f\u88c5\n}<\/pre>\n\n\n\n<p>MyBatis Generator\u306e\u5c0e\u5165\u306b\u3088\u308a\u3001\u958b\u767a\u8005\u306f\u30d3\u30b8\u30cd\u30b9\u30ed\u30b8\u30c3\u30af\u306e\u5b9f\u88c5\u306b\u6ce8\u529b\u3067\u304d\u308b\u3088\u3046\u306b\u306a\u308a\u3001\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u5168\u4f53\u306e\u751f\u7523\u6027\u304c\u5927\u5e45\u306b\u5411\u4e0a\u3057\u307e\u3059\u3002\u6b21\u306e\u30bb\u30af\u30b7\u30e7\u30f3\u3067\u306f\u3001\u5177\u4f53\u7684\u306a\u5c0e\u5165\u624b\u9806\u306b\u3064\u3044\u3066\u8a73\u3057\u304f\u8aac\u660e\u3057\u3066\u3044\u304d\u307e\u3059\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-2\">MyBatis Generator\u5c0e\u5165\u624b\u9806\uff1a5\u5206\u3067\u74b0\u5883\u69cb\u7bc9<\/h2>\n\n\n\n<p>MyBatis Generator\u3092\u52b9\u7387\u7684\u306b\u5c0e\u5165\u3059\u308b\u305f\u3081\u306e\u624b\u9806\u3092\u3001\u30d3\u30eb\u30c9\u30c4\u30fc\u30eb\u5225\u306b\u8a73\u3057\u304f\u89e3\u8aac\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-3\">Maven\/Gradle\u3067\u306e\u4f9d\u5b58\u95a2\u4fc2\u306e\u8ffd\u52a0\u65b9\u6cd5<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-4\">Maven\u306e\u5834\u5408<\/h4>\n\n\n\n<p><code>pom.xml<\/code>\u306b\u4ee5\u4e0b\u306e\u8a2d\u5b9a\u3092\u8ffd\u52a0\u3057\u307e\u3059\uff1a<\/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;!-- \u30d7\u30e9\u30b0\u30a4\u30f3\u306e\u8ffd\u52a0 --&gt;\n&lt;build&gt;\n    &lt;plugins&gt;\n        &lt;plugin&gt;\n            &lt;groupId&gt;org.mybatis.generator&lt;\/groupId&gt;\n            &lt;artifactId&gt;mybatis-generator-maven-plugin&lt;\/artifactId&gt;\n            &lt;version&gt;1.4.2&lt;\/version&gt;\n            &lt;dependencies&gt;\n                &lt;!-- MySQL Connector \u306e\u8ffd\u52a0\uff08MySQL\u306e\u5834\u5408\uff09 --&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;\n        &lt;\/plugin&gt;\n    &lt;\/plugins&gt;\n&lt;\/build&gt;\n\n&lt;!-- \u4f9d\u5b58\u95a2\u4fc2\u306e\u8ffd\u52a0 --&gt;\n&lt;dependencies&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    &lt;dependency&gt;\n        &lt;groupId&gt;org.mybatis.generator&lt;\/groupId&gt;\n        &lt;artifactId&gt;mybatis-generator-core&lt;\/artifactId&gt;\n        &lt;version&gt;1.4.2&lt;\/version&gt;\n    &lt;\/dependency&gt;\n&lt;\/dependencies&gt;<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-5\">Gradle\u306e\u5834\u5408<\/h4>\n\n\n\n<p><code>build.gradle<\/code>\u306b\u4ee5\u4e0b\u306e\u8a2d\u5b9a\u3092\u8ffd\u52a0\u3057\u307e\u3059\uff1a<\/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=\"\">plugins {\n    id 'org.mybatis.generator' version '1.4.2'\n}\n\ndependencies {\n    implementation 'org.mybatis:mybatis:3.5.13'\n    implementation 'org.mybatis.generator:mybatis-generator-core:1.4.2'\n    implementation 'mysql:mysql-connector-java:8.0.33'  \/\/ MySQL\u306e\u5834\u5408\n}\n\nmybatisGenerator {\n    verbose = true\n    configFile = 'src\/main\/resources\/generatorConfig.xml'\n}<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-6\">\u8a2d\u5b9a\u30d5\u30a1\u30a4\u30eb\u306e\u57fa\u672c\u69cb\u6210\u3068\u89e3\u8aac<\/h3>\n\n\n\n<p><code>src\/main\/resources\/generatorConfig.xml<\/code>\u306b\u4ee5\u4e0b\u306e\u8a2d\u5b9a\u3092\u4f5c\u6210\u3057\u307e\u3059\uff1a<\/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;!DOCTYPE generatorConfiguration PUBLIC\n        \"-\/\/mybatis.org\/\/DTD MyBatis Generator Configuration 1.0\/\/EN\"\n        \"http:\/\/mybatis.org\/dtd\/mybatis-generator-config_1_0.dtd\"&gt;\n&lt;generatorConfiguration&gt;\n    &lt;!-- \u30b3\u30f3\u30c6\u30ad\u30b9\u30c8\u8a2d\u5b9a --&gt;\n    &lt;context id=\"MySQLTables\" targetRuntime=\"MyBatis3\"&gt;\n        &lt;!-- \u30b3\u30e1\u30f3\u30c8\u751f\u6210\u306e\u6291\u5236\uff08\u4efb\u610f\uff09 --&gt;\n        &lt;commentGenerator&gt;\n            &lt;property name=\"suppressAllComments\" value=\"true\"\/&gt;\n        &lt;\/commentGenerator&gt;\n\n        &lt;!-- \u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u63a5\u7d9a\u8a2d\u5b9a --&gt;\n        &lt;jdbcConnection\n            driverClass=\"com.mysql.cj.jdbc.Driver\"\n            connectionURL=\"jdbc:mysql:\/\/localhost:3306\/mydb\"\n            userId=\"root\"\n            password=\"password\"&gt;\n            &lt;!-- SSL\u8b66\u544a\u306e\u6291\u5236\uff08\u5fc5\u8981\u306a\u5834\u5408\uff09 --&gt;\n            &lt;property name=\"nullCatalogMeansCurrent\" value=\"true\"\/&gt;\n        &lt;\/jdbcConnection&gt;\n\n        &lt;!-- Java\u30e2\u30c7\u30eb\u751f\u6210\u8a2d\u5b9a --&gt;\n        &lt;javaModelGenerator \n            targetPackage=\"com.example.model\" \n            targetProject=\"src\/main\/java\"&gt;\n            &lt;property name=\"enableSubPackages\" value=\"true\"\/&gt;\n            &lt;property name=\"trimStrings\" value=\"true\"\/&gt;\n        &lt;\/javaModelGenerator&gt;\n\n        &lt;!-- SQL\u30de\u30c3\u30d1\u30fcXML\u751f\u6210\u8a2d\u5b9a --&gt;\n        &lt;sqlMapGenerator \n            targetPackage=\"mapper\"  \n            targetProject=\"src\/main\/resources\"&gt;\n            &lt;property name=\"enableSubPackages\" value=\"true\"\/&gt;\n        &lt;\/sqlMapGenerator&gt;\n\n        &lt;!-- Mapper\u30a4\u30f3\u30bf\u30fc\u30d5\u30a7\u30fc\u30b9\u751f\u6210\u8a2d\u5b9a --&gt;\n        &lt;javaClientGenerator \n            type=\"XMLMAPPER\"\n            targetPackage=\"com.example.mapper\"\n            targetProject=\"src\/main\/java\"&gt;\n            &lt;property name=\"enableSubPackages\" value=\"true\"\/&gt;\n        &lt;\/javaClientGenerator&gt;\n\n        &lt;!-- \u30c6\u30fc\u30d6\u30eb\u8a2d\u5b9a --&gt;\n        &lt;table tableName=\"users\" domainObjectName=\"User\"&gt;\n            &lt;!-- \u4e3b\u30ad\u30fc\u8a2d\u5b9a --&gt;\n            &lt;generatedKey column=\"id\" sqlStatement=\"MYSQL\" identity=\"true\"\/&gt;\n        &lt;\/table&gt;\n    &lt;\/context&gt;\n&lt;\/generatorConfiguration&gt;<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-7\">\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u63a5\u7d9a\u8a2d\u5b9a\u306e\u30dd\u30a4\u30f3\u30c8<\/h3>\n\n\n\n<p>\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u63a5\u7d9a\u8a2d\u5b9a\u3067\u6ce8\u610f\u3059\u3079\u304d\u91cd\u8981\u306a\u30dd\u30a4\u30f3\u30c8\u3092\u8868\u306b\u307e\u3068\u3081\u307e\u3057\u305f\uff1a<\/p>\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\">\u91cd\u8981Point<\/div><\/div><div class=\"sng-box-msg__contents\"><div id=\"id-418e75ef-5a1b-4b58-9f2b-f72ec678deef\">\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>\u8a2d\u5b9a\u9805\u76ee<\/th><th>\u8aac\u660e<\/th><th>\u6ce8\u610f\u70b9<\/th><\/tr><\/thead><tbody><tr><td>driverClass<\/td><td>JDBC\u30c9\u30e9\u30a4\u30d0\u30fc\u306e\u30af\u30e9\u30b9\u540d<\/td><td>\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u88fd\u54c1\u306b\u5fdc\u3058\u3066\u5909\u66f4<\/td><\/tr><tr><td>connectionURL<\/td><td>\u63a5\u7d9aURL<\/td><td>\u6587\u5b57\u30b3\u30fc\u30c9\u8a2d\u5b9a\u3092\u542b\u3081\u308b<\/td><\/tr><tr><td>userId\/password<\/td><td>\u8a8d\u8a3c\u60c5\u5831<\/td><td>\u74b0\u5883\u5909\u6570\u3067\u306e\u7ba1\u7406\u3092\u63a8\u5968<\/td><\/tr><tr><td>nullCatalogMeansCurrent<\/td><td>\u30ab\u30bf\u30ed\u30b0\u8a2d\u5b9a<\/td><td>MySQL\u3067\u63a8\u5968\u3055\u308c\u308b\u8a2d\u5b9a<\/td><\/tr><\/tbody><\/table><\/figure>\n<\/div><\/div><\/div><\/div>\n\n\n\n<p>\u4e00\u822c\u7684\u306a\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u88fd\u54c1\u5225\u306e\u8a2d\u5b9a\u4f8b\uff1a<\/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;!-- PostgreSQL --&gt;\n&lt;jdbcConnection\n    driverClass=\"org.postgresql.Driver\"\n    connectionURL=\"jdbc:postgresql:\/\/localhost:5432\/mydb\"\n    userId=\"postgres\"\n    password=\"password\"&gt;\n&lt;\/jdbcConnection&gt;\n\n&lt;!-- Oracle --&gt;\n&lt;jdbcConnection\n    driverClass=\"oracle.jdbc.driver.OracleDriver\"\n    connectionURL=\"jdbc:oracle:thin:@localhost:1521:XE\"\n    userId=\"system\"\n    password=\"password\"&gt;\n&lt;\/jdbcConnection&gt;\n\n&lt;!-- SQL Server --&gt;\n&lt;jdbcConnection\n    driverClass=\"com.microsoft.sqlserver.jdbc.SQLServerDriver\"\n    connectionURL=\"jdbc:sqlserver:\/\/localhost:1433;databaseName=mydb\"\n    userId=\"sa\"\n    password=\"password\"&gt;\n&lt;\/jdbcConnection&gt;<\/pre>\n\n\n\n<p>\u5b9f\u884c\u65b9\u6cd5\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Maven \u306e\u5834\u5408\uff1a<\/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=\"\">mvn mybatis-generator:generate<\/pre>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li>Gradle \u306e\u5834\u5408\uff1a<\/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=\"\">.\/gradlew mbGenerator<\/pre>\n\n\n\n<p>\u5c0e\u5165\u6642\u306e\u30c8\u30e9\u30d6\u30eb\u30b7\u30e5\u30fc\u30c6\u30a3\u30f3\u30b0\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u6587\u5b57\u5316\u3051\u304c\u767a\u751f\u3059\u308b\u5834\u5408\uff1a<\/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;jdbcConnection ...&gt;\n    &lt;property name=\"characterEncoding\" value=\"utf8\"\/&gt;\n    &lt;property name=\"useUnicode\" value=\"true\"\/&gt;\n&lt;\/jdbcConnection&gt;<\/pre>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li>SSL\u8b66\u544a\u304c\u8868\u793a\u3055\u308c\u308b\u5834\u5408\uff1a<\/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;jdbcConnection ...&gt;\n    &lt;property name=\"useSSL\" value=\"false\"\/&gt;\n&lt;\/jdbcConnection&gt;<\/pre>\n\n\n\n<ol start=\"3\" class=\"wp-block-list\">\n<li>\u30bf\u30a4\u30e0\u30be\u30fc\u30f3\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3059\u308b\u5834\u5408\uff1a<\/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;jdbcConnection ...&gt;\n    &lt;property name=\"serverTimezone\" value=\"UTC\"\/&gt;\n&lt;\/jdbcConnection&gt;<\/pre>\n\n\n\n<p>\u3053\u308c\u3089\u306e\u8a2d\u5b9a\u3092\u5b8c\u4e86\u3059\u308b\u3053\u3068\u3067\u3001MyBatis Generator\u306e\u57fa\u672c\u7684\u306a\u74b0\u5883\u69cb\u7bc9\u306f\u5b8c\u4e86\u3067\u3059\u3002\u6b21\u306e\u30bb\u30af\u30b7\u30e7\u30f3\u3067\u306f\u3001\u3088\u308a\u5b9f\u8df5\u7684\u306a\u30b3\u30fc\u30c9\u751f\u6210\u306e\u8a2d\u5b9a\u65b9\u6cd5\u306b\u3064\u3044\u3066\u89e3\u8aac\u3057\u3066\u3044\u304d\u307e\u3059\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-8\">\u5b9f\u8df5\u7684\u306a\u30b3\u30fc\u30c9\u751f\u6210\uff1a5\u3064\u306e\u91cd\u8981\u8a2d\u5b9a<\/h2>\n\n\n\n<p>\u5b9f\u52d9\u3067\u4f7f\u3048\u308b\u30b3\u30fc\u30c9\u3092\u751f\u6210\u3059\u308b\u305f\u3081\u306e\u91cd\u8981\u306a\u8a2d\u5b9a\u3068\u30ab\u30b9\u30bf\u30de\u30a4\u30ba\u65b9\u6cd5\u3092\u89e3\u8aac\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-9\">\u30a8\u30f3\u30c6\u30a3\u30c6\u30a3\u30af\u30e9\u30b9\u306e\u30ab\u30b9\u30bf\u30de\u30a4\u30ba\u65b9\u6cd5<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-10\">1. \u30e2\u30c7\u30eb\u30af\u30e9\u30b9\u306e\u57fa\u672c\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=\"\">&lt;javaModelGenerator \n    targetPackage=\"com.example.model\" \n    targetProject=\"src\/main\/java\"&gt;\n    &lt;!-- \u30c8\u30ea\u30e0\u8a2d\u5b9a --&gt;\n    &lt;property name=\"trimStrings\" value=\"true\"\/&gt;\n    &lt;!-- \u30b7\u30ea\u30a2\u30e9\u30a4\u30ba\u8a2d\u5b9a --&gt;\n    &lt;property name=\"serializable\" value=\"true\"\/&gt;\n    &lt;!-- \u30a4\u30df\u30e5\u30fc\u30bf\u30d6\u30eb\u8a2d\u5b9a --&gt;\n    &lt;property name=\"immutable\" value=\"true\"\/&gt;\n    &lt;!-- \u30b3\u30f3\u30b9\u30c8\u30e9\u30af\u30bf\u8a2d\u5b9a --&gt;\n    &lt;property name=\"constructorBased\" value=\"true\"\/&gt;\n&lt;\/javaModelGenerator&gt;<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-11\">2. \u30ab\u30b9\u30bf\u30e0\u30d7\u30e9\u30b0\u30a4\u30f3\u306e\u8ffd\u52a0<\/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=\"\">\/\/ \u30ab\u30b9\u30bf\u30e0\u30d7\u30e9\u30b0\u30a4\u30f3\u306e\u5b9f\u88c5\u4f8b\npublic class LombokPlugin extends PluginAdapter {\n    @Override\n    public boolean validate(List&lt;String&gt; warnings) {\n        return true;\n    }\n\n    @Override\n    public boolean modelBaseRecordClassGenerated(TopLevelClass topLevelClass,\n            IntrospectedTable introspectedTable) {\n        \/\/ Lombok\u30a2\u30ce\u30c6\u30fc\u30b7\u30e7\u30f3\u306e\u8ffd\u52a0\n        topLevelClass.addImportedType(\"lombok.Data\");\n        topLevelClass.addImportedType(\"lombok.Builder\");\n        topLevelClass.addAnnotation(\"@Data\");\n        topLevelClass.addAnnotation(\"@Builder\");\n        return true;\n    }\n}<\/pre>\n\n\n\n<p>\u8a2d\u5b9a\u30d5\u30a1\u30a4\u30eb\u3078\u306e\u767b\u9332\uff1a<\/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;context id=\"MySQLTables\" targetRuntime=\"MyBatis3\"&gt;\n    &lt;plugin type=\"com.example.plugins.LombokPlugin\" \/&gt;\n&lt;\/context&gt;<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-12\">\u30de\u30c3\u30d1\u30fc\u30a4\u30f3\u30bf\u30fc\u30d5\u30a7\u30fc\u30b9\u306e\u8a2d\u5b9a\u30dd\u30a4\u30f3\u30c8<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-13\">1. \u57fa\u672c\u7684\u306aCRUD\u64cd\u4f5c\u306e\u751f\u6210\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=\"\">&lt;table tableName=\"users\" domainObjectName=\"User\"&gt;\n    &lt;!-- \u30e1\u30bd\u30c3\u30c9\u540d\u306e\u30ab\u30b9\u30bf\u30de\u30a4\u30ba --&gt;\n    &lt;property name=\"selectByExampleStatementId\" value=\"findByCondition\"\/&gt;\n    &lt;property name=\"selectByPrimaryKeyStatementId\" value=\"findById\"\/&gt;\n    &lt;property name=\"insertStatementId\" value=\"create\"\/&gt;\n    &lt;property name=\"updateByPrimaryKeyStatementId\" value=\"modify\"\/&gt;\n    &lt;property name=\"deleteByPrimaryKeyStatementId\" value=\"remove\"\/&gt;\n\n    &lt;!-- \u751f\u6210\u3059\u308b\u30e1\u30bd\u30c3\u30c9\u306e\u9078\u629e --&gt;\n    &lt;property name=\"enableCountByExample\" value=\"true\"\/&gt;\n    &lt;property name=\"enableUpdateByExample\" value=\"true\"\/&gt;\n    &lt;property name=\"enableDeleteByExample\" value=\"true\"\/&gt;\n    &lt;property name=\"enableSelectByExample\" value=\"true\"\/&gt;\n    &lt;property name=\"selectByExampleQueryId\" value=\"true\"\/&gt;\n&lt;\/table&gt;<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-14\">2. \u30ab\u30b9\u30bf\u30e0\u30e1\u30bd\u30c3\u30c9\u306e\u8ffd\u52a0<\/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=\"\">\/\/ \u30ab\u30b9\u30bf\u30e0\u30e1\u30bd\u30c3\u30c9\u3092\u542b\u3080\u30de\u30c3\u30d1\u30fc\u30a4\u30f3\u30bf\u30fc\u30d5\u30a7\u30fc\u30b9\npublic interface UserMapper {\n    \/\/ \u81ea\u52d5\u751f\u6210\u3055\u308c\u308b\u30e1\u30bd\u30c3\u30c9\n    User findById(Long id);\n    List&lt;User&gt; findByCondition(UserExample example);\n\n    \/\/ \u30ab\u30b9\u30bf\u30e0\u30e1\u30bd\u30c3\u30c9\u306e\u8ffd\u52a0\n    @Select(\"SELECT * FROM users WHERE status = #{status}\")\n    List&lt;User&gt; findByStatus(String status);\n\n    @Update(\"UPDATE users SET last_login = #{lastLogin} WHERE id = #{id}\")\n    int updateLastLogin(@Param(\"id\") Long id, @Param(\"lastLogin\") Date lastLogin);\n}<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-15\">XML\u30de\u30c3\u30d4\u30f3\u30b0\u30d5\u30a1\u30a4\u30eb\u306e\u751f\u6210\u30aa\u30d7\u30b7\u30e7\u30f3<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-16\">1. \u57fa\u672c\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=\"\">&lt;sqlMapGenerator \n    targetPackage=\"mapper\"  \n    targetProject=\"src\/main\/resources\"&gt;\n    &lt;!-- \u30b5\u30d6\u30d1\u30c3\u30b1\u30fc\u30b8\u306e\u751f\u6210 --&gt;\n    &lt;property name=\"enableSubPackages\" value=\"true\"\/&gt;\n    &lt;!-- \u30de\u30fc\u30b8\u53ef\u80fd\u306aXML\u306e\u751f\u6210 --&gt;\n    &lt;property name=\"isMergeable\" value=\"true\"\/&gt;\n&lt;\/sqlMapGenerator&gt;<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-17\">2. \u30ab\u30b9\u30bf\u30e0SQL\u306e\u8ffd\u52a0<\/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;!-- \u81ea\u52d5\u751f\u6210\u3055\u308c\u305fXML\u306b\u8ffd\u52a0\u3059\u308b\u30ab\u30b9\u30bf\u30e0SQL --&gt;\n&lt;select id=\"findActiveUsers\" resultMap=\"BaseResultMap\"&gt;\n    SELECT \n        &lt;include refid=\"Base_Column_List\" \/&gt;\n    FROM users \n    WHERE status = 'ACTIVE'\n    AND last_login &gt; #{lastLoginDate}\n&lt;\/select&gt;\n\n&lt;update id=\"batchUpdateStatus\"&gt;\n    UPDATE users \n    SET status = #{newStatus}\n    WHERE id IN\n    &lt;foreach collection=\"userIds\" 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-18\">\u65e5\u672c\u8a9e\u30ab\u30e9\u30e0\u540d\u306e\u9069\u5207\u306a\u51e6\u7406\u65b9\u6cd5<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-19\">1. \u30b3\u30e1\u30f3\u30c8\u751f\u6210\u306e\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=\"\">&lt;commentGenerator&gt;\n    &lt;!-- \u65e5\u672c\u8a9e\u30b3\u30e1\u30f3\u30c8\u306e\u6709\u52b9\u5316 --&gt;\n    &lt;property name=\"suppressAllComments\" value=\"false\"\/&gt;\n    &lt;property name=\"addRemarkComments\" value=\"true\"\/&gt;\n    &lt;!-- \u65e5\u4ed8\u60c5\u5831\u306e\u6291\u5236 --&gt;\n    &lt;property name=\"suppressDate\" value=\"true\"\/&gt;\n&lt;\/commentGenerator&gt;<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-20\">2. \u6587\u5b57\u30b3\u30fc\u30c9\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=\"\">&lt;jdbcConnection ...&gt;\n    &lt;!-- \u6587\u5b57\u30b3\u30fc\u30c9\u8a2d\u5b9a --&gt;\n    &lt;property name=\"characterEncoding\" value=\"utf8\"\/&gt;\n    &lt;property name=\"useUnicode\" value=\"true\"\/&gt;\n    &lt;!-- \u30e1\u30bf\u30c7\u30fc\u30bf\u306e\u6587\u5b57\u30b3\u30fc\u30c9\u8a2d\u5b9a --&gt;\n    &lt;property name=\"remarks\" value=\"true\"\/&gt;\n    &lt;property name=\"useInformationSchema\" value=\"true\"\/&gt;\n&lt;\/jdbcConnection&gt;<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-21\">\u578b\u5909\u63db\u306e\u7d30\u304b\u306a\u5236\u5fa1\u65b9\u6cd5<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-22\">1. JavaTypeResolver\u306e\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=\"\">&lt;javaTypeResolver&gt;\n    &lt;!-- BigDecimal\u578b\u306e\u4f7f\u7528 --&gt;\n    &lt;property name=\"forceBigDecimals\" value=\"false\"\/&gt;\n    &lt;!-- java.time API\u306e\u4f7f\u7528 --&gt;\n    &lt;property name=\"useJSR310Types\" value=\"true\"\/&gt;\n&lt;\/javaTypeResolver&gt;<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-23\">2. \u30ab\u30b9\u30bf\u30e0\u578b\u5909\u63db\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=\"\">\/\/ \u30ab\u30b9\u30bf\u30e0\u578b\u5909\u63db\u30af\u30e9\u30b9\npublic class CustomTypeResolver extends JavaTypeResolverDefaultImpl {\n    @Override\n    protected JavaType calculateJavaType(IntrospectedColumn introspectedColumn) {\n        if (introspectedColumn.getJdbcType() == Types.VARCHAR \n            &amp;&amp; introspectedColumn.getLength() &gt; 1000) {\n            return new FullyQualifiedJavaType(String.class.getName());\n        }\n        return super.calculateJavaType(introspectedColumn);\n    }\n}<\/pre>\n\n\n\n<p>\u8a2d\u5b9a\u3078\u306e\u9069\u7528\uff1a<\/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;javaTypeResolver type=\"com.example.resolver.CustomTypeResolver\"&gt;\n    &lt;property name=\"useJSR310Types\" value=\"true\"\/&gt;\n&lt;\/javaTypeResolver&gt;<\/pre>\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\">\u5b9f\u88c5\u6642\u306e\u4e3b\u8981\u306a\u578b\u5909\u63db\u5bfe\u5fdc\u8868\uff1a<\/div><div class=\"sgb-box-simple__body\" style=\"border-color:var(--wp--preset--color--sango-main);background-color:#FFF\"><div id=\"id-9e415d0a-b379-4a3d-a691-58891e06cafe\">\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u578b<\/th><th>Java\u578b<\/th><th>\u8a2d\u5b9a\u30aa\u30d7\u30b7\u30e7\u30f3<\/th><\/tr><\/thead><tbody><tr><td>TIMESTAMP<\/td><td>LocalDateTime<\/td><td>useJSR310Types=true<\/td><\/tr><tr><td>DATE<\/td><td>LocalDate<\/td><td>useJSR310Types=true<\/td><\/tr><tr><td>TIME<\/td><td>LocalTime<\/td><td>useJSR310Types=true<\/td><\/tr><tr><td>DECIMAL<\/td><td>BigDecimal<\/td><td>forceBigDecimals=true<\/td><\/tr><tr><td>NUMERIC<\/td><td>BigDecimal<\/td><td>forceBigDecimals=true<\/td><\/tr><tr><td>VARCHAR<\/td><td>String<\/td><td>\u30c7\u30d5\u30a9\u30eb\u30c8<\/td><\/tr><tr><td>BLOB<\/td><td>byte[]<\/td><td>\u30c7\u30d5\u30a9\u30eb\u30c8<\/td><\/tr><\/tbody><\/table><\/figure>\n<\/div><\/div><\/div>\n\n\n\n<p>\u3053\u308c\u3089\u306e\u8a2d\u5b9a\u3092\u7d44\u307f\u5408\u308f\u305b\u308b\u3053\u3068\u3067\u3001\u5b9f\u52d9\u3067\u5fc5\u8981\u3068\u306a\u308b\u9ad8\u54c1\u8cea\u306a\u30b3\u30fc\u30c9\u3092\u751f\u6210\u3059\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u3059\u3002\u6b21\u306e\u30bb\u30af\u30b7\u30e7\u30f3\u3067\u306f\u3001\u751f\u6210\u3055\u308c\u305f\u30b3\u30fc\u30c9\u306e\u4fdd\u5b88\u6027\u3092\u9ad8\u3081\u308b\u305f\u3081\u306e\u5b9f\u88c5\u30c6\u30af\u30cb\u30c3\u30af\u306b\u3064\u3044\u3066\u89e3\u8aac\u3057\u3066\u3044\u304d\u307e\u3059\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-24\">\u4fdd\u5b88\u6027\u3092\u9ad8\u3081\u308b\u5b9f\u88c5\u30c6\u30af\u30cb\u30c3\u30af\u96c6<\/h2>\n\n\n\n<p>\u81ea\u52d5\u751f\u6210\u30b3\u30fc\u30c9\u306e\u4fdd\u5b88\u6027\u3092\u9ad8\u3081\u3001\u9577\u671f\u7684\u306a\u958b\u767a\u52b9\u7387\u3092\u5411\u4e0a\u3055\u305b\u308b\u305f\u3081\u306e\u5b9f\u8df5\u7684\u306a\u30c6\u30af\u30cb\u30c3\u30af\u3092\u89e3\u8aac\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-25\">\u751f\u6210\u30b3\u30fc\u30c9\u306e\u30d0\u30fc\u30b8\u30e7\u30f3\u7ba1\u7406\u6226\u7565<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-26\">1. \u751f\u6210\u30b3\u30fc\u30c9\u306e\u7ba1\u7406\u65b9\u91dd<\/h4>\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\">\u63a8\u5968\u3055\u308c\u308b\u7ba1\u7406\u65b9\u91dd<\/div><div class=\"sgb-box-simple__body\" style=\"border-color:var(--wp--preset--color--sango-main);background-color:#FFF\"><div id=\"id-204ad12a-a5a3-4e81-bdfb-7eea71f28177\">\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>\u7ba1\u7406\u5bfe\u8c61<\/th><th>\u63a8\u5968\u65b9\u91dd<\/th><th>\u7406\u7531<\/th><\/tr><\/thead><tbody><tr><td>\u751f\u6210\u30b3\u30fc\u30c9<\/td><td>Git\u3067\u7ba1\u7406<\/td><td>\u30ec\u30d3\u30e5\u30fc\u30fb\u5dee\u5206\u78ba\u8a8d\u304c\u53ef\u80fd<\/td><\/tr><tr><td>\u8a2d\u5b9a\u30d5\u30a1\u30a4\u30eb<\/td><td>Git\u3067\u7ba1\u7406<\/td><td>\u30c1\u30fc\u30e0\u5185\u3067\u306e\u5171\u6709\u30fb\u5909\u66f4\u7ba1\u7406\u304c\u5bb9\u6613<\/td><\/tr><tr><td>\u4e00\u6642\u30d5\u30a1\u30a4\u30eb<\/td><td>.gitignore\u306b\u8ffd\u52a0<\/td><td>\u4e0d\u8981\u306a\u30d5\u30a1\u30a4\u30eb\u306e\u6df7\u5165\u3092\u9632\u6b62<\/td><\/tr><\/tbody><\/table><\/figure>\n<\/div><\/div><\/div>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-27\">2. .gitignore \u306e\u8a2d\u5b9a\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=\"\"># \u751f\u6210\u3055\u308c\u305f\u4e00\u6642\u30d5\u30a1\u30a4\u30eb\n*.class\n*.jar\n*.war\n\n# MyBatisGenerator\u8a2d\u5b9a\u30d5\u30a1\u30a4\u30eb\u306e\u30d0\u30c3\u30af\u30a2\u30c3\u30d7\ngeneratorConfig.xml.bak\n\n# \u30d3\u30eb\u30c9\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\ntarget\/\nbuild\/\n\n# IDE\u56fa\u6709\u306e\u30d5\u30a1\u30a4\u30eb\n.idea\/\n*.iml\n.vscode\/<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-28\">3. \u751f\u6210\u30b3\u30fc\u30c9\u306e\u5dee\u5206\u7ba1\u7406\u30b9\u30af\u30ea\u30d7\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=\"\">#!\/bin\/bash\n# \u751f\u6210\u524d\u306e\u30b3\u30fc\u30c9\u3092\u30d0\u30c3\u30af\u30a2\u30c3\u30d7\ncp -r src\/main\/java\/com\/example\/model model_backup\n\n# \u30b3\u30fc\u30c9\u751f\u6210\u5b9f\u884c\nmvn mybatis-generator:generate\n\n# \u5dee\u5206\u3092\u78ba\u8a8d\ndiff -r src\/main\/java\/com\/example\/model model_backup &gt; code_diff.txt\n\n# \u5dee\u5206\u304c\u3042\u308c\u3070\u901a\u77e5\nif [ -s code_diff.txt ]; then\n    echo \"\u30b3\u30fc\u30c9\u306b\u5909\u66f4\u304c\u3042\u308a\u307e\u3059\u3002\u78ba\u8a8d\u3057\u3066\u304f\u3060\u3055\u3044\u3002\"\n    cat code_diff.txt\nfi<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-29\">\u30ab\u30b9\u30bf\u30e0\u30d7\u30e9\u30b0\u30a4\u30f3\u306e\u6d3b\u7528\u65b9\u6cd5<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-30\">1. \u30b3\u30fc\u30c9\u54c1\u8cea\u30c1\u30a7\u30c3\u30af\u30d7\u30e9\u30b0\u30a4\u30f3<\/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=\"\">public class CodeQualityPlugin extends PluginAdapter {\n    @Override\n    public boolean validate(List&lt;String&gt; warnings) {\n        return true;\n    }\n\n    @Override\n    public boolean modelBaseRecordClassGenerated(\n            TopLevelClass topLevelClass,\n            IntrospectedTable introspectedTable) {\n        \/\/ Javadoc\u306e\u8ffd\u52a0\n        topLevelClass.addJavaDocLine(\"\/**\");\n        topLevelClass.addJavaDocLine(\" * \" + introspectedTable.getRemarks());\n        topLevelClass.addJavaDocLine(\" * @author MyBatis Generator\");\n        topLevelClass.addJavaDocLine(\" *\/\");\n\n        \/\/ \u30b3\u30fc\u30c9\u54c1\u8cea\u30c1\u30a7\u30c3\u30af\u7528\u30a2\u30ce\u30c6\u30fc\u30b7\u30e7\u30f3\n        topLevelClass.addImportedType(\"javax.validation.constraints.NotNull\");\n\n        return true;\n    }\n}<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-31\">2. \u30ab\u30b9\u30bf\u30e0\u30e1\u30bd\u30c3\u30c9\u8ffd\u52a0\u30d7\u30e9\u30b0\u30a4\u30f3<\/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=\"\">public class CustomMethodPlugin extends PluginAdapter {\n    @Override\n    public boolean clientGenerated(Interface interfaze,\n            IntrospectedTable introspectedTable) {\n        \/\/ \u30d0\u30c3\u30c1\u51e6\u7406\u7528\u30e1\u30bd\u30c3\u30c9\u306e\u8ffd\u52a0\n        addBatchInsertMethod(interfaze, introspectedTable);\n        addBatchUpdateMethod(interfaze, introspectedTable);\n        return true;\n    }\n\n    private void addBatchInsertMethod(Interface interfaze,\n            IntrospectedTable introspectedTable) {\n        Method method = new Method(\"batchInsert\");\n        method.setReturnType(new FullyQualifiedJavaType(\"int\"));\n        method.addParameter(new Parameter(\n            new FullyQualifiedJavaType(\"List&lt;\" + \n                introspectedTable.getBaseRecordType() + \"&gt;\"),\n            \"records\"));\n        interfaze.addMethod(method);\n    }\n}<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-32\">\u30c6\u30b9\u30c8\u30b3\u30fc\u30c9\u306e\u81ea\u52d5\u751f\u6210\u3068\u6d3b\u7528<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-33\">1. \u30c6\u30b9\u30c8\u30b1\u30fc\u30b9\u751f\u6210\u30d7\u30e9\u30b0\u30a4\u30f3<\/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=\"\">public class TestGeneratorPlugin extends PluginAdapter {\n    @Override\n    public boolean modelBaseRecordClassGenerated(\n            TopLevelClass topLevelClass,\n            IntrospectedTable introspectedTable) {\n        \/\/ \u30c6\u30b9\u30c8\u30af\u30e9\u30b9\u306e\u751f\u6210\n        generateTestClass(topLevelClass, introspectedTable);\n        return true;\n    }\n\n    private void generateTestClass(TopLevelClass modelClass,\n            IntrospectedTable table) {\n        String testClassName = modelClass.getType().getShortName() + \"Test\";\n        TopLevelClass testClass = new TopLevelClass(\n            modelClass.getType().getPackageName() + \".test.\" + testClassName);\n\n        \/\/ JUnit5\u306e\u30a2\u30ce\u30c6\u30fc\u30b7\u30e7\u30f3\u8ffd\u52a0\n        testClass.addImportedType(\"org.junit.jupiter.api.Test\");\n        testClass.addImportedType(\"org.junit.jupiter.api.DisplayName\");\n\n        \/\/ \u30c6\u30b9\u30c8\u30e1\u30bd\u30c3\u30c9\u306e\u751f\u6210\n        for (Method method : modelClass.getMethods()) {\n            generateTestMethod(testClass, method);\n        }\n    }\n}<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-34\">2. \u30c6\u30b9\u30c8\u30b3\u30fc\u30c9\u306e\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=\"\">@DisplayName(\"User \u30a8\u30f3\u30c6\u30a3\u30c6\u30a3\u306e\u30c6\u30b9\u30c8\")\nclass UserTest {\n    private UserMapper userMapper;\n\n    @BeforeEach\n    void setUp() {\n        \/\/ \u30c6\u30b9\u30c8\u7528\u306eMyBatis\u8a2d\u5b9a\n        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder()\n            .build(getClass().getResourceAsStream(\"\/mybatis-config-test.xml\"));\n        userMapper = sqlSessionFactory.openSession().getMapper(UserMapper.class);\n    }\n\n    @Test\n    @DisplayName(\"\u30e6\u30fc\u30b6\u30fc\u4f5c\u6210\u306e\u30c6\u30b9\u30c8\")\n    void testCreateUser() {\n        \/\/ \u30c6\u30b9\u30c8\u30c7\u30fc\u30bf\u4f5c\u6210\n        User user = User.builder()\n            .username(\"testUser\")\n            .email(\"test@example.com\")\n            .build();\n\n        \/\/ \u30c6\u30b9\u30c8\u5b9f\u884c\n        int result = userMapper.insert(user);\n\n        \/\/ \u691c\u8a3c\n        assertThat(result).isEqualTo(1);\n        assertThat(user.getId()).isNotNull();\n    }\n\n    @Test\n    @DisplayName(\"\u30d0\u30c3\u30c1\u66f4\u65b0\u306e\u30c6\u30b9\u30c8\")\n    void testBatchUpdate() {\n        \/\/ \u30c6\u30b9\u30c8\u30c7\u30fc\u30bf\u6e96\u5099\n        List&lt;User&gt; users = Arrays.asList(\n            createTestUser(\"user1\"),\n            createTestUser(\"user2\")\n        );\n\n        \/\/ \u30c6\u30b9\u30c8\u5b9f\u884c\n        int result = userMapper.batchUpdate(users);\n\n        \/\/ \u691c\u8a3c\n        assertThat(result).isEqualTo(users.size());\n    }\n}<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-35\">3. \u30c6\u30b9\u30c8\u30c7\u30fc\u30bf\u751f\u6210\u30e6\u30fc\u30c6\u30a3\u30ea\u30c6\u30a3<\/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=\"\">public class TestDataGenerator {\n    public static class Builder&lt;T&gt; {\n        private final Class&lt;T&gt; entityClass;\n        private final Map&lt;String, Object&gt; values = new HashMap&lt;&gt;();\n\n        public Builder(Class&lt;T&gt; entityClass) {\n            this.entityClass = entityClass;\n        }\n\n        public Builder&lt;T&gt; set(String field, Object value) {\n            values.put(field, value);\n            return this;\n        }\n\n        public T build() {\n            try {\n                T instance = entityClass.getDeclaredConstructor().newInstance();\n                for (Map.Entry&lt;String, Object&gt; entry : values.entrySet()) {\n                    PropertyUtils.setProperty(instance, \n                        entry.getKey(), entry.getValue());\n                }\n                return instance;\n            } catch (Exception e) {\n                throw new RuntimeException(\"\u30c6\u30b9\u30c8\u30c7\u30fc\u30bf\u751f\u6210\u5931\u6557\", e);\n            }\n        }\n    }\n\n    public static &lt;T&gt; Builder&lt;T&gt; builder(Class&lt;T&gt; entityClass) {\n        return new Builder&lt;&gt;(entityClass);\n    }\n}<\/pre>\n\n\n\n<p>\u3053\u308c\u3089\u306e\u30c6\u30af\u30cb\u30c3\u30af\u3092\u7d44\u307f\u5408\u308f\u305b\u308b\u3053\u3068\u3067\u3001\u4fdd\u5b88\u6027\u306e\u9ad8\u3044\u5b9f\u88c5\u3092\u5b9f\u73fe\u3067\u304d\u307e\u3059\u3002\u6b21\u306e\u30bb\u30af\u30b7\u30e7\u30f3\u3067\u306f\u3001\u5b9f\u969b\u306e\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u3067\u306e\u904b\u7528\u306b\u95a2\u3059\u308b\u30d9\u30b9\u30c8\u30d7\u30e9\u30af\u30c6\u30a3\u30b9\u306b\u3064\u3044\u3066\u89e3\u8aac\u3057\u3066\u3044\u304d\u307e\u3059\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-36\">MyBatis Generator\u6d3b\u7528\u306e\u30d9\u30b9\u30c8\u30d7\u30e9\u30af\u30c6\u30a3\u30b9<\/h2>\n\n\n\n<p>\u5b9f\u969b\u306e\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u3067MyBatis Generator\u3092\u52b9\u679c\u7684\u306b\u6d3b\u7528\u3059\u308b\u305f\u3081\u306e\u30d9\u30b9\u30c8\u30d7\u30e9\u30af\u30c6\u30a3\u30b9\u3092\u89e3\u8aac\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-37\">\u5927\u898f\u6a21\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u3067\u306e\u904b\u7528\u30dd\u30a4\u30f3\u30c8<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-38\">1. \u30e2\u30b8\u30e5\u30fc\u30eb\u5206\u5272\u6226\u7565<\/h4>\n\n\n\n<p>\u5927\u898f\u6a21\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u3067\u306e\u52b9\u679c\u7684\u306a\u30e2\u30b8\u30e5\u30fc\u30eb\u5206\u5272\u4f8b\uff1a<\/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=\"\">project-root\/\n\u251c\u2500\u2500 common\/\n\u2502   \u251c\u2500\u2500 entity\/              # \u5171\u901a\u30a8\u30f3\u30c6\u30a3\u30c6\u30a3\n\u2502   \u2514\u2500\u2500 generator\/           # \u751f\u6210\u8a2d\u5b9a\n\u251c\u2500\u2500 module-a\/\n\u2502   \u251c\u2500\u2500 entity\/              # \u30e2\u30b8\u30e5\u30fc\u30eb\u56fa\u6709\u30a8\u30f3\u30c6\u30a3\u30c6\u30a3\n\u2502   \u251c\u2500\u2500 mapper\/              # SQL\u30de\u30c3\u30d1\u30fc\n\u2502   \u2514\u2500\u2500 generator\/           # \u30e2\u30b8\u30e5\u30fc\u30eb\u7528\u751f\u6210\u8a2d\u5b9a\n\u2514\u2500\u2500 module-b\/\n    \u251c\u2500\u2500 entity\/\n    \u251c\u2500\u2500 mapper\/\n    \u2514\u2500\u2500 generator\/<\/pre>\n\n\n\n<p>\u8a2d\u5b9a\u30d5\u30a1\u30a4\u30eb\u306e\u5206\u5272\u4f8b\uff1a<\/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;!-- common-generator-config.xml --&gt;\n&lt;generatorConfiguration&gt;\n    &lt;context id=\"commonTables\"&gt;\n        &lt;!-- \u5171\u901a\u8a2d\u5b9a --&gt;\n        &lt;property name=\"javaFileEncoding\" value=\"UTF-8\"\/&gt;\n        &lt;property name=\"beginningDelimiter\" value=\"`\"\/&gt;\n        &lt;property name=\"endingDelimiter\" value=\"`\"\/&gt;\n\n        &lt;!-- \u30d7\u30e9\u30b0\u30a4\u30f3\u8a2d\u5b9a --&gt;\n        &lt;plugin type=\"org.mybatis.generator.plugins.SerializablePlugin\" \/&gt;\n        &lt;plugin type=\"org.mybatis.generator.plugins.ToStringPlugin\" \/&gt;\n\n        &lt;!-- \u5171\u901a\u30c6\u30fc\u30d6\u30eb\u8a2d\u5b9a --&gt;\n        &lt;table tableName=\"common_master\" \/&gt;\n    &lt;\/context&gt;\n&lt;\/generatorConfiguration&gt;\n\n&lt;!-- module-specific-generator-config.xml --&gt;\n&lt;generatorConfiguration&gt;\n    &lt;context id=\"moduleTables\"&gt;\n        &lt;!-- \u30e2\u30b8\u30e5\u30fc\u30eb\u56fa\u6709\u306e\u8a2d\u5b9a --&gt;\n        &lt;property name=\"moduleSpecificSetting\" value=\"true\"\/&gt;\n\n        &lt;!-- \u30e2\u30b8\u30e5\u30fc\u30eb\u56fa\u6709\u306e\u30c6\u30fc\u30d6\u30eb\u8a2d\u5b9a --&gt;\n        &lt;table tableName=\"module_specific_table\"&gt;\n            &lt;domainObjectRenamingRule \n                searchString=\"^Tbl\" \n                replaceString=\"\" \/&gt;\n        &lt;\/table&gt;\n    &lt;\/context&gt;\n&lt;\/generatorConfiguration&gt;<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-39\">2. \u30c1\u30fc\u30e0\u958b\u767a\u3067\u306e\u904b\u7528\u30ac\u30a4\u30c9\u30e9\u30a4\u30f3<\/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=\"\">\/\/ \u751f\u6210\u30b3\u30fc\u30c9\u306e\u30ab\u30b9\u30bf\u30de\u30a4\u30ba\u30dd\u30ea\u30b7\u30fc\npublic interface CustomizationPolicy {\n    \/**\n     * \u30ab\u30b9\u30bf\u30de\u30a4\u30ba\u53ef\u80fd\u306a\u7b87\u6240\n     * 1. \u30ab\u30b9\u30bf\u30e0\u30e1\u30bd\u30c3\u30c9\u306e\u8ffd\u52a0\uff08\u5225\u30d5\u30a1\u30a4\u30eb\u3067\u5b9f\u88c5\uff09\n     * 2. \u30d0\u30ea\u30c7\u30fc\u30b7\u30e7\u30f3\u5236\u7d04\u306e\u8ffd\u52a0\n     * 3. \u30c9\u30ad\u30e5\u30e1\u30f3\u30c8\u30b3\u30e1\u30f3\u30c8\u306e\u8ffd\u52a0\n     *\/\n\n    \/**\n     * \u30ab\u30b9\u30bf\u30de\u30a4\u30ba\u7981\u6b62\u306e\u7b87\u6240\n     * 1. \u751f\u6210\u3055\u308c\u305f\u30e1\u30bd\u30c3\u30c9\u306e\u4fee\u6b63\n     * 2. \u30a8\u30f3\u30c6\u30a3\u30c6\u30a3\u306e\u30d5\u30a3\u30fc\u30eb\u30c9\u5b9a\u7fa9\u306e\u5909\u66f4\n     * 3. \u30de\u30c3\u30d1\u30fcXML\u306e\u76f4\u63a5\u7de8\u96c6\n     *\/\n}\n\n\/\/ \u30ab\u30b9\u30bf\u30e0\u30e1\u30bd\u30c3\u30c9\u5b9f\u88c5\u4f8b\n@Repository\npublic class CustomUserMapper extends UserMapper {\n    \/\/ \u8ffd\u52a0\u30e1\u30bd\u30c3\u30c9\u306f\u3053\u3053\u306b\u5b9f\u88c5\n    public List&lt;User&gt; findByStatus(String status) {\n        UserExample example = new UserExample();\n        example.createCriteria().andStatusEqualTo(status);\n        return selectByExample(example);\n    }\n}<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-40\">\u30c8\u30e9\u30d6\u30eb\u30b7\u30e5\u30fc\u30c6\u30a3\u30f3\u30b0\u3068\u89e3\u6c7a\u7b56<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-41\">1. \u4e00\u822c\u7684\u306a\u554f\u984c\u3068\u5bfe\u51e6\u6cd5<\/h4>\n\n\n<div id=\"id-4c2a75a4-761a-41c9-8fef-9eeeda044c10\">\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>\u554f\u984c<\/th><th>\u539f\u56e0<\/th><th>\u89e3\u6c7a\u7b56<\/th><\/tr><\/thead><tbody><tr><td>\u30e1\u30e2\u30ea\u4e0d\u8db3<\/td><td>\u5927\u91cf\u30c6\u30fc\u30d6\u30eb\u751f\u6210<\/td><td>\u30d0\u30c3\u30c1\u30b5\u30a4\u30ba\u306e\u8abf\u6574<\/td><\/tr><tr><td>\u6587\u5b57\u5316\u3051<\/td><td>\u6587\u5b57\u30b3\u30fc\u30c9\u8a2d\u5b9a\u4e0d\u8db3<\/td><td>UTF-8\u306e\u660e\u793a\u7684\u6307\u5b9a<\/td><\/tr><tr><td>\u578b\u5909\u63db\u30a8\u30e9\u30fc<\/td><td>\u578b\u30de\u30c3\u30d4\u30f3\u30b0\u4e0d\u9069\u5207<\/td><td>\u30ab\u30b9\u30bf\u30e0\u578b\u30ea\u30be\u30eb\u30d0\u30fc\u306e\u5b9f\u88c5<\/td><\/tr><\/tbody><\/table><\/figure>\n<\/div>\n\n\n<h4 class=\"wp-block-heading\" id=\"i-42\">2. \u30a8\u30e9\u30fc\u5225\u306e\u5bfe\u51e6\u65b9\u6cd5<\/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\u4f7f\u7528\u91cf\u306e\u6700\u9069\u5316\npublic class MemoryOptimizedGenerator extends MyBatisGenerator {\n    private static final int BATCH_SIZE = 10;\n\n    @Override\n    public void generate(ProgressCallback callback) \n            throws SQLException, InterruptedException {\n        List&lt;String&gt; tableNames = getTableNames();\n        for (int i = 0; i &lt; tableNames.size(); i += BATCH_SIZE) {\n            List&lt;String&gt; batch = tableNames.subList(\n                i, \n                Math.min(i + BATCH_SIZE, tableNames.size())\n            );\n            generateBatch(batch, callback);\n            System.gc(); \/\/ \u30d0\u30c3\u30c1\u51e6\u7406\u5f8c\u306e\u30e1\u30e2\u30ea\u89e3\u653e\n        }\n    }\n}\n\n\/\/ \u578b\u5909\u63db\u30a8\u30e9\u30fc\u5bfe\u51e6\npublic class CustomTypeResolver extends JavaTypeResolverDefaultImpl {\n    @Override\n    protected FullyQualifiedJavaType calculateBigDecimalReplacement(\n            IntrospectedColumn column, \n            FullyQualifiedJavaType defaultType) {\n        if (column.getScale() &gt; 0 || column.getLength() &gt; 18) {\n            return defaultType;\n        }\n        return new FullyQualifiedJavaType(Long.class.getName());\n    }\n}<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-43\">\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u30c1\u30e5\u30fc\u30cb\u30f3\u30b0\u306e\u52d8\u6240<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-44\">1. \u751f\u6210\u30b3\u30fc\u30c9\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\u51e6\u7406\u306e\u6700\u9069\u5316\u4f8b\npublic interface OptimizedMapper&lt;T&gt; {\n    @Options(useGeneratedKeys = true, keyProperty = \"id\")\n    int batchInsert(@Param(\"list\") List&lt;T&gt; records);\n\n    \/\/ \u30d0\u30c3\u30c1\u66f4\u65b0\u7528SQL\u306e\u751f\u6210\n    @UpdateProvider(type = BatchSqlProvider.class, method = \"createBatchUpdate\")\n    int batchUpdate(@Param(\"list\") List&lt;T&gt; records);\n}\n\npublic class BatchSqlProvider {\n    public String createBatchUpdate(Map&lt;String, Object&gt; params) {\n        List&lt;?&gt; list = (List&lt;?&gt;) params.get(\"list\");\n        if (list.isEmpty()) return \"\";\n\n        SQL sql = new SQL();\n        sql.UPDATE(\"users\");\n        sql.SET(\"status = #{item.status}\");\n        sql.SET(\"updated_at = #{item.updatedAt}\");\n        sql.WHERE(\"id = #{item.id}\");\n\n        StringBuilder builder = new StringBuilder();\n        for (int i = 0; i &lt; list.size(); i++) {\n            if (i &gt; 0) builder.append(\" UNION ALL \");\n            builder.append(String.format(\"SELECT * FROM (%s) tmp%d\", \n                sql.toString().replace(\"#{item.\", \n                String.format(\"#{list[%d].\", i)), i));\n        }\n        return builder.toString();\n    }\n}<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-45\">2. \u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u8a2d\u5b9a\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;!-- generatorConfig.xml --&gt;\n&lt;table tableName=\"large_table\"&gt;\n    &lt;!-- \u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u60c5\u5831\u306e\u81ea\u52d5\u751f\u6210 --&gt;\n    &lt;property name=\"useActualColumnNames\" value=\"true\"\/&gt;\n    &lt;property name=\"addRemarkComments\" value=\"true\"\/&gt;\n\n    &lt;!-- \u691c\u7d22\u7528\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u306e\u6307\u5b9a --&gt;\n    &lt;index&gt;\n        &lt;index-column name=\"status\" \/&gt;\n        &lt;index-column name=\"created_at\" \/&gt;\n    &lt;\/index&gt;\n\n    &lt;!-- \u8907\u5408\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u306e\u6307\u5b9a --&gt;\n    &lt;index type=\"UNIQUE\"&gt;\n        &lt;index-column name=\"email\" \/&gt;\n        &lt;index-column name=\"tenant_id\" \/&gt;\n    &lt;\/index&gt;\n&lt;\/table&gt;<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-46\">3. \u30ad\u30e3\u30c3\u30b7\u30e5\u6226\u7565<\/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;!-- \u30de\u30c3\u30d1\u30fcXML\u3067\u306e\u30ad\u30e3\u30c3\u30b7\u30e5\u8a2d\u5b9a --&gt;\n&lt;cache\n    type=\"org.mybatis.caches.ehcache.EhcacheCache\"\n    eviction=\"LRU\"\n    flushInterval=\"60000\"\n    size=\"1024\"\n    readOnly=\"true\"\/&gt;\n\n&lt;!-- \u7279\u5b9a\u306e\u30b9\u30c6\u30fc\u30c8\u30e1\u30f3\u30c8\u3067\u306e\u30ad\u30e3\u30c3\u30b7\u30e5\u5236\u5fa1 --&gt;\n&lt;select id=\"selectByExample\" \n    parameterType=\"com.example.UserExample\" \n    resultMap=\"BaseResultMap\"\n    useCache=\"true\"&gt;\n    SELECT \n    &lt;if test=\"distinct\"&gt;\n        DISTINCT\n    &lt;\/if&gt;\n    &lt;include refid=\"Base_Column_List\" \/&gt;\n    FROM users\n    &lt;if test=\"_parameter != null\"&gt;\n        &lt;include refid=\"Example_Where_Clause\" \/&gt;\n    &lt;\/if&gt;\n&lt;\/select&gt;<\/pre>\n\n\n\n<p>\u3053\u308c\u3089\u306e\u30d9\u30b9\u30c8\u30d7\u30e9\u30af\u30c6\u30a3\u30b9\u3092\u9069\u5207\u306b\u9069\u7528\u3059\u308b\u3053\u3068\u3067\u3001MyBatis Generator\u3092\u52b9\u679c\u7684\u306b\u6d3b\u7528\u3057\u3001\u9ad8\u54c1\u8cea\u306a\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u958b\u767a\u3092\u5b9f\u73fe\u3067\u304d\u307e\u3059\u3002\u6b21\u306e\u30bb\u30af\u30b7\u30e7\u30f3\u3067\u306f\u3001\u3055\u3089\u306a\u308b\u958b\u767a\u52b9\u7387\u5316\u306b\u5411\u3051\u305f\u5c55\u671b\u306b\u3064\u3044\u3066\u89e3\u8aac\u3057\u3066\u3044\u304d\u307e\u3059\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-47\">\u6b21\u306e\u30b9\u30c6\u30c3\u30d7\uff1a\u3055\u3089\u306a\u308b\u958b\u767a\u52b9\u7387\u5316\u306b\u5411\u3051\u3066<\/h2>\n\n\n\n<p>MyBatis Generator\u3092\u30d9\u30fc\u30b9\u306b\u3001\u3088\u308a\u52b9\u7387\u7684\u306a\u958b\u767a\u74b0\u5883\u3092\u69cb\u7bc9\u3059\u308b\u305f\u3081\u306e\u6b21\u306e\u30b9\u30c6\u30c3\u30d7\u3092\u89e3\u8aac\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-48\">\u95a2\u9023\u30c4\u30fc\u30eb\u3068\u306e\u9023\u643a\u3067\u3055\u3089\u306a\u308b\u52b9\u7387\u5316<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-49\">1. IDE\u30d7\u30e9\u30b0\u30a4\u30f3\u3068\u306e\u9023\u643a<\/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;!-- IntelliJ IDEA\u7528\u306e\u8a2d\u5b9a\u4f8b --&gt;\n&lt;idea-plugin&gt;\n    &lt;id&gt;com.example.mybatis.generator.plugin&lt;\/id&gt;\n    &lt;name&gt;MyBatis Generator Integration&lt;\/name&gt;\n    &lt;vendor&gt;YourCompany&lt;\/vendor&gt;\n\n    &lt;extensions defaultExtensionNs=\"com.intellij\"&gt;\n        &lt;!-- \u751f\u6210\u30b3\u30fc\u30c9\u306e\u30ca\u30d3\u30b2\u30fc\u30b7\u30e7\u30f3\u6a5f\u80fd --&gt;\n        &lt;codeInsight.lineMarkerProvider\n            language=\"JAVA\"\n            implementationClass=\"com.example.plugin.MapperLineMarkerProvider\"\/&gt;\n\n        &lt;!-- SQL\u30a4\u30f3\u30b8\u30a7\u30af\u30b7\u30e7\u30f3\u8a2d\u5b9a --&gt;\n        &lt;sql.dialectProvider\n            implementation=\"com.example.plugin.MyBatisSqlDialectProvider\"\/&gt;\n    &lt;\/extensions&gt;\n&lt;\/idea-plugin&gt;<\/pre>\n\n\n\n<p>Visual Studio Code\u7528\u306e\u8a2d\u5b9a\u4f8b\uff1a<\/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=\"\">{\n    \"mybatis-generator.config\": {\n        \"configFile\": \"src\/main\/resources\/generatorConfig.xml\",\n        \"overwrite\": true,\n        \"verbose\": true,\n        \"contexts\": [\"default\"]\n    },\n    \"mybatis-generator.generate\": {\n        \"onSave\": false,\n        \"autoGenerateFiles\": [\n            \"Entity\",\n            \"Mapper\",\n            \"XML\"\n        ]\n    }\n}<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-50\">2. CI\/CD\u30d1\u30a4\u30d7\u30e9\u30a4\u30f3\u3068\u306e\u7d71\u5408<\/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=\"\"># GitHub Actions \u3067\u306e\u81ea\u52d5\u751f\u6210\u8a2d\u5b9a\u4f8b\nname: MyBatis Generator CI\n\non:\n  push:\n    paths:\n      - 'src\/main\/resources\/generatorConfig.xml'\n      - 'database\/schema\/**'\n\njobs:\n  generate:\n    runs-on: ubuntu-latest\n    steps:\n      - uses: actions\/checkout@v2\n\n      - name: Set up JDK\n        uses: actions\/setup-java@v2\n        with:\n          java-version: '17'\n\n      - name: Generate MyBatis files\n        run: |\n          mvn mybatis-generator:generate\n\n      - name: Create Pull Request\n        uses: peter-evans\/create-pull-request@v3\n        with:\n          title: 'Update MyBatis generated files'\n          commit-message: 'chore: update generated files'\n          branch: 'feature\/update-mybatis-generated'<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-51\">3. \u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u7ba1\u7406\u30c4\u30fc\u30eb\u3068\u306e\u9023\u643a<\/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=\"\">\/\/ Liquibase\/Flyway\u9023\u643a\u7528\u30ab\u30b9\u30bf\u30e0\u30d7\u30e9\u30b0\u30a4\u30f3\npublic class DatabaseChangelogPlugin extends PluginAdapter {\n    @Override\n    public boolean validate(List&lt;String&gt; warnings) {\n        return true;\n    }\n\n    @Override\n    public List&lt;GeneratedJavaFile&gt; contextGenerateJavaFiles(\n            IntrospectedTable introspectedTable) {\n        \/\/ \u5909\u66f4\u5c65\u6b74\u306e\u81ea\u52d5\u751f\u6210\n        String changeLog = generateChangeLog(introspectedTable);\n        writeToChangeLogFile(changeLog);\n        return super.contextGenerateJavaFiles(introspectedTable);\n    }\n\n    private String generateChangeLog(IntrospectedTable table) {\n        return String.format(\"\"\"\n            -- changeset %s:%s\n            CREATE TABLE %s (\n                %s\n            );\n            \"\"\",\n            getAuthor(),\n            generateChangesetId(),\n            table.getFullyQualifiedTable(),\n            generateColumnDefinitions(table)\n        );\n    }\n}<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-52\">\u6700\u65b0\u30a2\u30c3\u30d7\u30c7\u30fc\u30c8\u3068\u4eca\u5f8c\u306e\u5c55\u671b<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-53\">1. \u6700\u65b0\u30d0\u30fc\u30b8\u30e7\u30f3\u306e\u65b0\u6a5f\u80fd\u6d3b\u7528<\/h4>\n\n\n\n<p>MyBatis Generator 1.4.x \u306e\u65b0\u6a5f\u80fd\u6d3b\u7528\u4f8b\uff1a<\/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;!-- \u65b0\u3057\u3044\u578b\u89e3\u6c7a\u6a5f\u80fd\u306e\u6d3b\u7528 --&gt;\n&lt;javaTypeResolver&gt;\n    &lt;!-- Java 17\u306e\u65b0\u3057\u3044\u578b\u3078\u306e\u5bfe\u5fdc --&gt;\n    &lt;property name=\"useJSR310Types\" value=\"true\"\/&gt;\n    &lt;!-- \u30ec\u30b3\u30fc\u30c9\u578b\u306e\u751f\u6210\u30b5\u30dd\u30fc\u30c8 --&gt;\n    &lt;property name=\"generateRecordClasses\" value=\"true\"\/&gt;\n&lt;\/javaTypeResolver&gt;\n\n&lt;!-- \u65b0\u3057\u3044\u30d7\u30e9\u30b0\u30a4\u30f3\u6a5f\u80fd\u306e\u6d3b\u7528 --&gt;\n&lt;plugin type=\"org.mybatis.generator.plugins.FluentBuilderMethodsPlugin\" \/&gt;\n&lt;plugin type=\"org.mybatis.generator.plugins.VirtualPrimaryKeyPlugin\" \/&gt;<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-54\">2. \u30de\u30a4\u30af\u30ed\u30b5\u30fc\u30d3\u30b9\u5bfe\u5fdc<\/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=\"\">\/\/ \u30de\u30a4\u30af\u30ed\u30b5\u30fc\u30d3\u30b9\u7528\u306e\u30ab\u30b9\u30bf\u30e0\u751f\u6210\u8a2d\u5b9a\npublic class MicroserviceGenerator extends IntrospectedTableMyBatis3Impl {\n    @Override\n    public List&lt;GeneratedJavaFile&gt; getGeneratedJavaFiles() {\n        List&lt;GeneratedJavaFile&gt; files = super.getGeneratedJavaFiles();\n\n        \/\/ DTO\u30af\u30e9\u30b9\u306e\u751f\u6210\n        files.add(generateDTOClass());\n        \/\/ gRPC\u7528\u306e\u30d7\u30ed\u30c8\u30d5\u30a1\u30a4\u30eb\u751f\u6210\n        files.add(generateProtoFile());\n        \/\/ OpenAPI\u4ed5\u69d8\u306e\u751f\u6210\n        files.add(generateOpenAPISpec());\n\n        return files;\n    }\n\n    private GeneratedJavaFile generateDTOClass() {\n        TopLevelClass dtoClass = new TopLevelClass(\n            getBaseRecordType() + \"DTO\");\n        \/\/ DTO\u56fa\u6709\u306e\u8a2d\u5b9a\n        dtoClass.addAnnotation(\"@JsonInclude(JsonInclude.Include.NON_NULL)\");\n        return new GeneratedJavaFile(dtoClass, ...);\n    }\n}<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-55\">3. \u5c06\u6765\u306b\u5411\u3051\u305f\u6e96\u5099\u3068\u63a8\u5968\u4e8b\u9805<\/h4>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u30e2\u30b8\u30e5\u30fc\u30eb\u5316\u3068\u30b9\u30b1\u30fc\u30e9\u30d3\u30ea\u30c6\u30a3<\/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=\"\">\/\/ \u30e2\u30b8\u30e5\u30fc\u30eb\u5316\u5bfe\u5fdc\u306e\u57fa\u672c\u30a4\u30f3\u30bf\u30fc\u30d5\u30a7\u30fc\u30b9\npublic interface ModularGenerator {\n    void generateModule(String moduleName);\n    void generateSharedComponents();\n    void generateAPIs();\n}\n\n\/\/ \u5b9f\u88c5\u4f8b\npublic class ModularMyBatisGenerator implements ModularGenerator {\n    @Override\n    public void generateModule(String moduleName) {\n        \/\/ \u30e2\u30b8\u30e5\u30fc\u30eb\u56fa\u6709\u306e\u751f\u6210\u30ed\u30b8\u30c3\u30af\n        Context context = new Context(ModelType.CONDITIONAL);\n        context.setId(moduleName);\n        context.setTargetRuntime(\"MyBatis3\");\n\n        \/\/ \u30e2\u30b8\u30e5\u30fc\u30eb\u56fa\u6709\u306e\u8a2d\u5b9a\n        addModuleSpecificConfigurations(context);\n\n        \/\/ \u751f\u6210\u5b9f\u884c\n        generate(context);\n    }\n\n    private void addModuleSpecificConfigurations(Context context) {\n        \/\/ \u30e2\u30b8\u30e5\u30fc\u30eb\u3054\u3068\u306e\u8a2d\u5b9a\u8ffd\u52a0\n        JavaModelGeneratorConfiguration modelConfig = \n            new JavaModelGeneratorConfiguration();\n        modelConfig.setTargetPackage(\"com.example.\" + \n            context.getId() + \".model\");\n        context.setJavaModelGeneratorConfiguration(modelConfig);\n    }\n}<\/pre>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li>\u958b\u767a\u8005\u5411\u3051\u306e\u30d9\u30b9\u30c8\u30d7\u30e9\u30af\u30c6\u30a3\u30b9<\/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=\"\">\u63a8\u5968\u3055\u308c\u308b\u958b\u767a\u30d5\u30ed\u30fc\uff1a\n\n1. \u30b9\u30ad\u30fc\u30de\u8a2d\u8a08\n   - \u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u8a2d\u8a08\u30c4\u30fc\u30eb\u3067\u306e\u8a2d\u8a08\n   - ERD\u4f5c\u6210\u3068\u5171\u6709\n   - \u30ec\u30d3\u30e5\u30fc\u3068\u627f\u8a8d\n\n2. \u751f\u6210\u8a2d\u5b9a\u306e\u6e96\u5099\n   - \u30c1\u30fc\u30e0\u5171\u901a\u306e\u8a2d\u5b9a\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u4f5c\u6210\n   - \u30ab\u30b9\u30bf\u30de\u30a4\u30ba\u30dd\u30a4\u30f3\u30c8\u306e\u660e\u78ba\u5316\n   - \u547d\u540d\u898f\u5247\u306e\u7d71\u4e00\n\n3. \u30b3\u30fc\u30c9\u751f\u6210\u3068\u691c\u8a3c\n   - \u81ea\u52d5\u30c6\u30b9\u30c8\u306e\u5b9f\u884c\n   - \u30b3\u30fc\u30c9\u30ec\u30d3\u30e5\u30fc\n   - \u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u30c6\u30b9\u30c8\n\n4. \u7d99\u7d9a\u7684\u306a\u6539\u5584\n   - \u30d5\u30a3\u30fc\u30c9\u30d0\u30c3\u30af\u306e\u53ce\u96c6\n   - \u8a2d\u5b9a\u306e\u6700\u9069\u5316\n   - \u30c9\u30ad\u30e5\u30e1\u30f3\u30c8\u306e\u66f4\u65b0<\/pre>\n\n\n\n<ol start=\"3\" class=\"wp-block-list\">\n<li>\u4eca\u5f8c\u306e\u6280\u8853\u52d5\u5411\u3078\u306e\u5bfe\u5fdc<\/li>\n<\/ol>\n\n\n<div id=\"id-89b02940-ebf5-41e0-9f3a-2c62e62776ac\">\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>\u6280\u8853\u30c8\u30ec\u30f3\u30c9<\/th><th>\u5bfe\u5fdc\u65b9\u91dd<\/th><th>\u6e96\u5099\u3059\u3079\u304d\u70b9<\/th><\/tr><\/thead><tbody><tr><td>Cloud Native<\/td><td>\u30af\u30e9\u30a6\u30c9DB\u3078\u306e\u5bfe\u5fdc<\/td><td>\u63a5\u7d9a\u8a2d\u5b9a\u306e\u67d4\u8edf\u5316<\/td><\/tr><tr><td>GraphQL<\/td><td>\u30b9\u30ad\u30fc\u30de\u81ea\u52d5\u751f\u6210<\/td><td>\u578b\u5b9a\u7fa9\u306e\u62e1\u5f35<\/td><\/tr><tr><td>Reactive<\/td><td>R2DBC\u5bfe\u5fdc<\/td><td>\u975e\u540c\u671f\u51e6\u7406\u306e\u5b9f\u88c5<\/td><\/tr><\/tbody><\/table><\/figure>\n<\/div>\n\n\n<p>\u3053\u308c\u3089\u306e\u5c06\u6765\u3092\u898b\u636e\u3048\u305f\u6e96\u5099\u3068\u9069\u5207\u306a\u5b9f\u88c5\u306b\u3088\u308a\u3001MyBatis Generator\u3092\u9577\u671f\u7684\u306b\u6d3b\u7528\u3057\u3001\u7d99\u7d9a\u7684\u306a\u958b\u767a\u52b9\u7387\u306e\u5411\u4e0a\u3092\u5b9f\u73fe\u3067\u304d\u307e\u3059\u3002<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-56\">\u307e\u3068\u3081\u3068\u6b21\u306e\u30b9\u30c6\u30c3\u30d7<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u77ed\u671f\u7684\u306a\u6539\u5584\u30dd\u30a4\u30f3\u30c8\n<ul class=\"wp-block-list\">\n<li>IDE\u7d71\u5408\u306e\u5f37\u5316<\/li>\n\n\n\n<li>CI\/CD\u81ea\u52d5\u5316\u306e\u63a8\u9032<\/li>\n\n\n\n<li>\u30c6\u30b9\u30c8\u81ea\u52d5\u5316\u306e\u62e1\u5145<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>\u4e2d\u671f\u7684\u306a\u76ee\u6a19\n<ul class=\"wp-block-list\">\n<li>\u30de\u30a4\u30af\u30ed\u30b5\u30fc\u30d3\u30b9\u5bfe\u5fdc\u306e\u5b8c\u5099<\/li>\n\n\n\n<li>\u30af\u30e9\u30a6\u30c9\u30cd\u30a4\u30c6\u30a3\u30d6\u5316\u3078\u306e\u5bfe\u5fdc<\/li>\n\n\n\n<li>\u30c1\u30fc\u30e0\u958b\u767a\u30d7\u30ed\u30bb\u30b9\u306e\u6700\u9069\u5316<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>\u9577\u671f\u7684\u306a\u5c55\u671b\n<ul class=\"wp-block-list\">\n<li>\u65b0\u3057\u3044\u6280\u8853\u30c8\u30ec\u30f3\u30c9\u3078\u306e\u5bfe\u5fdc<\/li>\n\n\n\n<li>\u30b9\u30b1\u30fc\u30e9\u30d6\u30eb\u306a\u958b\u767a\u57fa\u76e4\u306e\u78ba\u7acb<\/li>\n\n\n\n<li>\u7d99\u7d9a\u7684\u306a\u52b9\u7387\u5316\u306e\u8ffd\u6c42<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n\n\n\n<p>\u3053\u308c\u3089\u306e\u8981\u7d20\u3092\u8a08\u753b\u7684\u306b\u5b9f\u65bd\u3059\u308b\u3053\u3068\u3067\u3001\u3088\u308a\u52b9\u7387\u7684\u3067\u4fdd\u5b88\u6027\u306e\u9ad8\u3044\u958b\u767a\u74b0\u5883\u3092\u5b9f\u73fe\u3067\u304d\u307e\u3059\u3002<\/p>\n\n\n\n<p><\/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":[2],"tags":[],"class_list":{"0":"post-517","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-java","7":"nothumb"},"_links":{"self":[{"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=\/wp\/v2\/posts\/517","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=517"}],"version-history":[{"count":2,"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=\/wp\/v2\/posts\/517\/revisions"}],"predecessor-version":[{"id":522,"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=\/wp\/v2\/posts\/517\/revisions\/522"}],"wp:attachment":[{"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=517"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=517"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=517"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}