{"id":40102,"date":"2023-12-20T15:32:25","date_gmt":"2023-08-29T18:55:07","guid":{"rendered":"https:\/\/www.silicloud.com\/zh\/blog\/%e7%90%86%e8%a7%a3spring%e6%a1%86%e6%9e%b6%e4%b8%ad%e7%9a%84%e6%95%b0%e6%8d%ae%e5%ba%93%e8%bf%9e%e6%8e%a5%e5%85%b1%e4%ba%ab%e6%96%b9%e6%b3%95%ef%bc%88%e6%95%b0%e6%8d%ae%e5%ba%93%e4%ba%8b%e5%8a%a1\/"},"modified":"2024-05-04T14:28:06","modified_gmt":"2024-05-04T06:28:06","slug":"%e7%90%86%e8%a7%a3spring%e6%a1%86%e6%9e%b6%e4%b8%ad%e7%9a%84%e6%95%b0%e6%8d%ae%e5%ba%93%e8%bf%9e%e6%8e%a5%e5%85%b1%e4%ba%ab%e6%96%b9%e6%b3%95%ef%bc%88%e6%95%b0%e6%8d%ae%e5%ba%93%e4%ba%8b%e5%8a%a1","status":"publish","type":"post","link":"https:\/\/www.silicloud.com\/zh\/blog\/%e7%90%86%e8%a7%a3spring%e6%a1%86%e6%9e%b6%e4%b8%ad%e7%9a%84%e6%95%b0%e6%8d%ae%e5%ba%93%e8%bf%9e%e6%8e%a5%e5%85%b1%e4%ba%ab%e6%96%b9%e6%b3%95%ef%bc%88%e6%95%b0%e6%8d%ae%e5%ba%93%e4%ba%8b%e5%8a%a1\/","title":{"rendered":"\u7406\u89e3Spring\u6846\u67b6\u4e2d\u7684\u6570\u636e\u5e93\u8fde\u63a5\u5171\u4eab\u65b9\u6cd5\uff08\u6570\u636e\u5e93\u4e8b\u52a1\uff09"},"content":{"rendered":"<p>\u672c\u6b21\uff0c\u6211\u5c06\u89e3\u91ca\u6709\u5173Spring\u7684\u6570\u636e\u5e93\u8fde\u63a5\u5171\u4eab\u65b9\u6cd5\uff08\u5373\u5728\u540c\u4e00\u4e2a\u4e8b\u52a1\u4e2d\u6267\u884c\u591a\u4e2aSQL\u7684\u65b9\u6cd5\uff09\u7684\u673a\u5236\u3002<\/p>\n<p>\u53ea\u662f\u89e3\u91ca\u673a\u5236\u53ef\u80fd\u4f1a\u5bf9\u4e0d\u719f\u6089Spring\u7684\u4eba\u6765\u8bf4\u6709\u4e00\u5b9a\u96be\u5ea6\uff01\uff1f\u56e0\u6b64\u2026\u2026\u6211\u60f3\u8fb9\u4f7f\u7528Spring\u63d0\u4f9b\u7684\u6570\u636e\u5e93\u8bbf\u95ee\u529f\u80fd\uff08JdbcTemplate\uff09\uff0c\u8fb9\u89e3\u91caSpring\u662f\u5982\u4f55\u751f\u6210\u548c\u5171\u4eab\u6570\u636e\u5e93\u8fde\u63a5\u7684\u3002<\/p>\n<h1>\u884c\u4e3a\u9a8c\u8bc1\u7248\u672c<\/h1>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">Spring Boot 1.5.1.RELEASE<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">Spring Framework 4.3.6.RELEASE<\/ul>\n<h1>\u521b\u5efa\u4e00\u4e2a\u7528\u4e8e\u9a8c\u8bc1\u7684Spring Boot\u9879\u76ee\u3002<\/h1>\n<p>\u9996\u5148\uff0c\u8ba9\u6211\u4eec\u521b\u5efa\u4e00\u4e2a\u7528\u4e8e\u9a8c\u8bc1\u7684Spring Boot\u9879\u76ee\uff08\u5728Dependencies\u4e2d\u6307\u5b9ajdbc\u548ch2\uff09\u3002\u5728\u8fd9\u4e2a\u4f8b\u5b50\u4e2d\uff0c\u6211\u4eec\u4f7f\u7528\u547d\u4ee4\u884c\u521b\u5efa\u9879\u76ee\uff0c\u4e0d\u8fc7\u60a8\u4e5f\u53ef\u4ee5\u4f7f\u7528SPRING INITIALIZR\u7684Web UI\u6216\u60a8\u6240\u4f7f\u7528\u7684IDE\u7684\u529f\u80fd\u6765\u751f\u6210\uff08\u5f53\u7136\u4e5f\u53ef\u4ee5\uff09\u3002<\/p>\n<pre class=\"post-pre\"><code>$ curl -s https:\/\/start.spring.io\/starter.tgz\\\r\n       -d name=spring-tx-demo\\\r\n       -d artifactId=spring-tx-demo\\\r\n       -d dependencies=jdbc,h2\\\r\n       -d baseDir=spring-tx-demo\\\r\n       | tar -xzvf -\r\n<\/code><\/pre>\n<p>\u5f53\u4f60\u521b\u5efa\u4e00\u4e2a\u9879\u76ee\uff0c\u5c06\u751f\u6210\u4ee5\u4e0b\u7ed3\u6784\u7684Maven\u9879\u76ee\u3002<\/p>\n<pre class=\"post-pre\"><code>$ cd spring-tx-demo\r\n$ tree\r\n.\r\n\u251c\u2500\u2500 mvnw\r\n\u251c\u2500\u2500 mvnw.cmd\r\n\u251c\u2500\u2500 pom.xml\r\n\u2514\u2500\u2500 src\r\n    \u251c\u2500\u2500 main\r\n    \u2502\u00a0\u00a0 \u251c\u2500\u2500 java\r\n    \u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 com\r\n    \u2502\u00a0\u00a0 \u2502\u00a0\u00a0     \u2514\u2500\u2500 example\r\n    \u2502\u00a0\u00a0 \u2502\u00a0\u00a0         \u2514\u2500\u2500 SpringTxDemoApplication.java\r\n    \u2502\u00a0\u00a0 \u2514\u2500\u2500 resources\r\n    \u2502\u00a0\u00a0     \u2514\u2500\u2500 application.properties\r\n    \u2514\u2500\u2500 test\r\n        \u2514\u2500\u2500 java\r\n            \u2514\u2500\u2500 com\r\n                \u2514\u2500\u2500 example\r\n                    \u2514\u2500\u2500 SpringTxDemoApplicationTests.java\r\n<\/code><\/pre>\n<p>\u6839\u636e\u9700\u8981\uff0c\u8bf7\u5c06\u5176\u5bfc\u5165\u60a8\u7684IDE\u4e2d\u4f7f\u7528\uff01<\/p>\n<h1>\u6570\u636e\u5e93\uff08\u6570\u636e\u6e90\uff09\u7684\u8bbe\u7f6e<\/h1>\n<p>\u8fd9\u6b21\u6211\u4eec\u5c06\u4f7f\u7528H2\u7684\u5185\u5b58\u6570\u636e\u5e93\u8fdb\u884c\u9a8c\u8bc1\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"k\">CREATE<\/span> <span class=\"k\">TABLE<\/span> <span class=\"n\">account<\/span> <span class=\"p\">(<\/span>\r\n  <span class=\"n\">id<\/span> <span class=\"nb\">CHAR<\/span><span class=\"p\">(<\/span><span class=\"mi\">10<\/span><span class=\"p\">)<\/span> <span class=\"k\">PRIMARY<\/span> <span class=\"k\">KEY<\/span><span class=\"p\">,<\/span>\r\n  <span class=\"n\">name<\/span> <span class=\"nb\">VARCHAR<\/span><span class=\"p\">(<\/span><span class=\"mi\">255<\/span><span class=\"p\">)<\/span>\r\n<span class=\"p\">);<\/span>\r\n<\/code><\/pre>\n<p>\u53e6\u5916\uff0c\u7531\u4e8e\u5f88\u96be\u9a8c\u8bc1Spring Boot\u5185\u7f6e\u7684DataSource\uff08\u5e26\u6709\u8fde\u63a5\u6c60\u7684DataSource\uff09\u662f\u5426\u6b63\u786e\u6267\u884c\u4e86\u4e8b\u52a1\u63a7\u5236\uff0c\u6240\u4ee5\u6211\u4eec\u4f1a\u5b9a\u4e49\u4e00\u4e2a\u6ca1\u6709\u8fde\u63a5\u6c60\u7684DataSource\u4f5c\u4e3a\u9a8c\u8bc1\u7528\u9014\u3002<\/p>\n<blockquote><p>\u6ce8\u610f\u4e8b\u9879\uff1a<\/p>\n<p>\u5f00\u53d1\u4e00\u822c\u5e94\u7528\u7a0b\u5e8f\u65f6\uff0c\u8bf7\u52a1\u5fc5\u4f7f\u7528\u8fde\u63a5\u6c60\uff01\uff01\uff08\u4e0d\u9700\u8981\u50cf\u4e0b\u9762\u8fd9\u6837\u7684bean\u5b9a\u4e49\uff09<\/p><\/blockquote>\n<pre class=\"post-pre\"><code><span class=\"kn\">package<\/span> <span class=\"nn\">com.example<\/span><span class=\"o\">;<\/span>\r\n\r\n<span class=\"kn\">import<\/span> <span class=\"nn\">org.springframework.boot.SpringApplication<\/span><span class=\"o\">;<\/span>\r\n<span class=\"kn\">import<\/span> <span class=\"nn\">org.springframework.boot.autoconfigure.SpringBootApplication<\/span><span class=\"o\">;<\/span>\r\n<span class=\"kn\">import<\/span> <span class=\"nn\">org.springframework.boot.autoconfigure.jdbc.DataSourceProperties<\/span><span class=\"o\">;<\/span>\r\n<span class=\"kn\">import<\/span> <span class=\"nn\">org.springframework.context.annotation.Bean<\/span><span class=\"o\">;<\/span>\r\n<span class=\"kn\">import<\/span> <span class=\"nn\">org.springframework.context.annotation.Configuration<\/span><span class=\"o\">;<\/span>\r\n<span class=\"kn\">import<\/span> <span class=\"nn\">org.springframework.jdbc.datasource.SimpleDriverDataSource<\/span><span class=\"o\">;<\/span>\r\n\r\n<span class=\"kn\">import<\/span> <span class=\"nn\">javax.sql.DataSource<\/span><span class=\"o\">;<\/span>\r\n<span class=\"kn\">import<\/span> <span class=\"nn\">java.sql.Driver<\/span><span class=\"o\">;<\/span>\r\n<span class=\"kn\">import<\/span> <span class=\"nn\">java.util.Properties<\/span><span class=\"o\">;<\/span>\r\n\r\n<span class=\"nd\">@SpringBootApplication<\/span>\r\n<span class=\"kd\">public<\/span> <span class=\"kd\">class<\/span> <span class=\"nc\">SpringTxDemoApplication<\/span> <span class=\"o\">{<\/span>\r\n\r\n    <span class=\"kd\">public<\/span> <span class=\"kd\">static<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">main<\/span><span class=\"o\">(<\/span><span class=\"nc\">String<\/span><span class=\"o\">[]<\/span> <span class=\"n\">args<\/span><span class=\"o\">)<\/span> <span class=\"o\">{<\/span>\r\n        <span class=\"nc\">SpringApplication<\/span><span class=\"o\">.<\/span><span class=\"na\">run<\/span><span class=\"o\">(<\/span><span class=\"nc\">SpringTxDemoApplication<\/span><span class=\"o\">.<\/span><span class=\"na\">class<\/span><span class=\"o\">,<\/span> <span class=\"n\">args<\/span><span class=\"o\">);<\/span>\r\n    <span class=\"o\">}<\/span>\r\n\r\n    <span class=\"nd\">@Configuration<\/span>\r\n    <span class=\"kd\">static<\/span> <span class=\"kd\">class<\/span> <span class=\"nc\">DataSourceConfiguration<\/span> <span class=\"o\">{<\/span>\r\n        <span class=\"nd\">@Bean<\/span>\r\n        <span class=\"kd\">public<\/span> <span class=\"nc\">DataSource<\/span> <span class=\"nf\">dataSource<\/span><span class=\"o\">(<\/span><span class=\"nc\">DataSourceProperties<\/span> <span class=\"n\">properties<\/span><span class=\"o\">)<\/span> <span class=\"kd\">throws<\/span> <span class=\"nc\">ClassNotFoundException<\/span> <span class=\"o\">{<\/span>\r\n            <span class=\"c1\">\/\/ \u2605\u2605\u2605 Spring\u304c\u63d0\u4f9b\u3057\u3066\u3044\u308b\u30b3\u30cd\u30af\u30b7\u30e7\u30f3\u3092\u30d7\u30fc\u30eb\u3057\u306a\u3044\u5b9f\u88c5\u30af\u30e9\u30b9\u3092\u5229\u7528 \u2605\u2605\u2605<\/span>\r\n            <span class=\"nc\">SimpleDriverDataSource<\/span> <span class=\"n\">dataSource<\/span> <span class=\"o\">=<\/span> <span class=\"k\">new<\/span> <span class=\"nc\">SimpleDriverDataSource<\/span><span class=\"o\">();<\/span>\r\n            <span class=\"n\">dataSource<\/span><span class=\"o\">.<\/span><span class=\"na\">setDriverClass<\/span><span class=\"o\">((<\/span><span class=\"nc\">Class<\/span><span class=\"o\">&lt;?<\/span> <span class=\"kd\">extends<\/span> <span class=\"nc\">Driver<\/span><span class=\"o\">&gt;)<\/span> <span class=\"nc\">Class<\/span><span class=\"o\">.<\/span><span class=\"na\">forName<\/span><span class=\"o\">(<\/span><span class=\"n\">properties<\/span><span class=\"o\">.<\/span><span class=\"na\">determineDriverClassName<\/span><span class=\"o\">()));<\/span>\r\n            <span class=\"n\">dataSource<\/span><span class=\"o\">.<\/span><span class=\"na\">setUrl<\/span><span class=\"o\">(<\/span><span class=\"n\">properties<\/span><span class=\"o\">.<\/span><span class=\"na\">determineUrl<\/span><span class=\"o\">());<\/span>\r\n            <span class=\"n\">dataSource<\/span><span class=\"o\">.<\/span><span class=\"na\">setUsername<\/span><span class=\"o\">(<\/span><span class=\"n\">properties<\/span><span class=\"o\">.<\/span><span class=\"na\">determineUsername<\/span><span class=\"o\">());<\/span>\r\n            <span class=\"n\">dataSource<\/span><span class=\"o\">.<\/span><span class=\"na\">setPassword<\/span><span class=\"o\">(<\/span><span class=\"n\">properties<\/span><span class=\"o\">.<\/span><span class=\"na\">determinePassword<\/span><span class=\"o\">());<\/span>\r\n            <span class=\"nc\">Properties<\/span> <span class=\"n\">connectionProperties<\/span> <span class=\"o\">=<\/span> <span class=\"k\">new<\/span> <span class=\"nc\">Properties<\/span><span class=\"o\">();<\/span>\r\n            <span class=\"n\">connectionProperties<\/span><span class=\"o\">.<\/span><span class=\"na\">setProperty<\/span><span class=\"o\">(<\/span><span class=\"s\">\"autoCommit\"<\/span><span class=\"o\">,<\/span> <span class=\"s\">\"false\"<\/span><span class=\"o\">);<\/span> <span class=\"c1\">\/\/ \u2605\u2605\u2605 \u81ea\u52d5\u30b3\u30df\u30c3\u30c8\u3092OFF\u306b\u3059\u308b \u2605\u2605\u2605<\/span>\r\n            <span class=\"n\">dataSource<\/span><span class=\"o\">.<\/span><span class=\"na\">setConnectionProperties<\/span><span class=\"o\">(<\/span><span class=\"n\">connectionProperties<\/span><span class=\"o\">);<\/span>\r\n            <span class=\"k\">return<\/span> <span class=\"n\">dataSource<\/span><span class=\"o\">;<\/span>\r\n        <span class=\"o\">}<\/span>\r\n    <span class=\"o\">}<\/span>\r\n\r\n<span class=\"o\">}<\/span>\r\n<\/code><\/pre>\n<p>\u6b64\u5916\uff0c\u8bf7\u52a1\u5fc5\u5c06\u81ea\u52a8\u63d0\u4ea4\u6807\u5fd7\u8bbe\u7f6e\u4e3afalse\uff08\u4e0d\u81ea\u52a8\u63d0\u4ea4\uff09\u3002\u5982\u679c\u5c06\u81ea\u52a8\u63d0\u4ea4\u6807\u5fd7\u8bbe\u7f6e\u4e3atrue\uff08\u81ea\u52a8\u63d0\u4ea4\uff09\uff0c\u90a3\u4e48\u6211\u4eec\u65e0\u6cd5\u786e\u5b9a\u5b9e\u9645\u662f\u8c01\u8fdb\u884c\u4e86\u63d0\u4ea4\u64cd\u4f5c&#8230;<\/p>\n<h1>\u4f7f\u7528JdbcTemplate\u8fdb\u884c\u6570\u636e\u5e93\u8bbf\u95ee<\/h1>\n<p>\u8ba9\u6211\u4eec\u5728SpringTxDemoApplication\u7c7b\u4e2d\u5b9e\u73b0CommandLineRunner\u63a5\u53e3\uff0c\u5e76\u5728run\u65b9\u6cd5\u4e2d\u4f7f\u7528JdbcTemplate\u6765\u5b9e\u73b0\u5bf9\u6570\u636e\u5e93\u7684\u8bbf\u95ee\u3002<\/p>\n<blockquote><p>\u6ce8\u610f\uff1a<\/p>\n<p>\u5c06Spring\u63d0\u4f9b\u7684DB\u8bbf\u95ee\u529f\u80fd\u7684\u65e5\u5fd7\uff08\u8c03\u8bd5\u65e5\u5fd7\uff09\u8f93\u51fa\uff0c\u53ef\u4ee5\u66f4\u5bb9\u6613\u5730\u786e\u8ba4\u5176\u5185\u90e8\u8fd0\u4f5c\u65b9\u5f0f\u3002<\/p>\n<p>src\/main\/resources\/application.properties<br \/>\nlogging.level.org.springframework.jdbc=debug<\/p><\/blockquote>\n<pre class=\"post-pre\"><code><span class=\"kn\">package<\/span> <span class=\"nn\">com.example<\/span><span class=\"o\">;<\/span>\r\n\r\n<span class=\"kn\">import<\/span> <span class=\"nn\">org.springframework.boot.CommandLineRunner<\/span><span class=\"o\">;<\/span>\r\n<span class=\"kn\">import<\/span> <span class=\"nn\">org.springframework.boot.SpringApplication<\/span><span class=\"o\">;<\/span>\r\n<span class=\"kn\">import<\/span> <span class=\"nn\">org.springframework.boot.autoconfigure.SpringBootApplication<\/span><span class=\"o\">;<\/span>\r\n<span class=\"kn\">import<\/span> <span class=\"nn\">org.springframework.boot.autoconfigure.jdbc.DataSourceProperties<\/span><span class=\"o\">;<\/span>\r\n<span class=\"kn\">import<\/span> <span class=\"nn\">org.springframework.context.annotation.Bean<\/span><span class=\"o\">;<\/span>\r\n<span class=\"kn\">import<\/span> <span class=\"nn\">org.springframework.context.annotation.Configuration<\/span><span class=\"o\">;<\/span>\r\n<span class=\"kn\">import<\/span> <span class=\"nn\">org.springframework.jdbc.core.JdbcTemplate<\/span><span class=\"o\">;<\/span>\r\n<span class=\"kn\">import<\/span> <span class=\"nn\">org.springframework.jdbc.datasource.SimpleDriverDataSource<\/span><span class=\"o\">;<\/span>\r\n\r\n<span class=\"kn\">import<\/span> <span class=\"nn\">javax.sql.DataSource<\/span><span class=\"o\">;<\/span>\r\n<span class=\"kn\">import<\/span> <span class=\"nn\">java.sql.Driver<\/span><span class=\"o\">;<\/span>\r\n<span class=\"kn\">import<\/span> <span class=\"nn\">java.util.Map<\/span><span class=\"o\">;<\/span>\r\n<span class=\"kn\">import<\/span> <span class=\"nn\">java.util.Properties<\/span><span class=\"o\">;<\/span>\r\n\r\n<span class=\"nd\">@SpringBootApplication<\/span>\r\n<span class=\"kd\">public<\/span> <span class=\"kd\">class<\/span> <span class=\"nc\">SpringTxDemoApplication<\/span> <span class=\"kd\">implements<\/span> <span class=\"nc\">CommandLineRunner<\/span> <span class=\"o\">{<\/span>\r\n\r\n    <span class=\"kd\">public<\/span> <span class=\"kd\">static<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">main<\/span><span class=\"o\">(<\/span><span class=\"nc\">String<\/span><span class=\"o\">[]<\/span> <span class=\"n\">args<\/span><span class=\"o\">)<\/span> <span class=\"o\">{<\/span>\r\n        <span class=\"nc\">SpringApplication<\/span><span class=\"o\">.<\/span><span class=\"na\">run<\/span><span class=\"o\">(<\/span><span class=\"nc\">SpringTxDemoApplication<\/span><span class=\"o\">.<\/span><span class=\"na\">class<\/span><span class=\"o\">,<\/span> <span class=\"n\">args<\/span><span class=\"o\">);<\/span>\r\n    <span class=\"o\">}<\/span>\r\n\r\n    <span class=\"kd\">private<\/span> <span class=\"kd\">final<\/span> <span class=\"nc\">JdbcTemplate<\/span> <span class=\"n\">jdbcTemplate<\/span><span class=\"o\">;<\/span>\r\n\r\n    <span class=\"kd\">public<\/span> <span class=\"nf\">SpringTxDemoApplication<\/span><span class=\"o\">(<\/span><span class=\"nc\">JdbcTemplate<\/span> <span class=\"n\">jdbcTemplate<\/span><span class=\"o\">){<\/span>\r\n        <span class=\"k\">this<\/span><span class=\"o\">.<\/span><span class=\"na\">jdbcTemplate<\/span> <span class=\"o\">=<\/span> <span class=\"n\">jdbcTemplate<\/span><span class=\"o\">;<\/span>\r\n    <span class=\"o\">}<\/span>\r\n\r\n    <span class=\"c1\">\/\/ \u2605\u2605\u2605 JdbcTemplate\u3092\u4f7f\u7528\u3057\u305fDB\u30a2\u30af\u30bb\u30b9\u51e6\u7406\u3092\u5b9f\u88c5\u3059\u308b \u2605\u2605\u2605<\/span>\r\n    <span class=\"nd\">@Override<\/span>\r\n    <span class=\"kd\">public<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">run<\/span><span class=\"o\">(<\/span><span class=\"nc\">String<\/span><span class=\"o\">...<\/span> <span class=\"n\">args<\/span><span class=\"o\">)<\/span> <span class=\"kd\">throws<\/span> <span class=\"nc\">Exception<\/span> <span class=\"o\">{<\/span>\r\n\r\n        <span class=\"n\">jdbcTemplate<\/span><span class=\"o\">.<\/span><span class=\"na\">update<\/span><span class=\"o\">(<\/span><span class=\"s\">\"INSERT INTO city (name, state, country) VALUES ('San Francisco', 'CA', 'US')\"<\/span><span class=\"o\">);<\/span>\r\n\r\n        <span class=\"nc\">Map<\/span><span class=\"o\">&lt;<\/span><span class=\"nc\">String<\/span><span class=\"o\">,<\/span> <span class=\"nc\">Object<\/span><span class=\"o\">&gt;<\/span> <span class=\"n\">city<\/span> <span class=\"o\">=<\/span> <span class=\"n\">jdbcTemplate<\/span><span class=\"o\">.<\/span><span class=\"na\">queryForMap<\/span><span class=\"o\">(<\/span><span class=\"s\">\"SELECT id, name, state, country FROM city WHERE id = 1\"<\/span><span class=\"o\">);<\/span>\r\n\r\n        <span class=\"nc\">System<\/span><span class=\"o\">.<\/span><span class=\"na\">out<\/span><span class=\"o\">.<\/span><span class=\"na\">println<\/span><span class=\"o\">(<\/span><span class=\"n\">city<\/span><span class=\"o\">);<\/span>\r\n\r\n    <span class=\"o\">}<\/span>\r\n\r\n    <span class=\"nd\">@Configuration<\/span>\r\n    <span class=\"kd\">static<\/span> <span class=\"kd\">class<\/span> <span class=\"nc\">DataSourceConfiguration<\/span> <span class=\"o\">{<\/span>\r\n        <span class=\"nd\">@Bean<\/span>\r\n        <span class=\"kd\">public<\/span> <span class=\"nc\">DataSource<\/span> <span class=\"nf\">dataSource<\/span><span class=\"o\">(<\/span><span class=\"nc\">DataSourceProperties<\/span> <span class=\"n\">properties<\/span><span class=\"o\">)<\/span> <span class=\"kd\">throws<\/span> <span class=\"nc\">ClassNotFoundException<\/span> <span class=\"o\">{<\/span>\r\n            <span class=\"nc\">SimpleDriverDataSource<\/span> <span class=\"n\">dataSource<\/span> <span class=\"o\">=<\/span> <span class=\"k\">new<\/span> <span class=\"nc\">SimpleDriverDataSource<\/span><span class=\"o\">();<\/span>\r\n            <span class=\"n\">dataSource<\/span><span class=\"o\">.<\/span><span class=\"na\">setDriverClass<\/span><span class=\"o\">((<\/span><span class=\"nc\">Class<\/span><span class=\"o\">&lt;?<\/span> <span class=\"kd\">extends<\/span> <span class=\"nc\">Driver<\/span><span class=\"o\">&gt;)<\/span> <span class=\"nc\">Class<\/span><span class=\"o\">.<\/span><span class=\"na\">forName<\/span><span class=\"o\">(<\/span><span class=\"n\">properties<\/span><span class=\"o\">.<\/span><span class=\"na\">determineDriverClassName<\/span><span class=\"o\">()));<\/span>\r\n            <span class=\"n\">dataSource<\/span><span class=\"o\">.<\/span><span class=\"na\">setUrl<\/span><span class=\"o\">(<\/span><span class=\"n\">properties<\/span><span class=\"o\">.<\/span><span class=\"na\">determineUrl<\/span><span class=\"o\">());<\/span>\r\n            <span class=\"n\">dataSource<\/span><span class=\"o\">.<\/span><span class=\"na\">setUsername<\/span><span class=\"o\">(<\/span><span class=\"n\">properties<\/span><span class=\"o\">.<\/span><span class=\"na\">determineUsername<\/span><span class=\"o\">());<\/span>\r\n            <span class=\"n\">dataSource<\/span><span class=\"o\">.<\/span><span class=\"na\">setPassword<\/span><span class=\"o\">(<\/span><span class=\"n\">properties<\/span><span class=\"o\">.<\/span><span class=\"na\">determinePassword<\/span><span class=\"o\">());<\/span>\r\n            <span class=\"nc\">Properties<\/span> <span class=\"n\">connectionProperties<\/span> <span class=\"o\">=<\/span> <span class=\"k\">new<\/span> <span class=\"nc\">Properties<\/span><span class=\"o\">();<\/span>\r\n            <span class=\"n\">connectionProperties<\/span><span class=\"o\">.<\/span><span class=\"na\">setProperty<\/span><span class=\"o\">(<\/span><span class=\"s\">\"autoCommit\"<\/span><span class=\"o\">,<\/span> <span class=\"s\">\"false\"<\/span><span class=\"o\">);<\/span>\r\n            <span class=\"n\">dataSource<\/span><span class=\"o\">.<\/span><span class=\"na\">setConnectionProperties<\/span><span class=\"o\">(<\/span><span class=\"n\">connectionProperties<\/span><span class=\"o\">);<\/span>\r\n            <span class=\"k\">return<\/span> <span class=\"n\">dataSource<\/span><span class=\"o\">;<\/span>\r\n        <span class=\"o\">}<\/span>\r\n    <span class=\"o\">}<\/span>\r\n\r\n<span class=\"o\">}<\/span>\r\n<\/code><\/pre>\n<p>\u5982\u679c\u5c06\u6b64\u7c7b\u4f5c\u4e3aSpring Boot\u5e94\u7528\u7a0b\u5e8f\u8fd0\u884c\uff0c\u4f1a\u5f97\u5230\u4ec0\u4e48\u7ed3\u679c\u5462\uff1f\u56e0\u4e3a\u8fdb\u884c\u4e86\u63d2\u51651\u6761\u8bb0\u5f55\u5e76\u4e14\u83b7\u53d6\u4e86\u63d2\u5165\u7684\u8bb0\u5f55\uff0c\u6240\u4ee5\u2026\u2026<\/p>\n<p>\u5728\u63a7\u5236\u53f0\u4e0a&#8230;<\/p>\n<pre class=\"post-pre\"><code>{ID=1, NAME=San Francisco, STATE=CA, COUNTRY=US}\r\n<\/code><\/pre>\n<p>\u6211\u60f3\u60a8\u671f\u671b\u8f93\u51fa\u4e3a\u300c\u3068\u300d\uff0c\u4f46\u662f&#8230;..<\/p>\n<p>\u5f53\u5b9e\u9645\u6267\u884c\u65f6\uff0c\u83b7\u53d6\u63d2\u5165\u7684\u8bb0\u5f55\u65f6\u4f1a\u53d1\u751f\u4ee5\u4e0b\u9519\u8bef\u3002<\/p>\n<pre class=\"post-pre\"><code>.\/mvnw spring-boot:run\r\n...\r\n .   ____          _            __ _ _\r\n \/\\\\ \/ ___'_ __ _ _(_)_ __  __ _ \\ \\ \\ \\\r\n( ( )\\___ | '_ | '_| | '_ \\\/ _` | \\ \\ \\ \\\r\n \\\\\/  ___)| |_)| | | | | || (_| |  ) ) ) )\r\n  '  |____| .__|_| |_|_| |_\\__, | \/ \/ \/ \/\r\n =========|_|==============|___\/=\/_\/_\/_\/\r\n :: Spring Boot ::        (v1.5.1.RELEASE)\r\n...\r\n2017-02-12 17:26:08.627 ERROR 46138 --- [           main] o.s.boot.SpringApplication               : Application startup failed\r\n\r\njava.lang.IllegalStateException: Failed to execute CommandLineRunner\r\n    at org.springframework.boot.SpringApplication.callRunner(SpringApplication.java:779) [spring-boot-1.5.1.RELEASE.jar:1.5.1.RELEASE]\r\n    at org.springframework.boot.SpringApplication.callRunners(SpringApplication.java:760) [spring-boot-1.5.1.RELEASE.jar:1.5.1.RELEASE]\r\n    at org.springframework.boot.SpringApplication.afterRefresh(SpringApplication.java:747) [spring-boot-1.5.1.RELEASE.jar:1.5.1.RELEASE]\r\n    at org.springframework.boot.SpringApplication.run(SpringApplication.java:315) [spring-boot-1.5.1.RELEASE.jar:1.5.1.RELEASE]\r\n    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1162) [spring-boot-1.5.1.RELEASE.jar:1.5.1.RELEASE]\r\n    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1151) [spring-boot-1.5.1.RELEASE.jar:1.5.1.RELEASE]\r\n    at com.example.SpringTxDemoApplication.main(SpringTxDemoApplication.java:21) [classes\/:na]\r\n    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_121]\r\n    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_121]\r\n    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_121]\r\n    at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_121]\r\n    at org.springframework.boot.maven.AbstractRunMojo$LaunchRunner.run(AbstractRunMojo.java:527) [spring-boot-maven-plugin-1.5.1.RELEASE.jar:1.5.1.RELEASE]\r\n    at java.lang.Thread.run(Thread.java:745) [na:1.8.0_121]\r\nCaused by: org.springframework.dao.EmptyResultDataAccessException: Incorrect result size: expected 1, actual 0\r\n    at org.springframework.dao.support.DataAccessUtils.requiredSingleResult(DataAccessUtils.java:71) ~[spring-tx-4.3.6.RELEASE.jar:4.3.6.RELEASE]\r\n    at org.springframework.jdbc.core.JdbcTemplate.queryForObject(JdbcTemplate.java:495) ~[spring-jdbc-4.3.6.RELEASE.jar:4.3.6.RELEASE]\r\n    at org.springframework.jdbc.core.JdbcTemplate.queryForMap(JdbcTemplate.java:489) ~[spring-jdbc-4.3.6.RELEASE.jar:4.3.6.RELEASE]\r\n    at com.example.SpringTxDemoApplication.run(SpringTxDemoApplication.java:35) [classes\/:na]\r\n    at org.springframework.boot.SpringApplication.callRunner(SpringApplication.java:776) [spring-boot-1.5.1.RELEASE.jar:1.5.1.RELEASE]\r\n    ... 12 common frames omitted\r\n...\r\n<\/code><\/pre>\n<p>\u6839\u636e\u5f02\u5e38\u4fe1\u606f\u201cCaused by: org.springframework.dao.EmptyResultDataAccessException: Incorrect result size: expected 1, actual 0\u201d\uff0c\u53ef\u4ee5\u63a8\u65ad\u51fa\u539f\u56e0\u662f\u672a\u627e\u5230\u7b26\u5408\u6761\u4ef6\u7684\u8bb0\u5f55\u3002<\/p>\n<h1>\u5728\u4f7f\u7528JdbcTemplate\u65f6\u5904\u7406\u8fde\u63a5\u7684\u65b9\u5f0f<\/h1>\n<p>\u4e3a\u4ec0\u4e48\u5728\u6700\u8fd1\u63d2\u5165\u8bb0\u5f55\u7684\u65f6\u5019\u627e\u4e0d\u5230\u8bb0\u5f55\u5462\uff1f<br \/>\n\u4e0b\u56fe\u5c55\u793a\u4e86\u5728\u6ca1\u6709Spring\u4e8b\u52a1\u7ba1\u7406\u7684\u60c5\u51b5\u4e0b\u8c03\u7528JdbcTemplate\u65b9\u6cd5\u65f6\uff0c\u5982\u4f55\u83b7\u53d6\u8fde\u63a5\u3002<\/p>\n<div><img decoding=\"async\" class=\"post-images\" title=\"\" src=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d3e4337434c4406c8a416\/29-0.png\" alt=\"spring-jdbc-non-tx.png\" \/><\/div>\n<div>\n<div class=\"post-table\">\u9805\u756a\u8aac\u660e\u2460Controller\u304b\u3089Spring\u306e\u30c8\u30e9\u30f3\u30b6\u30af\u30b7\u30e7\u30f3\u7ba1\u7406\u5916\u306eService\u30af\u30e9\u30b9\u306e\u30e1\u30bd\u30c3\u30c9\u3092\u547c\u3073\u51fa\u3059\u3002\u2461Service\u304b\u3089<code>JdbcTemplate<\/code>\u306e\u30e1\u30bd\u30c3\u30c9\u3092\u547c\u3073\u51fa\u3059\u3002\u2462<code>JdbcTemplate<\/code>\u306f\u3001\u81ea\u8eab\u306b\u5272\u308a\u5f53\u3066\u3089\u308c\u3066\u3044\u308b<code>DataSource<\/code>\u304b\u3089<code>Connection<\/code>\u3092\u53d6\u5f97\u3059\u308b\u3002\u305d\u306e\u969b\u3001\u76f4\u63a5<code>DataSource<\/code>\u304b\u3089<code>Connection<\/code>\u3092\u53d6\u5f97\u3059\u308b\u306e\u3067\u306f\u306a\u304f\u3001<code>DataSourceUtil#getConnection(DataSource)<\/code>\u3092\u4ecb\u3057\u3066\u53d6\u5f97\u3059\u308b\u4ed5\u7d44\u307f\u306b\u306a\u3063\u3066\u3044\u307e\u3059\u3002\u5f8c\u3067\u8a73\u3057\u304f\u8aac\u660e\u3057\u307e\u3059\u304c\u3001\u30c8\u30e9\u30f3\u30b6\u30af\u30b7\u30e7\u30f3\u7ba1\u7406\u4e0b\u3067\u306e<code>Connection<\/code>\u306e\u5171\u6709\u3092\u5b9f\u73fe\u3057\u3066\u3044\u308b\u306e\u304c<code>DataSourceUtil<\/code>\u306e\u30e1\u30bd\u30c3\u30c9\u306b\u306a\u308a\u307e\u3059\u3002\u2463<code>DataSourceUtil<\/code>\u304b\u3089\u53d6\u5f97\u3057\u305f<code>Connection<\/code>\u306e\u30e1\u30bd\u30c3\u30c9\u3092\u4f7f\u7528\u3057\u3066SQL\u306e\u5b9f\u884c\u3092\u4f9d\u983c\u3059\u308b\u3002\u2464<code>Connection<\/code>(<code>Connection<\/code>\u304b\u3089\u53d6\u5f97\u3057\u305f<code>Statement<\/code>)\u306f\u3001\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u306bSQL\u3092\u5b9f\u884c\u3059\u308b\u3002<\/div>\n<\/div>\n<p>\u6839\u636e\u6c14\u6ce1\u8bf4\u660e\uff0c\u6bcf\u6b21\u8c03\u7528JdbcTemplate\u7684\u65b9\u6cd5\u90fd\u4f1a\u4f7f\u7528\u4e0d\u540c\u7684\u8fde\u63a5\uff0c\u56e0\u6b64\u5982\u679c\u5728INSERT\u65f6\u4f7f\u7528\u7684\u8fde\u63a5\u672a\u8fdb\u884c\u63d0\u4ea4\uff0c\u540e\u7eed\u7684SELECT\u65f6\u4f7f\u7528\u7684\u8fde\u63a5\u5c06\u65e0\u6cd5\u627e\u5230INSERT\u7684\u8bb0\u5f55\u3002\uff08\u987a\u4fbf\u63d0\u4e00\u4e0b\uff0c\u8fd9\u662f\u5728\u8fde\u63a5\u7684\u9694\u79bb\u7ea7\u522b\u4e3a\u201cREAD COMMITTED\u201d\u65f6\u7684\u884c\u4e3a\uff0c\u9700\u8981\u6ce8\u610f\u7684\u662f\uff0c\u6839\u636e\u9694\u79bb\u7ea7\u522b\u7684\u4e0d\u540c\uff0c\u53ef\u80fd\u4f1a\u627e\u5230\u8bb0\u5f55\uff09\u3002<\/p>\n<p>\u53ef\u4ee5\u8bd5\u8bd5\u5c06\u81ea\u52a8\u63d0\u4ea4\u6807\u5fd7\u8bbe\u7f6e\u4e3atrue\u5e76\u91cd\u65b0\u8fd0\u884c\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"nd\">@Bean<\/span>\r\n<span class=\"kd\">public<\/span> <span class=\"nc\">DataSource<\/span> <span class=\"nf\">dataSource<\/span><span class=\"o\">(<\/span><span class=\"nc\">DataSourceProperties<\/span> <span class=\"n\">properties<\/span><span class=\"o\">)<\/span> <span class=\"kd\">throws<\/span> <span class=\"nc\">ClassNotFoundException<\/span> <span class=\"o\">{<\/span>\r\n    <span class=\"nc\">SimpleDriverDataSource<\/span> <span class=\"n\">dataSource<\/span> <span class=\"o\">=<\/span> <span class=\"k\">new<\/span> <span class=\"nc\">SimpleDriverDataSource<\/span><span class=\"o\">();<\/span>\r\n    <span class=\"c1\">\/\/ ...<\/span>\r\n    <span class=\"n\">connectionProperties<\/span><span class=\"o\">.<\/span><span class=\"na\">setProperty<\/span><span class=\"o\">(<\/span><span class=\"s\">\"autoCommit\"<\/span><span class=\"o\">,<\/span> <span class=\"s\">\"true\"<\/span><span class=\"o\">);<\/span> <span class=\"c1\">\/\/ \u2605\u2605\u2605 true\u306b\u5909\u66f4 \u2605\u2605\u2605<\/span>\r\n    <span class=\"n\">dataSource<\/span><span class=\"o\">.<\/span><span class=\"na\">setConnectionProperties<\/span><span class=\"o\">(<\/span><span class=\"n\">connectionProperties<\/span><span class=\"o\">);<\/span>\r\n    <span class=\"k\">return<\/span> <span class=\"n\">dataSource<\/span><span class=\"o\">;<\/span>\r\n<span class=\"o\">}<\/span>\r\n<\/code><\/pre>\n<pre class=\"post-pre\"><code>$ .\/mvnw spring-boot:run\r\n...\r\n2017-02-12 18:15:25.097 DEBUG 46292 --- [           main] o.s.jdbc.core.JdbcTemplate               : Executing SQL update [INSERT INTO city (name, state, country) VALUES ('San Francisco', 'CA', 'US')]\r\n2017-02-12 18:15:25.098 DEBUG 46292 --- [           main] o.s.jdbc.datasource.DataSourceUtils      : Fetching JDBC Connection from DataSource\r\n2017-02-12 18:15:25.098 DEBUG 46292 --- [           main] o.s.j.datasource.SimpleDriverDataSource  : Creating new JDBC Driver Connection to [jdbc:h2:mem:testdb;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE]\r\n2017-02-12 18:15:25.100 DEBUG 46292 --- [           main] o.s.jdbc.core.JdbcTemplate               : SQL update affected 1 rows\r\n2017-02-12 18:15:25.103 DEBUG 46292 --- [           main] o.s.jdbc.datasource.DataSourceUtils      : Returning JDBC Connection to DataSource\r\n2017-02-12 18:15:25.103 DEBUG 46292 --- [           main] o.s.jdbc.core.JdbcTemplate               : Executing SQL query [SELECT id, name, state, country FROM city WHERE id = 1]\r\n2017-02-12 18:15:25.103 DEBUG 46292 --- [           main] o.s.jdbc.datasource.DataSourceUtils      : Fetching JDBC Connection from DataSource\r\n2017-02-12 18:15:25.103 DEBUG 46292 --- [           main] o.s.j.datasource.SimpleDriverDataSource  : Creating new JDBC Driver Connection to [jdbc:h2:mem:testdb;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE]\r\n2017-02-12 18:15:25.123 DEBUG 46292 --- [           main] o.s.jdbc.datasource.DataSourceUtils      : Returning JDBC Connection to DataSource\r\n{ID=1, NAME=San Francisco, STATE=CA, COUNTRY=US}\r\n2017-02-12 18:15:25.126  INFO 46292 --- [           main] com.example.SpringTxDemoApplication      : Started SpringTxDemoApplication in 1.636 seconds (JVM running for 5.305)\r\n...\r\n<\/code><\/pre>\n<p>\u5f53\u4e0a\u8ff0\u7684\u65e5\u5fd7\u88ab\u8f93\u51fa\u65f6\uff0cSELECT\u64cd\u4f5c\u6210\u529f\u3002\u8fd9\u662f\u56e0\u4e3a\u5c06\u81ea\u52a8\u63d0\u4ea4\u6807\u5fd7\u8bbe\u7f6e\u4e3atrue\uff0c\u4f7f\u5f97\u5728INSERT\u64cd\u4f5c\u6210\u529f\u65f6\uff0cConnection\u88ab\u63d0\u4ea4\u3002<\/p>\n<p>\u5982\u679c\u5c06\u81ea\u52a8\u63d0\u4ea4\u6807\u5fd7\u8bbe\u7f6e\u4e3atrue\uff0c\u5c31\u53ef\u4ee5\u7ed3\u675f\u4e00\u5207\u5417\uff1f\u5f53\u7136\uff0c\u5e76\u4e0d\u662f\u8fd9\u6837\u7684\u3002\u6211\u8ba4\u4e3a\u6ca1\u6709\u5fc5\u8981\u8fdb\u884c\u89e3\u91ca\uff0c\u4f46\u662f\u5982\u679c\u8fdb\u884c\u591a\u4e2a\u66f4\u65b0\u64cd\u4f5c\u7684\u8bdd\uff0c\u9700\u8981\u5728\u6240\u6709\u66f4\u65b0\u64cd\u4f5c\u6210\u529f\u65f6\u8fdb\u884c\u63d0\u4ea4\uff0c\u5982\u679c\u6709\u90e8\u5206\u66f4\u65b0\u64cd\u4f5c\u5931\u8d25\uff0c\u5219\u9700\u8981\u8fdb\u884c\u56de\u6eda\u64cd\u4f5c\uff08\u5373\u6240\u8c13\u7684\u4e8b\u52a1\u63a7\u5236\uff09\u3002\u5728\u8fd9\u79cd\u60c5\u51b5\u4e0b\uff0c\u4e0d\u80fd\u4f7f\u7528\u6bcf\u6b21\u6267\u884cSQL\u90fd\u4f1a\u81ea\u52a8\u63d0\u4ea4\u7684\u201c\u81ea\u52a8\u63d0\u4ea4\u6807\u5fd7=true\u201d\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"nd\">@Override<\/span>\r\n<span class=\"kd\">public<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">run<\/span><span class=\"o\">(<\/span><span class=\"nc\">String<\/span><span class=\"o\">...<\/span> <span class=\"n\">args<\/span><span class=\"o\">)<\/span> <span class=\"kd\">throws<\/span> <span class=\"nc\">Exception<\/span> <span class=\"o\">{<\/span>\r\n\r\n    <span class=\"n\">jdbcTemplate<\/span><span class=\"o\">.<\/span><span class=\"na\">update<\/span><span class=\"o\">(<\/span><span class=\"s\">\"INSERT INTO city (name, state, country) VALUES ('San Francisco', 'CA', 'US')\"<\/span><span class=\"o\">);<\/span>\r\n    <span class=\"n\">jdbcTemplate<\/span><span class=\"o\">.<\/span><span class=\"na\">update<\/span><span class=\"o\">(<\/span><span class=\"s\">\"INSERT INTO city (name, state, country) VALUES ('\u8c4a\u5cf6\u533a', '\u6771\u4eac', 'JPN')\"<\/span><span class=\"o\">);<\/span>\r\n\r\n    <span class=\"c1\">\/\/ ...  <\/span>\r\n<span class=\"o\">}<\/span>\r\n<\/code><\/pre>\n<h1>\u5728\u4f7f\u7528JdbcTemplate\u65f6\u5904\u7406\u8fde\u63a5\u65f6\uff0c\u5728\u4e8b\u52a1\u7ba1\u7406\u4e0b\u7684\u5904\u7406\u65b9\u5f0f\u3002<\/h1>\n<p>\u5982\u679c\u60f3\u5728\u540c\u4e00\u4e8b\u52a1\u4e2d\u6267\u884c\u591a\u4e2a\u66f4\u65b0\u64cd\u4f5c\uff0c\u5e94\u8be5\u600e\u4e48\u505a\u5462\uff1f\u6b63\u5982Spring\u7528\u6237\u6240\u77e5\u9053\u7684\u90a3\u6837\uff0c\u53ea\u9700\u5728\u5e0c\u671b\u5728\u4e8b\u52a1\u7ba1\u7406\u4e0b\u6267\u884c\u7684\u7c7b\u6216\u65b9\u6cd5\u4e0a\u6dfb\u52a0@Transactional\u6ce8\u89e3\u5373\u53ef\u3002<\/p>\n<blockquote><p>\u8bf7\u6ce8\u610f\uff1a<\/p>\n<p>\u5982\u679c\u4f7f\u7528Spring Boot\uff0c\u5219\u4e0d\u9700\u8981\u4efb\u4f55\u7279\u6b8a\u914d\u7f6e&#8230;\u4f46\u662f\u5982\u679c\u4e0d\u4f7f\u7528Spring Boot\uff0c\u5219\u9700\u8981\uff1a<\/p>\n<p>&#8211; \u6dfb\u52a0@EnableTransactionManagement\u6ce8\u89e3<br \/>\n&#8211; \u5b9a\u4e49PlatformTransactionManager\uff08\u5982\u679c\u662fDB\u4e8b\u52a1\uff0c\u5219\u662fDataSourceTransactionManager\uff09\u7684Bean<\/p>\n<p>\uff08\u672c\u6587\u7ae0\u4e2d\u5c06\u4e0d\u5305\u542b\u975eSpring Boot\u7684\u8bf4\u660e\uff09<\/p><\/blockquote>\n<p>\u90a3\u4e48\uff0c\u8ba9\u6211\u4eec\u5b9e\u9645\u8fd0\u884c\u9a8c\u8bc1\u5e94\u7528\u7a0b\u5e8f\u5e76\u5728\u5176\u4e0a\u52a0\u4e0a@Transactional\uff08\u540c\u65f6\u4e0d\u8981\u5fd8\u8bb0\u5c06\u81ea\u52a8\u63d0\u4ea4\u6807\u5fd7\u8bbe\u7f6e\u4e3afalse\uff01\uff01\uff09\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"nd\">@Transactional<\/span> <span class=\"c1\">\/\/ \u2605\u2605\u2605 \u30e1\u30bd\u30c3\u30c9\u306b\u4ed8\u4e0e \u2605\u2605\u2605<\/span>\r\n<span class=\"nd\">@Override<\/span>\r\n<span class=\"kd\">public<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">run<\/span><span class=\"o\">(<\/span><span class=\"nc\">String<\/span><span class=\"o\">...<\/span> <span class=\"n\">args<\/span><span class=\"o\">)<\/span> <span class=\"kd\">throws<\/span> <span class=\"nc\">Exception<\/span> <span class=\"o\">{<\/span>\r\n\r\n    <span class=\"n\">jdbcTemplate<\/span><span class=\"o\">.<\/span><span class=\"na\">update<\/span><span class=\"o\">(<\/span><span class=\"s\">\"INSERT INTO city (name, state, country) VALUES ('San Francisco', 'CA', 'US')\"<\/span><span class=\"o\">);<\/span>\r\n\r\n    <span class=\"nc\">Map<\/span><span class=\"o\">&lt;<\/span><span class=\"nc\">String<\/span><span class=\"o\">,<\/span> <span class=\"nc\">Object<\/span><span class=\"o\">&gt;<\/span> <span class=\"n\">city<\/span> <span class=\"o\">=<\/span> <span class=\"n\">jdbcTemplate<\/span><span class=\"o\">.<\/span><span class=\"na\">queryForMap<\/span><span class=\"o\">(<\/span><span class=\"s\">\"SELECT id, name, state, country FROM city WHERE id = 1\"<\/span><span class=\"o\">);<\/span>\r\n\r\n    <span class=\"nc\">System<\/span><span class=\"o\">.<\/span><span class=\"na\">out<\/span><span class=\"o\">.<\/span><span class=\"na\">println<\/span><span class=\"o\">(<\/span><span class=\"n\">city<\/span><span class=\"o\">);<\/span>\r\n\r\n<span class=\"o\">}<\/span>\r\n<\/code><\/pre>\n<p>\u5728\u7ed9\u4e88 @Transactional \u6807\u6ce8\u540e\uff0c\u6267\u884cSpring Boot\u5e94\u7528\u7a0b\u5e8f\u540e\uff0cSELECT\u64cd\u4f5c\u4e5f\u53d8\u5f97\u6210\u529f\u4e86\u3002<\/p>\n<pre class=\"post-pre\"><code>$ .\/mvnw spring-boot:run\r\n...\r\n2017-02-12 18:42:46.689 DEBUG 46340 --- [           main] o.s.j.d.DataSourceTransactionManager     : Creating new transaction with name [com.example.SpringTxDemoApplication$$EnhancerBySpringCGLIB$$7f2a8641.run]: PROPAGATION_REQUIRED,ISOLATION_DEFAULT; ''\r\n2017-02-12 18:42:46.690 DEBUG 46340 --- [           main] o.s.j.datasource.SimpleDriverDataSource  : Creating new JDBC Driver Connection to [jdbc:h2:mem:testdb;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE]\r\n2017-02-12 18:42:46.690 DEBUG 46340 --- [           main] o.s.j.d.DataSourceTransactionManager     : Acquired Connection [conn1: url=jdbc:h2:mem:testdb user=SA] for JDBC transaction\r\n2017-02-12 18:42:46.697 DEBUG 46340 --- [           main] o.s.jdbc.core.JdbcTemplate               : Executing SQL update [INSERT INTO city (name, state, country) VALUES ('San Francisco', 'CA', 'US')]\r\n2017-02-12 18:42:46.700 DEBUG 46340 --- [           main] o.s.jdbc.core.JdbcTemplate               : SQL update affected 1 rows\r\n2017-02-12 18:42:46.703 DEBUG 46340 --- [           main] o.s.jdbc.core.JdbcTemplate               : Executing SQL query [SELECT id, name, state, country FROM city WHERE id = 1]\r\n{ID=1, NAME=San Francisco, STATE=CA, COUNTRY=US}\r\n2017-02-12 18:42:46.721 DEBUG 46340 --- [           main] o.s.j.d.DataSourceTransactionManager     : Initiating transaction commit\r\n2017-02-12 18:42:46.722 DEBUG 46340 --- [           main] o.s.j.d.DataSourceTransactionManager     : Committing JDBC transaction on Connection [conn1: url=jdbc:h2:mem:testdb user=SA]\r\n2017-02-12 18:42:46.722 DEBUG 46340 --- [           main] o.s.j.d.DataSourceTransactionManager     : Releasing JDBC Connection [conn1: url=jdbc:h2:mem:testdb user=SA] after transaction\r\n2017-02-12 18:42:46.722 DEBUG 46340 --- [           main] o.s.jdbc.datasource.DataSourceUtils      : Returning JDBC Connection to DataSource\r\n..\r\n<\/code><\/pre>\n<p>\u67e5\u770b\u65e5\u5fd7\u53d1\u73b0&#8230;\u751f\u6210\u8fde\u63a5\uff08\u65b0\u5efaJDBC\u9a71\u52a8\u8fde\u63a5\u81f3[jdbc:h2:mem:testdb;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE]\uff09\u7684\u65e5\u5fd7\u8f93\u51fa\u4ec5\u4ec5\u53ea\u6709\u4e00\u6b21\uff0c\u800cDataSourceTransactionManager\u7684\u65e5\u5fd7\uff08\u5305\u62ec\u4e8b\u52a1\u5f00\u59cb\u7684\u65e5\u5fd7\u7b49\uff09\u5f00\u59cb\u88ab\u8f93\u51fa\u3002\u4ece\u65e5\u5fd7\u6765\u770b\uff0c\u4f3c\u4e4e\u5b58\u5728\u591a\u4e2a\u64cd\u4f5c\u5171\u4eab\u540c\u4e00\u4e2a\u8fde\u63a5\u3002<\/p>\n<p>\u90a3\u4e48\uff0c\u6211\u4eec\u6765\u89e3\u6790\u4e00\u4e0b\u4e3a\u4ec0\u4e48\u4f1a\u5171\u4eab\u8fde\u63a5\u3002<br \/>\n\u4e0b\u9762\u7684\u56fe\u8868\u5c55\u793a\u4e86\u5728Spring\u7684\u4e8b\u52a1\u7ba1\u7406\u4e0b\u8c03\u7528JdbcTemplate\u65b9\u6cd5\u65f6\uff0c\u5982\u4f55\u751f\u6210\u548c\u4f7f\u7528\u8fde\u63a5\u3002<br \/>\n\u867d\u7136\u6709\u70b9\u590d\u6742\uff0c\u4f46\u53ea\u8981\u9010\u4e2a\u67e5\u770b\uff0c\u76f8\u4fe1\u4f60\u4e00\u5b9a\u80fd\u591f\u7406\u89e3\u7684\uff01\uff01\uff08\u53ef\u80fd\u6211\u7684\u89e3\u91ca\u6709\u4e9b\u4e0d\u6e05\u695a\u2026\u2026\uff09<\/p>\n<div><img decoding=\"async\" class=\"post-images\" title=\"\" src=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d3e4337434c4406c8a416\/47-0.png\" alt=\"spring-jdbc-tx.png\" \/><\/div>\n<div>\n<div class=\"post-table\">\u9805\u756a\u8aac\u660e\u2460Controller\u304b\u3089Spring\u306e\u30c8\u30e9\u30f3\u30b6\u30af\u30b7\u30e7\u30f3\u7ba1\u7406\u4e0b\u306eService\u30af\u30e9\u30b9\u306e\u30e1\u30bd\u30c3\u30c9\u3092\u547c\u3073\u51fa\u3059\u3002\u30c8\u30e9\u30f3\u30b6\u30af\u30b7\u30e7\u30f3\u7ba1\u7406\u4e0b\u306eService\u30af\u30e9\u30b9\u306e\u30e1\u30bd\u30c3\u30c9\u3092\u547c\u3073\u51fa\u3059\u3068\u3001\u5b9f\u969b\u306b\u306fProxy\u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u306e\u30e1\u30bd\u30c3\u30c9\u304c\u547c\u3073\u51fa\u3055\u308c\u3001\u30c8\u30e9\u30f3\u30b6\u30af\u30b7\u30e7\u30f3\u5236\u5fa1\u3092\u884c\u3046\u30af\u30e9\u30b9(TransactionInterceptor)\u304c\u547c\u3073\u51fa\u3055\u308c\u308b\u4ed5\u7d44\u307f\u306b\u306a\u3063\u3066\u3044\u307e\u3059\u3002\u2461<code>TransactionInterceptor<\/code>\u306f\u3001<code>DataSourceTransactionManager<\/code>\u306e\u30e1\u30bd\u30c3\u30c9\u3092\u547c\u3073\u51fa\u3057\u3066\u30c8\u30e9\u30f3\u30b6\u30af\u30b7\u30e7\u30f3\u306e\u958b\u59cb\u3092\u4f9d\u983c\u3059\u308b\u3002\u2462<code>DataSourceTransactionManager<\/code>\u306f\u3001\u81ea\u8eab\u306b\u5272\u308a\u5f53\u3066\u3089\u308c\u305f<code>DataSource<\/code>\u304b\u3089<code>Connection<\/code>(<code>autoCommit<\/code>\u306f<code>false<\/code>\u3068\u306a\u308b)\u3092\u53d6\u5f97\u3057<code>ConnectionHolder<\/code>(\u30c8\u30e9\u30f3\u30b6\u30af\u30b7\u30e7\u30f3\u5185\u3067\u5171\u6709\u3059\u308b<code>Connection<\/code>\u3092\u4fdd\u6301\u3059\u308b\u9818\u57df)\u3092\u751f\u6210\u3059\u308b\u3002\u751f\u6210\u3057\u305f<code>ConnectionHolder<\/code>\u306f\u3001<code>TransactionSynchronizationManager<\/code>\u30af\u30e9\u30b9\u4e0a\u306e\u30b9\u30ec\u30c3\u30c9\u30ed\u30fc\u30ab\u30eb\u306a<code>Map<\/code>\u578b\u306e\u5909\u6570\u306b\u683c\u7d0d\u3055\u308c\u307e\u3059\uff08<code>Map<\/code>\u306b\u683c\u7d0d\u3059\u308b\u969b\u306e\u30ad\u30fc\u3068\u3057\u3066<code>DataSource<\/code>\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u304c\u5229\u7528\u3055\u308c\u307e\u3059\uff09\u3002\u2463<code>TransactionInterceptor<\/code>\u306f\u3001\u30c8\u30e9\u30f3\u30b6\u30af\u30b7\u30e7\u30f3\u958b\u59cb\u5f8c\u306bService\u306e\u30e1\u30bd\u30c3\u30c9\u3092\u547c\u3073\u51fa\u3059\u3002\u2464Service\u304b\u3089<code>JdbcTemplate<\/code>\u306e\u30e1\u30bd\u30c3\u30c9\u3092\u547c\u3073\u51fa\u3059\u3002\u2465<code>JdbcTemplate<\/code>\u306f\u3001<code>DataSourceUtil#getConnection(DataSource)<\/code>\u3092\u4ecb\u3057\u3066\u30c8\u30e9\u30f3\u30b6\u30af\u30b7\u30e7\u30f3\u306b\u5272\u308a\u5f53\u3066\u3089\u308c\u3066\u3044\u308b<code>Connection<\/code>\u3092\u53d6\u5f97\u3057\u3001\u53d6\u5f97\u3057\u305f<code>Connection<\/code>\u306e\u30e1\u30bd\u30c3\u30c9\u3092\u4f7f\u7528\u3057\u3066SQL\u306e\u5b9f\u884c\u3092\u4f9d\u983c\u3059\u308b\u3002<code>DataSourceUtil<\/code>\u306f\u3001<code>TransactionSynchronizationManager<\/code>\u30af\u30e9\u30b9\u4e0a\u306e\u30b9\u30ec\u30c3\u30c9\u30ed\u30fc\u30ab\u30eb\u306a<code>Map<\/code>\u578b\u306e\u5909\u6570\u304b\u3089<code>ConnectionHolder<\/code>\u3092\u53d6\u5f97\u3059\u308b\u969b\u306e\u30ad\u30fc\u3068\u3057\u3066\u5f15\u6570\u3067\u53d7\u3051\u53d6\u3063\u305f<code>DataSource<\/code>\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u3092\u6307\u5b9a\u3057\u307e\u3059\u3002\u305d\u306e\u305f\u3081\u3001<code>JdbcTemplate<\/code>\u3068<code>DataSourceTransactionManager<\/code>\u306b\u6307\u5b9a\u3059\u308b<code>DataSource<\/code>\u306f\u3001\u540c\u4e00\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u306e\u3082\u306e\u3092\u6307\u5b9a\u3059\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002\u2466<code>Connection<\/code>(<code>Connection<\/code>\u304b\u3089\u53d6\u5f97\u3057\u305f<code>Statement<\/code>)\u306f\u3001\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u306bSQL\u3092\u5b9f\u884c\u3059\u308b\u3002<\/div>\n<\/div>\n<p>\u7b80\u5355\u5730\u8bf4\uff0c\u5c31\u662f\u5728\u4e8b\u52a1\u5f00\u59cb\u65f6\u4ece\u6570\u636e\u6e90\u83b7\u53d6\u4e00\u4e2a\u8fde\u63a5\uff0c\u7136\u540e\u901a\u8fc7\u4f7f\u7528DataSourceUtil\uff08TransactionSynchronizationManager\uff09\u7c7b\u7684\u65b9\u6cd5\u6765\u5171\u4eab\u8be5\u8fde\u63a5\uff0c\u5728\u540e\u7eed\u7684\u64cd\u4f5c\u4e2d\uff0c\u80fd\u591f\u5728\u540c\u4e00\u4e8b\u52a1\u4e2d\u6267\u884c\u591a\u4e2a\u64cd\u4f5c\u7684\u673a\u5236\u3002\uff08\u7b2c3\u70b9\u548c\u7b2c6\u70b9\u662f\u5173\u952e\uff09<\/p>\n<p>\u5c3d\u7ba1\u56fe\u8868\u4e2d\u6ca1\u6709\u8bb0\u5f55\uff0c\u4f46\u5f53Service\u7c7b\u7684\u65b9\u6cd5\u8c03\u7528\u7ed3\u675f\u65f6\uff0cTransactionInterceptor\u4f1a\u8c03\u7528DataSourceTransactionManager\u7684commit\u65b9\u6cd5\u6216rollback\u65b9\u6cd5\uff0c\u4ece\u800c\u8c03\u7528\u88ab\u5206\u914d\u7ed9\u4e8b\u52a1\u7684Connection\u7684commit\u65b9\u6cd5\u6216rollback\u65b9\u6cd5\u6765\u5b9e\u73b0\u3002<\/p>\n<h1>\u9664\u4e86JDBC\u5916\u7684\u4e8b\u52a1\u662f\u4ec0\u4e48\uff1f JDBC de sh\u00ec ?)<\/h1>\n<p>\u9664\u4e86JDBC\u4e4b\u5916\uff0cSpring\u548c\u5176\u5b50\u9879\u76ee\u63d0\u4f9b\u4e86\u4e00\u7cfb\u5217\u7528\u4e8e\u4e0d\u540c\u57fa\u7840\u8bbe\u65bd\u7684PlatformTransactionManager\uff0c\u5305\u62ecJMS\uff08Java\u6d88\u606f\u670d\u52a1\uff09\u3001JTA\uff08Java\u4e8b\u52a1API\uff09\u3001JPA\uff08Java\u6301\u4e45\u5316API\uff09\u7b49\u3002\u867d\u7136\u5404\u79cd\u673a\u5236\u7528\u4e8e\u5728\u540c\u4e00\u4e8b\u52a1\u4e2d\u6267\u884c\u591a\u4e2a\u64cd\u4f5c\u7565\u6709\u4e0d\u540c\uff0c\u4f46\u662f\u50cfJDBC\u4e00\u6837\uff0c\u5b83\u4eec\u901a\u5e38\u91c7\u7528\u901a\u8fc7TransactionSynchronizationManager\u5171\u4eab\u5fc5\u8981\u7684\u4e8b\u52a1\u63a7\u5236\u5bf9\u8c61\u7684\u65b9\u5f0f\u3002\uff08\u81f3\u5c11JMS\u548cJPA\u91c7\u7528\u4e86\u76f8\u540c\u7684\u65b9\u5f0f\uff09<\/p>\n<blockquote><p>\u987a\u4fbf\u63d0\u4e00\u4e0b\uff0c\u6211\u7ecf\u5e38\u5728\u5de5\u4f5c\u4e2d\u4f7f\u7528\u7684MyBatis(MyBatis-Spring)\u7684SqlSession\u4e5f\u901a\u8fc7TransactionSynchronizationManager\u6765\u63a7\u5236\u5728\u540c\u4e00\u4e8b\u52a1\u5185\u5171\u4eab\u76f8\u540c\u7684SqlSession\u3002<\/p><\/blockquote>\n<h1>\u6700\u540e<\/h1>\n<p>\u7531\u65bc\u6211\u6c92\u6709\u9032\u884c\u6574\u7406\uff0c\u6240\u4ee5\u4f5c\u70ba\u6700\u5f8c&#8230;<br \/>\n\u6211\u4e45\u9055\u5730\u5beb\u4e0b\u4e86&#8221;\u7406\u89e3\u7cfb\u5217&#8221;\u3002\u9019\u6b21\u6211\u4ecb\u7d39\u4e86Spring\u7684\u6838\u5fc3\u529f\u80fd\u4e4b\u4e00\uff0c\u5373\u4ea4\u6613\u7ba1\u7406\u6a5f\u5236\u7684\u4e00\u90e8\u5206\u3002\u7531\u65bcSpring\u6709\u5404\u7a2e\u529f\u80fd\uff0c\u6240\u4ee5\u5982\u679c\u5fc3\u60c5\u597d\u7684\u8a71\uff08\u53ea\u8981\u6211\u81ea\u5df1\u80fd\u5920\u7406\u89e3\uff09\uff0c\u6211\u6703\u8003\u616e\u518d\u6b21\u767c\u8868\u3002<\/p>\n<p>\u56e0\u4e3a\u300c\u52a8\u4e86\u6240\u4ee5\u53ef\u4ee5\uff01\u800c\u4e0d\u662f&#8230;&#8230;\u4e3a\u4ec0\u4e48\uff1f\u600e\u4e48\u505a\u5230\u7684\uff1f\u60f3\u8981\u89e3\u5f00\u6b63\u5728\u8fd0\u52a8\u7684\u4eba\u7684\u8c1c\u5e95\u300d<\/p>\n<h1>\u76f8\u5173\u6761\u76ee (Guanxi entari)<\/h1>\n<p>\u4ee5\u4e0b\u662f\u4e0e\u4ea4\u6613\u76f8\u5173\u7684\u6761\u76ee\u3002<\/p>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">3rd\u30d1\u30fc\u30c6\u30a3\u88fd\u306eDB\u30a2\u30af\u30bb\u30b9\u30e9\u30a4\u30d6\u30e9\u30ea\u3092Spring\u306e\u30c8\u30e9\u30f3\u30b6\u30af\u30b7\u30e7\u30f3\u7ba1\u7406\u4e0b\u306b\u53c2\u52a0\u3055\u305b\u308b\u65b9\u6cd5<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">Spring Boot 1.5\u304b\u3089PlatformTransactionManager\u7528\u306eCustomizer\u304c\u8ffd\u52a0\u3055\u308c\u308b<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">Spring Boot\u3067@Transactional\u3092\u4f7f\u308f\u305a\u306b\u30c8\u30e9\u30f3\u30b6\u30af\u30b7\u30e7\u30f3\u5236\u5fa1\u3092\u884c\u3046\u65b9\u6cd5<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">Spring\u306eDataSourceTransactionManager\u3092\u4f7f\u3046\u3068\u30a8\u30e9\u30fc\u6642\u306bCommit\u3055\u308c\u308b\u53ef\u80fd\u6027\u3042\u308a\uff01\uff1f<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">MyBatis-Spring 1.3\u304b\u3089Spring\u306e\u30c8\u30e9\u30f3\u30b6\u30af\u30b7\u30e7\u30f3\u30bf\u30a4\u30e0\u30a2\u30a6\u30c8\u5024\u304c\u9023\u643a\u3055\u308c\u308b\uff01\uff01<\/ul>\n<h1>\u53c2\u8003\u7f51\u7ad9<\/h1>\n<p>\u6211\u53c2\u8003\u4e86\u4ee5\u4e0b\u7f51\u7ad9\u3002<\/p>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">http:\/\/docs.spring.io\/spring\/docs\/current\/spring-framework-reference\/htmlsingle\/#tx-decl-explained<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">http:\/\/docs.spring.io\/spring\/docs\/current\/spring-framework-reference\/htmlsingle\/#jdbc-DataSourceTransactionManager<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>\u672c\u6b21\uff0c\u6211\u5c06\u89e3\u91ca\u6709\u5173Spring\u7684\u6570\u636e\u5e93\u8fde\u63a5\u5171\u4eab\u65b9\u6cd5\uff08\u5373\u5728\u540c\u4e00\u4e2a\u4e8b\u52a1\u4e2d\u6267\u884c\u591a\u4e2aSQL\u7684\u65b9\u6cd5\uff09\u7684\u673a\u5236\u3002 \u53ea\u662f\u89e3\u91ca\u673a [&hellip;]<\/p>\n","protected":false},"author":10,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-40102","post","type-post","status-publish","format-standard","hentry","category-uncategorized"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v21.5 (Yoast SEO v21.5) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>\u7406\u89e3Spring\u6846\u67b6\u4e2d\u7684\u6570\u636e\u5e93\u8fde\u63a5\u5171\u4eab\u65b9\u6cd5\uff08\u6570\u636e\u5e93\u4e8b\u52a1\uff09 - Blog - Silicon Cloud<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.silicloud.com\/zh\/blog\/\u7406\u89e3spring\u6846\u67b6\u4e2d\u7684\u6570\u636e\u5e93\u8fde\u63a5\u5171\u4eab\u65b9\u6cd5\uff08\u6570\u636e\u5e93\u4e8b\u52a1\/\" \/>\n<meta property=\"og:locale\" content=\"zh_CN\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"\u7406\u89e3Spring\u6846\u67b6\u4e2d\u7684\u6570\u636e\u5e93\u8fde\u63a5\u5171\u4eab\u65b9\u6cd5\uff08\u6570\u636e\u5e93\u4e8b\u52a1\uff09\" \/>\n<meta property=\"og:description\" content=\"\u672c\u6b21\uff0c\u6211\u5c06\u89e3\u91ca\u6709\u5173Spring\u7684\u6570\u636e\u5e93\u8fde\u63a5\u5171\u4eab\u65b9\u6cd5\uff08\u5373\u5728\u540c\u4e00\u4e2a\u4e8b\u52a1\u4e2d\u6267\u884c\u591a\u4e2aSQL\u7684\u65b9\u6cd5\uff09\u7684\u673a\u5236\u3002 \u53ea\u662f\u89e3\u91ca\u673a [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.silicloud.com\/zh\/blog\/\u7406\u89e3spring\u6846\u67b6\u4e2d\u7684\u6570\u636e\u5e93\u8fde\u63a5\u5171\u4eab\u65b9\u6cd5\uff08\u6570\u636e\u5e93\u4e8b\u52a1\/\" \/>\n<meta property=\"og:site_name\" content=\"Blog - Silicon Cloud\" \/>\n<meta property=\"article:published_time\" content=\"2023-08-29T18:55:07+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2024-05-04T06:28:06+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d3e4337434c4406c8a416\/29-0.png\" \/>\n<meta name=\"author\" content=\"\u5b87, \u534e\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"\u4f5c\u8005\" \/>\n\t<meta name=\"twitter:data1\" content=\"\u5b87, \u534e\" \/>\n\t<meta name=\"twitter:label2\" content=\"\u9884\u8ba1\u9605\u8bfb\u65f6\u95f4\" \/>\n\t<meta name=\"twitter:data2\" content=\"7 \u5206\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e7%90%86%e8%a7%a3spring%e6%a1%86%e6%9e%b6%e4%b8%ad%e7%9a%84%e6%95%b0%e6%8d%ae%e5%ba%93%e8%bf%9e%e6%8e%a5%e5%85%b1%e4%ba%ab%e6%96%b9%e6%b3%95%ef%bc%88%e6%95%b0%e6%8d%ae%e5%ba%93%e4%ba%8b%e5%8a%a1\/\",\"url\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e7%90%86%e8%a7%a3spring%e6%a1%86%e6%9e%b6%e4%b8%ad%e7%9a%84%e6%95%b0%e6%8d%ae%e5%ba%93%e8%bf%9e%e6%8e%a5%e5%85%b1%e4%ba%ab%e6%96%b9%e6%b3%95%ef%bc%88%e6%95%b0%e6%8d%ae%e5%ba%93%e4%ba%8b%e5%8a%a1\/\",\"name\":\"\u7406\u89e3Spring\u6846\u67b6\u4e2d\u7684\u6570\u636e\u5e93\u8fde\u63a5\u5171\u4eab\u65b9\u6cd5\uff08\u6570\u636e\u5e93\u4e8b\u52a1\uff09 - Blog - Silicon Cloud\",\"isPartOf\":{\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#website\"},\"datePublished\":\"2023-08-29T18:55:07+00:00\",\"dateModified\":\"2024-05-04T06:28:06+00:00\",\"author\":{\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/513018e4e121d3add1b7c5de8be21458\"},\"breadcrumb\":{\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e7%90%86%e8%a7%a3spring%e6%a1%86%e6%9e%b6%e4%b8%ad%e7%9a%84%e6%95%b0%e6%8d%ae%e5%ba%93%e8%bf%9e%e6%8e%a5%e5%85%b1%e4%ba%ab%e6%96%b9%e6%b3%95%ef%bc%88%e6%95%b0%e6%8d%ae%e5%ba%93%e4%ba%8b%e5%8a%a1\/#breadcrumb\"},\"inLanguage\":\"zh-Hans\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.silicloud.com\/zh\/blog\/%e7%90%86%e8%a7%a3spring%e6%a1%86%e6%9e%b6%e4%b8%ad%e7%9a%84%e6%95%b0%e6%8d%ae%e5%ba%93%e8%bf%9e%e6%8e%a5%e5%85%b1%e4%ba%ab%e6%96%b9%e6%b3%95%ef%bc%88%e6%95%b0%e6%8d%ae%e5%ba%93%e4%ba%8b%e5%8a%a1\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e7%90%86%e8%a7%a3spring%e6%a1%86%e6%9e%b6%e4%b8%ad%e7%9a%84%e6%95%b0%e6%8d%ae%e5%ba%93%e8%bf%9e%e6%8e%a5%e5%85%b1%e4%ba%ab%e6%96%b9%e6%b3%95%ef%bc%88%e6%95%b0%e6%8d%ae%e5%ba%93%e4%ba%8b%e5%8a%a1\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"\u9996\u9875\",\"item\":\"https:\/\/www.silicloud.com\/zh\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"\u7406\u89e3Spring\u6846\u67b6\u4e2d\u7684\u6570\u636e\u5e93\u8fde\u63a5\u5171\u4eab\u65b9\u6cd5\uff08\u6570\u636e\u5e93\u4e8b\u52a1\uff09\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#website\",\"url\":\"https:\/\/www.silicloud.com\/zh\/blog\/\",\"name\":\"Blog - Silicon Cloud\",\"description\":\"\",\"inLanguage\":\"zh-Hans\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/513018e4e121d3add1b7c5de8be21458\",\"name\":\"\u5b87, \u534e\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"zh-Hans\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/63cd45cbc05a35fc4ff7637a163c83c4962ef58d27472726c3a3e0c9c5194f0f?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/63cd45cbc05a35fc4ff7637a163c83c4962ef58d27472726c3a3e0c9c5194f0f?s=96&d=mm&r=g\",\"caption\":\"\u5b87, \u534e\"},\"url\":\"https:\/\/www.silicloud.com\/zh\/blog\/author\/yuhua\/\"},{\"@type\":\"ImageObject\",\"inLanguage\":\"zh-Hans\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e7%90%86%e8%a7%a3spring%e6%a1%86%e6%9e%b6%e4%b8%ad%e7%9a%84%e6%95%b0%e6%8d%ae%e5%ba%93%e8%bf%9e%e6%8e%a5%e5%85%b1%e4%ba%ab%e6%96%b9%e6%b3%95%ef%bc%88%e6%95%b0%e6%8d%ae%e5%ba%93%e4%ba%8b%e5%8a%a1\/#local-main-organization-logo\",\"url\":\"\",\"contentUrl\":\"\",\"caption\":\"Blog - Silicon Cloud\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"\u7406\u89e3Spring\u6846\u67b6\u4e2d\u7684\u6570\u636e\u5e93\u8fde\u63a5\u5171\u4eab\u65b9\u6cd5\uff08\u6570\u636e\u5e93\u4e8b\u52a1\uff09 - Blog - Silicon Cloud","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.silicloud.com\/zh\/blog\/\u7406\u89e3spring\u6846\u67b6\u4e2d\u7684\u6570\u636e\u5e93\u8fde\u63a5\u5171\u4eab\u65b9\u6cd5\uff08\u6570\u636e\u5e93\u4e8b\u52a1\/","og_locale":"zh_CN","og_type":"article","og_title":"\u7406\u89e3Spring\u6846\u67b6\u4e2d\u7684\u6570\u636e\u5e93\u8fde\u63a5\u5171\u4eab\u65b9\u6cd5\uff08\u6570\u636e\u5e93\u4e8b\u52a1\uff09","og_description":"\u672c\u6b21\uff0c\u6211\u5c06\u89e3\u91ca\u6709\u5173Spring\u7684\u6570\u636e\u5e93\u8fde\u63a5\u5171\u4eab\u65b9\u6cd5\uff08\u5373\u5728\u540c\u4e00\u4e2a\u4e8b\u52a1\u4e2d\u6267\u884c\u591a\u4e2aSQL\u7684\u65b9\u6cd5\uff09\u7684\u673a\u5236\u3002 \u53ea\u662f\u89e3\u91ca\u673a [&hellip;]","og_url":"https:\/\/www.silicloud.com\/zh\/blog\/\u7406\u89e3spring\u6846\u67b6\u4e2d\u7684\u6570\u636e\u5e93\u8fde\u63a5\u5171\u4eab\u65b9\u6cd5\uff08\u6570\u636e\u5e93\u4e8b\u52a1\/","og_site_name":"Blog - Silicon Cloud","article_published_time":"2023-08-29T18:55:07+00:00","article_modified_time":"2024-05-04T06:28:06+00:00","og_image":[{"url":"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d3e4337434c4406c8a416\/29-0.png"}],"author":"\u5b87, \u534e","twitter_card":"summary_large_image","twitter_misc":{"\u4f5c\u8005":"\u5b87, \u534e","\u9884\u8ba1\u9605\u8bfb\u65f6\u95f4":"7 \u5206"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.silicloud.com\/zh\/blog\/%e7%90%86%e8%a7%a3spring%e6%a1%86%e6%9e%b6%e4%b8%ad%e7%9a%84%e6%95%b0%e6%8d%ae%e5%ba%93%e8%bf%9e%e6%8e%a5%e5%85%b1%e4%ba%ab%e6%96%b9%e6%b3%95%ef%bc%88%e6%95%b0%e6%8d%ae%e5%ba%93%e4%ba%8b%e5%8a%a1\/","url":"https:\/\/www.silicloud.com\/zh\/blog\/%e7%90%86%e8%a7%a3spring%e6%a1%86%e6%9e%b6%e4%b8%ad%e7%9a%84%e6%95%b0%e6%8d%ae%e5%ba%93%e8%bf%9e%e6%8e%a5%e5%85%b1%e4%ba%ab%e6%96%b9%e6%b3%95%ef%bc%88%e6%95%b0%e6%8d%ae%e5%ba%93%e4%ba%8b%e5%8a%a1\/","name":"\u7406\u89e3Spring\u6846\u67b6\u4e2d\u7684\u6570\u636e\u5e93\u8fde\u63a5\u5171\u4eab\u65b9\u6cd5\uff08\u6570\u636e\u5e93\u4e8b\u52a1\uff09 - Blog - Silicon Cloud","isPartOf":{"@id":"https:\/\/www.silicloud.com\/zh\/blog\/#website"},"datePublished":"2023-08-29T18:55:07+00:00","dateModified":"2024-05-04T06:28:06+00:00","author":{"@id":"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/513018e4e121d3add1b7c5de8be21458"},"breadcrumb":{"@id":"https:\/\/www.silicloud.com\/zh\/blog\/%e7%90%86%e8%a7%a3spring%e6%a1%86%e6%9e%b6%e4%b8%ad%e7%9a%84%e6%95%b0%e6%8d%ae%e5%ba%93%e8%bf%9e%e6%8e%a5%e5%85%b1%e4%ba%ab%e6%96%b9%e6%b3%95%ef%bc%88%e6%95%b0%e6%8d%ae%e5%ba%93%e4%ba%8b%e5%8a%a1\/#breadcrumb"},"inLanguage":"zh-Hans","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.silicloud.com\/zh\/blog\/%e7%90%86%e8%a7%a3spring%e6%a1%86%e6%9e%b6%e4%b8%ad%e7%9a%84%e6%95%b0%e6%8d%ae%e5%ba%93%e8%bf%9e%e6%8e%a5%e5%85%b1%e4%ba%ab%e6%96%b9%e6%b3%95%ef%bc%88%e6%95%b0%e6%8d%ae%e5%ba%93%e4%ba%8b%e5%8a%a1\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.silicloud.com\/zh\/blog\/%e7%90%86%e8%a7%a3spring%e6%a1%86%e6%9e%b6%e4%b8%ad%e7%9a%84%e6%95%b0%e6%8d%ae%e5%ba%93%e8%bf%9e%e6%8e%a5%e5%85%b1%e4%ba%ab%e6%96%b9%e6%b3%95%ef%bc%88%e6%95%b0%e6%8d%ae%e5%ba%93%e4%ba%8b%e5%8a%a1\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"\u9996\u9875","item":"https:\/\/www.silicloud.com\/zh\/blog\/"},{"@type":"ListItem","position":2,"name":"\u7406\u89e3Spring\u6846\u67b6\u4e2d\u7684\u6570\u636e\u5e93\u8fde\u63a5\u5171\u4eab\u65b9\u6cd5\uff08\u6570\u636e\u5e93\u4e8b\u52a1\uff09"}]},{"@type":"WebSite","@id":"https:\/\/www.silicloud.com\/zh\/blog\/#website","url":"https:\/\/www.silicloud.com\/zh\/blog\/","name":"Blog - Silicon Cloud","description":"","inLanguage":"zh-Hans"},{"@type":"Person","@id":"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/513018e4e121d3add1b7c5de8be21458","name":"\u5b87, \u534e","image":{"@type":"ImageObject","inLanguage":"zh-Hans","@id":"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/63cd45cbc05a35fc4ff7637a163c83c4962ef58d27472726c3a3e0c9c5194f0f?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/63cd45cbc05a35fc4ff7637a163c83c4962ef58d27472726c3a3e0c9c5194f0f?s=96&d=mm&r=g","caption":"\u5b87, \u534e"},"url":"https:\/\/www.silicloud.com\/zh\/blog\/author\/yuhua\/"},{"@type":"ImageObject","inLanguage":"zh-Hans","@id":"https:\/\/www.silicloud.com\/zh\/blog\/%e7%90%86%e8%a7%a3spring%e6%a1%86%e6%9e%b6%e4%b8%ad%e7%9a%84%e6%95%b0%e6%8d%ae%e5%ba%93%e8%bf%9e%e6%8e%a5%e5%85%b1%e4%ba%ab%e6%96%b9%e6%b3%95%ef%bc%88%e6%95%b0%e6%8d%ae%e5%ba%93%e4%ba%8b%e5%8a%a1\/#local-main-organization-logo","url":"","contentUrl":"","caption":"Blog - Silicon Cloud"}]}},"_links":{"self":[{"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts\/40102","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/users\/10"}],"replies":[{"embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/comments?post=40102"}],"version-history":[{"count":2,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts\/40102\/revisions"}],"predecessor-version":[{"id":98872,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts\/40102\/revisions\/98872"}],"wp:attachment":[{"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/media?parent=40102"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/categories?post=40102"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/tags?post=40102"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}