资讯专栏INFORMATION COLUMN

Spring Boot快速入门(四):使用jpa进行数据库操作

Kyxy / 1569人阅读

摘要:最常用的属性,第一次加载时根据类会自动建立起表的结构前提是先建立好数据库,以后加载时根据类自动更新表结构,即使表结构改变了但表中的行仍然存在不会删除以前的行。

添加依赖

新建项目选择web,JPA,MySQL三个依赖

对于已存在的项目可以在bulid.gradle加入,spring boot将会帮你自动配置好

compile("org.springframework.boot:spring-boot-starter-data-jpa")
compile("org.springframework.boot:spring-boot-starter-web")
runtime("mysql:mysql-connector-java")
配置基本信息

然后在src/main/resources/application.properties下添加基本配置

#数据库连接地址
spring.datasource.url=jdbc:mysql://localhost:3306/jpa?useSSL=false
#数据库账号
spring.datasource.username=root
#数据库密码
spring.datasource.password=123456zxc
#数据库驱动
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
#jpa设置
spring.jpa.hibernate.ddl-auto=create
#是否在控制台显示数据库语句
spring.jpa.show-sql=true

spring.jpa.properties.hibernate.hbm2ddl.auto 其作用是:自动创建、更新、验证数据库表结构。该参数的几种配置如下:

create:每次加载hibernate时都会删除上一次的生成的表,然后根据你的model类再重新来生成新表,哪怕两次没有任何改变也要这样执行,这就是导致数据库表数据丢失的一个重要原因。

create-drop:每次加载hibernate时根据model类生成表,但是sessionFactory一关闭,表就自动删除。

update:最常用的属性,第一次加载hibernate时根据model类会自动建立起表的结构(前提是先建立好数据库),以后加载hibernate时根据model类自动更新表结构,即使表结构改变了但表中的行仍然存在不会删除以前的行。要注意的是当部署到服务器后,表结构是不会被马上建立起来的,是要等应用第一次运行起来后才会。

validate:每次加载hibernate时,验证创建数据库表结构,只会和数据库中的表进行比较,不会创建新表,但是会插入新值。

none:什么都不做

至此基本配置完成

创建实体

创建一个User实体,包含id(主键)、name(姓名)、age(年龄)属性,通过ORM框架其会被映射到数据库表中,由于配置了hibernate.hbm2ddl.auto,在应用启动的时候框架会自动去数据库中创建对应的表。

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

@Entity//这是一个和数据库表相关联的类
public class User
{
    @Id//主键
    @GeneratedValue//自增长
    private Long id;//id
    @Column(length = 30)//长度30
    private String name;//名称
    @Column(nullable = false)//不可空
    private Integer age;//年龄

    public User()
    {
    }

    public User(String name, Integer age)
    {
        this.name = name;
        this.age = age;
    }

    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 Integer getAge()
    {
        return age;
    }

    public void setAge(Integer age)
    {
        this.age = age;
    }
}
创建数据访问接口

创建一个userRepository接口,进行数据库操作

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

import java.util.List;

public interface UserRepository extends JpaRepository//JpaRepository<实体类型,主键类型>
{
    // 通过名称找到用户
    User findByName(String name);

    // 通过名称和年龄找到用户
    User findByNameAndAge(String name, Integer age);

    // 通过名称模糊查询
    List findByNameLike(String name);

    // 使用hql查询
    @Query("from User u where u.name=:name")//:name对应@Param里的name
    User findByHQL(@Param("name") String name);

    // 使用sql查询
    @Query(value = "select * from user where name = ?1 and age = ?2", nativeQuery = true)//?1表示第一个参数,?2表示第二个参数
    User findBySQL(String name, Integer age);
}
单元测试

在src/test/java/你的包名/你的项目名ApplicationTests编写对应的单元测试来验证编写的内容是否正确

import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

@RunWith(SpringRunner.class)
@SpringBootTest
public class JpaLearnApplicationTests
{
    // 注入userRepository
    @Autowired
    private UserRepository userRepository;

    @Test
    public void contextLoads()
    {
        // 添加10个测试用例
        userRepository.save(new User("QQQ",1));
        userRepository.save(new User("WWW",2));
        userRepository.save(new User("EEE",3));
        userRepository.save(new User("AAA",4));
        userRepository.save(new User("SSS",5));
        userRepository.save(new User("DDD",6));
        userRepository.save(new User("ZZZ",7));
        userRepository.save(new User("XXX",8));
        userRepository.save(new User("CCC",9));
        userRepository.save(new User("QQQ2",10));

        // 测试findAll, 查询所有记录
        Assert.assertEquals(10, userRepository.findAll().size());

        // 测试findByName, 查询姓名为AAA的User
        Assert.assertEquals(4, userRepository.findByName("AAA").getAge().longValue());

        // 测试findByHQL, 查询姓名为AAA的User
        Assert.assertEquals(4, userRepository.findByHQL("AAA").getAge().longValue());

        // 测试findByNameAndAge, 查询姓名为SSS并且年龄为5的User
        Assert.assertEquals("SSS", userRepository.findByNameAndAge("SSS", 5).getName());

        // 测试findBySQL, 查询姓名为SSS并且年龄为5的User
        Assert.assertEquals("SSS", userRepository.findBySQL("SSS", 5).getName());

        // 测试删除姓名为AAA的User
        userRepository.delete(userRepository.findByName("AAA"));

        // 测试findAll, 查询所有记录, 验证上面的删除是否成功
        Assert.assertEquals(9, userRepository.findAll().size());

        // 测试findAll, 查询名字有Q的有几个
        Assert.assertEquals(2,userRepository.findByNameLike("%Q%").size());
    }

}

点击运行测试用例

源码地址:https://github.com/LieRabbit/...
原文地址:https://lierabbit.cn/2018/01/...

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/68288.html

相关文章

  • 写这么多系列博客,怪不得找不到女朋友

    摘要:前提好几周没更新博客了,对不断支持我博客的童鞋们说声抱歉了。熟悉我的人都知道我写博客的时间比较早,而且坚持的时间也比较久,一直到现在也是一直保持着更新状态。 showImg(https://segmentfault.com/img/remote/1460000014076586?w=1920&h=1080); 前提 好几周没更新博客了,对不断支持我博客的童鞋们说声:抱歉了!。自己这段时...

    JerryWangSAP 评论0 收藏0
  • 【从零入门系列-2】Spring Boot据库实体定义实现

    摘要:文章系列从零入门系列之从零入门系列之程序结构设计说明前言本篇文章开始代码实践,系统设计从底向上展开,因此本篇先介绍如何实现数据库表实体类的设计实现。主键由数据库自动生成主要是自动增长型主键由程序控制。 文章系列 【从零入门系列-0】Sprint Boot 之 Hello World 【从零入门系列-1】Sprint Boot 之 程序结构设计说明 前言 本篇文章开始代码实践,系统...

    nemo 评论0 收藏0
  • spring boot - 收藏集 - 掘金

    摘要:引入了新的环境和概要信息,是一种更揭秘与实战六消息队列篇掘金本文,讲解如何集成,实现消息队列。博客地址揭秘与实战二数据缓存篇掘金本文,讲解如何集成,实现缓存。 Spring Boot 揭秘与实战(九) 应用监控篇 - HTTP 健康监控 - 掘金Health 信息是从 ApplicationContext 中所有的 HealthIndicator 的 Bean 中收集的, Spring...

    rollback 评论0 收藏0
  • SpringBoot入门

    摘要:入门简介是一种全新的框架,目的是简化应用的初始搭建和开发过程,让开发者写更少的配置,程序更快的启动和运行,致力于成为快速开发应用领域的领导者。并且可以内嵌,这样我们无需以包的形式部署项目。 SpringBoot入门 SpringBoot简介 spring boot是一种全新的Java web框架,目的是简化Spring应用的初始搭建和开发过程,让开发者写更少的配置,程序更快的启动和运行...

    leone 评论0 收藏0
  • Spring Boot 配置文件中的花样,看这一篇足矣!

    摘要:的默认配置文件位置为。比如,我们需要自定义模块的服务端口号,可以在中添加来指定服务端口为,也可以通过来指定应用名该名字在应用中会被注册为服务名。同时,配置内容都对开发人员可见,本身这也是一种安全隐患。 在快速入门一节中,我们轻松的实现了一个简单的RESTful API应用,体验了一下Spring Boot给我们带来的诸多优点,我们用非常少的代码量就成功的实现了一个Web应用,这是传统的...

    pingan8787 评论0 收藏0

发表评论

0条评论

Kyxy

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<