把实体 转为json 数据格式---jackson 的详细用法_Jackson快速入门

首先介绍三个注解:

@JsonAutoDetect (method/field):作用于方法或字段,用来表明,当生成json的时候忽略有该annotation的方法或字段

@JsonIgnore 过滤不需要转成json的属性

@JsonIgnoreProperties 主要用于过滤掉一些不需要的属性

以上三个注解需要放在get方法前面才有效.


package com.sw.entity.base;import static javax.persistence.GenerationType.IDENTITY;import java.util.HashSet;
import java.util.Set;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.Table;
import javax.persistence.Transient;import org.codehaus.jackson.annotate.JsonAutoDetect;
import org.codehaus.jackson.annotate.JsonIgnore;/*** Menu entity. @author MyEclipse Persistence Tools*/
@Entity
@Table(name = "menu", catalog = "zhong")
@JsonAutoDetect
public class Menu implements java.io.Serializable {// Fields/*** */private static final long serialVersionUID = 1L;private Integer id;private Menu menu;private String icon;private String name;private Short seq;private String url;private String prem;private Set<Menu> menus = new HashSet<Menu>(0);// Constructors/**用于json输出的属性,不需要持久化;*/private String state = "open";/*********************************//** default constructor */public Menu() {}/** minimal constructor */public Menu(Integer id) {this.id = id;}/** full constructor */
//省略构造器// Property accessors/**省略了一下不需要处理的get/set方法*/@JsonIgnore  //标记该属性不需要转为 json@ManyToOne(fetch = FetchType.LAZY)@JoinColumn(name = "pid")public Menu getMenu() {return this.menu;}public void setMenu(Menu menu) {this.menu = menu;}@JsonIgnore //标记该属性不需要转为 json@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "menu")public Set<Menu> getMenus() {return this.menus;}public void setMenus(Set<Menu> menus) {this.menus = menus;}/*jackson就是根据get方法来获取属性值的,如果持久化的属性值不符合你的要求,
可以通过更改get方法来实现。
比如说你的实体里有个set<xxx> xxx;的属性,如果按照jackson原本的计划,集合类型会被转为json数组,但你想把这个集合的内容转成字符串,那么就可以通过get方法返回字符。或者说按照你的要求返回任何东西。*///这个是为了树形结构菜单标记字段,加上此注解表示该字段不需要持久化实体到数据库@Transientpublic String getState() {if(this.getMenus()==null){state = "open";}else{state = "closed";}return state;}public void setState(String state) {this.state = state;}}

以下是转化代码:

List<Menu> menus = menuManager.getChildrenById(aid,"pid","seq",true); //从数据库取出list
ObjectMapper map = new ObjectMapper();//这是jackson的类库
map.writeValue(Struts2Utils.getResponse().getWriter(),menus); //输出json 这样就把json

数据输出到浏览器客户端了。

以下是值:

[{"name":"dfdsf","id":1,"state":"closed","seq":999,"prem":"fsfsd","icon":"fff","url":"gfdsfds"},
{"name":"fdsfds","id":2,"state":"closed","seq":999,"prem":"fsdf","icon":"fff","url":"efdsfsd"}]
jackson常用转化形式:
writeValueAsString(value) 转化为String
writeValueAsBytes(value) 转化为byte
writeValue(objec0,bean) 此方法用于直接输出json数据,
objec0代表输出环境,可以是Response.getWriter()也可以是Outputstream.bean是要输出的数据,集合和单个bean都可以

Jackson快速入门

Java生态圈中有很多处理JSON和XML格式化的类库,Jackson是其中比较著名的一个。虽然JDK自带了XML处理类库,但是相对来说比较低级,使用本文介绍的Jackson等高级类库处理起来会方便很多。

引入类库

由于Jackson相关类库按照功能分为几个相对独立的,所以需要同时引入多个类库,为了方便我将版本号单独提取出来设置,相关Gradle配置如下。

ext {jacksonVersion = '2.9.5'
}dependencies {compile group: 'com.fasterxml.jackson.core', name: 'jackson-core', version: jacksonVersioncompile group: 'com.fasterxml.jackson.core', name: 'jackson-databind', version: jacksonVersioncompile group: 'com.fasterxml.jackson.core', name: 'jackson-annotations', version: jacksonVersion// 引入XML功能compile group: 'com.fasterxml.jackson.dataformat', name: 'jackson-dataformat-xml', version: jacksonVersion// 比JDK自带XML实现更高效的类库compile group: 'com.fasterxml.woodstox', name: 'woodstox-core', version: '5.1.0'// Java 8 新功能compile group: 'com.fasterxml.jackson.datatype', name: 'jackson-datatype-jsr310', version: jacksonVersioncompile group: 'com.fasterxml.jackson.module', name: 'jackson-module-parameter-names', version: jacksonVersioncompile group: 'com.fasterxml.jackson.datatype', name: 'jackson-datatype-jdk8', version: jacksonVersioncompileOnly group: 'org.projectlombok', name: 'lombok', version: '1.16.22'
}

Maven配置请去mvnrepository搜索。

Jackson注解

Jackson类库包含了很多注解,可以让我们快速建立Java类与JSON之间的关系。详细文档可以参考Jackson-Annotations。下面介绍一下常用的。

属性命名

@JsonProperty注解指定一个属性用于JSON映射,默认情况下映射的JSON属性与注解的属性名称相同,不过可以使用该注解的value值修改JSON属性名,该注解还有一个index属性指定生成JSON属性的顺序,如果有必要的话。

属性包含

还有一些注解可以管理在映射JSON的时候包含或排除某些属性,下面介绍一下常用的几个。

@JsonIgnore注解用于排除某个属性,这样该属性就不会被Jackson序列化和反序列化。

@JsonIgnoreProperties注解是类注解。在序列化为JSON的时候,@JsonIgnoreProperties({"prop1", "prop2"})会忽略pro1和pro2两个属性。在从JSON反序列化为Java类的时候,@JsonIgnoreProperties(ignoreUnknown=true)会忽略所有没有Getter和Setter的属性。该注解在Java类和JSON不完全匹配的时候很有用。

@JsonIgnoreType也是类注解,会排除所有指定类型的属性。

序列化相关

@JsonPropertyOrder@JsonPropertyindex属性类似,指定属性序列化时的顺序。

@JsonRootName注解用于指定JSON根属性的名称。

处理JSON

简单映射

我们用Lombok设置一个简单的Java类。

@Data
@AllArgsConstructor
@NoArgsConstructor
public class Friend {private String nickname;private int age;
}

然后就可以处理JSON数据了。首先需要一个ObjectMapper对象,序列化和反序列化都需要它。

        ObjectMapper mapper = new ObjectMapper();Friend friend = new Friend("yitian", 25);// 写为字符串String text = mapper.writeValueAsString(friend);// 写为文件mapper.writeValue(new File("friend.json"), friend);// 写为字节流byte[] bytes = mapper.writeValueAsBytes(friend);System.out.println(text);// 从字符串中读取Friend newFriend = mapper.readValue(text, Friend.class);// 从字节流中读取newFriend = mapper.readValue(bytes, Friend.class);// 从文件中读取newFriend = mapper.readValue(new File("friend.json"), Friend.class);System.out.println(newFriend);

程序结果如下。可以看到生成的JSON属性和Java类中定义的一致。

{"nickname":"yitian","age":25}
Friend(nickname=yitian, age=25)

集合的映射

除了使用Java类进行映射之外,我们还可以直接使用Map和List等Java集合组织JSON数据,在需要的时候可以使用readTree方法直接读取JSON中的某个属性值。需要注意的是从JSON转换为Map对象的时候,由于Java的类型擦除,所以类型需要我们手动用new TypeReference给出。

        ObjectMapper mapper = new ObjectMapper();Map<String, Object> map = new HashMap<>();map.put("age", 25);map.put("name", "yitian");map.put("interests", new String[]{"pc games", "music"});String text = mapper.writeValueAsString(map);System.out.println(text);Map<String, Object> map2 = mapper.readValue(text, new TypeReference<Map<String, Object>>() {});System.out.println(map2);JsonNode root = mapper.readTree(text);String name = root.get("name").asText();int age = root.get("age").asInt();System.out.println("name:" + name + " age:" + age);

程序结果如下。

{"name":"yitian","interests":["pc games","music"],"age":25}
{name=yitian, interests=[pc games, music], age=25}
name:yitian age:25

Jackson配置

Jackson预定义了一些配置,我们通过启用和禁用某些属性可以修改Jackson运行的某些行为。详细文档参考JacksonFeatures。下面我简单翻译一下Jackson README上列出的一些属性。

// 美化输出
mapper.enable(SerializationFeature.INDENT_OUTPUT);
// 允许序列化空的POJO类
// (否则会抛出异常)
mapper.disable(SerializationFeature.FAIL_ON_EMPTY_BEANS);
// 把java.util.Date, Calendar输出为数字(时间戳)
mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);// 在遇到未知属性的时候不抛出异常
mapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);
// 强制JSON 空字符串("")转换为null对象值:
mapper.enable(DeserializationFeature.ACCEPT_EMPTY_STRING_AS_NULL_OBJECT);// 在JSON中允许C/C++ 样式的注释(非标准,默认禁用)
mapper.configure(JsonParser.Feature.ALLOW_COMMENTS, true);
// 允许没有引号的字段名(非标准)
mapper.configure(JsonParser.Feature.ALLOW_UNQUOTED_FIELD_NAMES, true);
// 允许单引号(非标准)
mapper.configure(JsonParser.Feature.ALLOW_SINGLE_QUOTES, true);
// 强制转义非ASCII字符
mapper.configure(JsonGenerator.Feature.ESCAPE_NON_ASCII, true);
// 将内容包裹为一个JSON属性,属性名由@JsonRootName注解指定
mapper.configure(SerializationFeature.WRAP_ROOT_VALUE, true);

这里有三个方法,configure方法接受配置名和要设置的值,Jackson 2.5版本新加的enable和disable方法则直接启用和禁用相应属性,我推荐使用后面两个方法。

用注解管理映射

前面介绍了一些Jackson注解,下面来应用一下这些注解。首先来看看使用了注解的Java类。

@Data
@NoArgsConstructor
@AllArgsConstructor
@JsonRootName("FriendDetail")
@JsonIgnoreProperties({"uselessProp1", "uselessProp3"})
public class FriendDetail {@JsonProperty("NickName")private String name;@JsonProperty("Age")private int age;private String uselessProp1;@JsonIgnoreprivate int uselessProp2;private String uselessProp3;
}

然后看看代码。需要注意的是,由于设置了排除的属性,所以生成的JSON和Java类并不是完全对应关系,所以禁用DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES是必要的。

        ObjectMapper mapper = new ObjectMapper();//mapper.enable(SerializationFeature.WRAP_ROOT_VALUE);mapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);FriendDetail fd = new FriendDetail("yitian", 25, "", 0, "");String text = mapper.writeValueAsString(fd);System.out.println(text);FriendDetail fd2 = mapper.readValue(text, FriendDetail.class);System.out.println(fd2);

运行结果如下。可以看到生成JSON的时候忽略了我们制定的值,而且在转换为Java类的时候对应的属性为空。

{"NickName":"yitian","Age":25}
FriendDetail(name=yitian, age=25, uselessProp1=null, uselessProp2=0, uselessProp3=null)

然后取消注释代码中的那行,也就是启用WRAP_ROOT_VALUE功能,再运行一下程序,运行结果如下。可以看到生成的JSON结果发生了变化,而且由于JSON结果变化,所以Java类转换失败(所有字段值全为空)。WRAP_ROOT_VALUE这个功能在有些时候比较有用,因为有些JSON文件需要这种结构。

{"FriendDetail":{"NickName":"yitian","Age":25}}
FriendDetail(name=null, age=0, uselessProp1=null, uselessProp2=0, uselessProp3=null)

Java8日期时间类支持

Java8增加了一套全新的日期时间类,Jackson对此也有支持。这些支持是以Jackson模块形式提供的,所以首先就是注册这些模块。

        ObjectMapper mapper = new ObjectMapper().registerModule(new JavaTimeModule()).registerModule(new ParameterNamesModule()).registerModule(new Jdk8Module());

导入类库之后,Jackson也可以自动搜索所有模块,不需要我们手动注册。

        mapper.findAndRegisterModules();

我们新建一个带有LocalDate字段的Java类。

@Data
@NoArgsConstructor
@AllArgsConstructor
@JsonRootName("Person")
public class Person {@JsonProperty("Name")private String name;@JsonProperty("NickName")private String nickname;@JsonProperty("Age")private int age;@JsonProperty("IdentityCode")private String identityCode;@JsonProperty@JsonFormat(pattern = "yyyy-MM-DD")private LocalDate birthday;
}

然后来看看代码。

    static void java8DateTime() throws IOException {Person p1 = new Person("yitian", "易天", 25, "10000", LocalDate.of(1994, 1, 1));ObjectMapper mapper = new ObjectMapper().registerModule(new JavaTimeModule());//mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);String text = mapper.writeValueAsString(p1);System.out.println(text);Person p2 = mapper.readValue(text, Person.class);System.out.println(p2);}

运行结果如下。可以看到,生成的JSON日期变成了[1994,1,1]这样的时间戳形式,一般情况下不符合我们的要求。

{"birthday":[1994,1,1],"Name":"yitian","NickName":"易天","Age":25,"IdentityCode":"10000"}
Person(name=yitian, nickname=易天, age=25, identityCode=10000, birthday=1994-01-01)

取消注释那行代码,程序运行结果如下。这样一来就变成了我们一般使用的形式了。如果有格式需要的话,可以使用@JsonFormat(pattern = "yyyy-MM-DD")注解格式化日期显示。

{"birthday":"1994-01-01","Name":"yitian","NickName":"易天","Age":25,"IdentityCode":"10000"}
Person(name=yitian, nickname=易天, age=25, identityCode=10000, birthday=1994-01-01)

处理XML

Jackson是一个处理JSON的类库,不过它也通过jackson-dataformat-xml包提供了处理XML的功能。Jackson建议我们在处理XML的时候使用woodstox-core包,它是一个XML的实现,比JDK自带XML实现更加高效,也更加安全。

这里有个注意事项,如果你正在使用Java 9以上的JDK,可能会出现java.lang.NoClassDefFoundError: javax/xml/bind/JAXBException异常,这是因为Java 9实现了JDK的模块化,将原本和JDK打包在一起的JAXB实现分隔出来。所以这时候需要我们手动添加JAXB的实现。在Gradle中添加下面的代码即可。

compile group: 'javax.xml.bind', name: 'jaxb-api', version: '2.3.0'

注解

Jackson XML除了使用Jackson JSON和JDK JAXB的一些注解之外,自己也定义了一些注解。下面简单介绍一下几个常用注解。

@JacksonXmlProperty注解有三个属性,namespace和localname属性用于指定XML命名空间的名称,isAttribute指定该属性作为XML的属性(<a b="xxx"></a>)还是作为子标签(<a><b></b></a>).

@JacksonXmlRootElement注解有两个属性,namespace和localname属性用于指定XML根元素命名空间的名称。

@JacksonXmlText注解将属性直接作为未被标签包裹的普通文本表现。

@JacksonXmlCData将属性包裹在CDATA标签中。

XML映射

新建如下一个Java类。

@Data
@NoArgsConstructor
@AllArgsConstructor
@JsonRootName("Person")
public class Person {@JsonProperty("Name")private String name;@JsonProperty("NickName")//@JacksonXmlTextprivate String nickname;@JsonProperty("Age")private int age;@JsonProperty("IdentityCode")@JacksonXmlCDataprivate String identityCode;@JsonProperty("Birthday")//@JacksonXmlProperty(isAttribute = true)@JsonFormat(pattern = "yyyy/MM/DD")private LocalDate birthday;}

下面是代码示例,基本上和JSON的API非常相似,XmlMapper实际上就是ObjectMapper的子类。

        Person p1 = new Person("yitian", "易天", 25, "10000", LocalDate.of(1994, 1, 1));XmlMapper mapper = new XmlMapper();mapper.findAndRegisterModules();mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);mapper.enable(SerializationFeature.INDENT_OUTPUT);String text = mapper.writeValueAsString(p1);System.out.println(text);Person p2 = mapper.readValue(text, Person.class);System.out.println(p2);

运行结果如下。

<Person><Name>yitian</Name><NickName>易天</NickName><Age>25</Age><IdentityCode><![CDATA[10000]]></IdentityCode><Birthday>1994/01/01</Birthday>
</Person>Person(name=yitian, nickname=易天, age=25, identityCode=10000, birthday=1994-01-01)

如果取消那两行注释,那么运行结果如下。可以看到Jackson XML注解对生成的XML的控制效果。

<Person birthday="1994/01/01"><Name>yitian</Name>易天<Age>25</Age><IdentityCode><![CDATA[10000]]></IdentityCode>
</Person>Person(name=yitian, nickname=null, age=25, identityCode=10000, birthday=1994-01-01)

Spring Boot集成

自动配置

Spring Boot对Jackson的支持非常完善,只要我们引入相应类库,Spring Boot就可以自动配置开箱即用的Bean。Spring自动配置的ObjectMapper(或者XmlMapper)作了如下配置,基本上可以适应大部分情况。

  • 禁用了MapperFeature.DEFAULT_VIEW_INCLUSION
  • 禁用了DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES
  • 禁用了SerializationFeature.WRITE_DATES_AS_TIMESTAMPS

如果需要修改自动配置的ObjectMapper属性也非常简单,Spring Boot提供了一组环境变量,直接在application.properties文件中修改即可。

Jackson枚举Spring环境变量
com.fasterxml.jackson.databind.DeserializationFeaturespring.jackson.deserialization.<feature_name>=true|false
com.fasterxml.jackson.core.JsonGenerator.Featurespring.jackson.generator.<feature_name>=true|false
com.fasterxml.jackson.databind.MapperFeaturespring.jackson.mapper.<feature_name>=true|false
com.fasterxml.jackson.core.JsonParser.Featurespring.jackson.parser.<feature_name>=true|false
com.fasterxml.jackson.databind.SerializationFeaturespring.jackson.serialization.<feature_name>=true|false
com.fasterxml.jackson.annotation.JsonInclude.Includespring.jackson.default-property-inclusion=always|non_null|non_absent|non_default|non_empty

由于Spring会同时配置相应的HttpMessageConverters,所以我们其实要做的很简单,用Jackson注解标注好要映射的Java类,然后直接让控制器返回对象即可!下面是一个Java类。

@JsonRootName("person")
public class Person {@JsonPropertyprivate String name;@JsonPropertyprivate int id;@JsonFormat(pattern = "yyyy-MM-DD")private LocalDate birthday;public Person(String name, int id, LocalDate birthday) {this.name = name;this.id = id;this.birthday = birthday;}
}

然后是控制器代码。在整个过程中我们只需要引入Jackson类库,然后编写业务代码就好了。关于如何配置Jackson类库,我们完全不需要管,这就是Spring Boot的方便之处。

@Controller
public class MainController {private Person person = new Person("yitian", 10000, LocalDate.of(1994, 1, 1));@RequestMapping("/")public String index() {return "index";}@RequestMapping(value = "/json", produces = "application/json")@ResponseBodypublic Person json() {return person;}
}

进入localhost:8080/xml就可以看到对应结果了。

结果

在这里插入图片描述

手动配置

Spring Boot自动配置非常方便,但不是万能的。在必要的时候,我们需要手动配置Bean来替代自动配置的Bean。

@Configuration
public class JacksonConfig {@Bean@Primary@Qualifier("xml")public XmlMapper xmlMapper(Jackson2ObjectMapperBuilder builder) {XmlMapper mapper = builder.createXmlMapper(true).build();mapper.enable(SerializationFeature.INDENT_OUTPUT);mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);return mapper;}@Bean@Qualifier("json")public ObjectMapper jsonMapper(Jackson2ObjectMapperBuilder builder) {ObjectMapper mapper = builder.createXmlMapper(false).build();mapper.enable(SerializationFeature.INDENT_OUTPUT);mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);return mapper;}
}

然后在需要的地方进行依赖注入。需要注意为了区分ObjectMapper和XmlMapper,需要使用@Qualifier注解进行标记。

@Controller
public class MainController {private ObjectMapper jsonMapper;private XmlMapper xmlMapper;private Person person = new Person("yitian", 10000, LocalDate.of(1994, 1, 1));public MainController(@Autowired @Qualifier("json") ObjectMapper jsonMapper, @Autowired @Qualifier("xml") XmlMapper xmlMapper) {this.jsonMapper = jsonMapper;this.xmlMapper = xmlMapper;}

以上就是Jackson类库的一些介绍,希望对大家有所帮助。

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

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

相关文章

java 类的加载顺序_Java 中类的加载顺序

这其实是去年校招时我遇到的一道阿里巴巴的笔试题(承认有点久远了-。-)&#xff0c;嗯&#xff0c;如果我没记错的话&#xff0c;当时是作为Java方向的一道选做大题。当然题意没有这么直白&#xff0c;题目只要求你写出程序运行后所有System.out.println的输出结果&#xff0c;…

Jackson转换json大写_关于jackson转化json的原理_jackson序列化和反序列化Json

背景 web工程中&#xff0c;数据交互是不可避免的&#xff0c;相比xml&#xff0c;json是现在流行的数据交互。 在调试接口中&#xff0c;发现返回字段的大小写不是我所期望的&#xff0c;原本应该返回的nNum字段变成了nnum&#xff0c;这样就导致和前端约定的有出入了。 ja…

svn利用TortoiseSVN忽略文件或文件夹(目录)

忽略已经版本控制的文件 如果你不小心添加了一些应该被忽略的文件&#xff0c;你如何将它们从版本控制中去除而不会丢失它们&#xff1f;或许你有自己的IDE配置文件&#xff0c;不是项目的一部分&#xff0c;但将会花费很多时间使之按照自己的方式工作。 如果你还没有提交&am…

SpringMVC 参数绑定详解

概述 记得之前跟前端同事联调接口的时候&#xff0c;后端SpringMVC需要接收数组类型的参数&#xff0c;然后跟前端说需要传数组类型过来。后来前端童鞋传了数组&#xff0c;但是后端接收不成功&#xff0c;联调失败。那时候由于时间关系没有仔细研究这块&#xff0c;当时想了个…

java 连接远程服务器_java实现连接远程服务器并执行命令的基本原理

一、所需jar包需要借助Ganymed SSH的jar包: ganymed-ssh2-build210.jar二、实现原理Ganymed SSH-2 java在整个访问过程中担当SSH的客户端&#xff0c;由于Linux系统自带SSH服务&#xff0c;所以可以直接访问Linux系统并执行相关命令&#xff0c;而 Windows系统则需要首先安装S…

SpringMVC接收基本类型和包装类型

先看一个示例&#xff1a; 注意这两个参数都没有加RequestParam注解。 测试&#xff1a; 直接报错。即没有加RequestParam注解&#xff0c;基本数据类型参数是必填的。 再测试&#xff1a; 直接返回null&#xff0c;也就是说包装类型参数&#xff0c;没有加RequestParam注解&…

SpringMVC 【参数绑定详讲、默认支持参数类型、自定义参数绑定、RequestParam 注解】

SpringMVC 第四篇【参数绑定详讲、默认支持参数类型、自定义参数绑定、RequestParam 注解】 参数绑定 我们在 Controller 使用方法参数接收值&#xff0c;就是把 web 端的值给接收到 Controller 中处理&#xff0c;这个过程就叫做参数绑定… 默认支持的参数类型 从上面的用…

MySQL中 IS NULL、IS NOT NULL、不等于, 能用上索引吗?

MySQL的WHERE子句中包含 IS NULL、IS NOT NULL、! 这些条件时便不能使用索引查询&#xff0c;只能使用全表扫描。 告诉大家结论&#xff1a; MySQL中决定使不使用某个索引执行查询的依据就是成本够不够小&#xff0c;如果null值很多&#xff0c;还是会用到索引的。 自己做了个…

Java EE 企业网站_基于jsp的企业网站系统-JavaEE实现企业网站系统 - java项目源码...

基于jspservletpojomysql实现一个javaee/javaweb的企业网站系统, 该项目可用各类java课程设计大作业中, 企业网站系统的系统架构分为前后台两部分, 最终实现在线上进行企业网站系统各项功能,实现了诸如用户管理, 登录注册, 权限管理等功能, 并实现对各类企业网站系统相关的实体…

MySQL创建联合索引,字段的先后顺序,对查询的影响分析

文章目录前言最左匹配原则为什么会有最左前缀呢&#xff1f;联合索引的存储结构联合索引字段的先后顺序b树可以存储的数据条数总结前言 ​ 对于联合索引我们知道&#xff0c;在使用的时候有一个最左前缀的原则&#xff0c;除了这些呢&#xff0c;比如字段放置的位置&#xff0…

php oracle 操作 sql语句中能不能添加数组_如何在PHP中使用Oracle数据库_php

在php3.0以上版本中&#xff0c;php内置了几乎目前所有的数据库处理函数&#xff0c;包括oracle;在本文中我们通过一个实例来介绍了如何使用这些函数来操作Oracle数据库。PHP提供了2大类API(应用程序接口)来操作Oracle数据库。一个是标准的Oracle处理函数(ORA) 另一个是Oracle …

mysql where过滤条件中and连接的两个条件的顺序不必和建立的联合索引的字段顺序一致_mysql and 顺序_mysql执行过程以及顺序

mysql中and的判断顺序 select * from a join b on 条件一 and 条件二条件一和二都是判断 id 字段&#xff0c; 条件一和条件二哪个先执行&#xff1f; 解析器会自动选择最优的流程执行的 这两个都是平级条件&#xff0c;理论上是没有先后顺序的&#xff01; 没有顺序&#xff…

MySQL优化器_MySQL查询优化器

MySQL优化器 MySQL架构图 讲到MySQL&#xff0c;就绕不开他的架构图。MySQL是一个经典的C/S架构。服务器这边分两层&#xff1a;第一层是Server层&#xff0c;第二层是存储引擎。Server层处理主要的业务操作流程&#xff0c;但不关心具体的存储逻辑。存储逻辑由存储引擎层去…

MySQL性能优化(一)MySQL中SQL语句是如何执行的?

该篇章将开始整理MySQL的优化&#xff0c;不过开始之前&#xff0c;我们想了解清楚那就是MySQL是怎么执行的。 文章目录1.MySQL驱动2.应用系统数据库连接池3.MySQL数据库连接池4.SQL执行过程4.1.线程监听&#xff1a;监听网络请求中的SQL语句4.2.SQL接口&#xff1a;负责处理接…

2023_Spark_实验三十三:配置Standalone模式Spark3.4.2集群

实验目的&#xff1a;掌握Spark Standalone部署模式 实验方法&#xff1a;基于centos7部署Spark standalone模式集群 实验步骤&#xff1a; 一、下载spark软件 下载的时候下载与自己idea里对应版本的spark News | Apache Spark 选择任意一个下载即可 - spark 3.4.1 - spark …

MySQL性能优化(二)InnoDB之日志文件

文章目录1.MySQL日志记录文件1.1.回顾SQL语句的执行1.2.InnoDB内存结构&#xff1a;缓冲池1.3.记录日志&#xff1a;Undo和Redo1.3.1.Undo日志文件&#xff1a;记录数据修改前的值1.3.2.Redo日志文件&#xff1a;记录数据即将修改值1.3.3.Undo和Redo的区别&#xff08;记录、前…

php正则检查QQ,PHP 正则匹配手机号的QQ号

//匹配手机号码//$mode /\d{3}-\d{8}|\d{4}-\d{7}|\d{11}/;//不匹配以-开头的手机号码//$mode /^((?!-).)*\d{3}-\d{8}|^((?!-).)*\d{4}-\d{7}|^((?!-).)*\d{11}/;//不匹配以 / 开头或结束的手机号码$mode /^((?!\/).)*\d{3}-\d{8}((?!\/).)*$|^((?!\/).)*\d{4}-\d{7}…

java获取单击内容,java – 单击菜单链接时,获取元素不是可点击的异常

我想点击菜单链接但没有运气.它总是显示异常 –Exception in thread “main” org.openqa.selenium.WebDriverException:unknown error: Element is not clickable at point (64, 64). Otherelement would receive the click: <div style”position: absolute; left:0px; to…

MySQL性能优化(三)Buffer Pool实现原理

文章目录1.回顾缓冲池 Buffer Pool2.配置Buffer Pool的大小3.Buffer Pool&#xff1a;数据结构3.1.磁盘数据结构&#xff1a;数据页3.2.缓冲池数据结构&#xff1a;数据页(缓存页)3.3.缓存页对应的描述信息4.Buffer Pool&#xff1a;初始化5.Buffer Pool&#xff1a;free链表6.…

MySQL性能优化(四)redo log实现原理

文章目录1.redo log的作用2.redo log的结构2.1.redo log 记录2.2.redo log block2.3.redo log buffer3.redo log buffer 刷盘1.redo log的作用 首先我们都知道&#xff0c;执行增删改SQL语句的时候&#xff0c;都是针对一个表中的某些数据去执行的&#xff0c;此时的话&#x…