当前位置: 首页 > news >正文

Spring Data JPA方法名命名规则

最近巩固一下JPA,网上看到这些资料,这里记录巩固一下。

一、Spring Data Jpa方法定义的规则

简单条件查询

        简单条件查询:查询某一个实体类或者集合。
        按照Spring Data的规范的规定,查询方法以find | read | get开头(比如 find、findBy、read、readBy、get、getBy),涉及查询条件时,条件的属性用条件关键字连接,要注意的是:条件属性以首字母大写。框架在进行方法名解析时,会先把方法名多余的前缀截取掉,然后对剩下部分进行解析。
        直接在接口中定义查询方法,如果是符合规范的,可以不用写实现,即不用写SQL,目前支持的关键字写法如下:

二、只有查询参数

定义一个Entity实体类:

class People{private String firstName;private String lastName;
}

以上使用and条件查询时,应这样写

findByLastNameAndFirstName(StringlastName,String firstName); 

注意:条件的属性名称与个数要与参数的位置与个数一一对应

三、查询同时排序

        如果方法的最后一个参数是 Sort 或者 Pageable 类型,也会提取相关的信息,以便按规则进行排序或者分页查询比如

Page findByName(String name, Pageable pageable);List findByName(String name, Sort sort);

排序也可以这么写

List<Cus> findBySexOrderByName(String sex); //名称正序(正序时,推荐此方式,简单)
List<Cus> findBySexOrderByNameAsc(String sex); //名称正序(效果同上)
List<Cus> findBySexOrderByNameDesc(String sex); //名称倒序

四、查询参数是 对象里面的对象的属性

如,查询参数是ERole.EMemberAccount.memberCode 一般我们会这么写

   @Query("select e from ERole e where e.memberAccount.memberCode = ?1")List<ERole> findByMerchantCode(String merchantCode);

如果用命名规则可以这么写

List<ERole> findByMemberAccountMemberCode(String merchantCode);

查询方法解析流程

        假如我们创建如下的查询:findByUserDepUuid(),框架在解析该方法时,首先剔除findBy,然后对剩下的属性进行解析,假设查询实体为Doc。

  1. 先判断userDepUuid (根据POJO(Plain Ordinary Java Object简单java对象,实际就是普通java bean)规范,首字母变为小写。)是否是查询实体的一个属性,如果根据该属性进行查询;如果没有该属性,继续第二步。

  2. 从右往左截取第一个大写字母开头的字符串(此处为Uuid),然后检查剩下的字符串是否为查询实体的一个属性,如果是,则表示根据该属性进行查询;如果没有该属性,则重复第二步,继续从右往左截取;最后假设 user为查询实体的一个属性。

  3. 接着处理剩下部分(DepUuid),先判断user所对应的类型是否有depUuid属性,如果有,则表示该方法最终是根据 “Doc.user.depUuid” 的取值进行查询;否则继续按照步骤 2的规则从右往左截取,最终表示根据“Doc.user.dep.uuid” 的值进行查询。

  4. 可能会存在一种特殊情况,比如 Doc包含一个user的属性,也有一个 userDep 属性,此时会存在混淆。可以明确在属性之间加上 "_"以显式表达意图,比如"findByUser_DepUuid()" 或者"findByUserDep_uuid()"。

五、命名规则不适合动态查询

当查询条件为null时,如

  • 实体定义:对于一个客户实体Cus,包含有name和sex,均是String类型。
  • 查询方法定义:List<Cus> findByNameAndSex(String name,String sex);
  • 使用时:dao.findByNameAndSex(null, "男");
  • 后台生成sql片断:where (cus0_.name is null) and cus0_.sex=?

        结论:当查询时传值是null时,数据库中只有该字段是null的记录才符合条件,并不是说忽略这个条件。也就是说,这种查询方式,只适合于明确查询条件必须传的业务,对于动态查询(条件多少是动态的,例如一般的查询列表,由最终用户使用时决定输入那些查询条件),这种简单查询是不能满足要求的。

强调:需要强调的是,命名规则也不适合delete insert update. 只适合简单查询

 

六、Spring Data JPA对多表查询的选择

答案是肯定的,直接上结论。

方案说明自定义接收对象SQL分页多表联合问题
方案一@QueryJPQL:DTO或投影原生SQL:Object[],map(2个字段时)JPQL或原生SQLJpaRepository实体上配不配关系都可以1.查询条件要嵌入SQL语句内,一些复杂的情形不好处理,例如某个字段模糊检索,字段是动态的;2.分页查询countQuery把查询语句重复了一遍
方案二Specification不支持,只能返回对应PO无SQL结合JpaRepository需要在实体上配置关系,如@OneToOne,否则无法实现左连接,只能联合查询1.实体需要配置连接关系2.每一个关联对象都是单独的数据库查询
方案三EntityManager不支持投影,其他同@QueryJPQL或原生SQL自己封装实体上配不配关系都可以相比于@Query好处是,JPQL字符串可以动态拼接,可以处理一些复杂的查询情形。但是分页需要自己封装。
方案四CriteriaQueryDTO无SQL自己封装需要在实体上配置关系,如@OneToOne否则无法实现左连接,只能联合查询同Specification,且分页需要自己封装
终极方案QueryDSLDTOTuple无SQL支持实体上配不配关系都可以解决以上所有问题

选择一个好的解决方案,需要考虑如下几个方面:

  • 能够自定义对象接收查询结果集;
  • 能够支持复杂的、动态的查询条件;
  • 既然使用JPA,当然最好能够用类型安全的查询方式,并且使用起来比较自然;
  • 能够原生支持分页查询;
  • 能够支持left join,并且对实体定义没有约束。

上表就是从这几个方面进行分析,最后QueryDSL堪称完美,下面详细介绍几种方案。

示例代码:GitHub - zhongpan/jpa-demo

七、JPA、Hibernate、Spring Data JPA三者的关系

        先了解下JPA、Hibernate、Spring Data JPA三者的关系是什么?

        JPA是一个接口规范,随着Java EE 5发布,也是EJB3.0的一部分。Hibernate是先于JPA出现的一种历史悠久的ORM框架,它实现了JPA,也是目前用的最多的实现。而Sprint Data JPA是Spring中提供的开箱即用的基于JPA的数据库访问框架,其采用的实现正是Hibernate。Spring Data JPA提供的数据库访问能力如下:

img

从上述接口的名字就可以看出:

  • CrudRepository:最基本的增删改查操作
  • PagingAndSortingRepository:分页查询
  • QueryByExampleExecutor:基于样本查询,避免了传一堆参数,还要判断是否null
  • JpaSpecificationExecutor:基于Specification查询,就是对CriteriaQuery的封装,类型安全的查询方式
  • QuerydslPredicateExecutor:基于QueryDSL的查询,也是类型安全的

        上述接口的实现在SimpleJpaRepository和QuerydslJpaPredicateExecutor中,其中就是基于JPA的EntiryManager接口进行封装。如果我们要重写实现,也是通过EntiryManager来完成。

方案一

        首先想到的方法自然是使用@Query注解,直接使用JPQL进行联合查询,自定义接收对象,left join都不在话下。主要的问题是对于一些复杂的、动态的查询条件不好处理,另外分页的countQuery不得不把主查询重写一遍,有点烦人。

 
@Repository
public interface VmhostDao extends JpaRepository<VmhostPO, String> {// 方法一:使用@Query注解,可以自定义接收对象// 问题:查询条件要嵌入SQL语句内,一些复杂的情形不好处理,例如某个字段模糊检索,字段是动态的;分页查询countQuery把查询语句重复了一遍@Query("select new com.example.demo.entity.VmhostDTO(v, u, t) from VmhostPO v left join AuthUserPO u on v.userid = u.id left join AuthTenantPO t on v.tenantid = t.id where v.name like %?1%")List<VmhostDTO> findVmhost(String name);@Query("select new com.example.demo.entity.VmhostInfoDTO(v.id, v.name, u.username, t.name) from VmhostPO v left join AuthUserPO u on v.userid = u.id left join AuthTenantPO t on v.tenantid = t.id where v.name like %:name%")List<VmhostInfoDTO> findVmhostInfo(String name);@Query("select v.id as id, v.name as name, u.username as userName, t.name as tname from VmhostPO v left join AuthUserPO u on v.userid = u.id left join AuthTenantPO t on v.tenantid = t.id")List<VmhostInfoByProjection> findVmhostInfoByProjection();@Query(value = "select new com.example.demo.entity.VmhostInfoDTO(v.id, v.name, u.username, t.name) from VmhostPO v left join AuthUserPO u on v.userid = u.id left join AuthTenantPO t on v.tenantid = t.id where v.name like %:name%", countQuery = "select count(*) from VmhostPO v left join AuthUserPO u on v.userid = u.id left join AuthTenantPO t on v.tenantid = t.id where v.name like %:name%")Page<VmhostInfoDTO> findVmhostInfoByPage(String name, Pageable pageable);}

方案二

        那么SQL的组织能否动态编程控制呢,自然会想到Specification查询,查询条件可以通过CriteriaQuery动态拼装。这也是Spring Data JPA中用的最广泛的查询方式。

        但是这种方式存在一些限制,首先不能灵活自定义接收对象,只能返回PO,其次要想实现left join,必须在实体上定义关系,最后关联对象不是一次查询回来的,而是单独的查询。

public interface VmhostSpecWithRelationDaoextends JpaRepository<VmhostWithRelationPO, String>, JpaSpecificationExecutor<VmhostWithRelationPO> {// 方案二:使用Specification查询// 问题:实体必须配置关系,否则无法左连接;每个关联对象是单独数据库查询
}package com.example.demo.service;@Service
public class VmhostService {public List<VmhostWithRelationPO> listVmhostSpecWithRelation(String name) {Specification<VmhostWithRelationPO> spec = (root, cq, cb) -> {root.join("user", JoinType.LEFT);root.join("tenant", JoinType.LEFT);return cb.like(root.get("name"), "%" + name + "%");};List<VmhostWithRelationPO> list = vmhostSpecWithRelationDao.findAll(spec);return list;}}

可能大家有两点疑问:

  • @Query和Specification能否混用,@Query定义select的结果,Specification定义查询条件

答案:不行,总是@Query有效,你定义的Specification参数压根就不会理会

 
// JpaSpecificationExecutor的参数和JpaRepository不一样,没啥用,SimpleJpaRepository总是用的JpaRepository的参数
public interface VmhostSpecDao extends JpaRepository<VmhostPO, String>, JpaSpecificationExecutor<VmhostInfoDTO> {// 方案二:@Query和Specification是不能混用的,也无法改变接收结果集对象// 无法混用,总是query有效,spec参数压根就不会理会@Query("from VmhostPO")List<VmhostPO> findVmhost(Specification<VmhostPO> spec);// 覆盖JpaSpecificationExecutor的方法可以吗?一样的,根本不会走到findAll的默认实现 @Override@Query("select new com.example.demo.entity.VmhostInfoDTO(v.id, v.name, u.username, t.name) from VmhostPO v left join AuthUserPO u on v.userid = u.id left join AuthTenantPO t on v.tenantid = t.id")List<VmhostInfoDTO> findAll(Specification<VmhostInfoDTO> spec);
}
  • Specification控制接收结果集对象

答案:对不起,Specification的toPredicate中执行select是无效的,里面只能返回查询条件。

 
  // 这样写没有用,生成如下sql// select vmhostpo0_.id as id1_2_, vmhostpo0_.addresses as addresse2_2_, vmhostpo0_.availablezone as availabl3_2_, vmhostpo0_.baremetal as baremeta4_2_, vmhostpo0_.cpucore as cpucore5_2_, vmhostpo0_.createtime as createti6_2_, vmhostpo0_.disksize as disksize7_2_, vmhostpo0_.floatip as floatip8_2_, vmhostpo0_.hostname as hostname9_2_, vmhostpo0_.locked as locked10_2_, vmhostpo0_.metadata as metadat11_2_, vmhostpo0_.name as name12_2_, vmhostpo0_.privatenetworkid as private13_2_, vmhostpo0_.ramsize as ramsize14_2_, vmhostpo0_.tenantid as tenanti15_2_, vmhostpo0_.tenantname as tenantn16_2_, vmhostpo0_.type as type17_2_, vmhostpo0_.userid as userid18_2_, vmhostpo0_.username as usernam19_2_, vmhostpo0_.vmstatus as vmstatu20_2_ from vmhost vmhostpo0_ cross join auth_user authuserpo1_ cross join auth_tenant authtenant2_ where vmhostpo0_.userid=authuserpo1_.id and vmhostpo0_.tenantid=authtenant2_.id and (vmhostpo0_.name like ?)
public Optional<VmhostInfoDTO> listVmhostSpec(String name) {Specification<VmhostInfoDTO> spec = (root, cq, cb) -> {// 只能cross join,要left join需要在实体上建立关系Root<AuthUserPO> user = cq.from(AuthUserPO.class);Root<AuthTenantPO> tenant = cq.from(AuthTenantPO.class);// 这里执行select没有用,这个函数只能返回查询条件,外层会覆盖selectcq.multiselect(root.get("id"), root.get("name"), user.get("username"), tenant.get("name"));return cb.and(cb.equal(root.get("userid"), user.get("id")), cb.equal(root.get("tenantid"), tenant.get("id")),cb.like(root.get("name"), "%" + name + "%"));};return vmhostSpecDao.findOne(spec);
}

因为SimpleJpaRepository的实现已经固定了select,跟JpaRepository的类型参数相关,跟JpaSpecificationExecutor的类型参数无关

 
protected <S extends T> TypedQuery<S> getQuery(@Nullable Specification<S> spec, Class<S> domainClass, Sort sort) {CriteriaBuilder builder = em.getCriteriaBuilder();CriteriaQuery<S> query = builder.createQuery(domainClass);Root<S> root = applySpecificationToCriteria(spec, domainClass, query);query.select(root);if (sort.isSorted()) {query.orderBy(toOrders(sort, root, builder));}return applyRepositoryMethodMetadata(em.createQuery(query));
}

方案三

上面两种使用方法是Spring Data JPA用的最多的,接下来只能从底层入手,直接使用EntiryManager。这种方法完全靠自己,所有接口都需要自己实现,丧失了Spring Data JPA的便利性。

 
@Repository
public class VmhostEMDao {@Autowired@PersistenceContextprivate EntityManager entityManager;// 方案三:使用原生的entityManager,解决@Query的SQL无法动态拼接问题// 此时分页就需要自己封装了,也没有了JPA自动实现的接口// 注意这里like后面要引号@SuppressWarnings("unchecked")public List<VmhostDTO> findVmhost(String name) {List<VmhostDTO> list = entityManager.createQuery("select new com.example.demo.entity.VmhostDTO(v, u, t) from VmhostPO v left join AuthUserPO u on v.userid = u.id left join AuthTenantPO t on v.tenantid = t.id where v.name like '%"+ name + "%'").getResultList();return list;}@SuppressWarnings("unchecked")public List<VmhostInfoByProjection> findVmhostInfoByProjection() {// 此时总是Object[],不支持投影List<VmhostInfoByProjection> list = entityManager.createQuery("select v.id as id, v.name as name, u.username as userName, t.name as tname from VmhostPO v left join AuthUserPO u on v.userid = u.id left join AuthTenantPO t on v.tenantid = t.id").getResultList();return list;}}

方案四

类似于方案二之于方案一,我们也可以使用类型安全的查询方式CriteraQuery。

 
@Repository
public class VmhostCQDao {@Autowired@PersistenceContextprivate EntityManager entityManager;// 方案四:相对于方案三,使用了类型安全的CriteriaQuery,其实Specification也是用的CriteriaQuery,所以存在和Specification一样的限制,但是可以控制select了,比Specification灵活一点public List<VmhostDTO> findVmhost(String name) {CriteriaBuilder builder = entityManager.getCriteriaBuilder();CriteriaQuery<VmhostDTO> query = builder.createQuery(VmhostDTO.class);// 实体上没有配置关系,无法使用left join,只能联合查询(inner join)Root<VmhostPO> root = query.from(VmhostPO.class);Root<AuthUserPO> rootUser = query.from(AuthUserPO.class);Root<AuthTenantPO> rootTenant = query.from(AuthTenantPO.class);query.multiselect(root, rootUser, rootTenant).where(builder.equal(root.get("userid"), rootUser.get("id")),builder.equal(root.get("tenantid"), rootTenant.get("id")), builder.like(root.get("name"), "%" + name + "%"));List<VmhostDTO> list = entityManager.createQuery(query).getResultList();return list;}}

终极方案

        到了终极方案了,Spring Data JPA集成了对QueryDSL的支持,官方参考见:http://www.querydsl.com/static/querydsl/latest/reference/html_single。

        是不是有点像方案二+方案四,单表的时候直接使用JpaRepository和QuerydslPredicateExecutor提供的默认实现。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
package com.example.demo.dao;import com.example.demo.entity.VmhostPO;import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.querydsl.QuerydslPredicateExecutor;public interface VmhostQDSLDaoextends JpaRepository<VmhostPO, String>, QuerydslPredicateExecutor<VmhostPO>, VmhostRepository {// 方案五:VmhostRepository使用原生的entityManager配合QueryDSL,完美解决所有问题// 对于单表也可以使用QuerydslPredicateExecutor,自动拥有默认实现}

        多表的时候就基于EntityManager扩展,但是querydsl已经帮我们做了很多工作,不是从头开始。querydsl的书写方式相对于CriteriaQuery也更加自然,易于理解。

1
2
3
4
5
6
7
@NoRepositoryBean
public class BaseRepository {@PersistenceContextprotected EntityManager em;}
1
2
3
4
5
6
7
public interface VmhostRepository {public List<VmhostDTO> findVmhost(Predicate predicate);public QueryResults<VmhostDTO> findVmhostByPage(Predicate predicate, Pageable pageable);}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
@Repository
public class VmhostRepositoryImpl extends BaseRepository implements VmhostRepository {// 多表左连接@Overridepublic List<VmhostDTO> findVmhost(Predicate predicate) {JPAQueryFactory queryFactory = new JPAQueryFactory(em);JPAQuery<VmhostDTO> jpaQuery = queryFactory.select(Projections.constructor(VmhostDTO.class, QVmhostPO.vmhostPO, QAuthUserPO.authUserPO,QAuthTenantPO.authTenantPO)).from(QVmhostPO.vmhostPO).leftJoin(QAuthUserPO.authUserPO).on(QVmhostPO.vmhostPO.userid.stringValue().eq(QAuthUserPO.authUserPO.id.stringValue())).leftJoin(QAuthTenantPO.authTenantPO).on(QVmhostPO.vmhostPO.tenantid.stringValue().eq(QAuthTenantPO.authTenantPO.id.stringValue()));jpaQuery.where(predicate);return jpaQuery.fetch();}@Overridepublic QueryResults<VmhostDTO> findVmhostByPage(Predicate predicate, Pageable pageable) {JPAQueryFactory queryFactory = new JPAQueryFactory(em);JPAQuery<VmhostDTO> jpaQuery = queryFactory.select(Projections.constructor(VmhostDTO.class, QVmhostPO.vmhostPO, QAuthUserPO.authUserPO,QAuthTenantPO.authTenantPO)).from(QVmhostPO.vmhostPO).leftJoin(QAuthUserPO.authUserPO).on(QVmhostPO.vmhostPO.userid.stringValue().eq(QAuthUserPO.authUserPO.id.stringValue())).leftJoin(QAuthTenantPO.authTenantPO).on(QVmhostPO.vmhostPO.tenantid.stringValue().eq(QAuthTenantPO.authTenantPO.id.stringValue())).offset(pageable.getOffset()).limit(pageable.getPageSize());jpaQuery.where(predicate);return jpaQuery.fetchResults();}}

总结

        以上方法都还是在Spring Data JPA框架之内,如果你愿意,你也可以去重写SimpleJpaRepository,重写了注意通过如下注解启用。

1
@EnableJpaRepositories(repositoryBaseClass = XXXXXX.class)

        其实QueryDSL已经做了很好的封装,完全没有必要重复造轮子,Spring Data JPA也提供了很多扩展点,在保留其便利性的基础上,根据需要去扩展,不需要全部推倒重来。

参考:

Spring Data JPA方法名命名规则 - 简书

Spring Data JPA中多表联合查询最佳实践 | 钟潘的博客

相关文章:

Spring Data JPA方法名命名规则

最近巩固一下JPA&#xff0c;网上看到这些资料&#xff0c;这里记录巩固一下。 一、Spring Data Jpa方法定义的规则 简单条件查询 简单条件查询&#xff1a;查询某一个实体类或者集合。 按照Spring Data的规范的规定&#xff0c;查询方法以find | read | get开头&…...

【Leetcode Sheet】Weekly Practice 15

Leetcode Test 2586 统计范围内的元音字符串数(11.7) 给你一个下标从 0 开始的字符串数组 words 和两个整数&#xff1a;left 和 right 。 如果字符串以元音字母开头并以元音字母结尾&#xff0c;那么该字符串就是一个 元音字符串 &#xff0c;其中元音字母是 a、e、i、o、u…...

人力资源社会保障部办公厅关于推行专业技术人员职业资格电子证书的通知

&#xff08;人社厅发〔2021〕97号&#xff09; 各省、自治区、直辖市及新疆生产建设兵团人力资源社会保障厅&#xff08;局&#xff09;&#xff0c;中共海南省委人才发展局&#xff0c;国务院有关部门、直属机构人事部门&#xff0c;有关协会、学会&#xff1a; 为贯彻落实…...

什么是光电耦合器?如何选择型号及种类

光电耦合器(英文缩写为OC)亦称光电隔离器&#xff0c;简称光耦&#xff1b;以光为媒介传输电信号&#xff1b;它对输入、输出电信号有良好的隔离作用&#xff0c;是目前种类最多、用途最广的光电器件之一&#xff1b;所以&#xff0c;它在各种电路中得到广泛的应用。 光耦合器…...

hive里因为列名用了关键字导致建表失败

代码 现象 ParseException line 6:4 cannot recognize input near percent String COMMENT in column name or primary key or foreign key 23/11/13 11:52:57 ERROR org.apache.hadoop.hive.ql.Driver: FAILED: ParseException line 6:4 cannot recognize input near percent …...

MySQL 报错 incorrect datetime value ‘0000-00-00 00:00:00‘ for column

使用navicat导入数据时报错&#xff1a; MySQL 报错 incorrect datetime value ‘0000-00-00 00:00:00’ for column 这是因为当前的MySQL不支持datetime为0的情况。 MySQL报incorrect datetime value ‘0000-00-00 00:00:00’ for column错误原因&#xff0c;是由于在MySQL5.7…...

Jira Data Center(非集群)升级操作

一、升级准备 Jira 管理界面执行升级检查下载升级包&#xff0c;使用原操作方式相同的方式安装。我这里原来的版本是通过./atlassian-jira-software-9.11.2-x64.bin安装的&#xff0c;接下来下载atlassian-jira-software-9.11.3-x64.bin的安装文件停止 Jira&#xff0c;bin/st…...

Spring IOC - BeanDefinition解析

1. BeanDefinition的属性 BeanDefinition作为接口定义了属性的get、set方法。这些属性基本定义在其直接实现类AbstractBeanDefinition中&#xff0c;各属性的含义如下表所示&#xff1a; 类型 名称 含义 常量 SCOPE_DEFAULT 默认作用域&#xff1a;单例模式 AUT…...

ds前后台博客系统

源码私信或者公众号java大师获取 博客简介&#xff1a;本博客采用Spring Boot LayUI做为基础&#xff0c;进行的博客系统开发&#xff0c;与bootvue相比&#xff0c;更为适合开发简单的系统&#xff0c;并且更容易上手&#xff0c;简单&#xff01;高效&#xff01;更易上手&a…...

算法leetcode|88. 合并两个有序数组(rust重拳出击)

文章目录 88. 合并两个有序数组&#xff1a;样例 1&#xff1a;样例 2&#xff1a;样例 3&#xff1a;提示&#xff1a; 分析&#xff1a;题解&#xff1a;rust&#xff1a;go&#xff1a;c&#xff1a;python&#xff1a;java&#xff1a; 88. 合并两个有序数组&#xff1a; …...

GoLong的学习之路,进阶,语法之并发(并发错误处理)补充并发三部曲

这篇文章主要讲的是如何去处理并发的错误。 在Go语言中十分便捷地开启goroutine去并发地执行任务&#xff0c;但是如何有效的处理并发过程中的错误则是一个很棘手的问题。 文章目录 recovererrgroup recover 哦对&#xff0c;似乎没写错误处理的文章。后面补上。 首先&…...

猪酒店房价采集

<?php // 设置代理 $proxy_host jshk.com.cn;// 创建一个cURL资源 $ch curl_init();// 设置代理 curl_setopt($ch, CURLOPT_PROXY, $proxy_host.:.$proxy_port);// 连接URL curl_setopt($ch, CURLOPT_URL, "http://www.zujia.com/");// 发送请求并获取HTML文档…...

Java基础知识第四讲:Java 基础 - 深入理解泛型机制

Java 基础 - 深入理解泛型机制 背景&#xff1a;Java泛型这个特性是从JDK 1.5才开始加入的&#xff0c;为了兼容之前的版本&#xff0c;Java泛型的实现采取了“伪泛型”的策略&#xff0c;即Java在语法上支持泛型&#xff0c;但是在编译阶段会进行所谓的“类型擦除”&#xff0…...

ceph-deploy bclinux aarch64 ceph 14.2.10【2】vdbench rbd 块设备rbd 测试失败

上篇 ceph-deploy bclinux aarch64 ceph 14.2.10-CSDN博客 安装vdbench 下载vdbench 下载页面 Vdbench Downloads (oracle.com) 包下载 需要账号登录&#xff0c;在弹出层点击同意才能继续下载 用户手册 https://download.oracle.com/otn/utilities_drivers/vdbench/vdb…...

split_train_val

# coding:utf-8 import os import random import argparse parser argparse.ArgumentParser() # xml文件的地址&#xff0c;根据自己的数据进行修改 xml一般存放在Annotations下 parser.add_argument(--xml_path, defaultdata_door_white/xml/train, typestr, helpinput xm…...

Linux Mint 21.3 将搭载 Cinnamon 6.0 和实验性 Wayland 支持

导读Wayland 会话可能在 Linux Mint 23 系列中成为默认选项&#xff0c;预计将在 2026 年实现。 Linux Mint 项目今天在他们的每月新闻通讯中 宣布&#xff0c;他们已经开始着手在未来的 Linux Mint 发行版中实施 Wayland 会话&#xff0c;最初将在 Linux Mint 21.3 中提供。 …...

名师助阵龙讯旷腾PWmat+半导体缺陷培训暨半导体缺陷计算大赛

半导体缺陷计算大赛 选拔赛截止日期&#xff1a;11月23日 参与杭州线下培训直接跳过选拔赛 大赛亮点 线上免费培训、线下限时领取免费名额 线下杭州培训可直通决赛&#xff0c;跳过选拔赛 线上培训有3次机会参与考试进入决赛 已购/未购用户均可参加、无身份限定 使用Mc…...

Kotlin与Java写法的变更

目录 获取类的Java Class属性 类型检查 for循环 switch语句 if判断 获取类的Java Class属性 //Java Intent intent new Intent(this, MainActivity.class);//Kotlin val intent Intent(this, MainActivity::class.java) 类型检查 //Java apple instanceof Fruit !(app…...

京东数据软件系统:京东销量和销额数据在哪里看?

京东平台店铺众多&#xff0c;行业同行也数不胜数&#xff0c;若想要在平台中更好的运营店铺&#xff0c;品牌需要做好数据分析。下面结合鲸参谋电商数据分析平台这一数据分析工具&#xff0c;我们来看一看品牌在做数据分析时需要注重哪些数据维度。 *行业数据 京东商家通过鲸…...

美观且功能丰富的控制台:5个.Net开源项目

今天一起盘点下&#xff0c;9月份推荐的5个.Net开源项目&#xff08;点击标题查看详情&#xff09;。 1、FTP开源库 FluentFTP是一个基于.Net开发的&#xff0c;可用于FTP和FTPS文件传输。该项目优化了速度&#xff0c;并提供简单易用的API&#xff0c;让开发人员可以快速地集…...

k8s从入门到放弃之Ingress七层负载

k8s从入门到放弃之Ingress七层负载 在Kubernetes&#xff08;简称K8s&#xff09;中&#xff0c;Ingress是一个API对象&#xff0c;它允许你定义如何从集群外部访问集群内部的服务。Ingress可以提供负载均衡、SSL终结和基于名称的虚拟主机等功能。通过Ingress&#xff0c;你可…...

23-Oracle 23 ai 区块链表(Blockchain Table)

小伙伴有没有在金融强合规的领域中遇见&#xff0c;必须要保持数据不可变&#xff0c;管理员都无法修改和留痕的要求。比如医疗的电子病历中&#xff0c;影像检查检验结果不可篡改行的&#xff0c;药品追溯过程中数据只可插入无法删除的特性需求&#xff1b;登录日志、修改日志…...

在四层代理中还原真实客户端ngx_stream_realip_module

一、模块原理与价值 PROXY Protocol 回溯 第三方负载均衡&#xff08;如 HAProxy、AWS NLB、阿里 SLB&#xff09;发起上游连接时&#xff0c;将真实客户端 IP/Port 写入 PROXY Protocol v1/v2 头。Stream 层接收到头部后&#xff0c;ngx_stream_realip_module 从中提取原始信息…...

【2025年】解决Burpsuite抓不到https包的问题

环境&#xff1a;windows11 burpsuite:2025.5 在抓取https网站时&#xff0c;burpsuite抓取不到https数据包&#xff0c;只显示&#xff1a; 解决该问题只需如下三个步骤&#xff1a; 1、浏览器中访问 http://burp 2、下载 CA certificate 证书 3、在设置--隐私与安全--…...

《基于Apache Flink的流处理》笔记

思维导图 1-3 章 4-7章 8-11 章 参考资料 源码&#xff1a; https://github.com/streaming-with-flink 博客 https://flink.apache.org/bloghttps://www.ververica.com/blog 聚会及会议 https://flink-forward.orghttps://www.meetup.com/topics/apache-flink https://n…...

关于 WASM:1. WASM 基础原理

一、WASM 简介 1.1 WebAssembly 是什么&#xff1f; WebAssembly&#xff08;WASM&#xff09; 是一种能在现代浏览器中高效运行的二进制指令格式&#xff0c;它不是传统的编程语言&#xff0c;而是一种 低级字节码格式&#xff0c;可由高级语言&#xff08;如 C、C、Rust&am…...

智能仓储的未来:自动化、AI与数据分析如何重塑物流中心

当仓库学会“思考”&#xff0c;物流的终极形态正在诞生 想象这样的场景&#xff1a; 凌晨3点&#xff0c;某物流中心灯火通明却空无一人。AGV机器人集群根据实时订单动态规划路径&#xff1b;AI视觉系统在0.1秒内扫描包裹信息&#xff1b;数字孪生平台正模拟次日峰值流量压力…...

以光量子为例,详解量子获取方式

光量子技术获取量子比特可在室温下进行。该方式有望通过与名为硅光子学&#xff08;silicon photonics&#xff09;的光波导&#xff08;optical waveguide&#xff09;芯片制造技术和光纤等光通信技术相结合来实现量子计算机。量子力学中&#xff0c;光既是波又是粒子。光子本…...

LeetCode - 199. 二叉树的右视图

题目 199. 二叉树的右视图 - 力扣&#xff08;LeetCode&#xff09; 思路 右视图是指从树的右侧看&#xff0c;对于每一层&#xff0c;只能看到该层最右边的节点。实现思路是&#xff1a; 使用深度优先搜索(DFS)按照"根-右-左"的顺序遍历树记录每个节点的深度对于…...

HubSpot推出与ChatGPT的深度集成引发兴奋与担忧

上周三&#xff0c;HubSpot宣布已构建与ChatGPT的深度集成&#xff0c;这一消息在HubSpot用户和营销技术观察者中引发了极大的兴奋&#xff0c;但同时也存在一些关于数据安全的担忧。 许多网络声音声称&#xff0c;这对SaaS应用程序和人工智能而言是一场范式转变。 但向任何技…...