JPA—简介

JPA—简介JPA 的使用什么是 JPA JPA JavaPersiste 是将实体对象持久化到数据库中的一种规范

大家好,欢迎来到IT知识分享网。

JPA的使用

什么是JPA;

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

Jpa与Jdbc的关系;

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

首先导入依赖;

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

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

配置文件yml;

 <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> </dependency> 
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",""); 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(""); 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()); } 

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实体。例如:

TYPE ASCII HTML
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文件进行本地保存。

导入


  1. 注脚的解释 ↩︎

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/125511.html

(0)
上一篇 2025-09-26 17:45
下一篇 2025-09-26 18:00

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信