欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Springboot+JPA+Mysql的实践操作

程序员文章站 2022-03-02 14:57:19
...

1、什么是JPA?

JPA全称为Java Persistence API ,Java持久化API是Sun公司在javaEE 5规范中提出的Java持久化接口。
JPA吸取了目前Java持久化技术的优点,旨在规范、简化Java对象的持久化工作。使用JPA持久化对象,并不是依赖于某一个ORM框架。

2、作用是什么?

通过JDK 5.0注解或XML描述对象-关系表的映射关系,并将运行期的实体对象持久化到数据库中,同样可以将数据库的结果集自动映射到实体类中。

3、底层是什么?

JPA是需要Provider来实现其功能的,Hibernate就是JPA Provider中很强的一个,应该说无人能出其右。
从功能上来说,JPA就是Hibernate功能的一个子集。

4、JPA和JDBCTemplate区别?

最根本的区别就是不需要我们再去书写原声SQL语句,通过对象来操作数据库,用极简的代码实现了对数据库的访问和操作,包括了增、删、改、查等在内的常用功能.

实践

应为JPA属于持久层技术,此处使用mysql数据库进行演示,SpingBoot+JPA+MYSQL需要添加一下依赖

<!-- mysql连接类-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>
<!--alibaba连接池-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.0.29</version>
        </dependency>
<!--     开启web-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
<!--JPA-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa
            </artifactId>
        </dependency>

#properties.yml配置

#mysql数据库连接

spring:
  datasource:
    driver-class-name: com.mysql.jdbc.Driver
    url: jdbc:mysql://localhost:3306/hotel?serverTimezone=UTC
    username: root
    password: aaaaaa


  jpa:
    hibernate:
      ddl-auto: update  # 第一次建表create  后面用update,建完表之后,要改为update,要不然每次重启工程会删除表并新建。
    show-sql: true #配置在日志中打印出执行的 SQL 语句信息。
    database-platform: org.hibernate.dialect.MySQL5InnoDBDialect #在 SrpingBoot 2.0 版本中,Hibernate 创建数据表的时候,默认的数据库存储引擎选择的是 MyISAM (之前好像是 InnoDB,这点比较诡异)。这个参数是在建表的时候,将默认的存储引擎切换为 InnoDB 用的。

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

实体(Model)类书写

@Entity(name=“EntityName”) 必须,用来标注一个数据库对应的实体,数据库中创建的表名默认和类名一致。
@Table(name="",catalog="",schema="") 可选,用来标注一个数据库对应的实体,数据库中创建的表名默认和类名一致。通常和 @Entity 配合使用,只能标注在实体的 class 定义处,表示实体对应的数据库表的信息。
@Id 必须,@Id 定义了映射到数据库表的主键的属性,一个实体只能有一个属性被映射为主键。
@GeneratedValue(strategy=GenerationType,generator="") 可选,strategy: 表示主键生成策略,有 AUTO、INDENTITY、SEQUENCE 和 TABLE 4 种,generator: 表示主键生成器的名称。
AUTO主键由程序控制, 是默认选项 ,不设置就是这个
IDENTITY 主键由数据库生成, 采用数据库自增长, Oracle不支持这种方式
SEQUENCE 通过数据库的序列产生主键, MYSQL 不支持
Table 提供特定的数据库产生主键, 该方式更有利于数据库的移植

@Column(name = “user_code”, nullable = false, length=32) 可选,@Column 描述了数据库表中该字段的详细定义,这对于根据 JPA 注解生成数据库表结构的工具。name: 表示数据库表中该字段的名称,默认情形属性名称一致,不一致时可指定;nullable: 表示该字段是否允许为 null,默认为 true;unique: 表示该字段是否是唯一标识,默认为 false;length: 表示该字段的大小,仅对 String 类型的字段有效。
@Transient可选,@Transient 表示该属性并非一个到数据库表的字段的映射,ORM 框架将忽略该属性。
@Enumerated 可选,使用枚举的时候,我们希望数据库中存储的是枚举对应的 String 类型,而不是枚举的索引值,需要在属性上面添加 @Enumerated(EnumType.STRING) 注解。

Dao层

数据访问层,通过编写一个继承自 JpaRepository 的接口就能完成数据访问,其中包含了几本的单表查询的方法,
非常的方便。值得注意的是,这个Account 对象名,而不是具体的表名,另外Interger是主键的类型,一般为Integer或者Long

@Repository
public interface JpaStyleDao extends JpaRepository<Style, Integer>
{

}

Service层

public interface StyleService {
    /* JPA写法*/
    Style add(Style style);
    Style update(Style style);
    void delete(int id);
    List<Style> findAll();
    Style findById(Integer id);
}
@Service
public class StyleServiceImpl implements StyleService {
    @Autowired
    StyleDao styleDao;

    @Autowired
    JpaStyleDao jpaStyleDao;

    @Override
    public Style add(Style style) {
        return jpaStyleDao.save(style);
    }
    @Override
    public Style update(Style style) {
        return jpaStyleDao.saveAndFlush(style);
    }
    @Override
    public void delete(int id) {
        jpaStyleDao.deleteById(id);
    }
    @Override
    public List<Style> findAll() {
        return jpaStyleDao.findAll();
    }
    @Override
    public Style findById(Integer id) {
        /* 原来是自从spring boot 2.0以后,由于用上了Java 8 的Optional,废除了原来的findOne(Id)。*/
        /* findById()方法也使用了Optional,废除了原来的方法:*/
        return jpaStyleDao.findById(id).get();
    }
}

Web层

@RestController
@RequestMapping("/style")
public class StyleController {
    @Autowired
    StyleService styleService;
    /*插入数据*/
    @RequestMapping(value = "/add", method = RequestMethod.POST)
    public Style add() {
        Style style = new Style();
        style.setStyle("大房");
        style.setMoney(125.0);
        style.setFacilities("卫生间、健生房");
        style.setMessage("可住两人");
        return styleService.add(style);


    }
//更新数据
    /*@[email protected] 一起使用 请求方式http://127.0.0.1:8080/style/update/5?style=大房*/
    @RequestMapping(value = "/update/{id}", method = RequestMethod.PUT)
    public Style update(@PathVariable int id, @RequestParam(value = "style", required = true) String styles) {
        Style style = new Style();
        style.setId(id);
        style.setStyle(styles);
        style.setMoney(126.0);
        style.setFacilities("卫生间、健生房");
        style.setMessage("可住两人");
        return styleService.update(style);
    }
//删除数据
    @RequestMapping(value = "/delete/{id}", method = RequestMethod.DELETE)
    public void delete(@PathVariable int id) {
        styleService.delete(id);
    }
//按照ID查找数据
    @RequestMapping(value = "/findById/{id}", method = RequestMethod.GET)
    public Style findById(@PathVariable int id) {

        return styleService.findById(id);
    }
//查找所有数据
    @RequestMapping(value = "/findAll", method = RequestMethod.GET)
    public List<Style> findAll() {
        return styleService.findAll();
    }
}