<?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.3.0.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.example</groupId>
<artifactId>spring-jpa</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>spring-jpa</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<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>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
- 使用maven构建项目,添加相关依赖项
-
<parent>设置了依赖父类,可以自动加载后续相关依赖版本,此外如果项目本身有父类依赖,则可以通过 <dependencyManagement>标签属性<type>pom</type>和<scope>import</scope>来实现。
- 通过父类依赖关系可以看到,后续依赖都是没有设置版本的,但是系统会根据parent的版本配置其他依赖版本
spring:
http:
encoding:
charset: UTF-8
force: true
enabled: true
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/student?useSSL=false&serverTimezone=UTC
username: student
password: lin123
jpa:
#自动生成sql
show-sql: true
hibernate:
#没有表的时候自动创建
ddl-auto: update
- 配置数据库和spring的jpa,可以使用yml和properties文件格式配置,此处使用yml格式配置文件
- serverTimezone=UTC新版必须设置时区,com.mysql.cj.jdbc.Driver新8版mysql驱动,如果是mysql 8前面的版本,不设置时区也可以,驱动为com.mysql.jdbc.Driver
-
jpa:里面的show-sql: true会自动生成sql,基础的sql不用自己写,ddl-auto: update项目启动的时候,如果数据库里面没有对应的表,系统会创建与java对象映射的表。
package com.example.springjpa.jopo;
import lombok.Data;
import javax.persistence.*;
@Data
@Entity //表示这个类是一个实体类
@Table(name = "users") //对应的数据库中表名称
public class Account {
@GeneratedValue(strategy = GenerationType.IDENTITY) //生成策略,这里配置为自增
@Column(name = "id") //对应表中id这一列
@Id //此属性为主键
int id;
@Column(name = "username") //对应表中username这一列
String username;
@Column(name = "password") //对应表中password这一列
String password;
}
- 创建与数据库表映射的java对象
-
@Table(name = "users")表名对应类名
-
属性对应数据库表的列:@GeneratedValue(strategy = GenerationType.IDENTITY) //生成策略,这里配置为自增
@Column(name = "id") //对应表中id这一列
@Id //此属性为主键
int id;
-
普通列,上面是主键列:@Column(name = "username") //对应表中username这一列
String username;
package com.example.springjpa.crud;
import com.example.springjpa.jopo.Account;
import org.springframework.data.repository.CrudRepository;
public interface UserJpaRepository extends CrudRepository<Account, Integer> {
Account findById(int id);
}
- 创建数据处理接口,结成CrudRepository,<Account, Integer>java映射对象和它的主键类型。
- 结合方法名和表的列可以自定义接口方法,系统会根据方法名,自动创建一个代理类帮你实现方法,我们调用的时候,声明用的是接口,实际调用的是系统创建的代理类。
package com.example.springjpa.service;
import com.example.springjpa.crud.UserJpaRepository;
import com.example.springjpa.jopo.Account;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class UserService {
@Autowired
private UserJpaRepository userJpaRepository;
// 根据 id 查询用户
public Account findById(int id) {
return userJpaRepository.findById(id);
}
// 修改用户邮箱
public void changeUserEmailById(int userId, String username) {
Account user = this.findById(userId);
user.setUsername(username);
userJpaRepository.save(user);
}
}
- service声明private UserJpaRepository userJpaRepository;接口对象,系统启动的时候会自动创建接口的实现类,然后我们调用的时候通过@Autowired注释把创建的对象赋予我们定义的接口对象(定义用接口,使用可以根据不同情况调用接口的实现类)。
- 前面我们定义了接口方法findById(userId),但是我们没有写sql语句,调用的时候却可以进行查询,是因为系统根据方法名,在代理类中自动编写了sql。
- 对于简单的,单表查询,jpa可以不用自己写一句sql语句,定义方法就i可以,对于开发小型的项目,真是快到飞起!
package com.example.springjpa.controller;
import com.example.springjpa.jopo.Account;
import com.example.springjpa.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping(value = "/api/v1/users")
public class UserController {
@Autowired
private UserService userService;
@GetMapping(value = "/{id}")
public ResponseEntity<Account> getUserById(@PathVariable int id) {
Account user = userService.findById(id);
return ResponseEntity.ok().body(user);
}
}
- 到了检验成果的时候了,controller可以根据不同的请求调用service的方法来操作数据库或者返回数据库里面查询的数据
- 有的朋友要问,好像数据库操作接口crud里面已经实现了数据查询,conroller都可以直接条用它了,为什么还要通过service来调用,service在这里显得很多余。拿是因为我们只是简单的示例,除了数据库处理,实际项目中还有很多逻辑事务要处理的,这部分我们就会放到service当中去,就是一个类只做一个种事情。
package com.example.springjpa;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class SpringJpaApplication {
public static void main(String[] args) {
SpringApplication.run(SpringJpaApplication.class, args);
}
}
- 因为是spring项目,所以启动类还是要写的,不然没有把相关beans注册到spring容器中去。调用的时候就不能使用注释的方式注入对象了。这就得按照老方式new对像,写起来一大篇,可能别人项目都跑起来了,你还在构建项目中!
- 主类启动之后就可以在浏览器访问对应得请求路径了,注意一点,spring的jpa是整表返回方式,就是你要查询名字,我就给你整个user对象的信息,取名字信息还是地址信息你自己看着办。