Mybatis 知识点

Mybatis 知识点

1.1 Mybatis 简介

1.1.1 什么是 Mybatis

  • Mybatis 是一款优秀的持久层框架
  • 支持定制化 SQL、存储过程及高级映射
  • Mybatis 几乎避免了所有的 JDBC 代码和手动设置参数以及获取结果集
  • MyBatis 可以使用简单的 XML 或注解来配置和映射原生类型、接口和 Java 的 POJO 为数据库中的记录

1.1.2 为什么需要 Mybatis

  • 更方便的将数据存入到数据库中
  • 传统的 JDBC 代码太复杂。简化,自动化
  • 减少了50%以上的代码量,比JDBC更简洁
  • Mybatis 的优点
    • 简单易学
    • 灵活
    • sql 和代码分离,提高了可维护性
    • 提供映射标签,支持对象与数据库的 orm 字段关系映射
    • 提供对象关系映射标签,支持对象关系组建维护
    • 提供 xml 标签,支持编写动态 sql

1.1.3 如何获取 Mybatis

maven 仓库获取

  • 可直接用以下代码引入自己的 maven 仓库中
<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
<dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis</artifactId>
    <version>3.5.13</version>
</dependency>

Github 获取源码

  • 下载地址:Releases · mybatis/mybatis-3 (github.com)

image-20230729164317294

中文文档

  • 可以帮助你更好的了解 Mybatis
  • 文档地址:mybatis – MyBatis 3 | 入门

1.2 第一个 Mybatis 程序

编写第一个 Mybatis 程序首先需要有一个具体步骤:

搭建环境–> 导入 Mybatis–>编写代码–>测试

1.2.1 搭建环境

  • 新建数据库,随便添加一张表,添加一些数据,便于测试

SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

-- ----------------------------
-- Table structure for user
-- ----------------------------
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user`  (
  `userId` int(11) NOT NULL AUTO_INCREMENT COMMENT '用户id',
  `userName` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '用户名称',
  `userAge` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '用户年龄',
  PRIMARY KEY (`userId`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 4 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;

-- ----------------------------
-- Records of user
-- ----------------------------
INSERT INTO `user` VALUES (1, '张三', '12');
INSERT INTO `user` VALUES (2, '李四', '15');
INSERT INTO `user` VALUES (3, '王五', '18');

SET FOREIGN_KEY_CHECKS = 1;

  • 创建一个 maven 项目
  • 导入三个 maven依赖
    • mysql驱动
    • mybatis
    • junit
    <dependencies>
        <!-- mybatis -->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.5.13</version>
        </dependency>
        <!-- mysql 驱动 -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.33</version>
        </dependency>
        <!-- junit -->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.13.2</version>
            <scope>test</scope>
        </dependency>

    </dependencies>

1.2.2 编写 mybatis 的核心配置文件

  • 在 resources 文件夹新建一个名为 mybatis-config.xml 的 xml 文件

image-20230730133540062

  • 将以下代码粘贴进核心配置文件
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
  PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
  "https://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
  <environments default="development">
    <environment id="development">
      <transactionManager type="JDBC"/>
      <dataSource type="POOLED">
        <property name="driver" value="${driver}"/>
        <property name="url" value="${url}"/>
        <property name="username" value="${username}"/>
        <property name="password" value="${password}"/>
      </dataSource>
    </environment>
  </environments>
  <mappers>
    <mapper resource="org/mybatis/example/BlogMapper.xml"/>
  </mappers>
</configuration>
  • 以上 property 标签中的 value 值,就是我们在 JDBC 中编写配置文件对应的
  • 例如 driver 代表驱动类的位置等等
  • 下面按照我自己的项目中的写法,示例
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "https://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.cj.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/mybatis?TRUE&amp;useUnicode=TRUE&amp;characterEncoding=UTF-8&amp;serverTimezone=GMT%2B8"/>
                <property name="username" value="root"/>
                <property name="password" value="root"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <mapper resource="org/mybatis/example/BlogMapper.xml"/>
    </mappers>
</configuration>

1.2.3 编写 Mybatis 工具类

每个 Mybatis 的应用都是一个以 SqlSessionFactory 的实例为核心的

SqlSessionFactory 可以通过 SqlSessionFactoryBuilder 来获取

**而 SqlSessionFactoryBuilder 可以从 XML 配置文件来构建出 SqlSessionFactory **

从 SqlSessionFactory 可以获取 SqlSession 实例

通过 SqlSession 可以直接执行已经映射的 SQL 语句

  • 创建一个 dao 包和 utils 工具包

image-20230730135435816

  • 在 utils 包下创建一个工具类 MybatisUtils

  • 编写 MybatisUtils 类,获取 SqlSessionFactory 实例

package com.qiaoer.utils;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import java.io.IOException;
import java.io.InputStream;

public class MybatisUtils {
    private static SqlSessionFactory sqlSessionFactory;
    static {
        //获取资源
        String resource = "mybatis-config.xml";
        InputStream inputStream = null;
        try {
            inputStream = Resources.getResourceAsStream(resource);
             sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }
}
  • String resource 的值是刚刚编写的 resource 文件夹下的 xml 文件路径

  • 通过已经获取的 SqlSessionFactory 实例,来获取 SqlSession 实例

  • 编写 getSqlSession() 方法,来获取 SqlSession 实例

package com.qiaoer.utils;

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;

public class MybatisUtils {
    private static SqlSessionFactory sqlSessionFactory;
    static {
        //获取资源
        String resource = "mybatis-config.xml";
        InputStream inputStream = null;
        try {
            inputStream = Resources.getResourceAsStream(resource);
             sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }
    //获取 SqlSession 实例
    public static SqlSession getSqlSession(){
        return sqlSessionFactory.openSession();
    }
}
  • 获取 SqlSession 实例后,可以使用 SqlSession 中的很多方法来对数据库进行操作

1.2.4 测试,编写代码

  • 编写实体类

image-20230730142538562

  • User 实体类代码
package com.qiaoer.entity;


public class User {

  private int userId;
  private String userName;
  private String userAge;

  public int getUserId() {
    return userId;
  }

  public void setUserId(int userId) {
    this.userId = userId;
  }

  public String getUserName() {
    return userName;
  }

  public void setUserName(String userName) {
    this.userName = userName;
  }

  public String getUserAge() {
    return userAge;
  }

  public void setUserAge(String userAge) {
    this.userAge = userAge;
  }

  public User() {
  }

  public User(int userId, String userName, String userAge) {
    this.userId = userId;
    this.userName = userName;
    this.userAge = userAge;
  }

  @Override
  public String toString() {
    return "User{" +
            "userId=" + userId +
            ", userName='" + userName + '\'' +
            ", userAge='" + userAge + '\'' +
            '}';
  }
}

  • 编写 dao 接口

image-20230730142731557

  • UserDao 接口代码
package com.qiaoer.dao;

import com.qiaoer.entity.User;

import java.util.List;

public interface UserDao {
    //获取所有用户
    List<User> getUsers();
}

  • 编写 dao 的接口实现类
  • 在 Mybatis 中,不需要在编写接口的实现类,只需要编写一个 xml 文档即可
  • 由原来的 UserDaoImpl 转换为一个 UserMapper.xml 文件
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.qiaoer.dao.UserDao">
<!-- SQL 语句查询-->
    <select id="selectBlog" resultType="com.qiaoer.entity.User">
        select * from user
    </select>
</mapper>
  • 其中 <mapper namespace="com.qiaoer.dao.UserDao"> 中的 namespace 的值对应的是要实现的接口类

  • <select id="selectBlog" resultType="com.qiaoer.entity.User">id 的值为对应的方法名

  • resultType属性表示返回一个结果

  • resultType 的值为返回值类型的返回类型对应的实体类

  • 编写完 UserMapper.xml 后,需要在 Mybatis 的核心配置文件 mybatis-config.xml 进行 Mapper 注册

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "https://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.cj.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/mybatis?TRUE&amp;useUnicode=TRUE&amp;characterEncoding=UTF-8&amp;serverTimezone=GMT%2B8"/>
                <property name="username" value="root"/>
                <property name="password" value="root"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <mapper resource="com/qiaoer/dao/UserMapper.xml"/>
    </mappers>
</configuration>
  • 这段代码中 <mappers> 则表现 Mapper 注册
  • 每一个 Mapper.xml 文件都需要进行注册
  • resource 属性的值就是对应的 Mapper.xml 文件路径
  • 但是这样也存在一定的 资源过滤问题,可能会导致你填写的 Mapper.xml 路径找不到
  • **因此需要在我们的 maven 中的 build 中配置 resources 来防止资源导出失败的问题 **
  • 将以下代码赋值到自己的 maven 中即可
<!--在build中配置resources,来防止我们资源导出失败的问题-->
    <build>
        <resources>
            <resource>
                <directory>src/main/resources</directory>
                <includes>
                    <include>**/*.properties</include>
                    <include>**/*.xml</include>
                </includes>
            </resource>
            <resource>
                <directory>src/main/java</directory>
                <includes>
                    <include>**/*.properties</include>
                    <include>**/*.xml</include>
                </includes>
                <filtering>true</filtering>
            </resource>
        </resources>
    </build>

image-20230730144321388

  • 测试代码
import com.qiaoer.dao.UserDao;
import com.qiaoer.entity.User;
import com.qiaoer.utils.MybatisUtils;
import org.apache.ibatis.session.SqlSession;
import java.util.List;

public class Test01 {
    public static void main(String[] args) {
        //第一步,获取 SqlSession 对象
        SqlSession sqlSession= MybatisUtils.getSqlSession();
        //方法一:通过 SqlSession 对象获取实现类
        System.out.println("=====方法1=====");
        UserDao mapper = sqlSession.getMapper(UserDao.class);
        List<User> users = mapper.getUsers();
        for (User user:users) {
            System.out.println(user);
        }
        //直接获取结果
        List<User> UserLists = sqlSession.selectList("com.qiaoer.dao.UserDao.getUsers");
        System.out.println("=====方法2=====");
        for (User user:UserLists) {
            System.out.println(user);
        }
        //关闭 SqlSession
        sqlSession.close();
    }
}

1.3 Mybatis 中 CRUD (增删改查)的标签介绍

在 Mybatis 中编写dao层的实现类的 Mapper.xml 文件中,对增删改查的标签进行介绍

1.3.1 select 标签

  • select 标签主要作用域 sql 语句的查询
  • select 标签语法
  <select id="对应方法" resultType="方法的返回值类型" parameterType="方法的参数类型">
        查询的 SQL 语句
    </select>
  • **id:**对应的 namespace 所对应的 dao 层接口类中的方法名
  • **resultType:**Sql 语句执行的返回值
  • **parameterType:**参数类型
  • 若 sql 语句中的条件需要参数来进行判读,则使用 #{参数名}
  • 示例如下,若需要通过方法传递过来的参数 id,来查询数据
<mapper namespace="com.qiaoer.dao.UserDao">
<!-- SQL 语句查询-->
    <select id="selectBlog" resultType="com.qiaoer.entity.User" parameterType="int">
        select * from user where userId=#{id}
    </select>
</mapper>

1.3.2 insert 标签

  • insert 标签主要作用域 sql 语句的增加数据
  • insert 标签语法
    <insert id="对应方法" parameterType="方法的参数类型">
        增加的 SQL 语句
    </insert>
  • 当我们的参数是一个对象时,在 #{} 当中直接写对象的属性名即可
  • 示例
<insert id="addUser" parameterType="com.qiaoer.entity.User">
    insert into user (userName, userAge) values (#{userName},#{userAge});
</insert>
  • 其中 #{userName},#{userAge} 两个均是 User 对象的属性名

  • ==注意:==当我们执行 SQL 语句的增删改时,都需要开启 SQL 的提交事务,否则并不会实际添加

  • 开启提交事务使用 SqlSession 中的 commit() 方法

  • 代码示例

import com.qiaoer.dao.UserDao;
import com.qiaoer.entity.User;
import com.qiaoer.utils.MybatisUtils;
import org.apache.ibatis.session.SqlSession;
import java.util.List;

public class Test01 {
    public static void main(String[] args) {
        //第一步,获取 SqlSession 对象
        SqlSession sqlSession= MybatisUtils.getSqlSession();
        UserDao mapper = sqlSession.getMapper(UserDao.class);
        //执行增加用户
        mapper.addUser(new User(-1,"你好","15"));
        //查询所有用户
        List<User> users = mapper.getUsers();
        for (User user : users) {
            System.out.println(user);
        }
        //提交事务
        sqlSession.commit();
        //关闭 SqlSession
        sqlSession.close();
    }
}

1.3.3 update 标签

  • update 标签主要作用域 sql 语句的修改数据
  • update 标签语法
    <insert id="对应方法" parameterType="方法的参数类型">
        修改的 SQL 语句
    </insert>
  • 它的参数设置与增加一样
  • 执行完毕也需要进行 SQL 的提交事务
  • Mapper.xml 示例
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.qiaoer.dao.UserDao">
    <update id="updateUser" parameterType="com.qiaoer.entity.User">
        update user set  userName=#{userName}  where userId=#{userId};
    </update>
</mapper>
  • 代码示例
import com.qiaoer.dao.UserDao;
import com.qiaoer.entity.User;
import com.qiaoer.utils.MybatisUtils;
import org.apache.ibatis.session.SqlSession;
import java.util.List;

public class Test01 {
    public static void main(String[] args) {
        //第一步,获取 SqlSession 对象
        SqlSession sqlSession= MybatisUtils.getSqlSession();
        UserDao mapper = sqlSession.getMapper(UserDao.class);
        //执行修改 id为1的用户
        mapper.updateUser(new User(1,"Qiaoer","15"));
        //查询所有用户
        List<User> users = mapper.getUsers();
        for (User user : users) {
            System.out.println(user);
        }
        //提交事务
        sqlSession.commit();
        //关闭 SqlSession
        sqlSession.close();
    }
}

1.3.3 delete 标签

  • delete标签主要作用域 sql 语句的修改数据
  • delete标签语法
    <delete id="对应方法" parameterType="方法的参数类型">
        删除的 SQL 语句
    </delete>
  • 增删改的操作基本一致

1.3.4 多参数传递 Map

  • 当我们的 sql 需要多个参数时,而这些参数并不只单单包含某个实体类,可以使用 Map 来传递参数
  • Map 传递参数,取值时直接使用 key 值来取出 value 值
  • 示例,在 dao 层接口类中,编写方法,通过用户年龄及用户姓名,查询用户
package com.qiaoer.dao;

import com.qiaoer.entity.User;

import java.util.List;
import java.util.Map;
import java.util.Objects;

public interface UserDao {
    //通过用户年龄,用户姓名,查询用户
    List<User> getUserByUserAgeAndUserName(Map<String, Object> map);
}

  • 在 Mapper.xml 中编写对应的生成实现类标签
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.qiaoer.dao.UserDao">
    <select id="getUserByUserAgeAndUserName" resultType="com.qiaoer.entity.User" parameterType="map">
        select * from user where userAge=#{userAge} and userName=#{userName}
    </select>
</mapper>
  • 其中 #{userAge}#{userName} 都属于 map 的 key 值
  • 编写测试类,调用方法
import com.qiaoer.dao.UserDao;
import com.qiaoer.entity.User;
import com.qiaoer.utils.MybatisUtils;
import org.apache.ibatis.session.SqlSession;

import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Objects;

public class Test01 {
    public static void main(String[] args) {
        //获取 SqlSession 对象
        SqlSession sqlSession=MybatisUtils.getSqlSession();
        //获取实现类
        UserDao userDao=sqlSession.getMapper(UserDao.class);
        //创建参数 map
        Map<String, Object> map=new HashMap<String, Object>();
        map.put("userAge",15);
        map.put("userName","Qiaoer");
        //调用查询方法
        List<User> userByUserAgeAndUserName = userDao.getUserByUserAgeAndUserName(map);
        //输出结果
        for (User user : userByUserAgeAndUserName) {
            System.out.println(user);
        }
        //提交事务
        sqlSession.commit();
        //关闭 SqlSession
        sqlSession.close();
    }
}

1.4 配置解析

1.4.1 核心配置文件

  • 核心配置文件一般官方命名为:mybatis-config.xml
  • MyBatis 的配置文件包含了会深深影响 MyBatis 行为的设置和属性信息
  • 核心配置文件的主要结构
  • configuration(配置)
    • properties(属性)
    • settings(设置)
    • typeAliases(类型别名)
    • typeHandlers(类型处理器)
    • objectFactory(对象工厂)
    • plugins(插件)
    • environments(环境配置)
      • environment(环境变量)
        • transactionManager(事务管理器)
        • dataSource(数据源)
    • databaseIdProvider(数据库厂商标识)
    • mappers(映射器)

1.4.2 environments(环境配置)

  • MyBatis 可以配置成适应多种环境
  • 但是一次只可以选择一种环境
  • 示例
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "https://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <environments default="test">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/mybatis?TRUE&amp;useUnicode=TRUE&amp;characterEncoding=UTF-8&amp;serverTimezone=GMT%2B8"/>
                <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.cj.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/mybatis?TRUE&amp;useUnicode=TRUE&amp;characterEncoding=UTF-8&amp;serverTimezone=GMT%2B8"/>
                <property name="username" value="root"/>
                <property name="password" value="root"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <mapper resource="com/qiaoer/dao/UserMapper.xml"/>
    </mappers>
</configuration>
  • 在上方的<environments></environments> 标签内,<environment></environment> 标签代表不同的环境

  • environment 标签的属性 id,则对应的是自己的环境名称

  • environments 标签的 属性 default,则表示用户要选择哪个环境,与environment 标签的属性 id 的值对应

  • 例如,上方示例中,我的 environments 标签的属性 default 的值为 test ,则代表我选择了 环境 <environment id="test">

  • <transactionManager/> 标签为事务管理器

    • 在 MyBatis 中有两种类型的事务管理器(也就是 type=“[JDBC|MANAGED]”)
    • 只需记住 MyBatis 的默认的事务管理器为 JDBC 即可
  • <dataSource></dataSource> 标签为数据源

    • 大多数 MyBatis 应用程序会按示例中的例子来配置数据源。虽然数据源配置是可选的,但如果要启用延迟加载特性,就必须配置数据源
    • 有三种内建的数据源类型(也就是 type=“[UNPOOLED|POOLED|JNDI]”)
    • MyBatis 的默认的数据源类型为 POOLED

1.4.3 属性(properties)

  • 可以通过 properties 标签来应用外部的配置文件
  • 这些属性可以在外部进行配置,并可以进行动态替换
  • 示例,编写一个 配置文件,放入 resources 资源文件下

image-20230801111729723

  • 在 核心配置文件中引入外部配置文件
  • 通过 <properties></properties> 标签引入
  • <properties></properties> 必须放在 <configuration></configuration> 标签内部的最顶部
  • 示例

image-20230801112105683

  • <properties></properties> 标签的 resource 属性则代表配置文件的路径
  • 因为引入了外部配置文件,所以在下方的 <dataSource> 标签中,可以使用配置文件中的键来调用
  • 设置好的属性可以在整个配置文件中用来替换需要动态配置的属性值,示例

image-20230801112428365

  • <properties></properties> 标签内也可以写入配置信息
  • 示例

image-20230801120620256

  • <properties></properties> 标签内的子元素和外部配置文件 之间的顺序存在一个优先级顺序
  • 如果两个都存在同样的键,那么会使用外部的配置文件当中的键对应的值
    I]")
    • MyBatis 的默认的数据源类型为 POOLED

1.4.3 属性(properties)

  • 可以通过 properties 标签来应用外部的配置文件
  • 这些属性可以在外部进行配置,并可以进行动态替换
  • 示例,编写一个 配置文件,放入 resources 资源文件下

[外链图片转存中…(img-q4RXm37z-1690863007343)]

  • 在 核心配置文件中引入外部配置文件
  • 通过 <properties></properties> 标签引入
  • <properties></properties> 必须放在 <configuration></configuration> 标签内部的最顶部
  • 示例

[外链图片转存中…(img-h8xqCyEL-1690863007343)]

  • <properties></properties> 标签的 resource 属性则代表配置文件的路径
  • 因为引入了外部配置文件,所以在下方的 <dataSource> 标签中,可以使用配置文件中的键来调用
  • 设置好的属性可以在整个配置文件中用来替换需要动态配置的属性值,示例

[外链图片转存中…(img-OrgPNL0u-1690863007343)]

  • <properties></properties> 标签内也可以写入配置信息
  • 示例

[外链图片转存中…(img-hqFB60K9-1690863007343)]

  • <properties></properties> 标签内的子元素和外部配置文件 之间的顺序存在一个优先级顺序
  • 如果两个都存在同样的键,那么会使用外部的配置文件当中的键对应的值

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

代码随想录算法训练营第三十二天 | 全是没接触过的知识点,要复习

以下题目多次复习 200 岛屿数量未看解答自己编写的青春版重点本题的解题思路&#xff0c;也是之前没有接触过的&#xff0c;四字总结&#xff1a;学会感染&#xff01; 题解的代码日后复习重新编写 32 最长有效括号未看解答自己编写的青春版重点这道题&#xff0c;动态规划的思…

小鹏遭遇“动荡”,自动驾驶副总裁吴新宙离职,现已完成团队过渡

根据最新消息&#xff0c;小鹏汽车的自动驾驶副总裁吴新宙宣布将加入全球GPU芯片巨头英伟达。吴新宙将成为该公司全球副总裁&#xff0c;直接向英伟达全球CEO黄仁勋汇报。小鹏汽车董事长何小鹏和吴新宙本人已在微博上确认该消息&#xff0c;并解释离职原因涉及家庭和多方面因素…

Spark提交流程

客户端通过脚本将任务提交到yarn执行&#xff0c;yarn启动APPMaster&#xff0c;APPMaster启动Driver线程&#xff0c;Driver负责初始化SparkContext并进行任务的切分和分配任务&#xff0c;交给Executor进行计算。

质数(判定质数 分解质因数 筛质数)

这里写目录标题 一、判定质数思路分析代码实现 二、分解质因数思路分析典型题目代码实现 三、质数筛经典题目思路分析1. 朴素筛法2. 埃氏筛法3. 欧拉筛法 一、判定质数 思路分析 由于每个合数的因子是成对出现的&#xff0c;即如果 d d d 是 n n n 的因子&#xff0c;那么 …

Qt实现引导界面UITour

介绍 最近做了一款键鼠自动化&#xff0c;想第一次安装打开后搞一个引导界面&#xff0c;找了好多资料没啥参考&#xff0c;偶然发现qt有引导界面如下图。 Qt整挺好&#xff0c;但是未找到源码&#xff0c;真的不想手撸&#xff0c;(源码找到了但是Qt整起来太复杂,没法拿来直接…

Python系统学习1-2

目录 一、硬件 二、软件&#xff1a;程序文档 三、基础知识 四、python执行过程 五、Pycharm使用技巧 一、硬件 计算机五大部件&#xff1a;运算器&#xff0c;存储器&#xff0c;控制器、输入设备&#xff0c;输出设备。 运算器和控制器 集成在CPU中。 存储&#xff1a…

Qt Creator 11 开放源码集成开发环境新增集成终端和 GitHub Copilot 支持

导读Qt 项目今天发布了 Qt Creator 11&#xff0c;这是一款开源、免费、跨平台 IDE&#xff08;集成开发环境&#xff09;软件的最新稳定版本&#xff0c;适用于 GNU/Linux、macOS 和 Windows 平台。 Qt Creator 11 的亮点包括支持标签、多外壳、颜色和字体的集成终端模拟器&am…

hcip——BGP实验

要求 1.搭建toop 2.地址规划 路由器AS接口地址R11 loop0:1.1.1.1 24 loop1 : 192.168.1.1 24 g0/0/0 12.0.0.1 24 R22 64512 g0/0/0: 12.0.0.2 24 g/0/01: 172.16.0.2 19 g0/0/2: 172.16.96.2 19 R32 64512g0/0/0: 172.16.0.3 19 g0/0/1:1…

在使用Python爬虫时遇到解析错误解决办法汇总

在进行Python爬虫任务时&#xff0c;遇到解析错误是常见的问题之一。解析错误可能是由于网页结构变化、编码问题、XPath选择器错误等原因导致的。为了帮助您解决这个问题&#xff0c;本文将提供一些实用的解决办法&#xff0c;并给出相关的代码示例&#xff0c;希望对您的爬虫任…

实现Feed流的三种模式:拉模式、推模式和推拉结合模式

在互联网产品中&#xff0c;Feed流是一种常见的功能&#xff0c;它可以帮助我们实时获取我们关注的用户的最新动态。Feed流的实现有多种模式&#xff0c;包括拉模式、推模式和推拉结合模式。在本文中&#xff0c;我们将详细介绍这三种模式&#xff0c;并通过Java代码示例来实现…

Centos7 安装man中文版手册

查找man中文安装包&#xff1a; yum search man-pages 安装man-pages-zh-CN.noarch: yum install -y man-pages-zh-CN.noarch

05|Oracle学习(UNIQUE约束)

1. UNIQUE约束介绍 也叫&#xff1a;唯一键约束&#xff0c;用于限定数据表中字段值的唯一性。 1.1 UNIQUE和primary key区别&#xff1a; 主键/联合主键每张表中只有一个。UNIQUE约束可以在一张表中&#xff0c;多个字段中存在。例如&#xff1a;学生的电话、身份证号都是…

091.粉刷房子

一、题目 剑指 Offer II 091. 粉刷房子 - 力扣&#xff08;LeetCode&#xff09; 二、代码 class Solution { public:int minCost(vector<vector<int>>& costs) {int row costs.size();int col costs[0].size();if (row 1)return min(min(costs[0][0], cos…

Mybatis ,Mybatis-plus列表多字段排序,包含sql以及warpper

根据 mybatis 根据多字段排序已经wrapper 根据多字段排序 首先根据咱们返回前端的数据列来规划好排序字段 如下&#xff1a; 这里的字段为返回VO的字段,要转换成数据库字段然后加入到排序中 示例&#xff0c;穿了 surname,cerRank 多字段,然后是倒序 false 首先创建好映射&am…

Python元编程-装饰器介绍、使用

目录 一、Python元编程装饰器介绍 二、装饰器使用 1. 实现认证和授权功能 2.实现缓存功能 3.实现日志输出功能 三、附录 1. logging.basicConfig介绍 2. 精确到毫秒&#xff0c;打印时间 方法一&#xff1a;使用datetime 方法二&#xff1a;使用time 一、Python元编程…

【Git】git reflog git log

前言 日常开发过程中&#xff0c;我们经常会遇到要进行版本回退的情况&#xff0c;这时候需要使用git reflog和git reset 命令 git reflog 常用命令&#xff1a; 1、git reflog -n 查看多少条 2、git reflog show origin 查看远程历史变动 git log 什么都不加默认显示当前分…

Python实现GA遗传算法优化循环神经网络回归模型(LSTM回归算法)项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档视频讲解&#xff09;&#xff0c;如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 遗传算法&#xff08;Genetic Algorithm&#xff0c;GA&#xff09;最早是由美国的 John holland于20世…

代码随想录算法训练营之JAVA|第十八天| 235. 二叉搜索树的最近公共祖先

今天是第 天刷leetcode&#xff0c;立个flag&#xff0c;打卡60天&#xff0c;如果做不到&#xff0c;完成一件评论区点赞最高的挑战。 算法挑战链接 235. 二叉搜索树的最近公共祖先https://leetcode.cn/problems/lowest-common-ancestor-of-a-binary-search-tree/descriptio…

springboot自定义错误消息

为了提供自定义错误消息提示&#xff0c;springboot在resources目录下&#xff0c;有一个文件ValidationMessages.properties 用于存储 验证错误的消息提示&#xff1a; 比如&#xff1a; 这样一个ValidationMessage.properties username.notempty用户名不能为空 username.len…

互联网宠物医院系统开发:数字化时代下宠物医疗的革新之路

随着人们对宠物关爱意识的提高&#xff0c;宠物医疗服务的需求也日益增加。传统的宠物医院存在排队等待、预约难、信息不透明等问题&#xff0c;给宠物主人带来了诸多不便。而互联网宠物医院系统的开发&#xff0c;则可以带来许多便利和好处。下面将介绍互联网宠物医院系统开发…