基于SpringBoot构建Spring Data JPA

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_35542218/article/details/83895742

基于SpringBoot构建Spring Data JPA

前言

 最近在研究Hibernate的注解,故因此搭建一个Spring Data JPA,编辑器是IDEA。

项目搭建

  • 点击 -> new Project
  • 在这里插入图片描述
  • 在这里插入图片描述
  • 在这里插入图片描述
  • 然后一直next,然后就构建完成了。

项目开始

  • 先创建几个文件夹,如图:在这里插入图片描述
  • 通过数据库实例创建一个数据库,名字自定,我的数据库为spring-cloud
  • 在 -> resource -> application.properties(或者application.yml,我比较喜欢用yml,各位自己选择),进行如下配置
server:
  #端口号
  port: 5000
spring:
  #数据库基本信息
  datasource:
    driver-class-name: com.mysql.jdbc.Driver
    #?号后面的参数都是根据实际情况进行添加
    url: jdbc:mysql://localhost:3306/spring-cloud?useUnicode=true&useSSL=false&serverTimezone=GMT
    username: root
    password: wulang
  jpa:
    hibernate:
      #create 启动时删数据库中的表,然后创建,退出时不删除数据表
      #create-drop 启动时删数据库中的表,然后创建,退出时删除数据表 如果表不存在报错
      #update 如果启动时表格式不一致则更新表,原有数据保留
      #validate 项目启动表结构进行校验 如果不一致则报错
      ddl-auto: update
    #运行时输出SQL语句
    show-sql: true
  • 现在在entity文件夹中创建User.java,这些注解都是Hibernate的,不懂得可以去百度
package vip.wulang.springdatajpa.entity;

import javax.persistence.*;

/**
 * @author CoolerWu on 2018/11/9.
 * @version 1.0
 *
 *  * @Table  标注类对应的表
 *  * 若表名和类型相同时,省略@Table,比如类Users 和表 users;
 *  * 若不相同时,必须有@Table,并设置name,为该类对应的表名。@Table(name="users")
 *  *
 *  * @Entity 标注实体
 *  *
 *  * @Id 标注id
 *  *
 *  * @Transient 标注该属性不做与表的映射(原因:可能表中没有该属性对应的字段)
 *  * 有该注解,在执行sql语句时,就不会出现该属性,否则会有,若表中没有该字段则会报错
 *  *
 *  * @Basic 默认所有属性都有该注解(主键需要单独使用@Id),所以可以省略
 *  * 		    该注解可以放在属性上,也可以放在对应的getter方法上。
 *  * 		     注意:要么统一将@Basic放在属性上,要么统一放在对应的getter方法上。(一般都放在属性上,可读性比较好)
 *  *
 *  * @Column 类中属性名和表中对应字段名不相同时,会使用该注解,指明在类中对应的字段
 *  * 			@Column(name="对应的表中字段名")
 */
@Entity
@Table(name = "tb_user")
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(nullable = false, unique = true)
    private String username;

    @Column(nullable = false)
    private String password;

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }
}
  • 现在在dao文件夹中创建UserDao.java
package vip.wulang.springdatajpa.dao;

import org.springframework.data.jpa.repository.JpaRepository;
import vip.wulang.springdatajpa.entity.User;

/**
 * @author CoolerWu on 2018/11/9.
 * @version 1.0
 *  * 基础的 Repository 提供了最基本的数据访问功能,其几个子接口则扩展了一些功能。它们的继承关系如下:
 *  * Repository: 仅仅是一个标识,表明任何继承它的均为仓库接口类
 *  * (1)CrudRepository: 继承 Repository,实现了一组 CRUD 相关的方法
 *  * (2)PagingAndSortingRepository: 继承 CrudRepository,实现了一组分页排序相关的方法
 *  * (3)JpaRepository: 继承 PagingAndSortingRepository,实现一组 JPA 规范相关的方法
 *  *
 *  * 自定义的 XxxxRepository 需要继承 JpaRepository,这样的 XxxxRepository 接口就具备了通用的数据访问控制层的能力。
 *  *
 *  * JpaSpecificationExecutor: 不属于Repository体系,实现一组 JPA Criteria 查询相关的方法 。
 */
public interface UserDao extends JpaRepository<User, Long> {
    User findByUsername(String username);
}
  • 现在在service文件夹中创建UserService.java
package vip.wulang.springdatajpa.service;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import vip.wulang.springdatajpa.dao.UserDao;
import vip.wulang.springdatajpa.entity.User;

/**
 * @author CoolerWu on 2018/11/9.
 * @version 1.0
 *
 *  * @Service      标注该类可以被Spring扫描
 *  * @Autowired    自动注入实例userDao
 */
@Service
public class UserService {
    @Autowired
    private UserDao userDao;

    public User getUser(String username) {
        return userDao.findByUsername(username);
    }

    public void addUser(User user) {
        userDao.save(user);
    }
}
  • 现在在controller文件夹中创建UserController.java
package vip.wulang.springdatajpa.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import vip.wulang.springdatajpa.entity.User;
import vip.wulang.springdatajpa.service.UserService;

/**
 * @author CoolerWu on 2018/11/9.
 * @version 1.0
 *  * @RestController 封装了@Controller、@ResponseBody,其中@Controller保证会被Spring扫描,@ResponseBody让返回值封装成Json格式
 *  * @GetMapping 定义了网络接口,只能接受HttpMethod=Get方式
 */
@RestController
public class UserController {
    @Autowired
    private UserService userService;

    @GetMapping("/getUser")
    public User getUser(@RequestParam("username") String username) {
        return userService.getUser(username);
    }

    @GetMapping("/addUser")
    public String addUser(@RequestParam("username") String username,
                        @RequestParam("password") String password) {
        User user = new User();
        user.setUsername(username);
        user.setPassword(password);
        userService.addUser(user);
        return "OK";
    }
}
  • 现在在springdatajpa文件夹中修改SpringDataJpaApplication.java部分内容
package vip.wulang.springdatajpa;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.domain.EntityScan;
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;

/**
 * @author CoolerWu on 2018/11/9.
 * @version 1.0
 *  * @SpringBootApplication 启动类,封装了Spring扫描等注解
 *  * @EntityScan 扫描带有@Entity注解的类
 *  * @EnableJpaRepositories 扫描继承了JpaRepositories的接口,动态代理生成Class
 */
@SpringBootApplication
@EntityScan
@EnableJpaRepositories("vip.wulang.springdatajpa.dao")
public class SpringDataJpaApplication {

    public static void main(String[] args) {
        SpringApplication.run(SpringDataJpaApplication.class, args);
    }
}
  • 然后启动,在控制台中可以发现,已经执行了SQL语句了,在查询数据库后,也发现有表了。

Hibernate: create table tb_user (id bigint not null auto_increment, password varchar(255) not null, username varchar(255) not null, primary key (id)) engine=MyISAM
Hibernate: alter table tb_user drop index UK_4wv83hfajry5tdoamn8wsqa6x
Hibernate: alter table tb_user add constraint UK_4wv83hfajry5tdoamn8wsqa6x unique (username)

测试

如图:addUsergetUser数据库也有如下数据:数据库

猜你喜欢

转载自blog.csdn.net/qq_35542218/article/details/83895742