Spring Boot 3 -使用mysql

本文详细介绍了在Spring Boot 3中使用MySQL数据库的两种方式:JPA和JDBC。通过添加依赖、配置数据库连接、编写Entity类和Repository接口,可以轻松实现数据访问。同时,文章还提及了Spring Data JPA如何简化数据库访问层代码,并提供了配置文件和代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.youkuaiyun.com/jiangjunshow

也欢迎大家转载本篇文章。分享知识,造福人民,实现我们中华民族伟大复兴!

               

Spring Boot构建的Web应用中,基于MYSQL数据库的几种数据库连接方式进行介绍。 
   包括JDBC、JPA、MyBatis、多数据源和事务。

Spring Boot的Web应用中使用Mysq数据库,也充分展示Spring Boot的优势(尽可能少的代码和配置)。数据访问层我们将使用Spring Data JPA和Hibernate(JPA的实现之一)。

  注意:如果你想JDBC和JPA可以一起使用,Spring Boot 是支持的,你只需要把JDBC和JPA的依赖都添加在pom.xml 中即可。无需其他特殊处理。

1、JPA

Spring Data Jpa 极大简化了数据库访问层代码,只要3步,就能搞定一切

1. 添加pom.xml依赖

2. 配置数据库连接

3. 编写Entity类,依照JPA规范,定义实体

4. 编写Repository接口,依靠SpringData规范,定义数据访问接口(注意,只要接口,不需要任何实现)
     5. 写一小陀配置文件 (Spring Scheme配置方式极大地简化了配置方式)

1.Maven pom.xml文件

要使用MySQL,需要引入对应的connector,因此,首先在pom文件中添加如下依赖:

<dependency>   <groupId>mysql</groupId>   <artifactId>mysql-connector-java</artifactId></dependency>

<dependencies>  <dependency>    <groupId>org.springframework.boot</groupId>    <artifactId>spring-boot-starter-web</artifactId>  </dependency>  <dependency>    <groupId>org.springframework.boot</groupId>    <artifactId>spring-boot-starter-data-jpa</artifactId>  </dependency>  <dependency>    <groupId>mysql</groupId>    <artifactId>mysql-connector-java</artifactId>  </dependency></dependencies>

2.属性配置文件application.properties

在src/main/resources/application.properties中设置数据源和jpa配置。

spring.datasource.url = jdbc:mysql://localhost:3306/testspring.datasource.username = rootspring.datasource.password = rootspring.datasource.driverClassName = com.mysql.jdbc.Driver# Specify the DBMSspring.jpa.database = MYSQL# Show or not log for each sql queryspring.jpa.show-sql = true# Hibernate ddl auto (create, create-drop, update)spring.jpa.hibernate.ddl-auto = update# Naming strategyspring.jpa.hibernate.naming-strategy = org.hibernate.cfg.ImprovedNamingStrategy# stripped before adding them to the entity manager)spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQL5Dialect

全部的配置都在如上的文件中了,不需要另外的XML配置和Java配置。

上文中的数据库配置,你需要换成你的数据库的地址和用户名密码。

hibernate的ddl-auto=update配置表名,数据库的表和列会自动创建(根据Java实体的熟悉), 这里 可以看到更多得hibernate配置。

如果希望通过Hibernate依靠Entity类自动创建数据库和数据表,则还需要加上配置项—— spring.jpa.hibernate.ddl-auto=create-drop
PS:在生产环境中不要使用create-drop,这样会在程序启动时先删除旧的,再自动创建新的,最好使用update;还可以通过设置 spring.jpa.show-sql = true来显示自动创建表的SQL语句,通过 spring.jpa.database = MYSQL指定具体的数据,如果不明确指定Spring boot会根据classpath中的依赖项自动配置。

在Spring项目中,如果数据比较简单,我们可以考虑使用JdbcTemplate,而不是直接定义Datasource,配置jdbc的代码如下:

@Autowiredprivate JdbcTemplate jdbcTemplate;

只要定义了上面这个代码,Spring Boot会自动创建一个Datasource对象,然后再创建一个jdbctemplate对象来管理datasource,通过jdbctemplate操作数据库可以减少大量模板代码。如果你对SpringBoot的原理感兴趣,可以在org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration类中查看其具体实现。


3.实体

我们本例是一个城市相关系统:
数据库中应该具备以下领域对象(domain object)
    创建一个City实体。User实体和Mysql数据库的city表相对应。
首先在src\main\java\com\city\data\下建立包domain,然后再在这个包下建立相应的实体类

package com.city.data.domain;import java.io.Serializable;import javax.persistence.Column;import javax.persistence.Entity;import javax.persistence.Table;import javax.persistence.GeneratedValue;import javax.persistence.Id;@Entity@Table(name = "city")public class City implements Serializable { private static final long serialVersionUID = 1L@Id @GeneratedValue private int cityId;  @Column(nullable = falseprivate String name; @Column(nullable = falseprivate int provinceId;  public City() { } public City( int cityId) {  super();  this.cityId = cityId; } public int  getCityId() {         return cityId;    }   public void setCityId(int id) {        this.cityId = id;   }            ...... }

4.实体的数据访问层Dao

创建完实体类,还需要创建CityRepository接口,该接口继承自Repository,这个接口放在src\main\java\com\city\data\service包中,具体代码如下:
package com.city.data.service;/** *DAO层 */import org.springframework.data.domain.Page;import org.springframework.data.domain.Pageable;import org.springframework.data.repository.Repository;import com.city.data.domain.City;interface CityRepository extends Repository<City, Long> { City findByName(String name);}

  我们都没有写一行SQL语句,也没有在代码中涉及到数据库连接、建立查询等方面的内容。只有实体类上的各种注解表明我们在于数据库做交互:@Entity,@Repository,@Id,@GeneratedValue,@ManyToOne,@ManyToMany以及@OneToMany,这些注解属于Java Persistance API。我们通过Respository接口的子接口与数据库交互,同时由Spring建立对象与数据库表、数据库表中的数据之间的映射关系。下面依次说明这些注解的含义和使用:

  • @Entity,说明被这个注解修饰的类应该与一张数据库表相对应,表的名称可以由类名推断,当然了,也可以明确配置,只要加上@Table(name = "books")即可。需要特别注意,每个Entity类都应该有一个protected访问级别的无参构造函数,用于给Hibernate提供初始化的入口。
  • @Id and @GeneratedValue:@Id注解修饰的属性应该作为表中的主键处理、@GeneratedValue修饰的属性应该由数据库自动生成,而不需要明确指定。
  • @ManyToOne, @ManyToMany表明具体的数据存放在其他表中,在这个例子里,书和作者是多对一的关系,书和出版社是多对一的关系,因此book表中的author和publisher相当于数据表中的外键;并且在Publisher中通过@OneToMany(mapped = "publisher")定义一个反向关联(1——>n),表明book类中的publisher属性与这里的books形成对应关系。
  • @Repository 用来表示访问数据库并操作数据的接口,同时它修饰的接口也可以被component scan机制探测到并注册为bean,这样就可以在其他模块中通过@Autowired织入。
      我们可以添加自定义的接口函数,JPA会提供对应的SQL查询,例如,在本例中的CityRepository中可以增加findByName(String name)函数,JPA会自动创建对应的SQL查询——根据name查询城市,这种将方法名转换为SQL语句的机制十分方便且功能强大,例如你可以增加类似findByNameIgnoringCase(String name)这种复杂查询。


5.业务逻辑层service

接口放在src\main\java\com\city\data\service包中,具体代码如下:
package com.city.data.service;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.data.domain.Page;import org.springframework.data.domain.Pageable;import org.springframework.stereotype.Component;import org.springframework.transaction.annotation.Transactional;import org.springframework.util.Assert;import org.springframework.util.StringUtils;import com.city.data.domain.City;@Component("cityService")@Transactionalpublic class CityServiceImpl implements CityService { private final CityRepository cityRepository; @Autowired public CityServiceImpl(CityRepository cityRepository) {  this.cityRepository = cityRepository; } //@Override public City getCity(String cityName) {  Assert.notNull(cityName, "Name must not be null");  return this.cityRepository.findByName(cityName); }}

6.测试的控制器CityController

新建一个查询控制器CityController,

接口放在src\main\java\com\city\data\web包中,具体代码如下:

package com.city.data.web;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Controller;import org.springframework.transaction.annotation.Transactional;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.ResponseBody;import org.springframework.web.bind.annotation.RequestMethod;import org.springframework.web.bind.annotation.PathVariable;import org.springframework.web.bind.annotation.RestController;import java.util.*;import com.city.data.service.CityService;import com.city.data.domain.City;;//原始格式//@Controller//json格式@RestControllerpublic class CityController { @Autowired private CityService cityService; @RequestMapping("/"@ResponseBody @Transactional(readOnly = truepublic int getBeijing() {  //return "helloWorld";  return this.cityService.getCity("beijing").getCityId(); } /**  * @PathVariable是用来获得请求url中的动态参数的  * @param name  * @return  */  @RequestMapping(value = "/{name}", method = RequestMethod.GET) public Map<String, Object> getCity( @PathVariable String name) {      City city =  this.cityService.getCity(name);     Map<String, Object> response = new LinkedHashMap<>();     response.put("msg", "get city with name(" + name +")");     response.put("city", city);     return response;  }}

你可以使用浏览器访问url http://127.0.0.1:8080

2、JDBC

JDBC 连接数据库

1、属性配置文件(application.properties)

spring
### 配置 Spring Boot Starter Quartz 和 MySQL 的方法 在 Spring Boot 中集成 Quartz 并将其与 MySQL 数据库配合使用是一个常见的需求。以下是关于如何配置 `spring-boot-starter-quartz` 以及可能遇到的问题及其解决方案。 #### 1. 添加必要的依赖项 为了使 Quartz 使用 MySQL 存储其调度信息,需要引入以下 Maven 或 Gradle 依赖: 对于 Maven: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-quartz</artifactId> </dependency> <!-- MySQL Connector --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> </dependency> ``` 对于 Gradle: ```gradle implementation &#39;org.springframework.boot:spring-boot-starter-quartz&#39; implementation &#39;mysql:mysql-connector-java&#39; ``` 这些依赖会自动将 Quartz 集成到 Spring Boot 应用程序中,并允许通过 JDBC 访问数据库[^4]。 --- #### 2. 创建 Quartz 表结构 Quartz 要求在 MySQL 数据库中有特定的表来存储作业和触发器的信息。可以通过运行 Quartz 提供的标准 SQL 文件来初始化这些表。SQL 文件通常位于 Quartz 发布版本中的 `/docs/dbTables/tables_mysql.sql` 下。 执行该脚本后,MySQL 将具备支持 Quartz 所需的所有表结构。 --- #### 3. 配置 application.properties 或 application.yml 在应用程序的配置文件中设置 Quartz 连接到 MySQL 的参数。例如,在 `application.properties` 中可以这样写: ```properties # DataSource Configuration (for both DB and Quartz) spring.datasource.url=jdbc:mysql://localhost:3306/quartz_db?useSSL=false&serverTimezone=UTC spring.datasource.username=root spring.datasource.password=password # Quartz Properties spring.quartz.job-store-type=jdbc spring.quartz.jdbc.initialize-schema=always spring.quartz.properties.org.quartz.scheduler.instanceName=MyScheduler spring.quartz.properties.org.quartz.threadPool.threadCount=3 spring.quartz.properties.org.quartz.dataSource.myDS.driver=com.mysql.cj.jdbc.Driver spring.quartz.properties.org.quartz.dataSource.myDS.URL=${spring.datasource.url} spring.quartz.properties.org.quartz.dataSource.myDS.user=${spring.datasource.username} spring.quartz.properties.org.quartz.dataSource.myDS.password=${spring.datasource.password} ``` 如果使用的是 YAML 格式的配置,则如下所示: ```yaml spring: datasource: url: jdbc:mysql://localhost:3306/quartz_db?useSSL=false&serverTimezone=UTC username: root password: password quartz: job-store-type: jdbc jdbc: initialize-schema: always properties: org.quartz.scheduler.instanceName: MyScheduler org.quartz.threadPool.threadCount: 3 org.quartz.dataSource.myDS.driver: com.mysql.cj.jdbc.Driver org.quartz.dataSource.myDS.URL: ${spring.datasource.url} org.quartz.dataSource.myDS.user: ${spring.datasource.username} org.quartz.dataSource.myDS.password: ${spring.datasource.password} ``` 上述配置指定了 Quartz 使用 JDBC JobStore 来管理持久化任务,并设置了线程池大小和其他必要属性[^1]。 --- #### 4. 解决常见问题 ##### a. 数据源未加载导致 Bean 初始化失败 如果在应用启动过程中发现某些 Bean 初始化失败,可能是由于数据源尚未完全加载而尝试访问数据库资源引起的。这种情况下可以在相关组件上标注延迟加载注解 `@Lazy`,或者调整 Bean 加载顺序以确保数据源先于其他组件完成初始化。 ##### b. 多数据源场景下的冲突 当项目存在多数据源时,可能会发生 Quartz 默认使用的数据源与其他业务逻辑的数据源混淆的情况。此时应明确指定 Quartz 使用的具体数据源名称(如上面提到的 `myDS`),并确保它不会干扰其他模块的工作流[^2]。 ##### c. 自动装配冲突 有时即使正确添加了依赖,仍可能出现无法识别 Quartz 组件的现象。这通常是由于缺少合适的 starter 导致的。确认是否已包含 `mybatis-spring-boot-autoconfigure` 及其关联功能的支持[^3]。 --- ### 示例代码片段 下面展示了一个简单的 Quartz 定时任务定义方式: ```java import org.quartz.Job; import org.quartz.JobExecutionContext; public class SampleJob implements Job { @Override public void execute(JobExecutionContext context) { System.out.println("Executing sample task..."); } } // 注册任务至 Scheduler @Bean public JobDetailFactoryBean jobDetail() { JobDetailFactoryBean factory = new JobDetailFactoryBean(); factory.setJobClass(SampleJob.class); factory.setName("sample-job"); factory.setDescription("A simple example of scheduled job."); return factory; } ``` 此代码展示了如何创建一个基本的任务类并通过工厂注册给 Quartz 调度器。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值