springboot基础jpa开发02

1.数据库操作

在spring boot中操作数据库很方便,这里我们使用jpa,jpa是利用Hibernate生成各种自动化sql,增删改查都能简单实现

1.1 添加maven jpa依赖

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

1.2 定义实体类

package com.mp.prj;

import javax.persistence.*;
import java.io.Serializable;

@Entity
@Table(name = "person_test")
public class Person implements Serializable {
    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    /**
     * 指定name,则为数据库中的列名,这里做个映射
     */
    @Column(name = "uname",length = 32,nullable = false,unique = true)
    private String name;
    /**
     * 省略默认列名就是属性名
     */
    @Column(length = 32)
    private String passwd;

    /*
    * @Transient 注解不会映射成表的字段 ,如果字段不写注解,则默认为@Column
    * */
    @Transient
    private String time;

    public String getTime() {
        return time;
    }

    public void setTime(String time) {
        this.time = time;
    }

    public static long getSerialVersionUID() {
        return serialVersionUID;
    }

    public Long getId() {
        return id;
    }

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

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getPasswd() {
        return passwd;
    }

    public void setPasswd(String passwd) {
        this.passwd = passwd;
    }

    public Person(String name,String passwd){
        this.name = name;
        this.passwd = passwd;
    }

    public Person(String name){
        this.name = name;
    }

    public Person(){}
}

注解说明:
(1)@Entity:是一个必选的注解,声明这个类对应了一个数据库表
(2)@Table(name=“person_test”) :是一个可选的注解,声明了数据库表和实体的映射信息,如果没有指定,则代表表名和实体名一致
(3)@Id:声明了实体中唯一标识对应的属性
(4)@GeneratedValue(strategy = GenerationType.IDENTITY):自增长
(5) @Column(name = “uname”,length = 32,nullable = false,unique = true) :用来声明属性所对应的字段,指定name代表着实体中字段和表的字段不一致,默认代表着实体和表字段一致
(6)@Transient 注解不会映射成表的字段 ,如果字段不写注解,则默认为@Basic

注:这里必须要指定一个默认的构造函数

1.3 实现持久化接口服务

package com.mp.prj;


import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository;

import java.util.List;

@Repository
public interface PersonRepository extends JpaRepository<Person,Long> {
//    Person findbyName(String name);

    /*
    * 自定义查询, @Query 注解中增加一个 nativeQuery = true 的属性,就可以采用原生 SQL 语句的方式来编写查询
    * */
    @Query(nativeQuery = true, value = "select * from person_test where uname=:name and passwd = :passwd")
    List<Person> findPersonByNameAndPasswd(@Param("name") String name,@Param("passwd") String passwd);
}

注解说明:
(1)@Repository:所有标注了@Repository的类都将被注册为Spring Bean
(2)默认情况下,Jpa提供了基本的增删改查操作,都可以满足需求
(3)这里我另外写了一个方法,在不能满足我们的需求的情况下使用,这里使用了@Query 注解,可以自定义sql查询

1.4 实现Controller

package com.mp.prj;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;

@RestController
@RequestMapping("/person")
public class PersonController {
    @Autowired
    PersonRepository personRepository;

    @RequestMapping("/insert")
    public String insertPerson(@RequestParam(value = "name") String name,
                            @RequestParam(value = "passwd") String passwd){
        personRepository.save(new Person(name,passwd));
        return "add person success";
    }

    @RequestMapping("/add/{name}")
    public String addPerson(@PathVariable("name") String name){
        personRepository.save(new Person(name));
        return "add person ok";
    }

    @RequestMapping("/findbyid/{id}")
    public Person findById(@PathVariable("id") String id){
        return personRepository.findById(Long.valueOf(id)).get();
    }

    @RequestMapping("/list")
    public List<Person> list(){
        return personRepository.findAll();
    }

    @RequestMapping("/find2/{name}/{passwd}")
    public List<Person> find2(@PathVariable("name") String name,
                        @PathVariable("passwd") String passwd){
        return personRepository.findPersonByNameAndPasswd(name,passwd);
    }
}

注解说明:
(1)@Autowired:按照类型(byType)装配依赖对象
(2)@PathVariable 和 @RequestParam
很容易理解,再次不详细介绍

1.6 数据库配置文件

在main路径下,新建resources文件夹,指定为Root Resources,新建文件application.yaml

spring:
  datasource:
    url: jdbc:mysql://10.1.0.9:3306/test?useUnicode=true&characterEncoding=UTF-8&useSSL=false
    username: test
    password: 123456
    driver-class-name: com.mysql.jdbc.Driver
  jpa:
    hibernate:
      ddl-auto: update
      naming:
        physical-strategy: org.springframework.boot.orm.jpa.hibernate.SpringPhysicalNamingStrategy

    show-sql: true

ddl-auto参数说明:
(1)create: 每次加载 hibernate 时都会删除上一次的生成的表,然后根据你的 model 类再重新来生成新表,哪怕两次没有任何改变也要这样执行,这就是导致数据库表数据丢失的一个重要原因。
(2)create-drop :每次加载 hibernate 时根据 model 类生成表,但是 sessionFactory 一关闭,表就自动删除。
(3)update:最常用的属性,第一次加载 hibernate 时根据 model 类会自动建立起表的结构(前提是先建立好数据库),以后加载 hibernate 时根据 model 类自动更新表结构,即使表结构改变了但表中的行仍然存在不会删除以前的行。要注意的是当部署到服务器后,表结构是不会被马上建立起来的,是要等 应用第一次运行起来后才会 。
(4)validate :每次加载 hibernate 时,验证创建数据库表结构,只会和数据库中的表进行比较,不会创建新表,但是会插入新值。

1.7 启动服务

(1)新增用户:http://localhost:8080/person/insert?name=zhangsan1&passwd=123456
即会成功往数据库插入一条数据

(2)使用PathVariable 方式新增用户:
http://localhost:8080/person/add/zhangsan2
(3)查找用户:
http://localhost:8080/person/list
其他的就不再详细介绍了…

1.8 注解加载详解

以后专题进行分析

猜你喜欢

转载自blog.csdn.net/mapeng765441650/article/details/94716122
今日推荐