springboot之整合基本的jdbc并操作Mysql数据库

springboot之整合基本的jdbc并操作Mysql数据库

对于数据访问层,无论是SQL还是NOSQL,springboot默认采用整合spring data方式进行统一处理,添加大量自动配置,屏蔽了许多设置,引入各种xxxTemplate,xxxRepository来简化我们对数据访问层的操作。对我们来说只需要进行简单的设置即可。

之前利用VMware安装了centos7系统,并利用桥接模式实现了主机和虚拟机之间的通信,最后利用docker安装了Mysql镜像。这次终于重新又回到了springboot的怀抱中。springboot整合jdbc和数据源真的是一波三折。首先明确我使用的springboot版本是2.2.4。并使用application.yml进行数据库连接相关配置

(1)第一波

之前自己通过idea创建过了springboot项目,不想再重新建了,于是想导入jdbc启动器和mysql驱动,在网上找了一圈都没找到如何在已经创建好的springboot中继续添加启动器,只好自己手动添加。这里就有两个坑:jdbc启动器的名字问题mysql驱动版本与mysql版本问题。最开始,找到的jdbc启动器是:

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
        </dependency>

之后进行测试的时候一老报错:

Unsatisfied dependency expressed through field 'dataSource'; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'javax.sql.DataSource' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}

说是没有这么一个bean,百度半天也没有结果,自己只好重新建一个springboot项目,并勾选Mysql driver和data jdbc。然后查看pom.xml文件,发现是:

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jdbc</artifactId>
        </dependency>

修改完之后继续。application.yml中设置Driver的时候,需要注意和自己版本的mysql相对应,而springboo连接Mysql驱动t默认版本是没指定的,一般是比较新,用Mysql5.7就要指定为mysql-connector-java的版本为5.1.41之类的,而且对应的驱动是com.mysql.jdbc.Driver,最新版本的mysql驱动名称变了。

(2)第二波

这是自己犯的一个低级错误:

Driver com.mysql.jdbc.Driver claims to not accept jdbcUrl

自己再输入urll时少了mysql后面的冒号:

jdbc:mysql://192.168.124.22:3306/jdbc

(3)第三波

这可不是我的锅了。在主机连接到虚拟机中linux下的docker中的mysql时,报错:

java.sql.SQLException: Access denied for user ''@'192.168.124.9' (using password: NO)

百度了下,在application.yml中,因为springboot中默认是data-username和data-password,要改成username和password。这也太坑了。

最后是相关代码:

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.2.4.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.gong</groupId>
    <artifactId>springboot-curd</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>springboot-curd</name>
    <description>Demo project for Spring Boot</description>

    <properties>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-thymeleaf</artifactId>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.41</version>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jdbc</artifactId>
        </dependency>
        <dependency>
            <groupId>org.webjars</groupId>
            <artifactId>bootstrap</artifactId>
            <version>4.1.2</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

application.yml

spring:
  datasource:
    username: root
    password: 123456
    url: jdbc:mysql://192.168.124.22:3306/jdbc
    driver-class-name: com.mysql.jdbc.Driver

SpringbootCurdApplicationTests.java

package com.gong.springbootcurd;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.SQLException;

@RunWith(SpringRunner.class)
@SpringBootTest
public class SpringbootCurdApplicationTests {

    @Autowired
    DataSource dataSource;

    @Test
    public void contextLoads() {
    }
    @Test
    public void testConnection() throws SQLException {
        System.out.println(dataSource.getClass());
        Connection connection = dataSource.getConnection();
        System.out.println(connection);
        connection.close();
    }

}

最后是相关输出:

springboot之整合基本的jdbc并操作Mysql数据库

接下来继续,我们可以自己让springboot启动时运行建表和插入语句,在application.yml中继续配置:

spring:
  datasource:
    username: root
    password: 123456
    url: jdbc:mysql://192.168.124.22:3306/jdbc?serverTimezone=UTC
    driver-class-name: com.mysql.jdbc.Driver
    schema:
     - classpath:department.sql
    initialization-mode: always

department.sql

SET FOREIGN_KEY_CHECKS=0;

-- ----------------------------
-- Table structure for department
-- ----------------------------
DROP TABLE IF EXISTS `department`;
CREATE TABLE `department` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `departmentName` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

启动springboot之后就会在jdbl数据库中生成一个department的表,我们在其中添加些数据:

springboot之整合基本的jdbc并操作Mysql数据库

最后利用jdbc进行数据操作:

@Controller
public class HelloController {

    @Autowired
    JdbcTemplate jdbcTemplate;

    @ResponseBody
    @RequestMapping("/query")
    public Map<String,Object> testJdbc(){
        List<Map<String, Object>> list = jdbcTemplate.queryForList("select * from department");
        return list.get(0);
    }
}

此时记得先注释掉之前的自动建表配置好,不然我们添加的数据会没清楚,再启动服务器:

springboot之整合基本的jdbc并操作Mysql数据库

带上curd 是因为我在另一个配置文件application.properties中配置了:

server.servlet.context-path=/curd

至此,整合jdbc并操作mysql数据库就完成了。