springboot 整合 springdata jpa

创建项目

使用idea软件创建jpa_basic项目

添加依赖

在pom文件中添加

<!--lombok-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>

        <!--Web必要的-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

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

        <!-- MySQL的java驅動 -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>

修改配置文件

修改文件application.properties

#服务端容器的配置
server.port=8080

#数据库配置
spring.datasource.url = jdbc:mysql://192.168.99.100:3306/xzw
spring.datasource.username = root
spring.datasource.password = 123456
spring.datasource.driverClassName = com.mysql.jdbc.Driver

# jpa配置
#update如果启动时表格式不一致则更新表,原有数据保留
spring.jpa.hibernate.ddl-auto=update
spring.jpa.show-sql=true
spring.jpa.properties.hibernate.format_sql=true

User实体类

  • domain通常代表与数据库表一一对应的javaBean

  • 新建domain文件夹并在该文件夹下新建user实体类

package indi.xzw.jpa_basic.domain;

import lombok.Data;
import org.hibernate.annotations.GenericGenerator;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;
import java.io.Serializable;
import java.util.Date;



@Entity // jpa的注解,需要加
@Table(name = "table_user") // 指定数据库的表名
@Data // lombok
public class User implements Serializable {
    @Id
    @GeneratedValue(generator = "system-uuid")
    @GenericGenerator(name = "system-uuid", strategy = "uuid")//使用hibernate的uuid主键生成器
    private String userId;

    private String userNickname;

    private String userPassword;

    private String userEmail;

    private Integer actiState;

    //激活成功与激活失败常量
    public static final int ACTIVATION_SUCCESSFUL = 1;
    public static final int ACTIVATION_UNSUCCESSFUL = 0;

    private String actiCode;

    private Date tokenExptime;

}
  • @Entity注释指名这是一个实体Bean
  • @Table注释指定了Entity所要映射带数据库表name用来指定映射表的表名
  • @Entity说明这个class是实体类,并且使用默认的orm规则,即class名即数据库表中表名,class字段名即表中的字段名如果想改变这种默认的orm规则,就要使用@Table来改变class名与数据库中表名的映射规则。
  • 加了@Data注解,所有Java代码中不需要生成getters and setters,而在编译的时候会自动生成getters and setters
  • @Id 必须,@Id 定义了映射到数据库表的主键的属性,一个实体只能有一个属性被映射为主键。
  • @GeneratedValue(strategy=GenerationType,generator="") 可选,strategy:
    表示主键生成策略,默认有 AUTO、INDENTITY、SEQUENCE 和 TABLE 4 种,也可以自定义主键生成策略,generator: 表示主键生成器的名称。
  • @GenericGenerator注解----自定义主键生成策略
  • @Column(name = "user_code", nullable = false, length=32) 可选,@Column 描述了数据库表中该字段的详细定义,这对于根据 JPA 注解生成数据库表结构的工具。name: 表示数据库表中该字段的名称,默认情形属性名称一致;nullable: 表示该字段是否允许为 null,默认为 true;unique: 表示该字段是否是唯一标识,默认为 false;length: 表示该字段的大小,仅对 String 类型的字段有效。

UserRepository

  • 将UserRepository继承JpaRepository就可以有对应的增删改查方法

  • 新建dao文件夹在该文件夹下新建UserRepository

package indi.xzw.jpa_basic.dao;

import indi.xzw.jpa_basic.domain.User;
import org.springframework.data.jpa.repository.JpaRepository;

public interface UserRepository extends JpaRepository<User, String> {

}
  • JpaRepository<T,ID>:T表示为我们实体的类型,ID表示为我们主键的类型,所以T我们填User,ID填string

UserService

新建service文件夹,并在该文件夹下新建UserService 实体类

package indi.xzw.jpa_basic.service;

import indi.xzw.jpa_basic.domain.User;

import java.util.List;

public interface UserService {

    List<User> getAllUser();
}

新建UserServiceImpl

在service目录下新建impl目录,并在该目录下新建UserServiceImpl

package indi.xzw.jpa_basic.service.impl;

import indi.xzw.jpa_basic.dao.UserRepository;
import indi.xzw.jpa_basic.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import indi.xzw.jpa_basic.domain.User;
import org.springframework.stereotype.Service;
import java.util.List;
// 实现
@Service
public class UserServiceImpl implements UserService {

    @Autowired
    private UserRepository userRepository;

    @Override
    public List<User> getAllUser() {
        return userRepository.findAll();
    }
}

UserController

新建controller目录在该目录下新建UserController

package indi.xzw.jpa_basic.controller;

import indi.xzw.jpa_basic.domain.User;
import indi.xzw.jpa_basic.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;

@RestController
public class UserController {

    @Autowired
    private UserService userService;

    /**
     * 得到所有用户
     */
    @GetMapping(value = "/user", produces = {"application/json;charset=UTF-8"})
    public void  getAllUser () {

        List<User> allUser = userService.getAllUser();

        for (User user : allUser) {
            System.out.println(user);
        }
    }
}

整体结构

46

测试

创建数据库

手动创建

CREATE TABLE table_user(
   user_id VARCHAR(100) NOT NULL,
   user_nickname VARCHAR(100) NOT NULL,
   user_password VARCHAR(40) NOT NULL,
   user_email VARCHAR(40) NOT NULL,
   acti_state INT NOT NULL,
   acti_code VARCHAR(40) NOT NULL,
   token_exptime DATE,
   PRIMARY KEY ( user_id )
   )ENGINE=InnoDB DEFAULT CHARSET=utf8;

可以不用创建数据库,直接运行程序,hibernate会自动创建数据库

45

插入数据

INSERT INTO table_user VALUES ('11578988-fb56-42ba-870b-48e0ffaa37ce','xzw','123456','1478497757@qq.com',1,'','2020-09-16');
INSERT INTO table_user VALUES ('c8f38dae-bf21-45eb-b1df-0e64110f23ef','xzw111','123456','1478497757@qq.com',1,'','2020-09-16');

运行

调用 http://localhost:8080/user

44

扩展小知识

问题

  1. UserService接口为什么可以直接实例化?
  2. 如果这个接口有两个实现类,他怎么区分调哪一个的方法?

  1. @Autowired会根据类型,自动实例化,也就是说本质并不是UserService实例化了而是UserServiceImpl实现类实例化了。
  2. 如果有两个实现类就不能使用@Autowired,可以使用@Resource,@Resource根据参数也能知道实现的是哪一个类。

评论

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×