1. MyBatis

1.1. 什么是MyBatis

  • MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。

1.2. MyBatis开发流程

  • 引入MyBatis依赖
  • 创建核心配置文件
  • 创建实体(Entity)类
  • 创建Mapper映射文件
  • 初始化SessionFactory
  • 利用SqlSession对象操作数据

1.3. MyBatis环境配置

1.4. Mapper XML 文件

MyBatis 的真正强大在于它的映射语句,也是它的魔力所在。由于它的异常强大,映射器的 XML 文件就显得相对简单。如果拿它跟具有相同功能的 JDBC 代码进行对比,你会立即发现省掉了将近 95% 的代
码。MyBatis 就是针对 SQL 构建的,并且比普通的方法做的更好。
SQL 映射文件有很少的几个顶级元素(按照它们应该被定义的顺序):

  • cache – 给定命名空间的缓存配置。
  • cache-ref – 其他命名空间缓存配置的引用。
  • resultMap – 是最复杂也是最强大的元素,用来描述如何从数据库结果集中来加载对象。
  • sql – 可被其他语句引用的可重用语句块。
  • insert – 映射插入语句
  • update – 映射更新语句
  • delete – 映射删除语句
  • select – 映射查询语句

1.5. 动态 SQL

MyBatis 的强大特性之一便是它的动态 SQL。如果你有使用 JDBC 或其他类似框架的经验,你就能体会到根据不同条件拼接 SQL 语句有多么痛苦。拼接的时候要确保不能忘了必要的空格,还要注意省掉列名列表最后的逗号。利用动态 SQL 这一特性可以彻底摆脱这种痛苦。
通常使用动态 SQL 不可能是独立的一部分,MyBatis 当然使用一种强大的动态 SQL 语言来改进这种情形,这种语言可以被用在任意的 SQL 映射语句中。
动态 SQL 元素和使用 JSTL 或其他类似基于 XML 的文本处理器相似。在 MyBatis 之前的版本中,有很多的元素需要来了解。MyBatis 3 大大提升了它们,现在用不到原先一半的元素就可以了。MyBatis 采用功
能强大的基于 OGNL 的表达式来消除其他元素。

  • if
  • choose (when, otherwise)
  • trim (where, set)
  • foreach

2. Druid

2.1. Druid是什么

Druid是 阿里巴巴开源的数据库连接池项目 。Druid能够提供强大的监控和扩展功能。

2.1.1. 连接池介绍

数据库连接池负责分配、管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个;释放空闲时间超过最大空闲时间的数据库连接来避免因为没有释放数据库连接而引起的数据库连接遗漏。通过数据库连接池能明显提高对数据库操作的性能。
连接池中提前预先建立了多个数据库连接对象,然后将连接对象保存到连接池中,当客户请求到来时,直接从池中取出一个连接对象为客户服务,当请求完成之后,客户程序调用close()方法,将连接对象放回池中。数据库连接池的意义在于,能够重复利用数据库连接(有点类似线程池的部分意义),提高对请求的响应时间和服务器的性能。

2.1.2. Druid数据源

druid为阿里巴巴的数据源,(数据库连接池),集合了c3p0、dbcp、proxool等连接池的优点,还加入了日志监控,有效的监控DB池连接和SQL的执行情况,相比spring推荐的DBCP和hibernate推荐的
C3P0、Proxool数据库连接池,Druid在市场上占有绝对的优势;

2.1.3. Druid功能

通过Druid连接池中间件, 我们可以实现:
1.可以监控数据库访问性能,Druid内置提供了一个功能强大的StatFilter插件,能够详细统计SQL的执行性能,这对于线上分析数据库访问性能有帮助。
2.替换传统的DBCP和C3P0连接池中间件。Druid提供了一个高效、功能强大、可扩展性好的数据库连接池。
3.数据库密码加密。直接把数据库密码写在配置文件中,容易导致安全问题。DruidDruiver和DruidDataSource都支持PasswordCallback。
4.SQL执行日志,Druid提供了不同的LogFilter,能够支持Common-Logging、Log4j和JdkLog,你可以按需要选择相应的LogFilter,监控你应用的数据库访问情况。
5.扩展JDBC,如果你要对JDBC层有编程的需求,可以通过Druid提供的Filter-Chain机制,很方便编写JDBC层的扩展插件。

2.2. Druid配置

正式版本下载
image.png
2.3. spring boot 整合druid

spring:
#DruidDataSource连接配置
datasource:

#连接数据库的url,不同数据库不一样
url: jdbc:sqlserver://194.0.19.247;DatabaseName=test_study;encrypt=false;
#连接数据库的用户名
username: test_study
#连接数据库的密码
password: 123456
#这一项可配可不配,如果不配置druid会根据url自动识别dbType,然后选择相应的

driverClassName

driverClassName: com.microsoft.sqlserver.jdbc.SQLServerDriver
#初始化时建立物理连接的个数
initialSize: 10
#最大连接池数量
maxActive: 20
#最小连接池数量
minIdle: 5
#获取连接时最大等待时间,单位毫秒
maxWait: 6000

#建议配置为true,不影响性能,并且保证安全性。申请连接的时候检测,如果空闲时间大于
timeBetweenEvictionRunsMillis,执行validationQuery检测连接是否有效。

testWhileIdle: true
#用来检测连接是否有效的sql,要求是一个查询语句,常用select 'x'。如果validationQuery为null,

testOnBorrow、testOnReturn、testWhileIdle都不会起作用。

validationQuery: select 1

3. PageHelper

3.1. PageHelper介绍

PageHelper是国内非常优秀的一款开源的mybatis分页插件, 它支持基本主流与常用的数据库, 例如
mysql、 oracle、 mariaDB、 DB2、 SQLite、 Hsqldb等
 
3.2. 添加依赖

image.png

4.问题聚合

4.1.MyBatis 中#{}和${}区别?

MyBatis 是一个 Java 的持久层框架,它用于将 SQL 查询和 Java 对象进行映射。在 MyBatis 中,#{} 和 ${} 是两种常用的参数替换方式,它们在处理参数时有所不同,主要区别如下:

#{}:这是预处理的方式。MyBatis 会将参数值进行预处理,这样可以防止 SQL 注入攻击。例如,如果你要查询用户名为 "user" 的用户,使用了 #{},MyBatis 会将参数值进行预处理,转换为如下的 SQL:WHERE username = 'user'。这样,即使 "user" 是从用户输入中获取的,也不会导致 SQL 注入攻击。
${}:这是直接的字符串替换。MyBatis会直接将参数值插入到SQL语句中。同样以查询用户名为例,如果使用了${},MyBatis 会将参数值直接替换到 SQL 中,如:WHERE username = 'user'。这种情况下,如果 "user" 是从用户输入中获取的,就可能会引起 SQL 注入攻击。
所以,一般来说,推荐使用 #{} 进行参数替换,因为它可以防止 SQL 注入攻击。但是,如果你要插入的参数是动态的列名或者表名(这在大多数情况下是不推荐的),那么你就需要使用 ${}。

4.2..MyBatis的优点和缺点?

MyBatis的优点主要包括:

  1. 简化开发:MyBatis简化了JDBC代码,开发者只需要关注SQL本身,而不需要花费大量时间在设置参数、处理结果集等重复性工作上。
  2. 灵活性强:MyBatis允许开发者直接编写原生态SQL,同时支持动态SQL,这使得MyBatis在处理复杂的数据库操作和复杂的业务逻辑时表现出色。
  3. 易于维护:MyBatis的映射文件和注解方式提供了清晰的SQL和结果集的对应关系,使得代码更易于理解和维护。
  4. 高效性能:MyBatis通过预编译SQL和缓存技术,提高了数据库操作的性能。

然而,MyBatis也存在一些缺点:

  1. 学习曲线陡峭:对于初学者来说,理解和掌握MyBatis可能需要一段时间。尤其是对于那些没有SQL和JDBC基础的人,学习MyBatis可能会更加困难。
  2. 侵入性强:使用MyBatis需要在项目中引入MyBatis的依赖,这可能会对项目的结构产生一定的影响。同时,如果项目需要更换数据库或者修改数据库结构,MyBatis的配置可能需要做出相应的调整。
  3. 不支持存储过程:虽然MyBatis允许开发者直接编写原生态SQL,但它并不支持存储过程,这可能会限制一些需要使用存储过程的功能。
  4. 异常处理不足:在处理数据库操作时,可能会遇到各种异常情况,而MyBatis在异常处理方面的设计可能不够完善,需要开发者自行处理或者自定义异常处理机制。

4.3.druid和其他数据库连接池的对比?

Druid是阿里巴巴开源平台上一个数据库连接池实现,它结合了C3P0、DBCP、PROXOOL等DB池的优点,同时加入了日志监控,可以很好的监控DB池连接和SQL的执行情况。相比其他数据库连接池,Druid具有以下特点和优势:

  1. 全面的监控特性:Druid提供了强大的监控功能,可以清晰地了解连接池和SQL的工作情况,包括SQL执行的耗时区间分布、监控连接池的物理连接创建和销毁次数等。
  2. 方便扩展:Druid提供了Filter-Chain模式的扩展API,可以自己编写Filter拦截JDBC中的任何方法,进行性能监控、SQL审计、用户名密码加密、日志等操作。
  3. 集合了开源和商业数据库连接池的优秀特性:Druid具有自动回收空闲连接的功能,并且有SQL拦截等功能和统计数据,具有良好的扩展性。
  4. 性能优越:Druid在并发较高的情况下表现优秀,具有出色的性能和稳定性。

其他数据库连接池如c3p0、DBCP、Tomcat JDBC等,也各具特点和优势。例如DBCP是一个稳定的数据库连接池,提供了可靠的数据库连接管理功能;Tomcat JDBC是一个开源的连接池,具有高效、稳定的特点。然而,相比之下,Druid在功能、性能和稳定性方面表现更为出色。

综上所述,Druid相比其他数据库连接池具有全面的监控特性、方便的扩展性、集合了开源和商业数据库连接池的优秀特性以及优越的性能和稳定性。因此,在选择数据库连接池时,可以考虑使用Druid。

4.4.如何设置为让连接池知道数据库已经断开了,并且自动测试连接查询?

为了确保连接池能够知道数据库连接是否已经断开,并能够自动测试连接的有效性,大多数现代的连接池都提供了相关的配置选项。以下是一些常见的设置和策略,你可以根据所使用的连接池进行调整:

  1. 设置连接验证查询(Validation Query)
    大多数连接池允许你配置一个SQL查询,该查询将用于验证从池中取出的连接是否仍然有效。通常,这是一个轻量级的查询,如SELECT 1。如果查询执行成功,则连接被认为是有效的;如果失败(例如,抛出异常),则连接将被视为无效,并从池中移除或重新建立。

    对于Druid连接池,你可以在配置中设置validationQuery属性:

    druid.validationQuery=SELECT 1
  2. 设置连接验证时机
    你需要确定何时进行连接验证。一些选项包括:

    • 每次借用连接时验证(Test On Borrow):在从池中获取连接时执行验证查询。这可以确保每次获取的连接都是有效的,但可能会对性能产生影响。
    • 每次归还连接时验证(Test On Return):在将连接归还给池时执行验证查询。这有助于保持池中连接的质量,但也可能增加额外的开销。
    • 定期验证空闲连接(Test While Idle):在连接空闲一段时间后执行验证查询。这有助于检测并移除长时间未使用的无效连接。

    对于Druid,你可以通过以下属性来设置验证时机:

    druid.testOnBorrow=true
    druid.testOnReturn=false
    druid.testWhileIdle=true
  3. 设置连接保持活动策略
    一些数据库和驱动提供了保持连接活动的机制,如MySQL的autoReconnect和PostgreSQL的keepalives。这些设置可以在数据库层面帮助维护连接,但通常需要与连接池设置协同工作。
  4. 配置空闲连接超时
    设置连接在池中的最大空闲时间。超过这个时间的连接将被关闭并从池中移除。这有助于清理不再需要的连接。

    在Druid中,你可以使用minEvictableIdleTimeMillis属性来设置:

    druid.minEvictableIdleTimeMillis=300000 # 5分钟
  5. 启用和配置连接泄漏检测
    如果担心连接泄漏(即连接在使用后未被正确关闭),可以启用连接泄漏检测功能。这将帮助识别和修复代码中的资源泄漏问题。

请注意,开启连接验证会增加数据库的负担,并可能对应用程序性能产生影响。因此,应该根据应用程序的具体需求和数据库的性能特点来合理配置这些选项。在生产环境中,建议进行性能测试以确定最佳的配置设置。

4.5.pagehelper的优点和缺点?

PageHelper是一款流行的分页插件,用于在Java Web开发中实现分页功能。它具有简单易用、高效性能和灵活配置等优点,但也存在一些缺点。

优点:

  1. 简单易用:PageHelper提供了简洁的API和丰富的配置选项,使得开发者能够轻松地实现分页功能。它支持多种数据库,包括MySQL、Oracle、SQL Server等,并且可以与MyBatis等ORM框架无缝集成。
  2. 高效性能:PageHelper采用了高效的分页算法,能够在短时间内处理大量数据。它还支持分布式分页,能够实现跨服务器的分页查询。
  3. 灵活配置:PageHelper提供了丰富的配置选项,如每页显示记录数、当前页码、排序方式等,使得开发者能够根据具体需求进行定制化配置。
  4. 支持多种数据库:PageHelper支持多种数据库,如MySQL、Oracle、SQL Server等,使得开发者能够根据项目需求选择合适的数据库。

缺点:

  1. 依赖性强:PageHelper需要依赖于MyBatis等ORM框架才能正常工作,对于不使用ORM框架的项目来说不太适用。
  2. 分页信息存储问题:PageHelper的分页信息(如当前页码、每页显示记录数等)通常存储在内存中,对于大数据量或者高并发访问场景可能会造成内存压力。
  3. SQL语句定制化不足:虽然PageHelper提供了丰富的配置选项,但在某些情况下,可能需要对SQL语句进行定制化处理以满足特殊需求,而PageHelper可能无法很好地满足这些需求。
  4. 不支持动态排序:PageHelper的分页查询是基于主键进行的,如果需要在分页查询中进行动态排序(即根据不同的排序字段返回不同的排序结果),则需要额外的处理。

总体来说,PageHelper是一款优秀的分页插件,适用于大多数的分页场景。但在使用过程中需要注意其缺点,并根据项目需求进行合理配置和处理。

4.6.Mybatis的适用场合?

MyBatis 适用于需要进行定制化 SQL、对 SQL 语句进行精细控制、需要高性能和扩展性、不需要十分复杂的对象关系映射(ORM)的应用场合。具体场合包括:

  1. 对于复杂的查询场景,需要灵活的 SQL 控制,MyBatis 可以自定义 SQL,并且与数据库的映射代码更简单明了。
  2. 业务流程相对单一,不需要多变的对象关系映射处理。
  3. 需要一个轻量级的数据访问框架,在保持简单、易用、灵活的同时,具备一定的性能保障。
  4. 项目对性能有极高要求的场合,MyBatis 在 SQL 映射的处理上具有优势,与 Hibernate 等 ORM 框架比较省时间,也很方便利用缓存功能对大数据量查询进行优化。
  5. 可以和 Spring Framework、Spring Boot等优秀框架进行快速集成。同时,搭配 JavaConfig 或 XML 文件配置方式都很方便,使用上多种方案可以自由搭配。
  6. 对于那些需要自己拼装 SQL 语句的项目,MyBatis 将 SQL 语句和 Java 代码尽量分离,使得开发者可以自由地拼装 SQL 语句,对于一些 SQL 语句比较复杂的项目,MyBatis 是一个不错的选择。

4.7.Mybatis有哪些动态的SQL?

MyBatis 提供了丰富的动态 SQL 功能,允许在映射的 SQL 语句中使用条件判断、循环、动态参数等,使得 SQL 语句更加灵活和可配置。以下是一些 MyBatis 中常用的动态 SQL 元素:

  1. <if>:用于条件判断,根据条件的结果决定是否包含某段 SQL 语句。

    <select id="findUsers" resultType="User">
      SELECT * FROM users
      WHERE 1=1
      <if test="name != null">
        AND name = #{name}
      </if>
      <if test="age != null">
        AND age = #{age}
      </if>
    </select>
  2. <choose>、<when>、<otherwise>:类似于 Java 中的 switch-case-default 结构,用于多个条件中选择一个执行。

    <select id="findUsersByRole" resultType="User">
      SELECT * FROM users
      WHERE 1=1
      <choose>
        <when test="role == 'admin'">
          AND admin_flag = 1
        </when>
        <when test="role == 'user'">
          AND user_flag = 1
        </when>
        <otherwise>
          AND guest_flag = 1
        </otherwise>
      </choose>
    </select>
  3. <trim>、<where>、<set>:用于处理 SQL 语句中的前缀、后缀以及多余的 AND/OR 等问题。

    • <where>:智能处理 WHERE 子句,如果条件为空则不会生成 WHERE 关键字,并且会自动去除首个 AND/OR。

      <select id="findUsersWithConditions" resultType="User">
        SELECT * FROM users
        <where>
          <if test="name != null">
            AND name = #{name}
          </if>
          <if test="age != null">
            AND age = #{age}
          </if>
        </where>
      </select>
    • <set>:智能处理 UPDATE 子句中的 SET 关键字,并且会自动去除末尾的逗号。

      <update id="updateUser" parameterType="User">
        UPDATE users
        <set>
          <if test="name != null">
            name = #{name},
          </if>
          <if test="age != null">
            age = #{age},
          </if>
        </set>
        WHERE id = #{id}
      </update>
    • <trim>:更通用的处理,可以自定义前缀、后缀和移除首个/最后一个特定字符。

      <trim prefix="WHERE" prefixOverrides="AND |OR ">
        ...
      </trim>
  4. <foreach>:用于遍历集合或数组,生成 SQL 中的 IN 子句或其他批量处理。

    <select id="findUsersInIds" resultType="User">
      SELECT * FROM users
      WHERE id IN
      <foreach item="id" index="index" collection="ids" open="(" separator="," close=")">
        #{id}
      </foreach>
    </select>
  5. <bind>:可以在 OGNL 表达式中创建一个变量,并将其绑定到上下文中,以便在后续的 SQL 语句中使用。

    <select id="findUsersLikeName" resultType="User">
      <bind name="pattern" value="'%' + _parameter + '%'" />
      SELECT * FROM users WHERE name LIKE #{pattern}
    </select>

在使用动态 SQL 时,MyBatis 会根据提供的参数和条件动态地生成 SQL 语句,从而实现了 SQL 语句的灵活性和可配置性。

4.8.什么是druid,它解决了什么问题?

Druid是一个非常优秀的数据库连接池。它是一个开源的数据库连接池,被广泛用于各种Java应用中,特别是在大数据和实时分析领域。

Druid的主要功能和优点包括:

  1. 提供了高性能的实时分析数据库:Druid是一个分布式的支持实时分析的数据存储系统,也被称为高性能实时分析数据库。它能够处理大规模数据,提供实时的数据分析功能。
  2. 实时数据注入:Druid支持流数据的注入,并且提供了数据的事件驱动,保证在实时和离线环境下事件的实效性和统一性。即便在加大数据规模的情况下,也能保证其时效性。
  3. 监控数据库访问性能:Druid内置了一个功能强大的StatFilter插件,能够详细统计SQL的执行性能,这对于线上分析数据库访问性能有帮助。
  4. 数据库密码加密:Druid可以直接把数据库密码写在配置文件中,这可能导致安全问题。Druid可以解决这个问题,通过数据库密码加密的方式保证安全性。
  5. 充当数据库连接池:Druid是一个JDBC组件,包括三个部分:基于Filter-Chain模式的插件体系、DruidDataSource(高效可管理的数据库连接池)和SQLParser。它可以作为一个数据库连接池使用,提供高效、功能强大、可扩展性好的数据库连接池服务。
  6. 强大的监控特性:Druid内置了一个功能强大的StatFilter插件可以监控数据库访问性能,可以清楚知道连接池和SQL的工作情况。
  7. 兼容性好:Druid提供了高效、功能强大、可扩展性好的数据库连接池。从DBCP迁移到Druid,只需要修改数据源的实现类就可以了。

总的来说,Druid主要解决了在大数据和实时分析领域的数据库连接、性能监控和安全问题。

4.9.为什么用 pagehelper 进行分页?

使用PageHelper进行分页的主要原因有以下几点:

  1. 简单易用:PageHelper提供了简洁的API和丰富的配置选项,使得开发者能够轻松地实现分页功能。它支持多种数据库,包括MySQL、Oracle、SQL Server等,并且可以与MyBatis等ORM框架无缝集成。
  2. 高效性能:PageHelper采用了高效的分页算法,能够在短时间内处理大量数据。它还支持分布式分页,能够实现跨服务器的分页查询。
  3. 灵活配置:PageHelper提供了丰富的配置选项,如每页显示记录数、当前页码、排序方式等,使得开发者能够根据具体需求进行定制化配置。
  4. 支持多种数据库:PageHelper支持多种数据库,如MySQL、Oracle、SQL Server等,使得开发者能够根据项目需求选择合适的数据库。
  5. 方便查看分页信息:在实际项目开发中,执行一个分页查询时,很多时候还需要知道该查询的其他信息,如总数、每页数量、当前页数、上一页或下一页等等。如果每次都自己写的话就太麻烦了,而PageHelper能够帮助我们更方便地获取这些信息,大大方便了开发者的开发效率。
  6. 不会互相影响:由于每次调用完成后会清空分页信息,所以多个查询分页不会互相影响。

综上所述,使用PageHelper进行分页可以带来诸多好处,包括简单易用、高效性能、灵活配置、支持多种数据库、方便查看分页信息和避免多个查询分页互相影响等。


波波鱼
4 声望3 粉丝

« 上一篇
SpringMVC配置
下一篇 »
SpringBoot项目