入门MyBatis

文章目录

  • 入门MyBatis
    • MyBatis快速入门
        • 创建user表添加数据
        • 创建模块导入坐标
        • 编写Mybatis核心配置文件
        • 编写SQL映射文件
        • 编码
    • 使用idea编写sql代码
        • 链接数据库
        • 调出console控制台
    • Mapper代理开发
        • 定义与SQL映射文件同名的Mapper接口
        • 编码
    • MyBatis核心配置文件
    • 安装mybatisx插件
    • 配置文件完成增删改查
      • mybatis完成数据库的查询操作
        • 编写接口方法
        • 编写sql
        • 执行方法
        • 参数占位符
        • 多条件查询
          • 散装参数的多条件查询
          • 对象参数的多条件查询
        • 动态条件查询
        • 但条件动态查询
      • mybatis完成数据库的添加操作
        • 在数据库中插入记录行
        • 在数据库中插入记录行同时获取id
      • mybatis完成数据库的修改操作
        • 修改数据库中某一行的所有数据
        • 修改动态字段
      • mybatis完成数据库的删除操作
        • 删除一个
        • 批量删除

入门MyBatis

使用MyBatis框架的作用主要是简化JDBC

JDBC缺点

  1. 注册驱动,获取连接
  2. SQL语句
  3. 手动设置参数
  4. 手动封装结果集

MyBatis优点

  1. 将字符串信息写入配置文件
  2. 免除几乎所有的JDBC代码,以及获取参数和获取结果集的工作

MyBatis快速入门

  1. 创建user表添加数据
  2. 创建模块导入坐标
  3. 编写Mybatis核心配置文件 – 》替换连接信息 解决硬编码问题
  4. 编写SQL映射文件 --》 统一管理sql语句,解决硬编码问题
  5. 编码
    • 定义POJO类
    • 加载核心配置文件,获取SqlSessionFactory对象
    • 获取Session对象,执行SQL语句
    • 释放资源
创建user表添加数据
名称数据类型长度描述
idint10主键自增
usernamevarchar20
passwordvarchar20
gendervarchar1
addrvarchar30
创建模块导入坐标
<dependencies><!--Mybatis 依赖--><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.5.5</version></dependency><!--Mysql 驱动--><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.46</version></dependency><!--junit 单元测试--><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.13</version><scope>test</scope></dependency><!--添加slf4j 日志api--><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-api</artifactId><version>1.7.20</version></dependency><!--添加logback-classic依赖--><dependency><groupId>ch.qos.logback</groupId><artifactId>logback-classic</artifactId><version>1.2.3</version></dependency><!--添加logback-core依赖--><dependency><groupId>ch.qos.logback</groupId><artifactId>logback-core</artifactId><version>1.2.3</version></dependency>
</dependencies>
编写Mybatis核心配置文件
<?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><environments default="development"><environment id="development"><transactionManager type="JDBC"/><dataSource type="POOLED">
<!--                数据库的连接信息--><property name="driver" value="com.mysql.jdbc.Driver"/><property name="url" value="jdbc:mysql:///mybatis?useSSL=false"/><property name="username" value="root"/><property name="password" value="root"/></dataSource></environment></environments><mappers><!--        加载sql的映射文件--><mapper resource="UserMapper.xml"/></mappers>
</configuration>

注意:

数据库连接信息留下备用。

其中的sql映射文件因为和UserMapper.xml文件属于同一目录,所以可以直接引用。其中的文件数量视情况而定。

编写SQL映射文件
<?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 :名称空间id: sql语句的唯一标识resultType: 返回所要包装的类型
-->
<mapper namespace="test"><select id="selectAll" resultType="com.example.pojo.User">select * from tb_user;</select>
</mapper>
编码
  • 定义POJO类

创建pojo目录,创建实体类(.java文件)按照数据库定义所有的变量,定义所有getter和setter方法

  • 加载核心配置文件,获取SqlSessionFactory对象

  • 获取Session对象,执行SQL语句

  • 释放资源

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;import java.io.IOException;
import java.io.InputStream;
import java.util.List;import com.example.pojo.User;
/*** Mybatis 快速入门* */
public class MybatisDemo {public static void main(String[] args) throws IOException {// 1. 加载核心配置文件,获取SqlSessionFactory对象String resource = "mybatis-config.xml";InputStream inputStream = Resources.getResourceAsStream(resource);SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);// 2. 获取Session对象,执行SQL语句SqlSession sqlSession = sqlSessionFactory.openSession();// 3. 执行sqlList<User> users = sqlSession.selectList("test.selectAll");System.out.println(users);// 4. 释放资源sqlSession.close();}
}

最后把项目run起来,你的项目就可以运行了

使用idea编写sql代码

链接数据库

在这里插入图片描述
在这里插入图片描述

注意:我使用的MySQL版本是8.0.26

调出console控制台

在这里插入图片描述

现在我们就可以愉快地使用idea来写sql语法了

Mapper代理开发

  1. 定义与SQL映射文件同名的Mapper接口,并且将Mapper接口和SQL映射文件放置在统一目录下
  2. 设置SQL映射文件的namespace属性为Mapper接口全限定名
  3. 在Mapper接口中定义方法,方法名就是SQL映射文件中的sql语句中的id,并保持参数类型和返回值类型一致
  4. 编码
    • 通过SqlSession 的 getMapper方法获取Mapper接口的代理对象
    • 调用对应方法完成sql的执行
定义与SQL映射文件同名的Mapper接口

在这里插入图片描述

在这里插入图片描述

注意:这里创建目录的时候需要使用/作为分隔符,否则编译的时候创建文件会加上.

在这里插入图片描述

别忘了修改mybatis.config.xml文件

编码
package com.example;import com.example.mapper.UserMapper;
import com.example.pojo.User;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;import java.io.IOException;
import java.io.InputStream;
import java.util.List;/*** Mybatis 代理开发* */
public class MybatisDemo2 {public static void main(String[] args) throws IOException {// 1. 加载核心配置文件,获取SqlSessionFactory对象String resource = "mybatis-config.xml";InputStream inputStream = Resources.getResourceAsStream(resource);SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);// 2. 获取Session对象,执行SQL语句SqlSession sqlSession = sqlSessionFactory.openSession();// 3. 执行sql// List<User> users = sqlSession.selectList("test.selectAll");// 3.1 获取UserMapper接口的代理对象UserMapper userMapper = sqlSession.getMapper(UserMapper.class);List<User> users = userMapper.selectAll();System.out.println(users);// 4. 释放资源sqlSession.close();}}

在上面mybatis.config.xml文件中可以使用包扫描的方式来读入mapper接口文件

在这里插入图片描述

MyBatis核心配置文件

<?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><!--    配置别名--><typeAliases><package name="com.example.pojo"/></typeAliases><!--environment:配置数据库连接环境信息,可以配置多个,通过default属性切换不同的environment
--><environments default="development"><environment id="development"><transactionManager type="JDBC"/><dataSource type="POOLED">
<!--                数据库的连接信息--><property name="driver" value="com.mysql.jdbc.Driver"/><property name="url" value="jdbc:mysql:///mybatis?useSSL=false"/><property name="username" value="root"/><property name="password" value="root"/></dataSource></environment><environment id="test"><transactionManager type="JDBC"/><dataSource type="POOLED"><!--                数据库的连接信息--><property name="driver" value="com.mysql.jdbc.Driver"/><property name="url" value="jdbc:mysql:///mybatis?useSSL=false"/><property name="username" value="root"/><property name="password" value="root"/></dataSource></environment></environments><mappers>
<!--        加载sql的映射文件-->
<!--        <mapper resource="com/example/mapper/UserMapper.xml"/>-->
<!--        使用包扫描的方式 Mapper代理 可以获取所有的mapper接口--><package name="com.example.mapper"/></mappers>
</configuration>

安装mybatisx插件

mybatisx插件的优点:方便mybatis中的xml文件与java的mapper接口之间的跳转。

配置文件完成增删改查

mybatis完成数据库的查询操作

步骤:

  1. 编写接口方法
  2. 编写sql
  3. 执行方法
编写接口方法
public interface BrandMapper {/*** 查询所有* */public List<Brand> selectAll();
}
编写sql
<mapper namespace="com.example.mapper.BrandMapper"><select id="selectAll" resultType="brand">select *from tb_brand;</select>
</mapper>
执行方法
@Test
public void testSelectAll() throws IOException {// 1. 获取sqlSessionFactoryString resource = "mybatis-config.xml";InputStream inputStream = Resources.getResourceAsStream(resource);SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);// 2. 获取sqlSession对象SqlSession sqlSession = sqlSessionFactory.openSession();// 3. 获取mapper接口的代理对象BrandMapper brandMapper = sqlSession.getMapper(BrandMapper.class);// 4. 执行方法List<Brand> brands = brandMapper.selectAll();System.out.println(brands);// 5. 释放资源sqlSession.close();
}

注意:Springboot里面可以设置命名规则关系映射,可以有效映射出所有的下划线命名和驼峰命名

mybatis里面可以在xml文件中设置resultMap标签一个一个设置驼峰命名

参数占位符

参数占位符:

​ 1. #{} : 会将值替换为?,防止了SQL注入

​ 2. ${} : 拼sql,会存在SQL注入问题

​ 3. 使用时机:

​ * 参数传递的时候 : #{}
​ * 表名或者列名不固定的时候 : ${}

多条件查询
散装参数的多条件查询

brandMapper.xml

<select id="selectByCondition" resultMap="brandResultMap">select *from tb_brandwherestatus = #{status}and company_name like #{companyName}and brand_name like #{brandName}
</select>

BrandMapper.java

public interface BrandMapper {/*** 条件查询* 参数接收:*  1. 散装参数:需要使用@Param()。对象属性名称需要和参数占位符一致。*  2. 对象参数*  3. map集合的参数* */public List<Brand> selectByCondition(@Param("status") int status, @Param("companyName") String companyName, @Param("brandName") String brandName);
}

MybatisTest.java

@Testpublic void testSelectByCondition() throws IOException {// 接收参数int status = 1;String companyName = "华为";String brandName = "华为";// 处理参数companyName = "%" + companyName + "%";brandName = "%" + brandName + "%";// 1. 获取sqlSessionFactoryString resource = "mybatis-config.xml";InputStream inputStream = Resources.getResourceAsStream(resource);SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);// 2. 获取sqlSession对象SqlSession sqlSession = sqlSessionFactory.openSession();// 3. 获取mapper接口的代理对象BrandMapper brandMapper = sqlSession.getMapper(BrandMapper.class);// 4. 执行方法List<Brand> brands = brandMapper.selectByCondition(status,companyName,brandName);System.out.println(brands);// 5. 释放资源sqlSession.close();}
对象参数的多条件查询

BrandMapper.java

public interface BrandMapper {/*** 条件查询* 参数接收:*  1. 散装参数:需要使用@Param()*  2. 对象参数*  3. map集合的参数* */List<Brand> selectByCondition(Brand brand);
}

MybatisTest.java

@Testpublic void testSelectByCondition() throws IOException {// 接收参数int status = 1;String companyName = "华为";String brandName = "华为";// 处理参数companyName = "%" + companyName + "%";brandName = "%" + brandName + "%";// 封装对象Brand brand = new Brand();brand.setStatus(status);brand.setBrandName(brandName);brand.setCompanyName(companyName);// 1. 获取sqlSessionFactoryString resource = "mybatis-config.xml";InputStream inputStream = Resources.getResourceAsStream(resource);SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);// 2. 获取sqlSession对象SqlSession sqlSession = sqlSessionFactory.openSession();// 3. 获取mapper接口的代理对象BrandMapper brandMapper = sqlSession.getMapper(BrandMapper.class);// 4. 执行方法
//        List<Brand> brands = brandMapper.selectByCondition(status,companyName,brandName);List<Brand> brands = brandMapper.selectByCondition(brand);System.out.println(brands);// 5. 释放资源sqlSession.close();}
动态条件查询

情境:输入条件时,用户是否都会填写内容

<select id="selectByCondition" resultMap="brandResultMap">select *from tb_brandwhere<if test="status != null">status = #{status}</if><if test="companyName != null and companyName != ''">and company_name like #{companyName}</if><if test="brandName != null and brandName != ''">and brand_name like #{brandName}</if>
</select>

if标签:

​ test:逻辑表达式

​ 问题:如果第一个if判断没有值会出现where-and 语法错误

​ 解决1:在每一个if里面加上and,然后在where后面加上and

​ 解决2:where标签替换where关键字

<!--解决方案1-->
<select id="selectByCondition" resultMap="brandResultMap">select *from tb_brandwhere 1 = 1<if test="status != null">and status = #{status}</if><if test="companyName != null and companyName != ''">and company_name like #{companyName}</if><if test="brandName != null and brandName != ''">and brand_name like #{brandName}</if>
</select>
<!--解决方案1-->
<select id="selectByCondition" resultMap="brandResultMap">select *from tb_brand<where><if test="status != null">status = #{status}</if><if test="companyName != null and companyName != ''">and company_name like #{companyName}</if><if test="brandName != null and brandName != ''">and brand_name like #{brandName}</if></where>
</select>
但条件动态查询

BrandMapper.xml

<select id="selectByConditionSingle" resultMap="brandResultMap">select *from tb_brandwhere<choose><when test="status != null">status = #{status}</when><when test="companyName != null and companyName != ''">company_name like #{companyName}</when><when test="brandName != null and brandName != ''">brand_name like #{brandName}</when></choose>
</select>

BrandMapper.java

public interface BrandMapper {List<Brand> selectByCondition(Brand brand);// 单条件动态查询List<Brand> selectByConditionSingle(Brand brand);
}

MybatisTest.java

@Test
public void testSelectByConditionSingle() throws IOException {// 接收参数int status = 1;String companyName = "华为";String brandName = "华为";// 处理参数companyName = "%" + companyName + "%";brandName = "%" + brandName + "%";// 封装对象Brand brand = new Brand();brand.setStatus(status);
//        brand.setBrandName(brandName);
//        brand.setCompanyName(companyName);// 1. 获取sqlSessionFactoryString resource = "mybatis-config.xml";InputStream inputStream = Resources.getResourceAsStream(resource);SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);// 2. 获取sqlSession对象SqlSession sqlSession = sqlSessionFactory.openSession();// 3. 获取mapper接口的代理对象BrandMapper brandMapper = sqlSession.getMapper(BrandMapper.class);// 4. 执行方法
//        List<Brand> brands = brandMapper.selectByCondition(status,companyName,brandName);List<Brand> brands = brandMapper.selectByConditionSingle(brand);System.out.println(brands);// 5. 释放资源sqlSession.close();
}

mybatis完成数据库的添加操作

在数据库中插入记录行

BrandMapper.java

public interface BrandMapper {void add(Brand brand);
}

MybatisTest.java

@Test
public void testAdd() throws IOException {// 接收参数int status = 1;String companyName = "波导手机";String brandName = "波导";String description = "手机中的战斗机";int ordered = 100;// 封装对象Brand brand = new Brand();brand.setStatus(status);brand.setBrandName(brandName);brand.setCompanyName(companyName);brand.setDescription(description);brand.setOrdered(ordered);// 1. 获取sqlSessionFactoryString resource = "mybatis-config.xml";InputStream inputStream = Resources.getResourceAsStream(resource);SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);// 2. 获取sqlSession对象SqlSession sqlSession = sqlSessionFactory.openSession(true);// 3. 获取mapper接口的代理对象BrandMapper brandMapper = sqlSession.getMapper(BrandMapper.class);// 4. 执行方法brandMapper.add(brand);//        // 提交事物
//        sqlSession.commit();// 5. 释放资源sqlSession.close();
}

BrandMapper.xml

<insert id="add">insert into tb_brand(brand_name, company_name, ordered, description, status)values (#{brandName},#{companyName},#{ordered},#{description},#{status})
</insert>
在数据库中插入记录行同时获取id

在插入代码中进行修改

MybatisTest.java

Integer id = brand.getId();
System.out.println(id);

BrandMapper.xml

<insert id="add" useGeneratedKeys="true" keyProperty="id">insert into tb_brand(brand_name, company_name, ordered, description, status)values (#{brandName},#{companyName},#{ordered},#{description},#{status})
</insert>

mybatis完成数据库的修改操作

修改数据库中某一行的所有数据

BrandMapper.java

public interface BrandMapper {void update(Brand brand);
}

BrandMapper.xml

<update id="update">update tb_brandsetbrand_name = #{brandName},company_name = #{companyName},ordered = #{ordered},description = #{description},status = #{status}where id = #{id};
</update>

Mybatis.java

@Test
public void testUpdate() throws IOException {// 接收参数int status = 1;String companyName = "波导手机";String brandName = "波导";String description = "波导手机,手机中的战斗机";int ordered = 200;int id = 4;// 封装对象Brand brand = new Brand();brand.setStatus(status);brand.setBrandName(brandName);brand.setCompanyName(companyName);brand.setDescription(description);brand.setOrdered(ordered);brand.setId(id);// 1. 获取sqlSessionFactoryString resource = "mybatis-config.xml";InputStream inputStream = Resources.getResourceAsStream(resource);SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);// 2. 获取sqlSession对象SqlSession sqlSession = sqlSessionFactory.openSession(true);// 3. 获取mapper接口的代理对象BrandMapper brandMapper = sqlSession.getMapper(BrandMapper.class);// 4. 执行方法brandMapper.update(brand);//        // 提交事物
//        sqlSession.commit();// 5. 释放资源sqlSession.close();
}
修改动态字段

BrandMapper.xml

<update id="update">update tb_brand<set><if test="brandName != null and brandName != ''">brand_name = #{brandName},</if><if test="companyName != null and companyName != ''">company_name = #{companyName},</if><if test="ordered != null and ordered != ''">ordered = #{ordered},</if><if test="description != null and description != ''">description = #{description},</if><if test="status != null and status != ''">status = #{status}</if></set>where id = #{id};
</update>

mybatis完成数据库的删除操作

删除一个

BrandMapper.java

public interface BrandMapper {void deleteById(int id);
}

BrandMapper.xml

<delete id="deleteById">delete from tb_brand where id = #{id};
</delete>

Mybatis.java

@Test
public void testDeleteById() throws IOException {// 接收参数int id = 4;// 1. 获取sqlSessionFactoryString resource = "mybatis-config.xml";InputStream inputStream = Resources.getResourceAsStream(resource);SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);// 2. 获取sqlSession对象SqlSession sqlSession = sqlSessionFactory.openSession(true);// 3. 获取mapper接口的代理对象BrandMapper brandMapper = sqlSession.getMapper(BrandMapper.class);// 4. 执行方法brandMapper.deleteById(id);//        // 提交事物
//        sqlSession.commit();// 5. 释放资源sqlSession.close();
}
批量删除

BrandMapper.java

public interface BrandMapper {void deleteByIds(@Param("ids") int[] ids);
}

BrandMapper.xml

注意:动态删除的sql语句在mybatis的foreach标签中collection属性只能是array,除非在传参的时候用@Params注解修饰过

上面的方法中也可以不用@Param注解修饰

<delete id="deleteByIds">delete from tb_brand where idin (<foreach collection="ids" item="id" separator=",">#{id}</foreach>);
</delete>

Mybatis.java

@Test
public void testDeleteByIds() throws IOException {// 接收参数int ids [] = {1,2,3};// 1. 获取sqlSessionFactoryString resource = "mybatis-config.xml";InputStream inputStream = Resources.getResourceAsStream(resource);SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);// 2. 获取sqlSession对象SqlSession sqlSession = sqlSessionFactory.openSession(true);// 3. 获取mapper接口的代理对象BrandMapper brandMapper = sqlSession.getMapper(BrandMapper.class);// 4. 执行方法brandMapper.deleteByIds(ids);//        // 提交事物
//        sqlSession.commit();// 5. 释放资源sqlSession.close();
}

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

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

相关文章

9(10)-1(2)-CSS 布局模型+CSS 浮动

个人主页&#xff1a;学习前端的小z 个人专栏&#xff1a;HTML5和CSS3悦读 本专栏旨在分享记录每日学习的前端知识和学习笔记的归纳总结&#xff0c;欢迎大家在评论区交流讨论&#xff01; 文章目录 一、CSS 布局模型1 流动模型&#xff08;标准流&#xff09; 二、CSS 浮动1 浮…

HTTP详解及代码实现

HTTP详解及代码实现 HTTP超文本传输协议 URL简述状态码常见的状态码 请求方法请求报文响应报文HTTP常见的HeaderHTTP服务器代码 HTTP HTTP的也称为超文本传输协议。解释HTTP我们可以将其分为三个部分来解释&#xff1a;超文本&#xff0c;传输&#xff0c;协议。 超文本 加粗样…

k8s存储卷 PV与PVC 理论学习

介绍 存储的管理是一个与计算实例的管理完全不同的问题。PersistentVolume 子系统为用户和管理员提供了一组 API&#xff0c;将存储如何制备的细节从其如何被使用中抽象出来。为了实现这点&#xff0c;我们引入了两个新的 API 资源&#xff1a;PersistentVolume 和 Persistent…

Java集合——Map、Set和List总结

文章目录 一、Collection二、Map、Set、List的不同三、List1、ArrayList2、LinkedList 四、Map1、HashMap2、LinkedHashMap3、TreeMap 五、Set 一、Collection Collection 的常用方法 public boolean add(E e)&#xff1a;把给定的对象添加到当前集合中 。public void clear(…

用C/C++加Easyx实现俄罗斯方块游戏(爆肝4万字,完全免费)

前言 相信大家一定玩过俄罗斯方块这款小游戏&#xff0c;简单容易上手是老少皆宜的小游戏&#xff0c;今天大家就跟着我来实现这个小游戏吧&#xff01;让自己学的C语言有用武之地。 为了让俄罗斯方块的开发更为简单些&#xff0c;图像更为丰富&#xff0c;在这里就利用了Easyx…

LOOP循环

Oracle从入门到总裁:​​​​​​https://blog.csdn.net/weixin_67859959/article/details/135209645 循环语句和条件语句一样都可以控制程序的执行顺序&#xff0c;而循环语句是指一段程序可以重复执行&#xff0c;PL/SQL 语言主要支持 3 种类型的循环&#xff1a;LOOP 循环、…

最优乘车

题目描述 H 城是一个旅游胜地&#xff0c;每年都有成千上万的人前来观光。为方便游客&#xff0c;巴士公司在各个旅游景点及宾馆&#xff0c;饭店等地都设置了巴士站并开通了一些单程巴上线路。每条单程巴士线路从某个巴士站出发&#xff0c;依次途经若干个巴士站&#xff0c;…

42. 接雨水(Java)

目录 题目描述:输入&#xff1a;输出&#xff1a;代码实现&#xff1a; 题目描述: 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图&#xff0c;计算按此排列的柱子&#xff0c;下雨之后能接多少雨水。 输入&#xff1a; height [0,1,0,2,1,0,1,3,2,1,2,1]输出&#xff1…

JavaEE 初阶篇-生产者与消费者模型(线程通信)

&#x1f525;博客主页&#xff1a; 【小扳_-CSDN博客】 ❤感谢大家点赞&#x1f44d;收藏⭐评论✍ 文章目录 1.0 生产者与消费者模型概述 2.0 在生产者与消费者模型中涉及的关键概念 2.1 缓冲区 2.2 生产者 2.3 消费者 2.4 同步机制 2.5 线程间通信 3.0 实现生产者与消费者模…

【ArcGIS微课1000例】0107:ArcGIS加载在线历史影像服务WMTS

文章目录 一、WMTS历史影像介绍二、ArcGIS加载WMTS服务三、Globalmapper加载WMTS服务一、WMTS历史影像介绍 通过访问历史影响WMTS服务,可以将全球范围内历史影像加载进来,如下所示: WMTS服务: https://wayback.maptiles.arcgis.com/arcgis/rest/services/World_Imagery/WM…

二叉树中所有距离为k的节点

题目链接&#xff1a;. - 力扣&#xff08;LeetCode&#xff09; 思路&#xff1a; 从目标节点的左孩子&#xff0c;右孩子&#xff0c;父亲节点出发去找&#xff0c;左孩子 右孩子 做法简单 &#xff0c; 主要是父亲节点 &#xff0c;因此我们需要知道每个节点的父亲节点&am…

【学习笔记】Elsevier的Latex模板文件(附网址)

注&#xff1a;这是一篇没有技术含量的水文&#xff0c;主要是看有人下载下来&#xff0c;居然当成资源需要积分才能下载。我觉得不行&#xff0c;故提供原始下载地址供查阅使用。 链接: 上述图片所示网址&#xff1a;链接直达

Redis(性能管理、主从复制、哨兵模式)概述及部署

目录 一、性能管理 1、查看Redis内存使用 2、内存碎片率 3、跟踪内存碎片率 4、内存使用率 5、内回收key 二、Redis集群有三种模式 三、Redis主从复制 1、主从复制的概念 2、主从复制的作用 3、主从复制的流程 4、搭建Redis主从复制 1.环境准备 2.安装Redis&#…

并查集学习(836. 合并集合 + 837. 连通块中点的数量)

//得先加集合个数再合并&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01; 核心代码&#xff1a; int find(int x){//返回父节点if(x ! p[x]) {p[x] find(p[x]);//路径压缩 } //孩子不等于爸爸&#xff0c;就…

先进电气技术 —— “控制”与“估计”

一、背景 在当今科技日新月异的时代&#xff0c;先进电气技术正在全球范围内以前所未有的速度发展&#xff0c;尤其是在“控制”与“估计”两大核心技术领域的突破&#xff0c;对电力系统、工业自动化、智能电网、电动汽车等诸多领域产生了深远影响。本文将探讨这两项核心技术…

基于微信小程序的生活日用品交易平台 的设计与实现

一、项目背景介绍&#xff1a; 随着计算机互联网技术的不断进步&#xff0c;也推动了计算机技术的进步&#xff0c;推动了社会的智能化&#xff0c;使科技与人们的日常需求紧密的联系到了一起&#xff0c;诞生人们追求更加便利的生活模式。计算机技术是社会前进的主力军&#x…

面试题——JVM老年代空间担保机制(我的想法)

这里借用一下人家的图&#xff0c;来说一下我的想法&#xff0c;嘻嘻。。。。 原文链接&#xff1a;一道面试题&#xff1a;JVM老年代空间担保机制-CSDN博客? 嗯&#xff0c;我觉得老年代担保机制的主要作用就是避免频繁触发FULL GC&#xff0c;这其实也是因为年轻代Minor GC…

前端:注册页面(后端php实现)

效果 代码 Regist.php <!-- 内部员工注册 --> <?php require_once get_db_conn.php; $conn db_connect();?> <?php //设置变量的默认值 if (!isset($_POST[UserID])) {$_POST[UserID] ; } if (!isset($_POST[Password])) {$_POST[Password] ; } if (!i…

实战:Solaris系统下Oracle 12.2 在线扩容ASM磁盘组操作记录

这篇文章主要是为了记录一下操作&#xff0c;这个假期又要给这套RAC扩容磁盘。 我这套Solaris的小机我还不总操作这玩意&#xff0c;和LINUX有点小差别&#xff0c;整理记录一下&#xff0c;要不每次都是现翻。 存储端划LUN映射到主机 登录到3PAR存储控制台&#xff0c;创建…

数据生成 | Matlab实现基于DE差分进化算法的数据生成

数据生成 | Matlab实现基于DE差分进化算法的数据生成 目录 数据生成 | Matlab实现基于DE差分进化算法的数据生成生成效果基本描述模型描述程序设计参考资料 生成效果 基本描述 1.Matlab实现基于DE差分进化算法的数据生成&#xff0c;运行环境Matlab2021b及以上&#xff1b; 2.计…