spring boot 基础-数据库连接-jpa

操作数据库方式

jpa 与mybatis,分为两个章节介绍,这里先介绍jpa的方式。 GitHub地址

使用前提

工具/jar包 版本
idea 2018.2.8
spring boot 2.1.4.RELEASE
Maven 3.6.0
jdk 1.8

pom.xml 使用依赖

<dependencies>
    <!--添加MySQL驱动依赖 -->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <scope>runtime</scope>
    </dependency>

    <!-- 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>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-configuration-processor</artifactId>
        <optional>true</optional>
    </dependency>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-devtools</artifactId>
        <scope>runtime</scope>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
</dependencies>

application.properties

spring.datasource.url=jdbc:mysql://192.168.80.11:3306/db_geoary?characterEncoding=utf-8
spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.jpa.hibernate.ddl-auto=update
# 显示sql语句
spring.jpa.show-sql=true

注意事项:

在properties中的密码 不可添加 单引号'',在yml 中的密码 必须添加 单引号''
spring.jpa.properties.hibernate.hbm2ddl.auto是hibernate的配置属性,其主要作用是:自动创建、更新、验证数据库表结构。该参数的几种配置如下:

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

项目结构

这里只做了最简单的功能实现,所以不会涉及到service 、implement等层面。

entity:持久化层,与数据库中表结构对应。

dao:数据库操作层,执行RURD 基本操作。

SpringBootJdbc01Application:spring boot项目启动程序入口。

static:静态资源文件根目录。

templates:模板文件根目录。

application.properties:配置文件。

系统流程

在配置文件application.properties中配置了 update 操作,所以表结构不需要我们建立,在系统启动时根据@Entity 注解的自动创建表结构(数据库还是得先创建的)。使用 JpaRepository 进行数据库的增删改查。

各文件介绍

User.java

@Entity
public class User {
    @Id
    @GeneratedValue
    private Integer id;

    private String username;

    private String tel;

    public User() {

    }

    public User(String username, String tel) {
        this.username = username;
        this.tel = tel;
    }
    // ...
    // get / set 方法  
    // ...    
    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", username='" + username + '\'' +
                ", tel='" + tel + '\'' +
                '}';
    }
}

UserRepository.java

/**
 * @description  UserRepository 继承 JpaRepository, User为仓库中的对象, Integer 为主键类型  JpaRepository 默认未我们提供了很多基本的接口,这里就不需要定义了
 * @param
 * @return
 * @author geoary
 * @date 2019/5/11
 */
public interface UserRepository extends JpaRepository<User, Integer> {
    // 此处的User必须为entity中的类名 不能写成 user
    /**
     * @description 根据用户名查询数据
     * @param  username 用户名
     * @return
     * @author geoary
     * @date 2019/5/11
     */
    @Query("from User where username=:username")
    List<User> findbyName(@Param("username") String username);

    /**
     * @description 根据id查询数据  Query 默认执行读操作
     * @param id 编号
     * @return
     * @author geoary
     * @date 2019/5/11
     */
    @Query("from User where id=:id")
    User findAllById(@Param("id") Integer id);

    /**
     * @description  做update / delete 这类写操作时,要夹@Modifying注解,并且要在调用的方法前加 @Transactional 注解标识进行事务控制
     * @param username 用户名
     * @return
     * @author geoary
     * @date 2019/5/11
     */
    @Modifying
    @Query("delete from User where username=:username")
    void deleteByUsername(@Param("username") String username);

}

这里说几点:

  1. JpaRepository 已经提供了很多常用到的方法,这个我们直接调用即可。但是总有一些方法是定制化的,必须自己写的,这些定制化的方法就是在这个接口下写的。
  2. 若是查询 直接使用 @Query() 注解即可,但是涉及到写操作的 (update、delete)等的操作就需要再加@Modifying 了,并在调用方法前加注解 @Transactional 表示进行事务控制。

测试方法 SpringBootJdbc01ApplicationTests.java

使用spring boot中自带的测试类进行

@Autowired
private UserRepository userRepository;

@Test
public void initDb(){
    // 添加数据到数据库
    // save方法即JpaRepository自带的方法,直接使用
    // save有两个用处,不带id的是insert,带id的是update。
    userRepository.save(new User("geoary", "13400000001"));
    userRepository.save(new User("icon man", "15600000000"));
    userRepository.save(new User("Thanos", "17800000000"));
}

@Test
public void test01() {
    // 查询所有数据 调用默认的接口
    List<User> users = userRepository.findAll();
    System.out.println(users);
    // 根据id查询数据 调用默认的接口
    User user = userRepository.findAllById(new Integer(1));
    System.out.println(user);
    // 根据姓名查询数据 调用自己写的接口
    List<User> userList = userRepository.findbyName("Elizabeth Olsen");
    System.out.println(userList);
}

@Test
public void test02(){
    User user = new User("Elizabeth Olsen", "18900000000");
    User userAdded = userRepository.save(user);
    System.out.println(userAdded);
}

@Test
public void test03(){
    userRepository.deleteById(new Integer(11));
}

@Test
public void test04(){
    // 修改之前要先做查询,不然会将未修改过的字段置为空
    User user = userRepository.findAllById(new Integer(10));
    user.setTel("18900000001");
    User userModifyed = userRepository.save(user);
    System.out.println(userModifyed);
}

// 这里使用@Transactional 进行事务控制
@Test
@Transactional
public void test05(){
    userRepository.deleteByUsername("test");
}
posted @   Geoary  阅读(145)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)
点击右上角即可分享
微信分享提示