首页 > 数据库 >MyBatis面试题--(与数据库连接的相关知识)

MyBatis面试题--(与数据库连接的相关知识)

时间:2024-11-15 20:07:51浏览次数:1  
标签:Mapper 面试题 分页 -- 使用 接口 SQL MyBatis

目录

在MyBatis中,Mapper接口的作用是什么?

在MyBatis中,Mapper接口是一种重要的组件,它定义了数据库操作的方法,这些方法与SQL语句相对应。Mapper接口的作用主要包括以下几点:

  1. 定义数据库操作的方法
    Mapper接口中定义的方法代表了对数据库的某种操作,例如查询、插入、更新或删除。每个方法通常对应一个SQL语句。

  2. 解耦SQL语句和Java代码
    通过将SQL语句放在XML映射文件中或使用注解的方式与Mapper接口中的方法关联,MyBatis允许开发者将SQL语句与Java代码分离,从而提高了代码的可维护性和可读性。

  3. 提供清晰的操作定义
    Mapper接口为数据库操作提供了一个清晰和直观的定义,使得其他开发者可以容易地理解和使用这些操作。

  4. 支持动态SQL
    MyBatis支持在Mapper接口中使用动态SQL特性,如<if><choose><when><otherwise>等,这使得构建复杂的查询变得更加灵活。

  5. 简化事务管理
    在Spring框架中,Mapper接口的方法可以与Spring的事务管理集成,简化了事务的配置和管理。

  6. 提高代码重用性
    通过定义通用的数据库操作方法,Mapper接口可以被多个地方重用,减少了代码的重复。

  7. 便于单元测试
    Mapper接口的方法可以被单独测试,这有助于实现单元测试的自动化和持续集成。

  8. 支持映射配置
    Mapper接口的方法可以配置复杂的结果映射,将数据库查询结果映射到Java对象或对象集合。

  9. 与MyBatis框架集成
    Mapper接口与MyBatis框架紧密集成,使得开发者可以利用MyBatis提供的各种特性,如缓存、插件等。

  10. 提高开发效率
    使用Mapper接口可以减少样板代码,让开发者专注于业务逻辑的实现,从而提高开发效率。

总的来说,Mapper接口是MyBatis框架中定义数据库操作的关键部分,它为数据库交互提供了一个简洁、灵活且强大的抽象层。

当实体类中属性名和表中的字段名不一样,怎么办?

当实体类中的属性名和数据库表中的字段名不同时,您可以使用MyBatis的映射功能来解决这个问题。MyBatis提供了以下几种方式来处理属性名和字段名不一致的情况:

1. 使用@Result注解

在MyBatis的映射文件中,您可以使用@Result注解来指定结果映射,将数据库字段映射到实体类的属性上。

public interface BlogMapper {
    @Select("SELECT id AS blogId, title AS blogTitle, content AS blogContent FROM blogs")
    @Results({
        @Result(property = "blogId", column = "id"),
        @Result(property = "blogTitle", column = "title"),
        @Result(property = "blogContent", column = "content")
    })
    List<Blog> selectBlogs();
}

2. 使用resultMap元素

在MyBatis的XML映射文件中,您可以定义一个resultMap,并在查询语句中引用它。

<resultMap id="BlogResultMap" type="Blog">
    <result property="blogId" column="id" />
    <result property="blogTitle" column="title" />
    <result property="blogContent" column="content" />
</resultMap>

<select id="selectBlogs" resultMap="BlogResultMap">
    SELECT id, title, content FROM blogs
</select>

3. 使用@Results注解(MyBatis 3.4.1+)

MyBatis 3.4.1及更高版本支持在Mapper接口的方法上使用@Results注解。

public interface BlogMapper {
    @Select("SELECT id, title, content FROM blogs")
    @Results({
        @Result(property = "blogId", column = "id"),
        @Result(property = "blogTitle", column = "title"),
        @Result(property = "blogContent", column = "content")
    })
    List<Blog> selectBlogs();
}

4. 使用mapUnderscoreToCamelCase属性

在MyBatis配置文件中,您可以设置mapUnderscoreToCamelCase属性为true,这样MyBatis会自动将下划线命名的数据库字段映射到驼峰命名的Java属性。

<configuration>
    <settings>
        <setting name="mapUnderscoreToCamelCase" value="true"/>
    </settings>
</configuration>

请注意,这种方法只适用于简单的映射,如果字段名和属性名的映射不是简单的下划线到驼峰的转换,您仍然需要使用@ResultresultMap来指定映射。

通过以上方法,您可以灵活地处理实体类属性名和数据库字段名不一致的问题,确保MyBatis能够正确地将数据库查询结果映射到Java对象。

在MyBatis中如何实现分页功能?

在MyBatis中实现分页功能通常有以下几种方法:

1. 使用MyBatis分页插件

MyBatis 分页插件,如 PageHelper,是一种流行的选择,它可以简化分页逻辑的处理。以下是如何使用 PageHelper 实现分页的步骤:

  1. 添加依赖:在项目的pom.xml文件中添加 PageHelper 依赖。
<dependency>
    <groupId>com.github.pagehelper</groupId>
    <artifactId>pagehelper-spring-boot-starter</artifactId>
    <version>最新版本</version>
</dependency>
  1. 配置分页插件:在 Spring Boot 的配置文件中配置 PageHelper。
# application.yml
pagehelper:
  helperDialect: mysql
  reasonable: true
  supportMethodsArguments: true
  params: count=countSql
  1. 使用分页插件:在 Mapper 接口的方法中直接使用 PageHelper。
public interface UserMapper extends MyBatisPlusMapper<User> {
    // 其他 CRUD 方法
}

@Service
public class UserService {

    @Autowired
    private UserMapper userMapper;

    public IPage<User> selectPageVo(Page page, @Param("name") String name) {
        PageHelper.startPage(page.getPageNum(), page.getPageSize());
        return userMapper.selectPage(new QueryWrapper<User>().eq("name", name));
    }
}

2. 手动编写分页 SQL

如果您不想使用分页插件,可以手动在 MyBatis 的 Mapper XML 文件中编写分页 SQL。

<select id="selectPagedBlogs" resultType="Blog">
    SELECT * FROM blogs
    LIMIT #{offset}, #{pageSize}
</select>

在这种情况下,您需要在服务层传递offset(偏移量)和pageSize(页面大小)参数,并计算分页参数。

3. 使用 MyBatis 的拦截器

您可以创建一个 MyBatis 拦截器,在拦截器中修改 SQL 语句以添加分页逻辑。

@Intercepts({
    @Signature(type = StatementHandler.class, method = "prepare", args = {Connection.class, Integer.class})
})
public class PaginationInterceptor implements Interceptor {
    // 实现拦截器逻辑,修改 SQL 以添加分页
}

4. 使用 MyBatis 分页注解

MyBatis 提供了@Select注解,您可以在 Mapper 接口中直接使用注解编写分页 SQL。

public interface BlogMapper {
    @Select("SELECT * FROM blogs LIMIT #{offset}, #{pageSize}")
    List<Blog> selectPagedBlogs(@Param("offset") int offset, @Param("pageSize") int pageSize);
}

注意事项

  • 分页插件通常是实现分页的最简单方法,特别是对于复杂的查询。
  • 手动编写分页 SQL 给您更多的控制权,但可能会更复杂,尤其是在处理复杂查询时。
  • 使用拦截器可以实现更通用的分页逻辑,但实现起来较为复杂。
  • 分页注解提供了一种简便的方法,但在复杂的分页逻辑中可能不够灵活。

根据您的具体需求和项目情况,您可以选择最适合您项目的方法来实现分页功能。

MyBatis#()和$()有什么区别?

在MyBatis中,#{}$()是用于在SQL语句中嵌入参数的两种不同方式,它们的主要区别在于处理方式和用途:

#{}(预处理参数)

  1. 预处理语句(Prepared Statements)#{}在MyBatis中用于参数占位符,它会被转换成预处理语句中的参数。这意味着参数是在SQL语句执行之前就被传递给数据库的,这有助于防止SQL注入攻击。

  2. 自动转义:使用#{}时,MyBatis会自动对参数值进行转义,以防止SQL注入。

  3. 安全性#{}是推荐的方式,因为它更安全,可以防止SQL注入。

  4. 示例

    <select id="selectBlog" resultType="Blog">
        SELECT * FROM Blog WHERE id = #{id}
    </select>
    

$()(字符串替换)

  1. 字符串替换$()在MyBatis中用于直接替换,它会将参数值直接拼接到SQL语句中。这种方式不会使用预处理语句。

  2. 无转义:使用$()时,参数值不会被自动转义,这可能会导致SQL注入的风险。

  3. 不安全性$()通常不推荐使用,因为它可能会导致SQL注入问题。

  4. 用途$()有时用于那些需要动态表名、列名或动态SQL片段的场景,但这些场景也应该尽量避免使用$(),转而使用其他更安全的方法,如MyBatis的动态SQL功能。

  5. 示例

    <select id="selectBlog" resultType="Blog">
        SELECT * FROM ${tableName} WHERE id = ${id}
    </select>
    

最佳实践

  • 安全性:总是使用#{}来传递SQL参数,以确保安全性。
  • 动态SQL:对于需要动态构建的SQL语句,使用MyBatis提供的动态SQL功能,如<if><choose><when><otherwise>等,而不是使用$()
  • 避免$():尽量避免使用$(),特别是在涉及用户输入的场景中,以防止SQL注入攻击。

总结来说,#{}是安全的参数传递方式,而$()是字符串替换方式,但在实际开发中,应尽量避免使用$(),以确保应用程序的安全性。

标签:Mapper,面试题,分页,--,使用,接口,SQL,MyBatis
From: https://www.cnblogs.com/yangcurry/p/18548579

相关文章

  • P9870 [NOIP2023] 双序列拓展 题解
    P9870[NOIP2023]双序列拓展题解NOIP2023T3,特殊性质题。什么是特殊性质题?就是题目给出了你极其神秘的性质,从而引导你想出正解。本篇题解将从部分分的角度,一步步讲述部分分与正解的关系。这样看的话,本题会变得十分简单。\(\text{Task}1∼7,O(Tnm)\)简化题意其实就是要求......
  • 617. 合并二叉树
    题目链接解题思路分情况讨论即可两个头都是空,直接返回空若root1为空,直接返回root2若roo2为空,直接返回root1若都不空,则二者相加,得到一个新节点A,然后二者的左子树去合并,得到一个新左子树new_left,二者的右子树去合并,得到一个新右子树new_right,然后新节点的左儿子就是new_......
  • mobileViT-V2-线性自注意力计算
    paperclassLinearSelfAttention(nn.Module):"""Thislayerappliesaself-attentionwithlinearcomplexity,asdescribedin`https://arxiv.org/abs/2206.02680`Thislayercanbeusedforself-aswellascross-attention.Args......
  • 用户模块接口文档
    一、用户注册1、基本信息:请求路径:/user/register请求方式:POST接口描述:该接口用于用户通过手机号注册账号2、请求参数:请求参数格式:applocation/json参数名称说明类型是否必须备注phone手机号码String是必须输入11位password登录密码String是必须5-......
  • html语言
    HTML文件以.htm或.html为扩展名1.HTML结构标签2.基础标签就是一些和文字相关的标签,如下:hr标签在浏览器中呈现出横线的效果。在页面文件中书写hr标签字体标签换行标签段落标签居中标签加粗、斜体、下划线3.图片、音频、视频标签4.超链接标签5.列......
  • 01背包
    01背包抽象出来是有n种物品,每种物品只可以选一个或则零个如果爆搜的话会是\(2^n\),但利用\(dp\)可以减少不必要的讨论模板AcWing2.01背包问题-AcWing没什么好分析的,主要是二维向一维的优化,先看看朴素版本#include<bits/stdc++.h>usingnamespacestd;constintMAXN......
  • 电路:电路模型和电路定律
    1.1电路和电路模型电路模型:反映实际电路部件的主要电磁性质的理想电路元件及其组合理想电路元件:有某种确定的电磁性质的理想元件(最小单元)电能或电信号的发生器用电设备电源负载激励响应输入输出5种基本的理想电路元件:电阻元件(R):表示消耗电能的元件电感元件(L):表示产生磁场,储......
  • 第九章 DIV+CSS布局
    9.1DIV+CSS概述9.1.1认识DIV<div>标签是HTML中的一种块级元素,用于定义文档中的一个分区或区域。它是一个容器,可以包含文本、图像、列表、表格、段落、其他块级元素,甚至是其他<div>元素。<div>标签本身不会在页面上显示任何内容,但它可以作为组织和布局HTML文档的工具9.......
  • Envelope Theorem
    ......
  • 第八章 利用CSS制作导航菜单
    8.1水平顶部导航栏8.1.1简单水平导航栏的设计与实现简单水平导航栏是网页设计中非常常见的元素,它通常位于页面的顶部,并提供主要的网站导航选项。下面我们将详细讲解如何创建一个基本的水平导航栏,包括HTML结构、CSS样式以及鼠标事件处理。1导航栏的创建首先,我们需要使用H......