Mybatis 知识点

news2024/9/22 21:33:14

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

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

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

相关文章

PyTorch深度学习实战(8)——批归一化

PyTorch深度学习实战&#xff08;8&#xff09;——批归一化 0. 前言1. 批归一化原理2. 批归一化优势3. 批归一化对模型训练的影响3.1 未使用批归一化&#xff0c;且输入值较小3.2 使用批归一化&#xff0c;且输入值较小3.3 使用批归一化&#xff0c;且输入值较大 小结系列链接…

Redis—环境搭建

Redis—环境搭建 &#x1f50e;Centos 安装 Redis5创建符号链接修改配置文件启动 Redis停止 Redis &#x1f50e;Centos 安装 Redis5 Centos8 安装 Redis5 yum install -y redisCentos7 安装 Redis5 Centos7 中 yum 源提供的 Redis 版本是 Redis3(有点老), 因此先安装 scl 源 …

算法综合篇专题二:滑动窗口

“在混沌想法中&#xff0c;最不可理喻念头。” 1、长度最小的子数组 (1) 题目解析 (2) 算法原理 class Solution { public:int minSubArrayLen(int target, vector<int>& nums) {int n nums.size();int sum 0;int len INT_MAX;for(int left0,r…

mysql进阶-用户的创建_修改_删除

1. 使用mysql单次查询 [rootVM-4-6-centos /]# mysql -h localhost -P 3306 -p mytest -e "select * from book1"; Enter password: ------------------------------------------- | id | category_id | book_name | num | ----------------------------…

数据结构 | 基本数据结构——队列

目录 一、何谓队列 二、队列抽象数据类型 三、用Python实现队列 四、模拟&#xff1a;传土豆 五、模拟&#xff1a;打印任务 5.1 主要模拟步骤 5.2 Python实现 一、何谓队列 队列是有序集合&#xff0c;添加操作发生在“尾部”&#xff0c;移除操作则发生在“头部”。新…

【Javascript】基础知识

文章目录 01 变量的声明02 数据类型字符串型boolean类型undefined null类型symbol类型超大整数 bigint数组类型普通对象 01 变量的声明 02 数据类型 复习: 声明 ​ 声明变量关键词 ​ let ​ const ​ 变量名 >变量命名规范 ​ 英文 数字 _ $不要以数字开头 ​ 见名知意 ​…

深度学习之tensorboard可视化工具

(1)什么是tensorboard tensorboard是TensorFlow 的一个可视化工具包&#xff0c;提供机器学习实验所需的可视化和工具&#xff0c;该工具的功能如下&#xff1a; 跟踪和可视化指标&#xff0c;例如损失和精度可视化模型图&#xff08;操作和层&#xff09;查看权重、偏差或其…

【Java多线程学习4】volatile关键字及其作用

说说对于volatile关键字的理解&#xff0c;及的作用 概述 1、我们知道要想线程安全&#xff0c;就需要保证三大特性&#xff1a;原子性&#xff0c;有序性&#xff0c;可见性。 2、被volatile关键字修饰的变量&#xff0c;可以保证其可见性和有序性&#xff0c;但是volatile…

uniApp 对接安卓平板刷卡器, 读取串口数据

背景: 设备: 鸿合 电子班牌 刷卡对接 WS-B22CS, 安卓11; 需求: 将刷卡器的数据传递到自己的App中, 作为上下岗信息使用, 以完成业务; 对接方式: 1. 厂家技术首先推荐使用 接收自定义广播的方式来获取, 参考代码如下 对应到uniApp 中的实现如下 <template><view c…

python数据可视化Matplotlib

1.绘制简单的折线图 # -*- coding: utf-8 -*- import matplotlib.pyplot as pltinput_values [1, 2, 3, 4, 5] squares [1, 4, 9, 16, 25] plt.style.use(seaborn) fig, ax plt.subplots() ax.plot(input_values, squares, linewidth3) # 线条粗细# 设置图表标题并给坐标…

2023年第四届“华数杯”数学建模思路 - 复盘:光照强度计算的优化模型

文章目录 0 赛题思路1 问题要求2 假设约定3 符号约定4 建立模型5 模型求解6 实现代码 0 赛题思路 &#xff08;赛题出来以后第一时间在CSDN分享&#xff09; https://blog.csdn.net/dc_sinor?typeblog 1 问题要求 现在已知一个教室长为15米&#xff0c;宽为12米&#xff0…

less的使用

less的介绍&#xff1a; less使用 1、 less使用的第一种用法&#xff0c;起变量名&#xff0c;变量名区分大小写&#xff1a; 这里我们定义一个粉色变量 我想使用直接把变量拿过来就行 2、vscode使用插件&#xff0c;直接将Css文件转换less文件&#xff1a; 3、第二种用法&…

8.泛型

目录 1 基本使用 2 多个泛型 3 泛型约束 3.1 数组 3.2 extends约束 3.3 用泛型约束泛型 4 泛型接口 5 ts中的数组用的就是泛型 6 泛型类 7 常用泛型工具类型 7.1 让所有属性变为可选属性 Partial 7.2 将所有属性都变为只读属性 Readonly 7.3 从指定类…

git-版本控制器

集中式版本控制工具&#xff08;不常用&#xff09; 版本库集中于中央服务器&#xff0c;team要联网才能工作&#xff08;下载代码&#xff09; SVN CVS 分布式版本控制工具 每个电脑上都有一个完整的版本库&#xff0c;工作时无需联网&#xff0c;可以把修改推送给其他人来…

ThreadLocal有内存泄漏问题吗

对于ThreadLocal的原理不了解或者连Java中的引用类型都不了解的可以看一下我的之前的一篇文章Java中的引用和ThreadLocal_鱼跃鹰飞的博客-CSDN博客 我这里也简单总结一下: 1. 每个Thread里都存储着一个成员变量&#xff0c;ThreadLocalMap 2. ThreadLocal本身不存储数据&…

python爬虫(四)_urllib2库的基本使用

本篇我们将开始学习如何进行网页抓取&#xff0c;更多内容请参考:python学习指南 urllib2库的基本使用 所谓网页抓取&#xff0c;就是把URL地址中指定的网络资源从网络流中读取出来&#xff0c;保存到本地。在Python中有很多库可以用来抓取网页&#xff0c;我们先学习urllib2。…

docker minio安装

1.介绍 Minio是一款开源的对象存储服务&#xff0c;它可以在任何硬件或云平台上提供高性能、高可用性和高安全性的存储解决方案。Minio最新版是2021年11月发布的RELEASE.2021-11-24T23-19-33Z&#xff0c;它带来了以下几个方面的改进和新特性&#xff1a; - 支持S3 Select AP…

Allegro选择暗显模式仍然无法实现暗显模式的解决办法

Allegro选择暗显模式仍然无法实现暗显模式的解决办法 用Allegro进行PCB设计的时候,时常需要使用到暗显模式,让视图中未被高亮的图形暗显下去,如下图 左边是未高亮的网络,右边是已高亮的 但是有时候因为一些原因,导致无法暗显,如下图 下面介绍如何解决这个问题,具体操作…

CSPM认证的价值?

最近 CSPM 证书很热门&#xff0c;含金量高&#xff0c;CSPM证书虽然发起的时间不长&#xff0c;但获取 CSPM 证书也是目前发展的一个趋势。如果打算在项目管理领域发展的强烈建议尽快获取 CSPM&#xff0c;提前为自己积攒一些资本。 一、什么是 CSPM证书&#xff1f;跟PMP是什…

Java-API简析_java.io.FileWriter类(基于 Latest JDK)(浅析源码)

【版权声明】未经博主同意&#xff0c;谢绝转载&#xff01;&#xff08;请尊重原创&#xff0c;博主保留追究权&#xff09; https://blog.csdn.net/m0_69908381/article/details/132038909 出自【进步*于辰的博客】 因为我发现目前&#xff0c;我对Java-API的学习意识比较薄弱…