{"id":337,"date":"2023-02-25T06:49:47","date_gmt":"2023-02-24T22:49:47","guid":{"rendered":"https:\/\/www.appblog.cn\/?p=337"},"modified":"2023-04-30T14:49:48","modified_gmt":"2023-04-30T06:49:48","slug":"spring-boot-custom-druid-data-source","status":"publish","type":"post","link":"https:\/\/www.appblog.cn\/index.php\/2023\/02\/25\/spring-boot-custom-druid-data-source\/","title":{"rendered":"Spring Boot\u81ea\u5b9a\u4e49Druid\u6570\u636e\u6e90"},"content":{"rendered":"<h2>\u6dfb\u52a0\u76f8\u5173\u4f9d\u8d56<\/h2>\n<pre><code class=\"language-xml\">&lt;dependencies&gt;\n    &lt;dependency&gt;\n        &lt;groupId&gt;org.springframework.boot&lt;\/groupId&gt;\n        &lt;artifactId&gt;spring-boot-starter-web&lt;\/artifactId&gt;\n    &lt;\/dependency&gt;\n    &lt;dependency&gt;\n        &lt;groupId&gt;org.springframework.boot&lt;\/groupId&gt;\n        &lt;artifactId&gt;spring-boot-starter-test&lt;\/artifactId&gt;\n        &lt;scope&gt;test&lt;\/scope&gt;\n    &lt;\/dependency&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;\/dependency&gt;\n    &lt;dependency&gt;\n        &lt;groupId&gt;org.springframework.boot&lt;\/groupId&gt;\n        &lt;artifactId&gt;spring-boot-starter-data-jpa&lt;\/artifactId&gt;\n    &lt;\/dependency&gt;\n    &lt;dependency&gt;\n        &lt;groupId&gt;com.alibaba&lt;\/groupId&gt;\n        &lt;artifactId&gt;druid&lt;\/artifactId&gt;\n    &lt;\/dependency&gt;\n&lt;\/dependencies&gt;<\/code><\/pre>\n<p><!-- more --><\/p>\n<h2>Druid\u6570\u636e\u6e90\u914d\u7f6e<\/h2>\n<p>\u914d\u7f6e<code>application.properties<\/code>\uff0c\u9996\u5148\u662f\u57fa\u672c\u7684\u94fe\u63a5\u5c5e\u6027\uff0c\u7136\u540e\u662fDruid\u7684\u76f8\u5173\u5c5e\u6027\u914d\u7f6e<\/p>\n<pre><code class=\"language-yml\">spring:\n  datasource:\n    #type: com.alibaba.druid.pool.DruidDataSource\n    driver-class-name: com.mysql.jdbc.Driver\n    url: jdbc:mysql:\/\/localhost:3306\/db1?useSSL=false&amp;requireSSL=false\n    username: root\n    password: root<\/code><\/pre>\n<h2>\u6ce8\u5165\u81ea\u5b9a\u4e49dataSource<\/h2>\n<p>\u4f7f\u7528<code>@Bean(&quot;dataSource&quot;)<\/code>\u8986\u76d6\u9ed8\u8ba4\u7684dataSource\u6570\u636e\u6e90\uff0c\u7531\u4e8e\u6ca1\u6709\u914d\u7f6e<code>spring.datasource.type=com.alibaba.druid.pool.DruidDataSource<\/code>\uff0c<code>com.alibaba.druid.pool.DruidDataSource#configFromPropety<\/code>\u65b9\u6cd5\u4e0d\u4f1a\u5c06url\uff0cusername\uff0cpassword\uff0cdriver-class-name\u6ce8\u5165\u8fdb\u53bb\uff0c\u6240\u4ee5\u9700\u8981\u81ea\u5df2\u624b\u52a8\u8bbe\u7f6e<\/p>\n<pre><code class=\"language-java\">@Configuration\npublic class CustomConfiguration {\n\n    @Value(&quot;${spring.datasource.url}&quot;)\n    String url;\n\n    @Value(&quot;${spring.datasource.username}&quot;)\n    String username;\n\n    @Value(&quot;${spring.datasource.password}&quot;)\n    String password;\n\n    @Value(&quot;${spring.datasource.driver-class-name}&quot;)\n    String driverClassName;\n\n    @Bean(&quot;dataSource&quot;)\n    public DataSource druidDataSource(StandardEnvironment env) {\n        Properties properties = new Properties();\n        DruidDataSource druidDataSource = new DruidDataSource();\n        PropertySource&lt;?&gt; appProperties = env.getPropertySources().get(&quot;applicationConfig: [classpath:\/application.yml]&quot;);\n        Map&lt;String,Object&gt;  source = (Map&lt;String, Object&gt;) appProperties.getSource();\n        properties.putAll(source);\n        druidDataSource.configFromPropety(properties);\n        druidDataSource.setUrl(url);\n        druidDataSource.setPassword(username);\n        druidDataSource.setUsername(password);\n        druidDataSource.setDriverClassName(driverClassName);\n        return druidDataSource;\n    }\n}<\/code><\/pre>\n<h2>\u6d4b\u8bd5<\/h2>\n<h3>\u5b9e\u4f53<\/h3>\n<pre><code class=\"language-java\">@Setter\n@Getter\n@Entity\n@Table(name = &quot;customer&quot;)\npublic class Customer implements Serializable {\n\n    @Id\n    @GeneratedValue(strategy = GenerationType.IDENTITY)\n    private Long id;\n\n    @Column(name = &quot;nike_name&quot;)\n    private String nikeName;\n\n    @Column\n    private String email;\n\n    @Column\n    private String mobile;\n\n    @Column\n    private String phone;\n\n    @Column\n    private String address;\n}<\/code><\/pre>\n<h3>Service\u5c42<\/h3>\n<pre><code class=\"language-java\">@Service(&quot;customerService&quot;)\n@Transactional(rollbackFor = Exception.class)\npublic class CustomerServiceImpl implements CustomerService {\n\n    private static final String INSERT_CUSTOMER = &quot;INSERT INTO customer (nike_name,email,mobile,phone,address) VALUES (?,?,?,?,?);&quot;;\n\n    @Autowired\n    private JdbcTemplate jdbcTemplate;\n\n    @Override\n    public void create(Customer customer) {\n        jdbcTemplate.update(INSERT_CUSTOMER, customer.getNikeName(),\n                customer.getEmail(), customer.getMobile(),\n                customer.getPhone(), customer.getAddress());\n        if(&quot;rollbackUser&quot;.equals(customer.getNikeName())){\n            throw new RuntimeException(&quot;test rollback on runtimeException.&quot;);\n        }\n    }\n}<\/code><\/pre>\n<h3>\u6d4b\u8bd5\u7528\u4f8b<\/h3>\n<pre><code class=\"language-java\">@RunWith(SpringRunner.class)\n@SpringBootTest\npublic class TestCustomerService {\n\n    @Autowired\n    private CustomerService customerService;\n\n    @Autowired\n    private JdbcTemplate jdbcTemplate;\n\n    @Test\n    public void testCreateCustomer(){\n        Customer customer = new Customer();\n        customer.setAddress(&quot;\u6d59\u6c5f\u676d\u5dde&quot;);\n        customer.setEmail(&quot;xxx@appblog.cn&quot;);\n        customer.setMobile(&quot;10086&quot;);\n        customer.setNikeName(&quot;Joe.Ye&quot;);\n        customer.setPhone(&quot;010-10086&quot;);\n        customerService.create(customer);\n    }\n\n    @Test\n    public void testRollback(){\n        Customer customer = new Customer();\n        customer.setAddress(&quot;\u6d59\u6c5f\u676d\u5dde&quot;);\n        customer.setEmail(&quot;xxx@appblog.cn&quot;);\n        customer.setMobile(&quot;10086&quot;);\n        customer.setNikeName(&quot;rollbackUser&quot;);\n        customer.setPhone(&quot;010-10086&quot;);\n        customerService.create(customer);\n    }\n\n    @Test\n    public void testSearchCustomer() {\n        String sql = &quot;SELECT id FROM customer WHERE nike_name = &#039;Joe.Ye&#039;&quot;;\n        Assert.notEmpty(jdbcTemplate.queryForList(sql, Long.class));\n    }\n}<\/code><\/pre>\n","protected":false},"excerpt":{"rendered":"<p>\u6dfb\u52a0\u76f8\u5173\u4f9d\u8d56 &lt;dependencies&gt; &lt;dependency&gt; &lt;grou [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[41],"tags":[110],"class_list":["post-337","post","type-post","status-publish","format-standard","hentry","category-spring-boot","tag-druid"],"_links":{"self":[{"href":"https:\/\/www.appblog.cn\/index.php\/wp-json\/wp\/v2\/posts\/337","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.appblog.cn\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.appblog.cn\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.appblog.cn\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.appblog.cn\/index.php\/wp-json\/wp\/v2\/comments?post=337"}],"version-history":[{"count":0,"href":"https:\/\/www.appblog.cn\/index.php\/wp-json\/wp\/v2\/posts\/337\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.appblog.cn\/index.php\/wp-json\/wp\/v2\/media?parent=337"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.appblog.cn\/index.php\/wp-json\/wp\/v2\/categories?post=337"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.appblog.cn\/index.php\/wp-json\/wp\/v2\/tags?post=337"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}