Mybatis的关联映射

学习目标

  • 了解数据表之间以及对象之间的三种关联关系
  • 熟悉关联关系中的嵌套查询和嵌套结果
  • 掌握一对一、一对多和多对多关联映射的使用

文章目录

1. 关联关系概述

2. 一对一

3.一对多 

 4. 多对多


1. 关联关系概述

  • 一对一的关系:就是在本类中定义对方类型的对象
  • 一对多的关系:就是一个A类类型对应多个B类类型的情况
  • 多对多的关系:在A类中定义B类类型的集合,在B类中定义A类类型的集合

2. 一对一

Mybatis通过<resultMap>中的子元素<association>来处理一对一关联关系.

<association>元素中,通常可以配置一下属性:

  • property:指定映射到的实体类对象属性,与表字段意义对应。

  • column:指定表中对应的字段。

  • javaType:指定映射到实体对象属性的类型。

  • select:指定引入嵌套查询的子SQL语句,该属性用于关联映射中的嵌套查询。

  • fetchType:指定在关联查询时是否启用延迟加载。fetchType属性有lazyeager两个属性值,默认值为lazy(即默认关联延迟加载)。

<association>元素只需要参考如下两种实例配置:

	<!-- 方式一:嵌套查询 -->
<association property="card" column="card_id"javaType="IdCard"select="com.mybatis.mapper.IdCardMapper.findCodeById" /><!-- 方式二:嵌套结果 -->
<association property="card" javaType="com.mybatis.po.IdCard"><id property="id" column="card_id" /><result property="code" column="code" /></association>

Mybatis在映射文件中加载关联关系对象主要通过两种方式:嵌套查询和嵌套结果。嵌套查询是指通过执行另外一条SQL映射语句来返回预期的复杂类型;嵌套结果是使用嵌套结果映射来处理重复的联合结果的子集。我们可以使用上述任何一种方式实现对关联关系的加载。

 查询个人及其关联的身份证信息是先通过查询个人表中的主 主键来获个人信息, 然后通过表中的外键,来获取证件表中的身份证号信息。其具体实现步骤如下:

(1)在mybatis数据库中分别创建名为tb_idcard和tb_person的数据表,同时预先插入两条数据。

USE mybatis;
#创建一个名称为tb_idcard的表
CREATE TABLE tb_idcard(
id INT PRIMARY KEY AUTO_INCREMENT,
CODE VARCHAR(18)
);#插入两条数据
INSERT INTO tb_ idcard (CODE) VALUES ('152221198711020624') ;
INSERT INTO tb_ idcard (CODE) VALUES ('152201199008150317') ;#创建一个名称为tb_ person的表
CREATE TABLE tb_ person (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(32),
age INT,
sex VARCHAR(8),
card id INT UNIQUE,
FOREIGN KEY (card_ id) REFERENCES tb_idcard(id)
);#插入两条数据
INSERT INTO tb_ person (name,age,sex,card id) VALUSE('Rose',27,'tom',27,'男',2);
INSERT INTO tb_person (name,age,sex, card _id) VALUES('tom',29, '女',1); 

(2) 在Eclipse中创建工程,然后引入相关JAR包、log4j日志文件、MybatisUtils工具类以及mybatis-config.xml核心配置文件。

(3)在项目的com.mybatis.po包下创建持久化类idCard和Person。

package com.mybatis.po;public class IdCard {private Integer id;private String code;public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getCode() {return code;}public void setCode(String code) {this.code = code;}@Overridepublic String toString() {return "idCard [id=" + id + ", code=" + code + "]";}}
package com.mybatis.po;public class Person {private Integer id;private String name;private Integer age;private String sex;private IdCard card;public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public Integer getAge() {return age;}public void setAge(Integer age) {this.age = age;}public String getSex() {return sex;}public void setSex(String sex) {this.sex = sex;}public IdCard getCard() {return card;}public void setCard(IdCard card) {this.card = card;}@Overridepublic String toString() {return "Person [id=" + id + ", name=" + name + ", age=" + age + ", sex=" + sex + ", card=" + card + "]";}}

 (4)在com.mybatis.mapper包中,创建证件映射文件idCardMapper.xml和个人映射文件PersonMapper.xml,并在两个映射文件中编写一对一关联映射查询的配置信息。

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!-- 根据客户名编号查询客户信息列表 -->
<mapper namespace="com.mybatis.mapper.IdCardMapper"><!-- 根据id查询证件信息 --><select id="findCodeById" parameterType="Integer"resultType="IdCard">select * from tb_idcard where id=#{id}</select>
</mapper>	
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!-- 根据客户名编号查询客户信息列表 -->
<mapper namespace="com.mybatis.mapper.PersonMapper"><!-- 嵌套查询:通过执行另外一条SQL映射语句来返回预期的特殊类型 --><select id="findPersonById" parameterType="Integer"resultMap="IdCardWithPersonResult">select * from tb_person where id=#{id}</select><resultMap type="Person" id="IdCardWithPersonResult"><id property="id" column="id" /><result property="name" column="name" /><result property="age" column="age" /><result property="sex" column="sex" /><!-- 一对一:association使用select属性引入另外一条SQL语句 --><association property="card" column="card_id"javaType="IdCard"select="com.mybatis.mapper.IdCardMapper.findCodeById" /></resultMap><!-- 嵌套结果:使用嵌套结果映射来处理重复的联合结果的子集 --><select id="findPersonById2" parameterType="Integer"resultMap="IdCardWithPersonResult2">select p.*,idcard.codefrom tb_person p,tb_idcard idcardwhere p.card_id=idcard.idand p.id=#{id}</select><resultMap type="Person" id="IdCardWithPersonResult2"><id property="id" column="id" /><result property="name" column="name" /><result property="age" column="age" /><result property="sex" column="sex" /><association property="card" javaType="IdCard"><id property="id" column="card_id" /><result property="code" column="code" /></association></resultMap></mapper>	

 (5)在核心配置文件mybatis-config.xml中,引入Mapper映射文件并定义别名。

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration><!-- 引入数据库连接配置文件 --><properties resource="db.properties" /><!-- 使用扫描包的形式定义别名 --><typeAliases><package name="com.mybatis.po" /></typeAliases><!-- 环境配置 --><environments default="mysql"><environment id="mysql"><transactionManager type="JDBC" /><dataSource type="POOLED"><property name="driver" value="${jdbc.driver}" /><property name="url" value="${jdbc.url}" /><property name="username" value="${jdbc.username}" /><property name="password" value="${jdbc.password}" /></dataSource></environment></environments><mappers><mapper resource="com/mybatis/mapper/IdCardMapper.xml" /><mapper resource="com/mybatis/mapper/PersonMapper.xml" /></mappers>
</configuration>

 (6)在com.mybatis.test包中,创建测试类MybatisAssociatedTest,并在类中编写测试方法findPersonByIdTest()。

package com.mybatis.test;import org.apache.ibatis.session.SqlSession;
import org.junit.Test;import com.mybatis.po.Person;
import com.mybatis.util.MybatisUtils;/** Mybatis关联查询映射测试类*/
public class MybatisAssociatedTest {/** 嵌套查询*/@Testpublic void CustomerTest() throws Exception {// 1.通过工具类生成SqlSession对象SqlSession session = MybatisUtils.getSession();// 2.使用Mybatis嵌套查询的方式查询id为1的人的信息Person person = session.selectOne("com.mybatis.mapper." + "PersonMapper.findPersonById", 1);// 3.输出查询结果System.out.println(person);// 4.关闭SqlSessionsession.close();}/** 嵌套结果*/@Testpublic void CustomerTest2() {// 1.通过工具类生成SqlSession对象SqlSession session = MybatisUtils.getSession();// 2.使用Mybatis嵌套查询的方式查询id为1的人的信息Person person = session.selectOne("com.nynu.qdy.mapper." + "PersonMapper.findPersonById2", 1);// 3.输出查询结果System.out.println(person);// 4.关闭SqlSessionsession.close();}}

(7) 使用JUnit4分别执行findByIdTest()和CustomerTest2()后,控制台的输出结果如下图所示。

3.一对多 

Mybatis通过<resultMap>中的子元素<collection>来处理一对多关联关系。<collection>子元素的属性与<association>元素相同,但还包括一个特殊属性——ofType。ofType属性与javaType属性对应,它用于指定实体对象中集合类属性所包含的元素类型。

<collection>元素的使用可以参考如下两种实例进行配置:

<!--方式一:嵌套查询-->
<collection property="ordersList" column="id"ofType="com.mybatis.po.Orders">select="com.mybatis.mapper.OrdersMapper.selectOrders" /></collection>
<!-- 方式二:嵌套结果 -->
<collection property="ordersList" ofType="Orders"><id property="id" column="orders_id" /><result property="number" column="number" /></collection>

 在了解了MyBatis处理一对多关联关系的元素和方式后,接下来以用户和订单之间的这种一 对多关联关系为例,详细讲解如何在MyBatis中处理一对多 关联关系,具体步骤如下:

(1) 在mybatis数据库中,创建两个数据表,分别为tb_ _user和tb_ _orders, 同时在表中预先插入几条数据,执行的SQL语句如下所示。

#创建一个名称为tb_ user的表
CREATE TABLE tb_user(
id int(32) PRIMARY KEY AUTO_INCREMENT,
username varchar (32),
address varchar (256)
);#插入3 条数据
INSERT INTO tb_ user VALUES ('1', ' 詹姆斯',! 克利夫兰');
INSERT INTO tb user VALUES ('2', '科比,洛杉矾') ;
INSERT INTO tb user VALUES ('3', '保罗', '洛杉矶');井创建一个名称为tb_orders 的表
CREATE TABLE tb_orders(
1d int(32) PRIMARY KEY AUTO_INCREMENT,
number varchar (32) NOT NULL,
user_ id int(32) NOT NULL,
FOREIGN KEY (user_id) REFERENCES tb_user (id)
); #插入3条数据
INSERT INTO tb orders VALUES ('1', '1000011','1');
INSERT INTO tb orders VALUES ('2', '1000011','1');
INSERT INTO tb orders VALUES ('3', '1000011','2');

 (2) 在com.mybatis.po包中,创建持久化类Orders和User,并在两个类中定义相关属性和方法。

package com.mybatis.po;import java.util.List;public class Orders {private Integer id;private String number;private List<Product> productList;public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getNumber() {return number;}public void setNumber(String number) {this.number = number;}public List<Product> getProductList() {return productList;}public void setProductList(List<Product> productList) {this.productList = productList;}@Overridepublic String toString() {return "Orders [id=" + id + ", number=" + number + ", productList=" + productList + "]";}}
package com.mybatis.po;import java.util.List;public class User {private Integer id;private String username;private String address;private List<Orders> ordersList;public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public String getAddress() {return address;}public void setAddress(String address) {this.address = address;}public List<Orders> getOrdersList() {return ordersList;}public void setOrdersList(List<Orders> ordersList) {this.ordersList = ordersList;}@Overridepublic String toString() {return "User [id=" + id + ", username=" + username + ", address=" + address + ", ordersList=" + ordersList+ "]";}}

(3) 在com.mybatis.mapper包中,创建用户实体类映射文件UserMapper.xml,并在文件中编写一对多关联映射查询的配置。

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!-- namespace表示命名空间 -->
<mapper namespace="com.mybatis.mapper.UserMapper"><!-- 一对多:查看某一用户及其关联的订单信息 注意:当关联查询出的列名相同,则需要使用别名区分 --><select id="findUserWithOrders" parameterType="Integer"resultMap="UserWithOrdersResult">select u.*,o.id as orders_id,o.numberfrom tb_user u,tb_orders owhere u.id=o.user_idand u.id=#{id}</select><resultMap type="User" id="UserWithOrdersResult"><id property="id" column="id" /><result property="username" column="username" /><result property="address" column="address" /><!-- 一对多关联映射:collection ofType表示属性集合中元素的类型,List<Orders>属性即Order类 --><collection property="ordersList" ofType="Orders"><id property="id" column="orders_id" /><result property="number" column="number" /></collection></resultMap>
</mapper>	

(4) 在核心配置文件mybatis-config.xml中,引入Mapper映射文件。

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration><!-- 引入数据库连接配置文件 --><properties resource="db.properties" /><!-- 使用扫描包的形式定义别名 --><typeAliases><package name="com.mybatis.po" /></typeAliases><!-- 环境配置 --><environments default="mysql"><environment id="mysql"><transactionManager type="JDBC" /><dataSource type="POOLED"><property name="driver" value="${jdbc.driver}" /><property name="url" value="${jdbc.url}" /><property name="username" value="${jdbc.username}" /><property name="password" value="${jdbc.password}" /></dataSource></environment></environments><mappers><mapper resource="com/mybatis/mapper/IdCardMapper.xml" /><mapper resource="com/mybatis/mapper/PersonMapper.xml" /><mapper resource="com/mybatis/mapper/UserMapper.xml" /></mappers>
</configuration>

(5) 在测试类MybatisAssociatedTest中,编写测试方法findUserTest()方法。

package com.mybatis.test;import org.apache.ibatis.session.SqlSession;
import org.junit.Test;import com.mybatis.po.User;
import com.mybatis.util.MybatisUtils;/** Mybatis关联查询映射测试类*/
public class MybatisAssociatedTest {/** 一对多*/@Testpublic void findUserTest() {// 1.通过工具类生成SqlSession对象SqlSession session = MybatisUtils.getSession();// 2.查询id为1的用户信息User user = session.selectOne("com.mybatis.mapper." + "UserMapper.findUserWithOrders", 1);// 3.输出查询结果信息System.out.println(user);// 4.关闭SqlSessionsession.close();}}

(6)  使用JUnit执行findUserTest()方法后,控制台输出结果如下图所示。

 4. 多对多

了解了数据库中订单表与商品表之间的多对多关联关系后,下面我们就通过具体的案例来讲解如何使用MyBatis来处理这种多对多的关系,具体实现步骤如下:

(1) 创建数据表。在mybatis数据库中新建名称为tb_product和tb_ordersitem的两个数据表,同时在表中预先插入几条数据。其执行的SQL语句如下所示。

#创建一个名称为tb_product的表CREATE TABLE tb_product(
id INT(32) PRIMARY KEY AUTO_INCREMENT,
NAME VARCHAR(32),
price DOUBLE
);#插入3条数据
INSERT INTO tb_product VALUES ('1', 'Java 基础入门','44.51') ;
INSERT INTO tb_product VALUES ('2', 'Java web 程序开发入门','38.5') ;
INSERT INTO tb product VALUES ('3', 'SSM框架整合实战','50') ; #创建一个名称为tb_ ordersitem的中间表
CREATE TABLE tb_ordersitem(
id INT (32) PRIMARY KEY AUTO_INCREMENT,
orders id INT(32),
product id INT (32),
FOREIGN KEY (orders_ id) REFERENCES tb_orders (id),
FOREIGN KEY (product_ id) REFERENCES tb_product (id)
);#插入3条数据
INSERT INTO tb_ordersitem VALUES('1','1','1');
INSERT INTO tb_ordersitem VALUES('2','1','3');
INSERT INTO tb ordersitem VALUES('3','3','3');

 (2) 在com.mybatis.po包中,创建持久化类Product,并在类中定义相关属性和方法。

package com.mybatis.po;import java.util.List;public class Product {private Integer id; // 商品idprivate String name; // 商品名称private Double price; // 商品单价private List<Orders> orders; // 与订单相关的关联属性public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public Double getPrice() {return price;}public void setPrice(Double price) {this.price = price;}public List<Orders> getOrders() {return orders;}public void setOrders(List<Orders> orders) {this.orders = orders;}@Overridepublic String toString() {return "Product [id=" + id + ", name=" + name + ", prices=" + price + ", orders=" + orders + "]";}}

(3)在com.mybatis.mapper包中,创建订单实体映射文件Ordermapper.xml和商品实体映射文件Productmapper.xml,对两个映射文件进行编辑。

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.nynu.qdy.mapper.OrdersMapper"><!-- 多对多嵌套映射查询: 通过执行另外一条SQL映射语句来返回预期的特殊类型 --><select id="findOrdersWithProduct" parameterType="Integer"resultMap="OrdersWithProductResult">select * from tb_orders where id=#{id}</select><resultMap type="Orders" id="OrdersWithProductResult"><id property="id" column="id" /><result property="number" column="number" /><collection property="productList" column="id"ofType="Product"select="com.mybatis.mapper.ProductMapper.findProductById"></collection></resultMap><!-- 多对多嵌套结果查询:查询某订单及其关联的商品详情 --><select id="findOrdersWithProduct2" parameterType="Integer"resultMap="OrdersWithProductResult2">select o.*,p.id as pid,p.name,p.pricefrom tb_orderso,tb_product p,tb_ordersitem oiwhere oi.orders_id=o.idandoi.product_id=p.idand o.id=#{id}</select><resultMap type="Orders" id="OrdersWithProductResult2"><id property="id" column="id" /><result property="number" column="number" /><!-- 多对多关联映射:collection --><collection property="productList" ofType="Product"><id property="id" column="id" /><result property="name" column="name" /><result property="price" column="price" /></collection></resultMap>
</mapper>

(4)将创建的映射文件中OrderMapper.xml和ProductMapper.xml的文件路径配置到核心配置文件mybatis-config.xml中。

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration><!-- 引入数据库连接配置文件 --><properties resource="db.properties" /><!-- 使用扫描包的形式定义别名 --><typeAliases><package name="com.mybatis.po" /></typeAliases><!-- 环境配置 --><environments default="mysql"><environment id="mysql"><transactionManager type="JDBC" /><dataSource type="POOLED"><property name="driver" value="${jdbc.driver}" /><property name="url" value="${jdbc.url}" /><property name="username" value="${jdbc.username}" /><property name="password" value="${jdbc.password}" /></dataSource></environment></environments><mappers><mapper resource="com/mybatis/mapper/OrdersMapper.xml" /><mapper resource="com/mybatis/mapper/ProductMapper.xml" /></mappers>
</configuration>

(5)在测试类MybatisAssociatedTest中,编写多对多关联查询的测试方法findOrdersTest()。

package com.mybatis.test;import org.apache.ibatis.session.SqlSession;
import org.junit.Test;import com.mybatis.po.Orders;
import com.mybatis.po.User;
import com.mybatis.util.MybatisUtils;/** Mybatis关联查询映射测试类*/
public class MybatisAssociatedTest {/** 多对多*/@Testpublic void findOrdersTest() {// 1.通过工具类生成SqlSession对象SqlSession session = MybatisUtils.getSession();// 2.查询id为1的订单中的商品信息Orders orders = session.selectOne("com.mybatis.mapper." + "OrdersMapper.findOrdersWithProduct", 1);// 3.输出查询结果信息System.out.println(orders);// 4.关闭SqlSessionsession.close();}/** 多对多嵌套查询*/@Testpublic void findOrdersTest2() {// 1.通过工具类生成SqlSession对象SqlSession session = MybatisUtils.getSession();// 2.使用Mybatis嵌套查询的方式查询id为1的人的信息Orders orders = session.selectOne("com.mybatis.mapper." + "OrdersMapper.findOrdersWithProduct2", 1);// 3.输出查询结果System.out.println(orders);// 4.关闭SqlSessionsession.close();}
}

 (6) 使用JUnit4执行findOrdersTest()方法后,控制台的输出结果如下图所示。

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

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

相关文章

【乱码】字符串乱码

1、html <meta charset"UTF-8">2、mysql mysql_query(set names "utf8");3、php header("Content-Type: application/json;charsetUTF-8");json解码 $a你好; echo json_encode($a);加入 $aurldecode($a);即可解码

.NET Core 使用RSA算法 加密/解密/签名/验证签名

前言 前不久移植了支付宝官方的SDK&#xff0c;以适用ASP.NET Core使用支付宝支付&#xff0c;但是最近有好几位用户反应在Linux下使用会出错&#xff0c;调试发现是RSA加密的错误&#xff0c;下面具体讲一讲。 RSA在.NET Core的改动 以前我们使用RSA加密主要是使用RSACryptoSe…

ajax读取.txt文件出现乱码

其实挺简单一问题&#xff0c;刚开始以为页面没输入 <meta charset"UTF-8">结果还是乱码&#xff0c;后来想到老师讲过&#xff0c;新建文件时保存文件有utf8和ANSI等格式&#xff0c;一看果然不对&#xff0c;自己每次新建文件默认格式都是ANSI&#xff0c;这…

萨提亚领衔主题演讲,带领高管和MVP合影,预告Julia女神的演讲中将有我的.NET Core实践

微软Tech Summit 2017大会在精彩的暖场视频中劲爆开始&#xff0c;瞬间点燃参会者们的热情。予力全球每一人、每一组织&#xff0c;成就不凡&#xff0c;是微软的使命。 微软公司首席执行官萨提亚 ∙ 纳德拉发布了主题演讲&#xff0c;他表示&#xff1a;“稳定发展、持续创新…

ajax读取文件未及时更新

在ajax读取文件&#xff08;.txt,.json&#xff09;时&#xff0c;会发生更改文件&#xff0c;ajax读取的还是原来的文件&#xff0c;要想改变这个可以在读取文件的后缀在加个&#xff1f;tXXX 具体情况如下 这样由于t值在变化&#xff0c;浏览器就会认为是个变化的值&#x…

基于.NET CORE微服务框架 -浅析如何使用surging

1、前言 surging受到大家这么强烈的关注&#xff0c;我感到非常意外&#xff0c;比如有同僚在公司的分享会上分享surging, 还有在博客拿其它的RPC框架&#xff0c;微服务做对比等等&#xff0c;这些举动都让我感觉压力很大&#xff0c;毕竟作为个人的开源项目&#xff0c;无法与…

2019年这50个Kafka面试题,你知道答案么

转载自 2019年这50个Kafka面试题&#xff0c;你知道答案么 Apache Kafka对于新手的面试问题&#xff1a;41, 42, 43, 44, 45, 47, 49 Apache Kafka对于有经验的人的面试问题&#xff1a;46, 48 Apache Kafka的受欢迎程度很高&#xff0c;Kafka拥有充足的就业机会和职业前景…

使用Visual Studio Code 开发.NET Core应用程序

开源和跨平台开发是Microsoft 的当前和将来至关重要的策略。.NET Core已开源&#xff0c;同时开发了其他项来使用和支持新的跨平台策略。.NET Core2.0 目前已经发布&#xff0c;是适用于针对 Web 和云构建跨平台应用程序的最新开源技术&#xff0c;可在 Linux、Mac OS X 和Wind…

Julia女神告诉我任何一家企业本质上都是一家软件公司

微软技术大会今天进入高潮&#xff0c;潘正磊女神发表题为“开发者在数字化转型中的关键价值”的主题演讲&#xff0c;积极评价开发者在各行业数字化转型中扮演的关键角色&#xff1b; 女神潘正磊表示&#xff1a;“由技术创新引领的数字化转型给全球各行业带来了巨大的变革和机…

P3391-[模板]文艺平衡树【Splay】

正题 题目连接:https://www.luogu.org/problemnew/show/P3391 题目大意 一个序列&#xff0c;m个操作翻转[l..r][l..r][l..r]区间。求最终序列 解题思路 节点维护编号&#xff0c;然后答案就是中序遍历。然后翻转的话我们先考虑一个性质。 若这是初始状态(l-1和r1反了) 然后…

Hadoop入门(三)HDFS API

一、、HDFS 常用类 Configuration 配置 Path 路径 FileSystem 文件系统 Stream 流 IOUtils IO工具 API文档 二、类解析 &#xff08;1&#xff09;Configuration 配置文件加载顺序 设置/获取参数方法 &#xff08;2&#xff09;Path Path 常用方法 &#xff08;3&…

在XUnit中用Moq怎样模拟EntityFramework Core下的DbSet

最近在做一个项目的单元测试时&#xff0c;遇到了些问题&#xff0c;解决后&#xff0c;觉得有必要记下来&#xff0c;并分享给需要的人&#xff0c;先简单说一下项目技术框架背景&#xff1a; asp.net core 2.0(for .net core)框架 用Entity Framework Core作ORM XUnit作单元…

解决idea中xml文件报红问题

报错截图&#xff1a; 解决方法&#xff1a; 复制爆红的约束链接file >>> settings >>> Languages & Frameworks >>> Schemas and DTDs右边框中找到 Ignored schemas and DTD3:点击加号添加约束&#xff0c;如下图应用即可&#xff01;

Hadoop入门(四)HDFS编程

一、编程环境设置 编程使用到idea2018&#xff0c;maven &#xff08;1&#xff09;启动集群 在window上启动vmware软件的虚拟机hadoop01&#xff0c;hadoop02&#xff0c;hadoop03。 进入hadoop01虚拟机启动集群&#xff0c;执行命令 start-dfs.sh &#xff08;2&#x…

ASP.NET Core 认证与授权[4]:JwtBearer认证

Bearer认证 HTTP提供了一套标准的身份验证框架&#xff1a;服务器可以用来针对客户端的请求发送质询(challenge)&#xff0c;客户端根据质询提供身份验证凭证。质询与应答的工作流程如下&#xff1a;服务器端向客户端返回401&#xff08;Unauthorized&#xff0c;未授权&#x…

隧道裂缝检测_2【C++PCL】

作者:迅卓科技 简介:本人从事过多项点云项目,并且负责的项目均已得到好评! 公众号:迅卓科技,一个可以让您可以学习点云的好地方 1.前言 我们团队注重每一个细节,确保代码的可读性、可维护性和可扩展性达到最高标准。我们严格遵循行业最佳实践,采用模块化和面向对象的设…

开源纯C#工控网关+组态软件(五)从网关到人机界面

一、 引子 之前都在讲网关&#xff0c;不少网友关注如何实现界面。想了解下位机变量变化&#xff0c;是怎样一步步触发人机界面动画的。 这个步步触发&#xff0c;实质上是变量组&#xff08;Group&#xff09;的批量数据变化&#xff08;DataChange&#xff09;事件&#xf…

P1315,jzoj3029-观光公交【费用流】

前言 你绝对想不到&#xff0c;我用费用流神仙构图做了一道 的题 正题 评测记录:https://www.luogu.org/recordnew/lists?uid52918&pidP1315 题目大意 有nnn个地方&#xff0c;iii到第i1i1i1的长度为did_idi​。 有mmm个人&#xff0c;从tit_iti​出发&#xff0c;从l…

Spring依赖注入和控制反转

文章目录1、依赖注入1.1、依赖注入和控制反转的概念1.2、依赖注入的实现方式1.3、控制反转的具体实现1.4、依赖注入的具体实现1.5、依赖注入和控制反转总结1、依赖注入 1.1、依赖注入和控制反转的概念 依赖注入(Dependency Injection, 简称DI)与控制反转(IoC)的含义相同&…

Hadoop入门(五)IO操作

一、HadoopIO操作意义 Hadoop自带一套用于I/O的原子性的操作 &#xff08;不会被线程调度机制打断&#xff0c;一直到结束&#xff0c;中间不会有任何context switch&#xff09; 特点 基于保障海量数据集的完整性和压缩性 Hadoop提供了一些用于开发分布式系统的API&#xff…