spring-boot 从零开始-03

spring-boot中的JPA

这里不介绍数据库如何安装,如需要安装请自行百度

1.什么是JPA?JPA用来干什么?
2.有哪些JPA的实现?
3.如果在spring boot如何实现JPA

1.什么是JPA?JPA用来干什么?

JPA全称Java Persistence API.JPA通过JDK 5.0注解或XML描述对象-关系表的映射关系,并将运行期的实体对象持久化到数据库中。
JPA(Java Persistence API)是Sun官方提出的Java持久化规范。它为Java开发人员提供了一种对象/关系映射工具来管理Java应用中的关系数据。
持久化(Persistence),即把数据(如内存中的对象)保存到可永久保存的存储设备中(如磁盘)。持久化的主要应用是将内存中的对象存储在的数据库中,或者存储在磁盘文件中、XML数据文件中等等。
持久化是将程序数据在持久状态和瞬时状态间转换的机制。
JDBC就是一种持久化机制。文件IO也是一种持久化机制。

题外话:换言之,JPA就是一个储存的标准,太规范了数据持久化的标准,用于数据持久化

1.1什么是Spring data

Spring Data是一个用于简化数据库访问,并支持云服务的开源框架。其主要目标是使得数据库的访问变得方便快捷,并支持map-reduce框架和云计算数据服务。此外,它还支持基于关系型数据库的数据服务,如Oracle RAC等。对于拥有海量数据的项目,可以用Spring Data来简化项目的开发,就如Spring Framework对JDBC、ORM的支持一样,Spring Data会让数据的访问变得更加方便。

2.有哪些JPA的实现?

Hibernate,EclipseLink(曾经的toplink),OpenJPA等可供选择,所以使用JPA的一个好处是,可以更换实现而不必改动太多代码

3.如果在spring boot如何实现JPA--spring boot JPA

(1)在pom.xml添加mysql,spring-data-jpa依赖;
(2)在application.properties文件中配置mysql链接配置文件
(3)在application.properties文件中配置JPA配置信息;
(4)编写测试例子

(1)在pom.xml添加mysql,spring-data-jpa依赖
    
    
        mysql
        mysql-connector-java
        8.0.13
    
    
    
    
        org.springframework.boot
        spring-boot-starter-data-jpa
    
(2)在application.properties文件中配置mysql链接配置文件

新建文件夹src/main/resources,在resources目录下new->file, 取名字为application.properties固定写法。一定要在指定的路径下面新建,否则无法找到该文件。

(3)在application.properties文件中配置JPA配置信息

输入配置数据库配置信息

##################################
# 数据库基本配置
# 数据库username和password
# 驱动,链接方式
# 最大连接
# 初始大小
##################################
spring.datasource.url=jdbc:mysql://localhost:3306/avalanching_crm
spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.driverClassName=com.mysql.cj.jdbc.Driver
spring.datasource.max-active=20
spring.datasource.max-idle=8
spring.datasource.min-idle=8
spring.datasource.initial-size=10

##################################
# 数据库基本配置
# 数据库类型
# 是否现实sql语句
# 最大连接
# 初始大小
##################################
spring.jpa.database = MYSQL
spring.jpa.show-sql = true
spring.jpa.hibernate.ddl-auto = update
spring.jpa.hibernate.naming-strategy = org.hibernate.cfg.ImprovedNamingStrategy
spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQL5Dialect

注意:spring.datasource.driverClassName,很多教程里面都是写com.mysql.jdbc.Driver,而非com.mysql.cj.jdbc.Driver,这里需要根据你当前mysql和驱动版本决定的,如果无法确定两者都尝试一下即可

(4)编写测试例子

新建package


spring-boot 从零开始-03_第1张图片
image.png

model:随意创建的,名字自己取,后面都是这个package的子包
bean:是用来存放我们数据库实体类的,里面属性为private(私有的),提供public(公开的)setting和getting方法供外部调用
controller:处理请求类,控制器类,处理外部的请求,完成相应的操作,把结果返回给请求者
repository:这里需要一个接口类,这个定义了JPA的基本操作,例如增删查改
service:提供外部调用数据库操作

具体代码如下:
在bean package下创建:Dog实体类

package com.avalanching.spring_hellow.model.JPADemo.bean;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;

/**
 * 创建一个实体类
 * 1.使用@Entity进行实体类的持久化操作,当JPA检测到 
 * @Entity 将在数据库中创建表结构
 */
@Entity
public class Dog {
    /**
     * @id 指定主键
     * @GeneratedValue(strategy=GenerationType.AUTO) 指定主键的生成规则
     * mysql默认自增长
     **/
    @Id 
    @GeneratedValue(strategy=GenerationType.AUTO)
    private int id; // 主键
    private String name;
    private int age;
    private String remark;
    
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public String getRemark() {
        return remark;
    }
    public void setRemark(String remark) {
        this.remark = remark;
    }
}

repository package下创建:DogRepository接口

package com.avalanching.spring_hellow.model.JPADemo.repository;

import org.springframework.data.repository.CrudRepository;
import com.avalanching.spring_hellow.model.JPADemo.bean.Dog;

/**
 * DogRepository这个接口继承与CrudRepository
 * 源码定义:
 * public interface CrudRepository extends Repository
 * 
 * T:是一个范型,这里传入的类型是一个实体类,需要操作那个数据实体就传入,
 *   这里需要操作Dog,所以传入Dog
 * ID extends Serializable: 这里传入的是主键的类型,Dog的主键是id,然后定义的是int
 *                          这里最好将组件定义为Integer,int长度非常有限
 * 此处为一个接口,暂无需要写方法,这里主要是一种规范行为
 */
public interface DogRepository extends CrudRepository {

}

在service package下创建:DogService类

package com.avalanching.spring_hellow.model.JPADemo.service;

import javax.annotation.Resource;
import javax.transaction.Transactional;

import org.springframework.stereotype.Service;
import com.avalanching.spring_hellow.model.JPADemo.bean.Dog;
import com.avalanching.spring_hellow.model.JPADemo.repository.DogRepository;
/**
 * @Service对应的是业务层Bean 
 * 告诉spring这是一个业务层
 * 相当于在.xml文件配置如下代码
 * 
 *  ........
 * 
 */
@Service
public class DogService {
    /**
     * @Resource(这个注解属于J2EE的),
     * 默认安照名称进行装配,名称可以通过name属性进行指定。  
     * 简单来说就是自动new DogRepository的对象,并赋值给dogRepository这个属性
     * 自动装配属性
     */
    @Resource
    private DogRepository dogRepository;
    
    /**
     * @Transactional 标签进行事务绑定
     * 可以简单理解,只要对数据库里面的内容操作就最好绑定事务
     * insert, update, delete等操作
     **/
    @Transactional
    public void save(Dog dog) {
        dogRepository.save(dog);
    }
    
    @Transactional
    public void delete(int id) {
        dogRepository.delete(id);
    }
    
    @Transactional
    public void deleteAll() {
        dogRepository.deleteAll();
    }
    
    public Iterable getAll() {
        return dogRepository.findAll();
    }
}

在controller package下创建:DogController类

package com.avalanching.spring_hellow.model.JPADemo.controller;

import javax.annotation.Resource;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.avalanching.spring_hellow.model.BaseJSONEntity;
import com.avalanching.spring_hellow.model.JPADemo.bean.Dog;
import com.avalanching.spring_hellow.model.JPADemo.service.DogService;

@RestController
@RequestMapping("/dog")
public class DogController {
    
    @Resource
    private DogService dogservice;
    
    @RequestMapping("/save")
    public String save() {
        Dog dog = new Dog();
        dog.setAge(3);
        dog.setName("不二");
        dog.setRemark("666");
        dogservice.save(dog);
        return "success";
    }
    
    @RequestMapping("/delete") 
    public String delete() {
        dogservice.delete(1);       
        return "success";
    }
    
    @RequestMapping("/clean")
    public String clean() {
        dogservice.deleteAll();
        return "success";
    }
    
    @RequestMapping("/find")
    public BaseJSONEntity findDog() {
        Iterable list = dogservice.getAll();
        BaseJSONEntity entity = new BaseJSONEntity();
        entity.setCode(0);
        entity.setData(list);
        entity.setMessage("success");
        return entity;
    }
}

启动程序: 输入网址测试,或打开数据库查看

这里建议:使用Postman去测试,safari浏览器修改一次网址它就能自动调用一次,会出现重复调用的现象

自定义Repository

package com.avalanching.spring_hellow.model.JPADemo.repository;

import org.springframework.data.repository.Repository;
import com.avalanching.spring_hellow.model.JPADemo.bean.Dog;


public interface Dog2Repository extends Repository {
    
    /**
     * 1.查询方法以get | find | read 开头 
     * 2.条件的属性用关键字链接,要注意条件属性以首字母大写
     */
    public Iterable findByName(String name);
    
}

相应的service和controller添加相应代码

/**
 * DogService代码
 */
// 添加一个Dog2Repository类属性
@Resource
private Dog2Repository dog2Repository;

// 创建一个方法供controller调用
public Iterable findDogByName(String name) {
    return dog2Repository.findByName(name);
}
// 在controller中添加一个方法
@RequestMapping("/findname")    
public BaseJSONEntity findDogByName(String name) {
    Iterable dog = dogservice.findDogByName(name);
    BaseJSONEntity entity = new BaseJSONEntity();
    entity.setCode(0);
    entity.setData(dog);
    entity.setMessage("success");
    return entity;
}

启动程序之后输入网址:localhost:8080/dog/findname?name="Dog名字"
这里需要注意的是findBy后面必须给查询到属性名,并且首字母大写

编写JPQL语句查询:

/**
     * 如果编写JPQL语句
     * Hibernate --HQL语句
     * JPQL 语句与HQL语句相似
     * @Query标示一个查询语句
     * :name此处为一个占位符,可以任选书写
     **/
    @Query("from Dog where name=:name")
    public Dog findMyDogByName(@Param("name")String name);

如果你的表名为user_table,请换成UserTable,首字母大写,并且没有下划线,后面遵循驼峰命名法

你可能感兴趣的:(spring-boot 从零开始-03)