SpringDataJpa入门(渊虹)

SpringDataJPA入门

1. 项目构建

  1. 【Filt】->【new】 -> 【project】 -> 选择Spring Initializr -> 【next】,填写Group,Artifact,Type ->【next】

  2. 选择依赖包

    • 左边选择Core,右边勾选Lombok
    • 左边选择Web,右边勾选Web
    • 左边选择SQL,右边勾选JPAMySQL

    【next】->【finish】

2.配置文件

在配置文件resource.application.xml前,需要创建以下配置类

package com.example.springdatajpa.config;
public class MyDatabaseConfig extends MySQL5InnoDBDialect {
    @Override
    public String getTableTypeString() {
        // 设置创建表的存储引擎为 InnoDB,字符编码为 utf-8
        return " ENGINE=InnoDB DEFAULT CHARSET=utf8";
    }
}

resource.application.yml文件中添加如下配置

spring:
  datasource:
    url: jdbc:mysql://localhost:3306/springdatajpa?useSSL=FALSE&serverTimezone=UTC
    username: root
    password: root
    driver-class-name: com.mysql.cj.jdbc.Driver
  jpa:
    show-sql: true          # 打印sql语句
    hibernate:
      ddl-auto: update
    # 设置jsp存储引擎,使用上面的配置类
    database-platform: com.example.springdatajpa.config.MyDatabaseConfig

spring data jpa的配置说明:

  1. spring.jpa.show-sql:是否在日志打印sql语句

    同样的,可以在logback-spring.xml中配置如下可以打印sqlsql参数

     <!--开发环境:打印控制台-->
        <springProfile name="dev">
            <!-- 打印sql -->
            <logger name="org.hibernate.SQL" level="DEBUG"/>
            <!-- 打印sql的参数 -->
            <logger name="org.hibernate.type.descriptor.sql.BasicBinder" level="TRACE"/>
            <root level="info">
                <appender-ref ref="CONSOLE"/>
            </root>
        </springProfile>
    
  1.  
  1. spring.jpa.hibernate.ddl-auto:是hibernate的配置属性,其主要作用是:自动创建、更新、验证数据库表结构。

    该参数的几种配置如下:

    • create:每次加载都会删除上一次的生成的表,然后根据model类再重新来生成新表,会导致数据库表数据丢失。
    • create-drop:每次加载时,根据model类生成表,但是sessionFactory一关闭,表就自动删除。
    • update:最常用的属性,第一次加载时根据model类会创建表的结构(前提是先建立好数据库),以后加载时根据model类自动更新表结构,即使表结构改变了但表中的行仍然存在不会删除以前的行。要注意的是当部署到服务器后,表结构是不会被马上建立起来的,是要等应用第一次运行起来后才创建。
    • validate:每次加载时,验证创建数据库表结构,只会和数据库中的表进行比较,不会创建新表,但是会插入新值。
  2. spring.jpa.database-platform:SpringBoot 2.0版本中创建数据表的时候,默认存储引擎是 MyISAM 。这个参数值org.hibernate.dialect.MySQL5InnoDBDialect是在建表的时候,将默认的存储引擎切换为 InnoDB,但默认的字符编码为latin1,所以一般都是自定义配置类继承MySQL5InnoDBDialect来指定字符编码,或者手动创建表指定字符编码,或者创建表后,修改表字符编码。

3.建立数据实体类

数据库实体类是一个 POJO Bean 对象。这里我们先建立一个 UserDO 的数据库实体。数据库实体的源码如下

package com.example.springdatajpa.entity;
@Entity
@Table(name = "User")   // 指定表名,不指定使用实体类名称
@Getter
@Setter
@JsonIgnoreProperties(ignoreUnknown = true, value = {"hibernateLazyInitializer", "handler", "fieldHandler"})
public class UserDO {
    @Id     // 主键id
    @GeneratedValue(strategy = GenerationType) // 主键生成策略
    @Column(name = "id")
    private Long id;

    @Column(name = "username", length = 50) // 表列的字段名,长度50
    private String username;

    @Column(name = "age", length = 3)   // 表列的字段名,长度3
    private Integer age;
}

注意点:

  • @JsonIgnoreProperties:忽略Hibernate的延迟加载的一些属性"hibernateLazyInitializer", "handler", "fieldHandler",这些属性在实体类里没有所以要忽略掉,否则转换为Json会报错。

  • @GeneratedValue:设置主键id的生成策略。Jpa支持4种生成策略:

    • TABLE:使用一个特定的数据库表格来保存主键
    • SEQUENCE:根据底层数据库的序列来生成主键,需要数据库支持序列。
    • IDENTITY:主键由数据库自动生成(主要是自动增长型)
    • AUTO:主键由程序控制(JPA默认)

    四种数据库支持情况:

    数据库名称支持的id策略
    mysqlGenerationType.TABLE GenerationType.AUTO GenerationType.IDENTITY 不支持GenerationType.SEQUENCE
    oracleGenerationType.AUTO GenerationType.SEQUENCE GenerationType.TABLE 不支持GenerationType.IDENTITY
    postgreSQLGenerationType.TABLE GenerationType.AUTO GenerationType.IDENTITY GenerationType.SEQUENCE 都支持
    kingbaseGenerationType.TABLE GenerationType.SEQUENCE GenerationType.IDENTITY GenerationType.AUTO 都支持

    上面的生成策略都是自增id,移植和在分布式下都不方便,JPA可以使用UUID生成策略:

    @Id
    @GenericGenerator(name = "system-uuid", strategy = "uuid")
    @GeneratedValue(generator = "system-uuid")
    @Column(name = "id")
    private String id;    // uuid必须为String类型
    
  •  

4.实现持久层服务

JPA中,实现持久层服务很简单。只需要新建接口继承org.springframework.data.jpa.repository.JpaRepository<T, ID>类即可,其中T是数据库实体类,ID是数据库实体类的主键类型

package com.example.springdatajpa.repository;
/**
 * 符合SpringDataJpa的Dao层接口规范
 *      JpaRepository<操作的实体类类型,实体类中主键属性的类型>
 *          * 封装了基本curd操作
 *      JpaSpecificationExecutor<操作的实体类类型>
 *          * 封装了复杂查询(如分页等)
 */
@Repository
public interface UserRepository extends JpaRepository<UserDO, Long>, JpaSpecificationExecutor<UserDO> {
    // 如果需要自定义方法查询,可以添加
    User findByUsername(String username);
}

一行代码也不用写。UserDO 这个实体类,拥有父类的如下功能:

Snipaste_2019-04-07_14-39-09.png

5.创建Service服务

  1. UserService接口

    package com.example.springdatajpa.service;
    public interface UserService {
        UserDO saveUser(UserDO userDO);
        UserDO findById(long id);
    }
    
  •  
  • UserService接口的实现类UserServiceImpl

    package com.example.springdatajpa.service.impl;
    @Service
    public class UserServiceImpl implements UserService {
        @Autowired
        private UserRepository userRepository;
    
         /**
         * save: 保存或更新
         *          根据传递的对象是否存在主键id,
         *          如果没有id主键属性,则保存
         *          存在id主键属性,根据id查询数据,再更新数据
         */
        @Override
        public UserDO saveUser(UserDO userDO) {
            UserDO save = userRepository.save(userDO);
            return save;
        }
    
        @Override
        public UserDO findById(long id) {
            UserDO byId = userRepository.findById(id).get();
            return byId;
        }
    }
    
  1.  

6.controller

package com.example.springdatajpa.controller;
@RestController
public class UserController {
    @Autowired
    private UserService userService;

    @PostMapping("/add-user")
    public UserDO addPerson(@RequestBody UserDO user){
        return userService.saveUser(user);
    }

    @GetMapping("/get-user")
    public UserDO getPerson(@RequestParam Long id){
        return userService.findById(id);
    }
}

启动程序,如果数据库中的表不存在时,会自动创建表,在Postman中执行

  • 添加用户

Snipaste_2019-04-07_15-04-32.png

  • 通过id获取用户

转载:https://www.jianshu.com/p/4b16a6271a63

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值