皮皮网

【定制网站和源码】【全景生成网站源码】【负数源码变成反码】jpa save源码分析

2024-11-27 01:12:13 来源:jason c 源码

1.SpringDataJPA的使用详解
2.SpringBoot JPA 注解sql语句中忽略null值
3.JPA系列(三):Spring Jpa save问题缓存总结
4.hibernate中的update()与saveOrUpdate()的区别,load()与get()的区别,Hibernate与JPA的区别。

jpa save源码分析

SpringDataJPA的使用详解

       JPA顾名思义就是JavaPersistenceAPI的意思,是JDK5.0注解或XML描述对象-关系表的映射关系,并将运行期的实体对象持久化到数据库中。

       SpringBoot使用SpringDataJPA完成CRUD操作.数据的存储以及访问都是最为核心的关键部分,现在有很多企业采用主流的数据库,如关系型数据库:MySQL,Oracle,SQLServer。非关系型数据库:redis,mongodb等.

       SpringDataJPA是SpringData的一个子项目,它通过提供基于JPA的Repository极大了减少了操作JPA的代码。

1、导入相关依赖并配置文件<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-jpa</artifactId></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><scope>runtime</scope></dependency>spring:datasource:driver-class-name:com.mysql.cj.jdbc.Driverurl:username:password:jpa:database:mysql#日志中显示sql语句show-sql:truehibernate:naming:physical-strategy:org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl2、JPA使用步骤一:新建实体类并添加JPA注解@Data@AllArgsConstructor@NoArgsConstructor@Entity@Table(name="article")publicclassArticleimplementsSerializable{ @Id@GeneratedValue@Column(name="a_id")privateIntegeraId;@Column(name="article_title")privateStringarticleTitle;@Column(name="article_content")privateStringarticleContent;@Column(name="head_image")privateStringheadImage;@Column(name="article_author")privateStringarticleAuthor;@Column(name="type_number")privateIntegertypeNumber;@Column(name="pageviews")privateIntegerpageViews;@Column(name="create_time")privateStringcreateTime;@Column(name="is_state")privateIntegerisState;}步骤二:新建接口ArticleDao/***JpaRepository<T,码分ID>提供简单的数据操作接口*Article实体类类型*Integer主键类型**JpaSpecificationExecutor<T>提供复杂查询接口*Article实体类类型**Serializable序列化*/@RepositorypublicinterfaceArticleDaoextendsJpaRepository<Article,Integer>,JpaSpecificationExecutor<Article>,Serializable{ //这里没有代码,注意没有代码..........}步骤三:测试@SpringBootTestclassSpringbootJpaApplicationTests{ @AutowiredprivateArticleDaoarticleDao;@TestvoidcontextLoads(){ List<Article>articleList=articleDao.findAll();articleList.forEach(System.out::println);}}3、JPA查询方法命令规范关键字方法命名sqlwhere字句AndfindByNameAndPwdwherename=?andpwd=?OrfindByNameOrSexwherename=?orsex=?Is,EqualsfindById,findByIdEqualswhereid=?BetweenfindByIdBetweenwhereidbetween?and?LessThanfindByIdLessThanwhereid<?LessThanEqualsfindByIdLessThanEqualswhereid<=?GreaterThanfindByIdGreaterThanwhereid>?GreaterThanEqualsfindByIdGreaterThanEqualswhereid>=?AfterfindByIdAfterwhereid>?BeforefindByIdBeforewhereid<?IsNullfindByNameIsNullwherenameisnullisNotNull,NotNullfindByNameNotNullwherenameisnotnullLikefindByNameLikewherenamelike?NotLikefindByNameNotLikewherenamenotlike?StartingWithfindByNameStartingWithwherenamelike'?%'EndingWithfindByNameEndingWithwherenamelike'%?'ContainingfindByNameContainingwherenamelike'%?%'OrderByfindByIdOrderByXDescwhereid=?orderbyxdescNotfindByNameNotwherename<>?InfindByIdIn(Collection<?>c)whereidin(?)NotInfindByIdNotIn(Collection<?>c)whereidnotin(?)TruefindByAaaTuewhereaaa=trueFalsefindByAaaFalsewhereaaa=falseIgnoreCasefindByNameIgnoreCasewhereUPPER(name)=UPPER(?)4、JPQL语法生成publicinterfaceStandardRepositoryextendsJpaRepository<Standard,Long>{ //JPA的命名规范List<Standard>findByName(Stringname);//自定义查询,没有遵循命名规范@Query("fromStandardwherename=?")StandardfindByNamexxxx(Stringname);//遵循命名规范,执行多条件查询StandardfindByNameAndMaxLength(Stringname,IntegermaxLength);//自定义多条件查询@Query("fromStandardwherename=?2andmaxLength=?1")StandardfindByNameAndMaxLengthxxx(IntegermaxLength,Stringname);//使用”标准”SQL查询,以前mysql是怎么写,这里继续@Query(value="select*fromT_STANDARDwhereC_NAME=?andC_MAX_LENGTH=?",nativeQuery=true)StandardfindByNameAndMaxLengthxx(Stringname,IntegermaxLength);//模糊查询StandardfindByNameLike(Stringname);@Modifying//代表本操作是更新操作@Transactional//事务注解@Query("deletefromStandardwherename=?")voiddeleteByName(Stringname);@Modifying//代表本操作是更新操作@Transactional//事务注解@Query("updateStandardsetmaxLength=?wherename=?")voidupdateByName(IntegermaxLength,Stringname);}5、JPAURUD示例

       modle:Article.java

@Data@AllArgsConstructor@NoArgsConstructor@Entity@Table(name="article")publicclassArticleimplementsSerializable{ @Id@GeneratedValue(strategy=GenerationType.IDENTITY)@Column(name="a_id")privateintaId;@Column(name="article_title")privateStringarticleTitle;@Column(name="article_content")privateStringarticleContent;@Column(name="head_image")privateStringheadImage;@Column(name="article_author")privateStringarticleAuthor;@Column(name="type_number")privateinttypeNumber;privateintpageviews;@DateTimeFormat(pattern="yyyy-MM-ddHH:mm:ss")@JsonFormat(pattern="yyyy-MM-ddHH:mm:ss",timezone="GMT+8")@Column(name="create_time")privateDatecreateTime;@Column(name="is_state")privateintisState;}

       dao:ArticleDao.java

publicinterfaceArticleDaoextendsJpaRepository<Article,Integer>,JpaSpecificationExecutor<Article>,Serializable{ List<Article>findByArticleTitleContaining(Stringkeywords);//自定义方法@Query("selectartfromArticleartwhereart.articleTitlelike%?1%orart.articleContentlike%?1%")Page<Article>findByLike(Stringkeywords,Pageablepageable);}

       service:ArticleService.java

publicinterfaceArticleService{ Page<Article>findByLike(Stringkeywords,intpage,intpageSize);publicvoiddelArticle(intaId);publicvoidupdateArticle(Articlearticle);publicvoidaddArticle(Articlearticle);}

       serviceImpl:ArticleServiceImpl.java

@ServicepublicclassArticleServiceImplimplementsArticleService{ @AutowiredprivateArticleDaoarticleDao;@OverridepublicPage<Article>findByLike(Stringkeywords,intpage,intpageSize){ Sortsort=Sort.by(Sort.Direction.DESC,"createTime");PageRequestpageable=PageRequest.of(page-1,pageSize,sort);Page<Article>pageResult=articleDao.findByLike(keywords,pageable);returnpageResult;}@OverridepublicvoiddelArticle(intaId){ articleDao.deleteById(aId);}@OverridepublicvoidupdateArticle(Articlearticle){ articleDao.save(article);}@OverridepublicvoidaddArticle(Articlearticle){ articleDao.save(article);}}

       controller:ArticleController.java

spring:datasource:driver-class-name:com.mysql.cj.jdbc.Driverurl:username:password:jpa:database:mysql#日志中显示sql语句show-sql:truehibernate:naming:physical-strategy:org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl、JPA实现分页和模糊查询

       modle:Article.java

@Data@AllArgsConstructor@NoArgsConstructor@Entity@Table(name="article")publicclassArticleimplementsSerializable{ @Id@GeneratedValue(strategy=GenerationType.IDENTITY)@Column(name="a_id")privateintaId;@Column(name="article_title")privateStringarticleTitle;@Column(name="article_content")privateStringarticleContent;@Column(name="head_image")privateStringheadImage;@Column(name="article_author")privateStringarticleAuthor;@Column(name="type_number")privateinttypeNumber;privateintpageviews;@DateTimeFormat(pattern="yyyy-MM-ddHH:mm:ss")@JsonFormat(pattern="yyyy-MM-ddHH:mm:ss",timezone="GMT+8")@Column(name="create_time")privateDatecreateTime;@Column(name="is_state")privateintisState;}

       dao:ArticleDao.java

spring:datasource:driver-class-name:com.mysql.cj.jdbc.Driverurl:username:password:jpa:database:mysql#日志中显示sql语句show-sql:truehibernate:naming:physical-strategy:org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl2

       service:ArticleService.java

spring:datasource:driver-class-name:com.mysql.cj.jdbc.Driverurl:username:password:jpa:database:mysql#日志中显示sql语句show-sql:truehibernate:naming:physical-strategy:org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl3

       serviceImpl:ArticleServiceImpl.java

spring:datasource:driver-class-name:com.mysql.cj.jdbc.Driverurl:username:password:jpa:database:mysql#日志中显示sql语句show-sql:truehibernate:naming:physical-strategy:org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl4

       controller:ArticleController.java

spring:datasource:driver-class-name:com.mysql.cj.jdbc.Driverurl:username:password:jpa:database:mysql#日志中显示sql语句show-sql:truehibernate:naming:physical-strategy:org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl5

SpringBoot JPA 注解sql语句中忽略null值

       在SpringBoot中,JPA的码分便捷性有时可能会带来意外的困扰。当你尝试使用save方法更新实体对象时,码分如果只提供了部分更新字段,码分其他未赋值的码分字段会被自动设为null。这可能会导致不期望的码分定制网站和源码结果,例如,码分即使只想更新一个字段,码分其他未指定的码分字段也会被清空。

       为了解决这个问题,码分有人提出使用@DynamicUpdate注解,码分其默认值为false,码分当设置为true时,码分会动态地更新所有已修改的码分字段。然而,码分这个注解可能并不符合所有需求,因为它会更新所有非null字段,全景生成网站源码而非仅更新你所指定的修改部分。

       另一种解决方案是利用JPA的灵活性,通过自定义SQL语句。在注解中,可以编写条件逻辑来判断哪些字段在SQL语句中应该被忽略null值。这种方法更加精确,可以确保只更新实际提供的非null字段,避免了不必要的负数源码变成反码数据清空。

       以下是一个简要的自定义SQL示例,用于在update操作时忽略null值:

       1. 首先,理解JPA的@Query注解,可以用于执行自定义SQL。

       2. 在update方法上使用@Query,编写如下的SQL语句:

       java

       @Query(value = "UPDATE YourEntity SET ?1 = :value1 WHERE yourField2 = :value2 AND yourField3 IS NOT NULL", nativeQuery = true)

       public void updateEntity(@Param("value1") String updatedField, @Param("value2") Long id, @Param("value3") String yourField3);

       这里,`yourField3`会被忽略,只有`updatedField`和`yourField2`会被更新,tcpip调试助手 源码如果它们的值不为null。

       尽管找到了其他解决方法,这个自定义SQL的思路不失为一个有效且灵活的解决方案,值得记录在案。

JPA系列(三):Spring Jpa save问题缓存总结

       在处理Spring JPA save问题时,我们需要了解其缓存机制。在服务A和B的交互过程中,服务A尝试根据服务B返回的红包牛牛PHP源码id存储数据,以保持数据一致。然而,在实现中,如果服务A在尝试将请求存储到B服务中失败后,会进行回滚操作。但实际情况中,调用save方法后,JPA并未立即把数据实体存储到数据库中,而是先存储在缓存中。在执行业务逻辑后,尝试刷新缓存中的数据到数据库时,发生异常。由于try-catch块已在先前执行完,所以不会触发删除在服务B中存储的数据的操作,导致数据不一致问题。此问题与一级缓存(Session的缓存)相关,该缓存在事务范围内存储数据。二级缓存(SessionFactory的缓存)为进程范围或集群范围的缓存,可能存在并发问题,但在此场景下,我们通常不会启用它。在使用CrudRepository的save方法保存或更新对象时,如果entity实体设置了自增主键,则只会打印出一条insert语句,并立即刷新到数据库。如果entity未设置增长策略,则会先打印出一条select语句,再打印出一条insert语句。在给方法添加事务的情况下,若entity未设置增长策略,可能会导致尝试刷新缓存中的数据到数据库时出现异常。通过复现实验,可以验证这些情况。

hibernate中的update()与saveOrUpdate()的区别,load()与get()的区别,Hibernate与JPA的区别。

       è¿™æ˜¯æˆ‘的总结:

       1:Hibernate 的get和load方法的区别

       å½“查询的数据不存在时表现不一样:load:延迟检索 get:立即检索

       1:load返回的是代理对象,等到要用该对象时,才会发sql语句从数据库取, 当数据库没有对应的记录时会报错

       2:get 直接从数据库加载,不会延迟加载,当数据库没有对应的记录时返回null.

       2:save 和update区别

       save的作用是把一个新的对象保存

       update是把一个脱管状态的对象保存

       3:persist(),save(),saveOrUpdate()区别 persist():只接受临时状态的对象,即主键没有值的对象,如果传递一个非临时状态的对象给它,则会抛出异常。

        save():无论对象是否处于临时状态都会向数据库保存。saveOrUpdate():如果主键有值则执行update,如果主键没有值则执行insert

       4:load()---->setXX() 和 update()区别

       load()--->setXX():支持动态更新:此时需要在配置文件里加上:dynamic-update="true"update:用来更新托管状态的对象,使其变成持久状态。更新一个没有主键对应值的临时对象不会成功:。

       jpa是用注释的,不需要为每张表配置hibernate映射文件。