Spring Data JPA 实例查询

转自:https://www.cnblogs.com/rulian/p/6533109.html

一、相关接口方法

在继承JpaRepository接口后,自动拥有了按“实例”进行查询的诸多方法。这些方法主要在两个接口中定义,一是QueryByExampleExecutor,一个是JpaRepository,如下所示:
复制代码
public interface QueryByExampleExecutor<T> { 
<S extends T> S findOne(Example<S> example); //根据“实例”查找一个对象。
<S extends T> Iterable<S> findAll(Example<S> example); //根据“实例”查找一批对象
<S extends T> Iterable<S> findAll(Example<S> example, Sort sort); //根据“实例”查找一批对象,且排序
<S extends T> Page<S> findAll(Example<S> example, Pageable pageable); //根据“实例”查找一批对象,且排序和分页
<S extends T> long count(Example<S> example); //根据“实例”查找,返回符合条件的对象个数
<S extends T> boolean exists(Example<S> example); //根据“实例”判断是否有符合条件的对象
}
复制代码

 

复制代码
@NoRepositoryBean public interface JpaRepository<T, ID extends Serializable> extends PagingAndSortingRepository<T, ID>, QueryByExampleExecutor<T> {...... 
@Override 
<S extends T> List<S> findAll(Example<S> example); //根据实例查询 
@Override 
<S extends T> List<S> findAll(Example<S> example, Sort sort);//根据实例查询,并排序。 
}
复制代码

 

二、快速入门

观察上面的方法,其参数都有一个 Example 类对象,这就一个“实例”(个人翻译的叫法,未必准确),它代表的是查询条件,它是通过包装要查询的实体对象而生成的。下面通过一个例子,来快速了解一下其用法。
1、定义实体类
如有 客户信息、客户类型 两个实体类定义如下:
复制代码
/**
* 客户
*/
@Entity
@Table(name = "demo_lx_Customer")
public class Customer extends BaseBo
{private String name; //姓名private String sex; //性别private int age; //年龄private String address; //地址private boolean focus ; //是否重点关注private Date addTime; //创建时间private String remark; //备注@ManyToOneprivate CustomerType customerType; //客户类型......
}
复制代码

 

复制代码
/**
* 客户类型
*/
@Entity
@Table(name = "demo_lx_CustomerType")
public class CustomerType extends BaseBo
{ private String code; //编号private String name; //名称private String remark; //备注......
}
复制代码

 

2、模拟数据

加入一些模拟数据:

 

3、查询

现在要查询:地址是“郑州市”,姓“刘”的客户,可以这样来写:

复制代码
     //创建查询条件数据对象Customer customer = new Customer();customer.setName("刘");customer.setAddress("河南省郑州市");//创建匹配器,即如何使用查询条件ExampleMatcher matcher = ExampleMatcher.matching() //构建对象.withMatcher("name", GenericPropertyMatchers.startsWith()) //姓名采用“开始匹配”的方式查询.withIgnorePaths("focus");  //忽略属性:是否关注。因为是基本类型,需要忽略掉//创建实例Example<Customer> ex = Example.of(customer, matcher); //查询List<Customer> ls = dao.findAll(ex);//输出结果System.out.println("数量:"+ls.size());for (Customer bo:ls){System.out.println(bo.getName());}
复制代码

 

输出结果:
数量:1
刘芳

 

三、认识“实例查询”

 

1、概念定义:

    上面例子中,是这样创建“实例”的:Example<Customer> ex = Example.of(customer, matcher);我们看到,Example对象,由customer和matcher共同创建,为讲解方便,我们先来明确一些定义。

    A、实体对象:在持久化框架中与Table对应的域对象,一个对象代表数据库表中的一条记录,如上例中Customer对象。在构建查询条件时,一个实体对象代表的是查询条件中的“数值”部分。如:要查询姓“刘”的客户,实体对象只能存储条件值“刘”。

    B、匹配器:ExampleMatcher对象,它是匹配“实体对象”的,表示了如何使用“实体对象”中的“值”进行查询,它代表的是“查询方式”,解释了如何去查的问题。如:要查询姓“刘”的客户,即姓名以“刘”开头的客户,该对象就表示了“以某某开头的”这个查询方式,如上例中:withMatcher("name", GenericPropertyMatchers.startsWith())

    C、实例:即Example对象,代表的是完整的查询条件。由实体对象(查询条件值)和匹配器(查询方式)共同创建。

    再来理解“实例查询”,顾名思义,就是通过一个例子来查询。要查询的是Customer对象,查询条件也是一个Customer对象,通过一个现有的客户对象作为例子,查询和这个例子相匹配的对象。

 

2、特点及约束(局限性):

    1、支持动态查询。即支持查询条件个数不固定的情况,如:客户列表中有多个过滤条件,用户使用时在“地址”查询框中输入了值,就需要按地址进行过滤,如果没有输入值,就忽略这个过滤条件。对应的实现是,在构建查询条件Customer对象时,将address属性值置具体的条件值或置为null。

    2、不支持过滤条件分组。即不支持过滤条件用 or(或) 来连接,所有的过滤查件,都是简单一层的用 and(并且) 连接。

    3、仅支持字符串的开始/包含/结束/正则表达式匹配 和 其他属性类型的精确匹配。查询时,对一个要进行匹配的属性(如:姓名 name),只能传入一个过滤条件值,如以Customer为例,要查询姓“刘”的客户,“刘”这个条件值就存储在表示条件对象的Customer对象的name属性中,针对于“姓名”的过滤也只有这么一个存储过滤值的位置,没办法同时传入两个过滤值。正是由于这个限制,有些查询是没办法支持的,例如要查询某个时间段内添加的客户,对应的属性是 addTime,需要传入“开始时间”和“结束时间”两个条件值,而这种查询方式没有存两个值的位置,所以就没办法完成这样的查询。

 

四、重点理解ExampleMatcher

 

1、需要考虑的因素

查询条件的表示,有两部分,一是条件值,二是查询方式。条件值用实体对象(如Customer对象)来存储,相对简单,当页面传入过滤条件值时,存入相对应的属性中,没入传入时,属性保持默认值。查询方式是用匹配器ExampleMatcher来表示,情况相对复杂些,需要考虑的因素有:
(1)Null值的处理。当某个条件值为Null,是应当忽略这个过滤条件呢,还是应当去匹配数据库表中该字段值是Null的记录?
(2)基本类型的处理。如客户Customer对象中的年龄age是int型的,当页面不传入条件值时,它默认是0,是有值的,那是否参与查询呢?
(3)忽略某些属性值。一个实体对象,有许多个属性,是否每个属性都参与过滤?是否可以忽略某些属性?
(4)不同的过滤方式。同样是作为String值,可能“姓名”希望精确匹配,“地址”希望模糊匹配,如何做到?
(5)大小写匹配。字符串匹配时,有时可能希望忽略大小写,有时则不忽略,如何做到?
2、五个配置项
围绕上面一系列情况,ExampleMatcher中定义了5项配置来解决这些问题。 
复制代码
public class ExampleMatcher {
NullHandler nullHandler; //Null值处理方式
StringMatcher defaultStringMatcher; //默认字符串匹配方式
boolean defaultIgnoreCase; //默认大小写忽略方式
PropertySpecifiers propertySpecifiers; //各属性特定查询方式
Set<String> ignoredPaths; //忽略属性列表
......
}
复制代码

    (1)nullHandler:Null值处理方式,枚举类型,有2个可选值,INCLUDE(包括),IGNORE(忽略)。标识作为条件的实体对象中,一个属性值(条件值)为Null是,是否参与过滤。当该选项值是INCLUDE时,表示仍参与过滤,会匹配数据库表中该字段值是Null的记录;若为IGNORE值,表示不参与过滤。

(2)defaultStringMatcher:默认字符串匹配方式,枚举类型,有6个可选值,DEFAULT(默认,效果同EXACT),EXACT(相等),STARTING(开始匹配),ENDING(结束匹配),CONTAINING(包含,模糊匹配),REGEX(正则表达式)。该配置对所有字符串属性过滤有效,除非该属性在 propertySpecifiers 中单独定义自己的匹配方式。
(3)defaultIgnoreCase:默认大小写忽略方式,布尔型,当值为false时,即不忽略,大小不相等。该配置对所有字符串属性过滤有效,除非该属性在propertySpecifiers 中单独定义自己的忽略大小写方式。
(4)propertySpecifiers:各属性特定查询方式,描述了各个属性单独定义的查询方式,每个查询方式中包含4个元素:属性名、字符串匹配方式、大小写忽略方式、属性转换器。如果属性未单独定义查询方式,或单独查询方式中,某个元素未定义(如:字符串匹配方式),则采用 ExampleMatcher 中定义的默认值,即上面介绍的defaultStringMatcher 和 defaultIgnoreCase 的值。
(5)ignoredPaths:忽略属性列表,忽略的属性不参与查询过滤。
3、操作方法

在ExampleMatcher中定义了一系列方式,用于设置这5项设置值,所有的设置方法均返回 ExampleMatcher 对象,所以支持链式编程配置。


(1)创建一个默认的 ExampleMatcher 对象。

定义:

public static ExampleMatcher matching()

默认配置如下:
A、nullHandler:IGNORE。Null值处理方式:忽略
B、defaultStringMatcher:DEFAULT。默认字符串匹配方式:默认(相等
C、defaultIgnoreCase:false。默认大小写忽略方式:不忽略
D、propertySpecifiers:空。各属性特定查询方式,
E、ignoredPaths:空列表。忽略属性列表,空列表

 

(2)改变Null值处理方式。

定义:
public ExampleMatcher withNullHandler(NullHandler nullHandler)
public ExampleMatcher withIncludeNullValues()
public ExampleMatcher withIgnoreNullValues()

产生效果:
改变配置项nullHandler,分别设为:指定值、INCLUDE(包括)、IGNORE(忽略)。

 

(3)改变默认字符串匹配方式。
定义:
public ExampleMatcher withStringMatcher(StringMatcher defaultStringMatcher)

产生效果:
改变配置项defaultStringMatcher,设为指定值。

 

(4)改变默认大小写忽略方式。
定义:
public ExampleMatcher withIgnoreCase()
public ExampleMatcher withIgnoreCase(boolean defaultIgnoreCase)

产生效果:
改变配置项defaultIgnoreCase,分别设为:true,指定值。

 

(5)向“忽略属性列表”中添加属性。
定义:
public ExampleMatcher withIgnorePaths(String... ignoredPaths)

产生效果:
改变配置项ignoredPaths,向列表中添加一个或多个属性。

 

(6)配置属性特定查询方式

    一个属性的特定查询方式,包含了3个信息:字符串匹配方式、大小写忽略方式、属性转换器,存储在 propertySpecifiers 中,操作时用 GenericPropertyMatcher 类来传递配置信息。有4个方法来改变配置,这4个方法操作时,内部均采用增量改变的方式,即如果没有为属性定义“特定查询方式”,则会定义一个,并根据传进来的“非空信息”进行配置,如果已经定义有,则会根据传进来的“非空信息”进行更新。如果一个“特定查询方式”中的“字符串匹配方式、大小写忽略方式”没有设置值,查询时则采用ExampleMatcher中的默认配置。

 

A、自定义类的方式。

定义:
public ExampleMatcher withMatcher(String propertyPath, MatcherConfigurer<GenericPropertyMatcher> matcherConfigurer)

产生效果:

向 propertySpecifiers 中增加或更新属性“特定查询方式”的配置。

参数说明:
propertyPath:要配置特定查询的属性名。
matcherConfigurer:自定义类对象。自定义类需要实现MatcherConfigurer接口,在接口的 configureMatcher() 实现方法中指定相关配置。

 

B、直接传入通用属性查询对象方式。

定义:
public ExampleMatcher withMatcher(String propertyPath, GenericPropertyMatcher genericPropertyMatcher)

产生效果:

向 propertySpecifiers 中增加或更新属性“特定查询方式”的配置。

参数说明:
propertyPath:要配置特定查询的属性名。
genericPropertyMatcher:直接传入一个通用查询对象。 ExampleMatcher.GenericPropertyMatchers工具类中提供了常用对象创建的静态方法,所有方法均返回GenericPropertyMatcher 对象,所以支持链式编程配置。

另外:GenericPropertyMatcher 类本身也提供了诸多方法,用于改变相关配置项。

 

C、改变的大小写忽略方式

定义:
public ExampleMatcher withIgnoreCase(String... propertyPaths)

产生效果:
向 propertySpecifiers 中增加或更新属性“特定查询方式”中的“大小写忽略方式”配置。。

 

D、设置属性转换器

定义:
public ExampleMatcher withTransformer(String propertyPath, PropertyValueTransformer propertyValueTransformer)

产生效果:
向 propertySpecifiers 中增加或更新属性“特定查询方式”中的“属性转换器”配置。

五、常用情况说明

  

1、关于基本数据类型。
实体对象中,避免使用基本数据类型,采用包装器类型。如果已经采用了基本类型,
而这个属性查询时不需要进行过滤,则把它添加到忽略列表(ignoredPaths)中。

2、Null值处理方式。
默认值是 IGNORE(忽略),即当条件值为null时,则忽略此过滤条件,一般业务也是采用这种方式就可满足。当需要查询数据库表中属性为null的记录时,可将值设为INCLUDE,这时,对于不需要参与查询的属性,都必须添加到忽略列表(ignoredPaths)中,否则会出现查不到数据的情况。

3、默认配置、特殊配置。
默认创建匹配器时,字符串采用的是精确匹配、不忽略大小写,可以通过操作方法改变这种默认匹配,以满足大多数查询条件的需要,如将“字符串匹配方式”改为CONTAINING(包含,模糊匹配),这是比较常用的情况。对于个别属性需要特定的查询方式,可以通过配置“属性特定查询方式”来满足要求。

4、非字符串属性
如约束中所谈,非字符串属性均采用精确匹配,即等于。

5、忽略大小写的问题。
忽略大小的生效与否,是依赖于数据库的。例如 MySql 数据库中,默认创建表结构时,字段是已经忽略大小写的,所以这个配置与否,都是忽略的。如果业务需要严格区分大小写,可以改变数据库表结构属性来实现,具体可百度。

  

六、常用查询示例

以“快速入门”中的实体对象和模拟数据为例,列一些常用查询,方便开发时参考。

 

1、无匹配器的情况
要求:查询地址是“河南省郑州市”,且重点关注的客户。
说明:对于默认匹配器满足条件时,则不需要创建匹配器。

复制代码
     //创建查询条件数据对象Customer customer = new Customer();customer.setAddress("河南省郑州市");customer.setFocus(true);//创建实例Example<Customer> ex = Example.of(customer); //查询List<Customer> ls = dao.findAll(ex);//输出结果System.out.println("数量:"+ls.size());for (Customer bo:ls){System.out.println(bo.getName());}
复制代码

 

输出结果:

数量:4
李明
刘芳
zhang ming
ZHANG SAN

 

2、通用情况
要求:根据姓名、地址、备注进行模糊查询,忽略大小写,地址要求开始匹配。
说明:这是通用情况,主要演示改变默认字符串匹配方式、改变默认大小写忽略方式、属性特定查询方式配置、忽略属性列表配置。

复制代码
     //创建查询条件数据对象Customer customer = new Customer();customer.setName("zhang");customer.setAddress("河南省");customer.setRemark("BB");//创建匹配器,即如何使用查询条件ExampleMatcher matcher = ExampleMatcher.matching() //构建对象.withStringMatcher(StringMatcher.CONTAINING) //改变默认字符串匹配方式:模糊查询.withIgnoreCase(true) //改变默认大小写忽略方式:忽略大小写.withMatcher("address", GenericPropertyMatchers.startsWith()) //地址采用“开始匹配”的方式查询.withIgnorePaths("focus");  //忽略属性:是否关注。因为是基本类型,需要忽略掉//创建实例Example<Customer> ex = Example.of(customer, matcher); //查询List<Customer> ls = dao.findAll(ex);//输出结果System.out.println("数量:"+ls.size());for (Customer bo:ls){System.out.println(bo.getName());}
复制代码

 

输出结果: 

数量:2
zhang ming
ZHANG SAN

  

3、多级查询
要求:查询所有潜在客户
说明:主要演示多层级属性查询

复制代码
     //创建查询条件数据对象CustomerType type = new CustomerType();type.setCode("01"); //编号01代表潜在客户Customer customer = new Customer();customer.setCustomerType(type);        //创建匹配器,即如何使用查询条件ExampleMatcher matcher = ExampleMatcher.matching() //构建对象.withIgnorePaths("focus");  //忽略属性:是否关注。因为是基本类型,需要忽略掉                //创建实例Example<Customer> ex = Example.of(customer, matcher); //查询List<Customer> ls = dao.findAll(ex);//输出结果System.out.println("数量:"+ls.size());for (Customer bo:ls){System.out.println(bo.getName());}
复制代码

 

输出结果: 

数量:4
李明
李莉
张强
ZHANG SAN

  

4、查询Null值
要求:地址是null的客户
说明:主要演示改变“Null值处理方式”

复制代码
     //创建查询条件数据对象Customer customer = new Customer();//创建匹配器,即如何使用查询条件ExampleMatcher matcher = ExampleMatcher.matching() //构建对象.withIncludeNullValues() //改变“Null值处理方式”:包括.withIgnorePaths("id","name","sex","age","focus","addTime","remark","customerType");  //忽略其他属性//创建实例Example<Customer> ex = Example.of(customer, matcher); //查询List<Customer> ls = dao.findAll(ex);//输出结果System.out.println("数量:"+ls.size());for (Customer bo:ls){System.out.println(bo.getName());}
复制代码

 

输出结果: 

数量:2
张强
刘明

 

七、写在最后

对实例查询的研究及本文的写作,确入投入了精力,因此该文章也赢得了不少的点击率。
但是...但是...就实用性而言,由于“实例查询”的局限性和复杂性,在Spring Data JPA中其实是不实用的。用的最多的还是“简单查询”(因为简单,所以...)和 基于JPA Criteria 的动态查询(可以满足所有需求,没有局限性)。(仅个人观点)
简单查询的两篇博文:
http://www.cnblogs.com/rulian/p/6557471.html
http://www.cnblogs.com/rulian/p/6434631.html

转载于:https://www.cnblogs.com/sharpest/p/8670425.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/539040.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

windows找不到文件gpedit.msc_此电脑右键管理提示windows找不到文件的解决方法

也许当你右键点击此电脑管理时&#xff0c;也许会出现Windows找不到文件的提示&#xff0c;下面提供一些解决方法&#xff1a;1、首先按下“Windows”R组合键打开运行&#xff0c;在弹出的“运行“对话框中输入”compmgmt.msc“&#xff0c;点击”确定“&#xff1b;2、如果此时…

java序列化流_java 序列化流与反序列化流

一 对象序列化流ObjectOutputStreamObjectOutputStream 将Java对象的基本数据类型和图形写入OutputStream。可以使用ObjectInputStream读取(重构)对象。通过在流中使用文件可以实现对象的持久存储。注意&#xff1a;只能将支持 java.io.Serializable 接口的对象写入流中用于从流…

win10文件显示后缀名_win10系统,如何去除“此电脑” 里的6个多余文件夹

Windows系统从XP到win7,再到进化到如今的win10&#xff0c;在系统性能和使用便捷性方面&#xff0c;确实改进了很多&#xff0c;但是&#xff0c;金无赤足&#xff0c;没有完美的东西&#xff0c;总是有一些小细节让我们感觉不舒服&#xff0c;如如鲠在喉。比如我们下面看到的这…

数字化工厂的五大系统_如何搭建以MES系统为核心的数字化工厂?

MES强调车间级的过程集成、控制和监控&#xff0c;以及合理地配置和组织所有资源。满足车间信息化需要&#xff0c;提高车间对随机事件的快速响应和处理能力&#xff0c;有力地促进企业信息化进程向车间层拓展。通过构建以“精益生产、智能制造”为特点的车间管理系统&#xff…

zookeeper数据结构及Znode类型

结构 1、层次化的目录结构&#xff0c;命名符合常规文件系统规范 2、每个节点在zookeeper中叫做znode,并且其有一个唯一的路径标识。 3、节点Znode可以包含数据和子节点&#xff08;但是EPHEMERAL类型的节点不能有子节点&#xff09;。 4、客户端应用可以在节点上设置监视器…

设计企业网站大纲_企业网站设计布局

网站制作一年350元&#xff0c;五站合一&#xff0c;快速建站 &#xff0c;www.sxjcwzjs.com,只需进入网站右上角注册快速建站即可(需要电脑登录注册)&#xff0c;需要联系我吧&#xff01;电话&#xff1a;13752214574&#xff0c;微信号&#xff1a;m1078582894企业网站布局很…

vue导入静态js_如何在vue js中加载静态图像

我有一个组件,它接受一个prop字符串,即一个url。它可以是远程图片,也可以是资产文件夹中的本地静态资产。目录结构:-assets/- logo.png-app.vue-components/-ImageTest.vue图像测试.vue{{imagelink}}export default {name: "ImageTest",props:{imagelink: String,},c…

搭建linux测试环境有什么用_谈谈现在搭建网站用什么程序好,选择对的程序是很重要的开头...

目前可以选择的网站程序还是蛮多的&#xff0c;开源的系统也很多&#xff0c;也有很多精品。更多时候&#xff0c;选择网站程序要结合网站的定位。说说dedecms&#xff0c;就是我们都知道的织梦程序&#xff0c;功能很齐全&#xff0c;作为一个简单的资讯门户网站&#xff0c;算…

Zookeeper应用:服务端上下线

需求 客户端感知服务器的上下线。 示意图 步骤 服务端&#xff1a; 1、所有机子向Zookeeper注册&#xff0c;注册znode为临时的。 2、有机子下线&#xff0c;连接断开后被Zookeeper自动删除&#xff0c;触发监听事件。 3、有机子上线&#xff0c;触发监听事件。 客户端&am…

哈希表查找失败的平均查找长度_你还应该知道的哈希冲突解决策略

本文首发于 vivo互联网技术 微信公众号 链接&#xff1a;https://mp.weixin.qq.com/s/5vxYoeARG1nC7Z0xTYXELA作者&#xff1a;Xuegui Chen哈希是一种通过对数据进行压缩, 从而提高效率的一种解决方法&#xff0c;但由于哈希函数有限&#xff0c;数据增大等缘故&#xff0c;哈希…

python 正则替换_5分钟速览Python正则表达式常用函数!五分钟就掌握它!

导读&#xff1a;正则表达式是处理字符串类型的"核武器"&#xff0c;不仅速度快&#xff0c;而且功能强大。本文不过多展开正则表达式相关语法&#xff0c;仅简要介绍python中正则表达式常用函数及其使用方法&#xff0c;以作快速查询浏览。01 Re概览Re模块是python的…

oracle 分组_大数据分组怎样才会更快

分组是数据库的常见运算&#xff0c;无论数据如何准备&#xff0c;通常都需要将所有数据遍历。建立索引这时是不起作用的&#xff0c;存储格式才是决定遍历效率的主要因素。数据库中数据的存放虽然是二进制格式的&#xff0c;但普遍IO性能差&#xff0c;库内遍历快&#xff0c;…

java下拉树_参数模板中下拉树级联下拉数据集查询

背景说明在参数表单的制作中会遇到各种各样的需求&#xff0c;如为了方便参数的输入&#xff0c;需要将输入框设计成树状&#xff1b;若参数模板中有两个输入框&#xff0c;每个输入框对应的参数有某种关系&#xff0c;前一个输入框输入参数后&#xff0c;后一个输入框自动关联…

java8 list 行转列_太赞了,Intellij IDEA 竟然把 Java8 的数据流问题这么完美的解决掉了!

使用 IntelliJ IDEA 来帮忙构建你自己的实时模板连接分组《Java 2019 超神之路》《Dubbo 实现原理与源码解析 —— 精品合集》《Spring 实现原理与源码解析 —— 精品合集》《MyBatis 实现原理与源码解析 —— 精品合集》《Spring MVC 实现原理与源码解析 —— 精品合集》《Spr…

beautifulsoup爬取网页中的表格_用 Python 爬取网页

来自公众号&#xff1a;优达学城Udacity作者&#xff1a;Kerry Parker编译&#xff1a;欧剃作为数据科学家的第一个任务&#xff0c;就是做网页爬取。那时候&#xff0c;我对使用代码从网站上获取数据这项技术完全一无所知&#xff0c;它偏偏又是最有逻辑性并且最容易获得的数据…

pyecharts添加文字_超燃的文字云效果,用Python就能轻松get!

本文转载自公众号&#xff1a;数据森麟(ID&#xff1a;shujusenlin)作者&#xff1a;叶庭云链接&#xff1a;https://blog.csdn.net/fyfugoyfa/ 01 / 词云图词云图是一种用来展现高频关键词的可视化表达&#xff0c;通过文字、色彩、图形的搭配&#xff0c;产生有冲击力地视觉效…

mysql 创建视图 主键_MySQL数据库基础操作命令,本文助你更上一层楼!

今天介绍的是关于Mysql数据库一些操作的基础命令用户与权限创建用户mysql>create user test identified by BaC321#; 修改密码5.5版本及以前的命令mysql>set password for testpassowrd(!1A2#3); 5.6及以上命令mysql>update mysql.user set authentication_stringpass…

mysql 聚合函数 怎么用在条件里_MySql 中聚合函数增加条件表达式的方法

Mysql 与聚合函数在一起时候where条件和having条件的过滤时机where 在聚合之前过滤当一个查询包含了聚合函数及where条件&#xff0c;像这样的情况select max(cid) from t where t.id<999这时候会先进行过滤&#xff0c;然后再聚合。先过滤出ID《999的记录&#xff0c;再查找…

drbd(三):drbd的状态说明

1.几种获取状态信息的方法 drbd有很多获取信息的方式。在drbd84和之前的版本&#xff0c;大多都使用cat /proc/drbd来获取信息&#xff0c;多数情况下&#xff0c;这个文件展示的信息对于管理和维护drbd来说已经足够。 例如以下是drbd84上两个volume的节点状态信息&#xff1a;…

python QTreeWidgetItem下面有几个子tree_python-nlp ch1笔记:nlp的基础应用、高级应用、python优势、nltk环境搭建...

本帖是对(印度)Jalaj Thanaki作品《python自然语言处理》的翻译、缩减及改编~nlp的基础应用NLP是AI的子分支&#xff0c;其相关概念可以用于以下专家系统中&#xff1a;语音识别系统问答系统机器翻译文本摘要情感分析基于模板的聊天机器人文本分类主题分割nlp的高级应用理解自然…