当前位置: 首页 > article >正文

MyBatis:解决数据库字段和Java对象字段不匹配问题及占位符问题

MyBatis:解决数据库字段和Java对象字段不匹配问题及占位符问题

文章目录

  • MyBatis:解决数据库字段和Java对象字段不匹配问题及占位符问题
    • 一、数据库字段和Java对象字段不匹配问题
      • 1、问题描述
      • 2、解决方案
        • 2.1、方案1
        • 2.2、方案2
        • 2.3、方案3
    • 二、占位符问题
      • 1、两种占位符
      • 2、`#{}` 和 `${}` 的区别![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/7a617fe2f67a4c93a317c22173438075.png#pic_center)

一、数据库字段和Java对象字段不匹配问题

1、问题描述

在使用 MyBatis 进行数据库操作时,数据库表的字段名称和 Java 对象中的属性名称可能不一致,这是一个常见问题。为了处理这种不匹配,MyBatis 提供了几种方法来映射数据库字段与 Java 对象字段。

2、解决方案

2.1、方案1

取别名: 可以通过在 SQL 查询中使用别名来解决字段名称与 Java 对象属性名称不一致的问题。

<select id="list" resultType="user">
        SELECT userId AS 'id',username AS 'name',PASSWORD AS 'pwd' FROM t_user
</select>
2.2、方案2

定义映射关系(*): 使用 MyBatis 的 ResultMap 是一种更灵活的方式来解决字段不一致的问题。你可以在 MyBatis 的映射文件中明确指出数据库字段与 Java 对象字段的对应关系 。

<!--
       下面的resultMap表示的是定义了结果集的映射
         type:表示数据库查询出来映射的Java类是哪一个
    -->
    <resultMap id="listResultMap" type="user">
        <!--映射主键-->
        <id property="id" column="userId"></id>
        <!--映射其他字段-->
        <result property="name" column="username"></result>
        <result property="pwd" column="password"></result>
    </resultMap>


    <!--    下面通过映射结果集来解决 字段不一样的问题-->
    <select id="list" resultMap="listResultMap">
        SELECT *
        FROM t_user
    </select>
2.3、方案3

使用注解: MyBatis 也支持在 Mapper 接口中通过注解来定义字段映射。可以使用 @Results@Result 注解来指定数据库字段和 Java 对象属性的对应关系。

@Select("SELECT user_id, user_name FROM users WHERE user_id = #{id}")
@Results({
    @Result(property = "id", column = "user_id"),
    @Result(property = "name", column = "user_name")
})
User getUser(int id);

二、占位符问题

1、两种占位符

mybatis中的占位符 有两个 #{} 一个是 ${}

#{} 占位符用于安全地传递参数,它会将参数值作为预编译的 SQL 语句的一部分,MyBatis 会自动将参数值传递给 JDBC 的 PreparedStatement,这样可以有效避免 SQL 注入攻击。

${} 是 MyBatis 中的字符串替换占位符,它会直接将参数值拼接到 SQL 语句中,不会进行任何 SQL 转义,因此存在 SQL 注入的风险。

理解:#{}在执行的时候 实际上是翻译成了 JDBC中的占位符 ?

${}在执行的时候 直接是 SQL语句的拼接

理解:#{}在执行的时候 实际上是翻译成了 JDBC中的占位符 ?

${}在执行的时候 直接是 SQL语句的拼接

2、#{}${} 的区别在这里插入图片描述


http://www.kler.cn/a/291572.html

相关文章:

  • CAN201 Introduction to Networking(计算机网络)Pt.1 导论和应用层
  • HTTP、HTTPS和SOCKS5代理協議
  • AI的进阶之路:从机器学习到深度学习的演变(四)
  • 【从零开始入门unity游戏开发之——C#篇21】C#面向对象的封装——`this`扩展方法、运算符重载、内部类、`partial` 定义分部类
  • CSDN外链失效3:
  • 移动0 - 简单
  • 「Python程序设计」模块式编程:函数
  • 基于 SpringBoot 冬奥会科普平台
  • 【Java】实体类Javabean的运用案例
  • 社区电商系统源码之卷轴模式:商业模式分析
  • BUUCTF—[网鼎杯 2020 朱雀组]phpweb
  • Laravel 中间件与事件应用教程
  • CSS解析:盒模型
  • Selenium 调用 JavaScript 操作带有 readonly 属性 的日期控件
  • erlang学习:用ETS和DETS存储数据
  • Ascend C算子性能优化实用技巧02——内存优化
  • 获取Word、PPT、Excel、PDF文件页数及加密校验
  • 145. 利用 Redis Bitmap实践: 用户签到统计
  • Android TextView设置跑马灯失效
  • ACL实验配置学习笔记
  • 【网络安全 | 渗透工具】Cencys+Shodan使用教程
  • 科研绘图系列:R语言差异基因四分图(Quad plot)
  • 【轻松学EntityFramework Core】--数据迁移
  • 【高阶数据结构】B树、B+树、B*树
  • 手把手教ESP32连接阿里云
  • 如何在Centos7构建调试“Jmeter-InfluxDB-Grafana“?