day07

1、数据库连接池原理

JavaWeb 数据库连接池是一种管理数据库连接的机制。它通过创建一组初始化的数据库连接,在需要时将连接分配给应用程序,并在使用后将其归还给连接池,以便重复使用。

数据库连接池的原理如下:

1. 初始化连接池:在应用程序启动时,创建一定数量的数据库连接,并将它们保存在连接池中。这些连接可以使用数据库驱动程序的特定API进行创建。

2. 连接分配:当应用程序需要与数据库交互时,从连接池中获取一个可用连接。

3. 连接使用:应用程序使用获取的连接执行数据库操作。

4. 连接归还:当应用程序使用完连接后,将其归还给连接池。归还连接时,可以通过关闭连接或重置连接的状态来确保连接处于可重用状态。

5. 连接池管理:连接池负责管理连接的状态和数量。它监控连接的使用情况,并根据需要创建新的连接或关闭闲置的连接。

数据库连接池的好处包括:

1. 提高性能:数据库连接的创建和关闭是一项昂贵的操作。使用连接池可以避免频繁的创建和关闭连接,提高数据库访问的性能。

2. 资源管理:连接池可以根据应用程序的需求和资源的可用性来管理连接数量,防止资源浪费。

3. 连接重用:连接池允许连接被重复使用,减少了连接的创建和关闭次数,提高了应用程序的响应速度。

总结起来,通过使用数据库连接池,JavaWeb 应用程序可以更高效地管理数据库连接,提高应用程序的性能和可扩展性。
当应用程序需要与数据库进行交互时,通常需要创建一个数据库连接来执行相关的操作。然而,频繁地创建和关闭连接会给数据库服务器带来不必要的开销和性能问题。为了解决这个问题,引入了数据库连接池,其原理如下:

1. 连接初始化:在应用程序启动时,连接池会初始化一定数量的数据库连接,这些连接处于可用状态并保存在连接池中。

2. 连接获取:当应用程序需要数据库连接时,它可以从连接池中获取一个可用的连接。连接池会管理这些连接的状态,标记哪些连接是可用的,哪些连接正在被使用。

3. 连接复用:应用程序使用连接执行数据库操作,包括查询、插入、更新等。当操作完成后,应用程序会将连接返回给连接池,而不是直接关闭连接。这样做的好处是,这些连接可以被其他需要连接的应用程序复用,而不必重新创建连接。

4. 连接回收:连接池会监控连接的使用情况。如果连接长时间未被使用(闲置状态),连接池会将其关闭以节省资源。同时,连接池还可以根据需要动态地创建新的连接,以满足应用程序对连接的需求。

5. 资源管理:连接池还负责管理连接的数量和使用情况。它可以限制连接的最大数量,并根据需求动态调整连接池的大小,以充分利用系统资源。

通过使用数据库连接池,可以减少创建和关闭连接的开销,提高数据库访问的效率和性能。连接池可以更好地管理连接资源,避免连接的过度创建和销毁,同时提供连接的复用和动态调整,适应不同应用的需求。这样,应用程序可以更高效地与数据库进行交互,提升整体系统的性能和可伸缩性。

2、LambdaQueryWrapper表达式
LambdaQueryWrapper 是 MyBatis-Plus 框架提供的一个查询条件封装类,用于构建 SQL 查询条件。
它可以通过 Lambda 表达式来定义查询条件,提供了一种更简洁、易读的方式来编写数据库查询。
使用 LambdaQueryWrapper 需要以下步骤:

  • 导入相关的包:
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
  • 创建 LambdaQueryWrapper 对象:
LambdaQueryWrapper<DishFlavor> queryWrapper=new LambdaQueryWrapper<>();
  • 添加查询条件:
queryWrapper.eq(Entity::getField, value); // 相等条件
queryWrapper.ne(Entity::getField, value); // 不等条件
queryWrapper.like(Entity::getField, value); // 模糊查询条件
queryWrapper.in(Entity::getField, values); // in 条件
queryWrapper.between(Entity::getField, start, end); // 范围条件
// 和更多...

// 可以使用多个条件组合
queryWrapper.eq(Entity::getField1, value1)
            .like(Entity::getField2, value2);
  • 执行查询:
List<Entity> result = entityMapper.selectList(queryWrapper);

LambdaQueryWrapper 提供了丰富的方法来定义查询条件,包括等于(eq)、不等于(ne)、大于(gt)、小于(lt)、大于等于(ge)、小于等于(le)、模糊查询(like)、in 条件(in)、between 条件(between)等。 可以根据具体的业务需求选择合适的方法来构建查询条件.
此外,LambdaQueryWrapper 还支持链式调用,可以根据实际需要添加多个查询条件。在构建完查询条件后,可以将 LambdaQueryWrapper 对象传递给 MyBatis-Plus 的 selectList、selectOne 等方法来执行数据库查询操作。
通过使用 LambdaQueryWrapper,可以更加方便地构建复杂的查询条件,并降低了手动编写 SQL 的复杂性,提高了开发效率。

3、双冒号用法
在 Java 中,双冒号 “::” 是一种引用方法的方式,用于简化代码和提高代码的可读性。它主要用于以下几个方面:

  • 方法引用:
    可以使用双冒号来引用现有的方法。语法如下:
ClassName::methodName

其中,ClassName 是包含要引用的方法的类名,methodName 是要引用的方法名。通过双冒号引用方法,可以将方法作为值传递,以便在其他地方使用该方法。
例如,假设有一个名为 StringUtils 的实用类,其中包含一个静态方法 isNullOrEmpty:

public static boolean isNullOrEmpty(String str) {
    return str == null || str.isEmpty();
}

可以使用双冒号引用该方法:

Predicate<String> predicate = StringUtils::isNullOrEmpty;

在这个例子中,Predicate 是一个函数式接口,用于测试给定的字符串是否为空或 null。使用双冒号将 StringUtils 的 isNullOrEmpty 方法绑定到 predicate,可以将其作为值传递给其他方法或函数。

  • 构造方法引用:
    双冒号也可以用于引用构造方法。语法如下:
ClassName::new

其中,ClassName 是要引用构造方法的类名。通过双冒号引用构造方法,可以创建对象的引用,而不必直接调用构造方法。

例如,假设有一个名为 Person 的类,它有一个带有 name 参数的构造方法:

public class Person {
    private String name;

    public Person(String name) {
        this.name = name;
    }

    // getter and setter
}

在这个例子中,Function<String, Person> 是一个函数式接口,它接受一个字符串参数并返回一个 Person 对象。使用双冒号将 Person 的构造方法绑定到 creator,可以将其作为值传递给其他方法或函数,并在需要时创建 Person 对象。

  • 数组引用
    双冒号还可以用于引用数组的方法。语法如下:
TypeName[]::new

其中,TypeName 是数组的元素类型。通过双冒号引用数组的方法,可以创建指定大小的数组。

例如,要创建一个长度为 10 的整数数组,可以使用双冒号引用数组的方法:

IntFunction<int[]> arrayCreator = int[]::new;
int[] array = arrayCreator.apply(10);

在这个例子中,IntFunction<int[]> 是一个函数式接口,它接受一个整数参数并返回一个整数数组。使用双冒号将 int 类型的数组的构造方法绑定到 arrayCreator,可以在需要时创建指定大小的整数数组。

总的来说,双冒号是一种简化 Java 代码的语法,用于引用方法、构造方法或数组的方法。它可以提高代码的可读性和可维护性,并促进函数式编程思想在 Java 中的应用。

4、Mapper映射文件存放的两种位置

  • 1.将Mapper接口和Mapper映射文件存放到 src/main/java 同一目录下,还需要在pom.xml文件中手动指定资源文件夹路径resources
        <resources>
            <resource>
                <directory>src/main/java</directory>
                <includes>
                    <include>**/*.xml</include>
                </includes>
            </resource>
        </resources>

2.将Mapper 接口和Mapper映射文件分开存放

  • Mapper接口类存放到src/main/java目录下
  • Mapper映射文件存放到resources(类路径)
  • 需要在springboot核心配置文件中指定mapper映射文件存放的位置
mybatis.mapper-locations=classpath:mapper/*.xml

5、左连接、右连接、全连接