JPA—简介

JPA的使用

什么是JPA;

JPA(Java Persistence API)是将实体对象持久化到数据库中的一种规范。JPA仅仅是一种规范,也就是说JPA仅仅定义了一些接口,而接口是需要实现才能工作的。所以底层需要某种实现,而Hibernate就是实现了JPA接口的ORM框架。spirng data jpa是spring提供的一套简化JPA开发的框架,按照约定好的【方法命名规则】写dao层接口,就可以在不写接口实现的情况下,实现对数据库的访问和操作。同时提供了很多除了CRUD之外的功能,如分页、排序、复杂查询等等,底层还是使用了 Hibernate 的 JPA 技术实现。

Jpa与Jdbc的关系;

相同点:
1.都跟操作数据库有关、JPA是JDBC的升级版
2.JDBC和JPA都是一组模范接口
3.都是由SUN官方推出
不同点:
1.JDBC是由各个关系型数据库实现的,JPA是由ORM框架实现(ORM:对象关系映射)
2.JDBC使用SQL语句和数据库通信,JPA面向对象,通过ORM框架来生成SQL进行操作
3.JAP是依赖于JDBC才能操作数据库的

JPA的对象分为四个状态 分别是;

**1.**临时状态:指对象刚刚创建出来,还没有与entityManager发生关系,没有持久化,可以理解为还为与数据库进行交互
**2.**持久状态:与entityManager发生关系,操作了数据库,已经被持久化,比如:查询出来的数据,添加数据,修改的数据
**3.**删除状态:执行了remove方法但是还为提交事务
**4.**游离状态:数据提交到数据库,事务commit后,此时再对数据进行操作也不会同步到数据库

首先导入依赖;

在这里插入图片描述
代码如下:

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

配置文件yml;

配置之前先加入Mysql依赖:
在这里插入图片描述
代码如下:

     <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>

配置好依赖以后其次配置application.yml:
在这里插入图片描述
代码如下:

spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    username: root
    password: root
    url: jdbc:mysql://localhost:3306/users_test?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8&useSSL=false
  jpa:
    show-sql: true
    properties:
      hibernate:
        dialect: org.hibernate.dialect.MySQL5Dialect
#        dialect: org.hibernate.dialect.MySQLDialect
        format_sql: true
    hibernate:
      ddl-auto: update
#      ddl-auto: create

原则;

**1.**使用第一个注释(dialect: org.hibernate.dialect.MySQLDialect),可能会在由实体类生成数据库表的时候报错(Error executing DDL),DDL是数据定义语言(Data Definition Language),用来创建数据库表和更新数据库表结构的。

**2.**使用第二个注释(ddl-auto: create),会把数据库中的所有表和数据都删除,然后再重新创建新表,所以要慎用!使用update就安全,也会创建表,更新表结构!为了安全起见,尽量避免使用ddl-auto: create。

**3.**serverTimezone=GMT%2B8,配置的是东八区。

**4.**format_sql: true,格式化显示sql,这个也很重要,方便查看sql的执行情况

继承(Jpa)UserRepository接口

在这里插入图片描述
代码如下:

@Repository
public interface UserRepository extends JpaRepository<User,Integer> {




    @Override
    Page<User> findAll(Pageable pageable);
    /*原生查询,列名和表名使用数据库中的字段和表名*/
    @Query(value="select * from users where user_name like ? 1",
        countQuery="select  count (*) from  users where user_name like ?1",nativeQuery = true)
    Page<User>findByUserNameLike(String userName, Pageable pageable);

    Object findByUserName(String river);

    List findByUserNameEndsWith(String ver3);

    ArrayList<User>  findByUserNameStartsWith(String river);

    List findByUserNameContains(String s);

    List findByUserNameLike(String s);

    ArrayList<User> findByUserNameNotIn(String[] userNames);

    /*sql,列名和表名使用实体类的属性和类名,如果没有new User(),返回值List中是Object【】,而不是User实体类*/
//    @Query(value="select new User (u.userName,u.password) from User u where u.userName like :userName and u.createTime >:createTime")
//    List<User>findByUserNameLikeAndCreaTimeGreaterThan(@Param("userName")String userName, @Param("createTime")Date createTime);
}

原则:
1、JpaRepository<User,Integer>中,User是数据库对象的实体类,Integer是数据表的主键类型。

2、UserName为字段名,查询的时候,只要函数的命名符合jpa的规则,则不需要实现的方法体,这里是列举的几个常用的查询。

3、jpa实现分页的方式是使用Pageable接口。

4、可以使用原生查询和hql语句查询。其中hql中,需要注意的是new User(),描述在注释中写了。

创建一个(User)实体类;

在这里插入图片描述
此图为后续没有实现所以进行分装
代码如下:

@Entity
@Table(name = "userd")
public class User {
    @Id
    @GeneratedValue(strategy= GenerationType.IDENTITY)
    @Column(name="id")
    private int id;
    @Column(name="name")
    private String username;
    @Column(name="password")
    private String password;
    @Column(name="create_time")
    private Date createTime;
    @Column(name="update_time")
    private Date updateTime;

    public User(String username, String password) {
        this.username = username;
        this.password = password;
    }
    public User(){

    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public Date getCreateTime() {
        return createTime;
    }

    public void setCreateTime(Date createTime) {
        this.createTime = createTime;
    }

    public Date getUpdateTime() {
        return updateTime;
    }

    public void setUpdateTime(Date updateTime) {
        this.updateTime = updateTime;
    }
}

编写测试类:DemoApplicationTests;

代码结果
在这里插入图片描述

代码如下:

@SpringBootTest
class DemoApplicationTests {
    @Autowired
    private UserRepository userRepository;
    private final static Logger log= LoggerFactory.getLogger(DemoApplicationTests.class);
    @Test
    void save() {
        User user = new User("river","123456");
        User user1 = userRepository.save(user);
        log.info("id:{},userName:{},password:{}",user1.getId(),user1.getUsername(),user1.getPassword());

            }
            @Test
            void findByUserName(){
                User user = (User) userRepository.findByUserName("river");
                assertNotEquals(user,null);
                log.info(user.getPassword());
    }
            @Test
            void update(){
                User user= (User) userRepository.findByUserName("river");
                user.setPassword("123456");
                userRepository.save(user);
                assertNotEquals(user,null);
                log.info(user.getPassword());
            }
            @Test
            void findByUserNameEndsWith(){
                List userList = userRepository.findByUserNameEndsWith("ver3");
                assertNotEquals(userList.size(),1);
            }
            @Test
            void findByUserNameStartsWitgh(){
                ArrayList<User> userList = userRepository.findByUserNameStartsWith("river");
                assertNotEquals(userList.size(),0);
                log.info(userList.get(0).getPassword());
            }
            @Test
            void findByUserNameContains(){
                List userList=userRepository.findByUserNameContains("3");
                assertNotEquals(userList.size(),1);
                //log.info(userList.get(0).getpassowrd());

            }
    @Test
    void findByUserNameLike() {
        List userList = (List) userRepository.findByUserNameLike("river%");
        assertNotEquals(userList.size(), 0);
        log.info("size:{}",userList.size());
        userList = userRepository.findByUserNameLike("river_");
        assertNotEquals(userList.size(), 0);
        log.info("size:{}",userList.size());
    }

说明:
1、save()方法,返回的User对象中,id是为0的。除非配置了@GeneratedValue。

2、createTime是不需要赋值的。配置数据库的时候,设置默认值为:CURRENT_TIMESTAMP。还需要在User实体类加上@DynamicInsert注解,这样插入的时候createTime就会被自动赋值。

3、updateTime也是不需要赋值的。设计数据表的使用,手动建表的话:update_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP。如果是使用Navicat设计表的话,勾选“根据当前时间戳更新”。还需要在在User实体类加上@DynamicUpdate注解,这样当数据更新的时候,时间会自动更新到数据库中。

一堆报错还未解决 后续尽快待完成 !!!!!

使用:---------:居中
使用:----------居左
使用----------:居右

第一列第二列第三列
第一列文本居中第二列文本居右第三列文本居左

SmartyPants

SmartyPants将ASCII标点字符转换为“智能”印刷标点HTML实体。例如:

TYPEASCIIHTML
Single backticks'Isn't this fun?'‘Isn’t this fun?’
Quotes"Isn't this fun?"“Isn’t this fun?”
Dashes-- is en-dash, --- is em-dash– is en-dash, — is em-dash

创建一个自定义列表

Markdown
Text-to- HTML conversion tool
Authors
John
Luke

如何创建一个注脚

一个具有注脚的文本。1

注释也是必不可少的

Markdown将文本转换为 HTML

KaTeX数学公式

您可以使用渲染LaTeX数学表达式 KaTeX:

Gamma公式展示 Γ ( n ) = ( n − 1 ) ! ∀ n ∈ N \Gamma(n) = (n-1)!\quad\forall n\in\mathbb N Γ(n)=(n1)!nN 是通过欧拉积分

Γ ( z ) = ∫ 0 ∞ t z − 1 e − t d t   . \Gamma(z) = \int_0^\infty t^{z-1}e^{-t}dt\,. Γ(z)=0tz1etdt.

你可以找到更多关于的信息 LaTeX 数学表达式here.

新的甘特图功能,丰富你的文章

Mon 06 Mon 13 Mon 20 已完成 进行中 计划一 计划二 现有任务 Adding GANTT diagram functionality to mermaid
  • 关于 甘特图 语法,参考 这儿,

UML 图表

可以使用UML图表进行渲染。 Mermaid. 例如下面产生的一个序列图:

张三 李四 王五 你好!李四, 最近怎么样? 你最近怎么样,王五? 我很好,谢谢! 我很好,谢谢! 李四想了很长时间, 文字太长了 不适合放在一行. 打量着王五... 很好... 王五, 你怎么样? 张三 李四 王五

这将产生一个流程图。:

链接
长方形
圆角长方形
菱形
  • 关于 Mermaid 语法,参考 这儿,

FLowchart流程图

我们依旧会支持flowchart的流程图:

Created with Raphaël 2.3.0 开始 我的操作 确认? 结束 yes no
  • 关于 Flowchart流程图 语法,参考 这儿.

导出与导入

导出

如果你想尝试使用此编辑器, 你可以在此篇文章任意编辑。当你完成了一篇文章的写作, 在上方工具栏找到 文章导出 ,生成一个.md文件或者.html文件进行本地保存。

导入

如果你想加载一篇你写过的.md文件,在上方工具栏可以选择导入功能进行对应扩展名的文件导入,
继续你的创作。


  1. 注脚的解释 ↩︎

  • 6
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
JPA是Java Persistence API的缩写,是Java EE规范中用于ORM(对象关系映射)的API。它定义了一组接口和注解,使开发人员可以通过编写面向对象的代码来操作数据库。引用提到了在pom.xml中添加了两个依赖,即org.springframework.data:spring-data-jpa和org.springframework.boot:spring-boot-starter-data-jpa,这是使用Spring Data JPA时需要添加的依赖。 Spring Data JPA是在JPA规范下对Repository层进行封装的实现。它提供了一套简化的方法和规范,使开发人员可以更轻松地进行数据库操作。引用中的代码片段展示了如何定义一个符合Spring Data JPA规范的DAO层接口。通过继承JpaRepository和JpaSpecificationExecutor接口,我们可以获得封装了基本CRUD操作和复杂查询的功能。 关于JPA和Spring Data JPA的区别,引用提到了一个很好的解释。JPA是一种规范,而Spring Data JPA是在JPA规范下提供的Repository层的实现。通过使用Spring Data JPA,我们可以方便地在不同的ORM框架之间进行切换,而不需要更改代码。Spring Data JPA还对Repository层进行了封装,省去了开发人员的不少麻烦。 综上所述,JPA是Java EE规范中的API,而Spring Data JPA是在JPA规范下的Repository层的实现。Spring Data JPA封装了JPA规范,提供了更方便的方法和规范,使开发人员可以更轻松地进行数据库操作。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [JPA和Spring-Data-JPA简介](https://blog.csdn.net/benjaminlee1/article/details/53087351)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] - *2* [JPA & Spring Data JPA详解](https://blog.csdn.net/cd546566850/article/details/107180272)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值