开发中常用的Mybatis使用总结

MyBatis(三、注解开发) 实现复杂关系映射之前我们可以在映射文件中通过配置来实现,使用注解开发后,我们可以使用@Results注解 ,@Result注解,@One注解,@Many注解组合完成复杂关系的配置。​ 修改MyBatis的核心配置文件,我们使用了注解替代的映射文件,所以我们只需要加载使用了注解的Mapper接口即可。这几年来注解开发越来越流行,Mybatis也可以使用注解开发方式,这样我们就可以减少编写Mapper 映射文件了。......... 阅读详情

mybatis使用总结

介绍
首个类持久性框架
分为JDBC(原始SQL)和Hibernate(ORM)简化绝大部分JDBC代码,
手工设置参数和获取结果
灵活,使用者能够完全控制SQL,支持高级映射

防止sql注入

说明:在MyBatis中,使用XML文件或注释来进行配置和映射,将接口和Java POJO(普通的旧Java对象)映射到数据库记录

xml例子
映射器界面

@Mapper
public interface UserMapper {
    User getById(int id);
}

** XML配置文件**

<select id="getById" resultType="org.example.User">
 SELECT * FROM user WHERE id = #{id}
</select

注释示例

@Mapper
public interface UserMapper {
    @Select("SELECT * FROM user WHERE id= #{id}")
    User getById(@Param("id") int id);
}

可以看到,使用者需要自己编写SQL语句,因此当使用不当时,会导致注入问题

与使用JDBC不同的是,MyBatis使用#{}和${}来进行参数值替换

使用#{}语法时,MyBatis会自动生成PreparedStatement,使用参数绑定(?)的方式来设置值,
上述两个示例等价的JDBC查询代码如下:

String sql = "SELECT * FROM users WHERE id = ?";
PreparedStatement ps = connection.prepareStatement(sql);
ps.setInt(1, id);

因此#{}可以有效防止SQL注入,详细可参考http://www.mybatis.org/mybatis-3/sqlmap-xml.html 字符串替换部分

而使用${}语法时,MyBatis会直接注入原始字符串,即相当于分段字符串,因此会导致SQL注入,如

<select id="getByName" resultType="org.example.User">
 SELECT * FROM user WHERE name = '${name}' limit 1
</select>

名称估计’ or ‘1’='1,实际执行的语句为

SELECT * FROM user WHERE name = '' or '1'='1' limit 1

因此建议尽量使用#{},但有些时候,如按语句排序,使用#{}会导致错误,如

ORDER BY #{sortBy}

sortBy参数估计name,替换后会成为

ORDER BY "name"

即以字符串“ name”来排序,而不是按名称排序,详细可参考https://stackoverflow.com/a/32996866/6467552。

这种情况就需要使用 ${}

ORDER BY ${sortBy}

使用了${}后,使用者需要自行过滤输入,方法有:

代码层使用白名单的方式,限制sortBy允许的值,如只能为name,email变量,异常情况则设置为替换值name

在XML配置文件中,使用if标签来进行判断

Mapper接口方法

List<User> getUserListSortBy(@Param("sortBy") String sortBy);
<select id="getUserListSortBy" resultType="org.example.User">
  SELECT * FROM user
  <if test="sortBy == 'name' or sortBy == 'email'">
 order by ${sortBy}
  </if>
</select>

因为Mybatis不支持else,需要替换值的情况,可以使用 choose (when, otherwise)

<select id="getUserListSortBy" resultType="org.example.User">
  SELECT * FROM user
  <choose>
    <when test="sortBy == 'name' or sortBy == 'email'">
      order by ${sortBy}
    </when>
    <otherwise>
      order by name
    </otherwise>
 </choose>
</select>

like语句

在代码层,在参数值两边加上%,然后再使用#{}

使用bind标签来构造新参数,然后再使用#{}

Mapper接口方法

List<User> getUserListLike(@Param("name") String name);

xml配置文件

<select id="getUserListLike" resultType="org.example.User">
    <bind name="pattern" value="'%' + name + '%'" />
    SELECT * FROM user
    WHERE name LIKE #{pattern}
</select>

语句内部的值为OGNL表达式,具体可参考http://www.mybatis.org/mybatis-3/dynamic-sql.html bind部分

使用SQL concat()函数

<select id="getUserListLikeConcat" resultType="org.example.User">
 SELECT * FROM user WHERE name LIKE concat ('%', #{name}, '%')
</select>

除了注入问题之外,这里还需要对用户的输入进行过滤,永久有通配符,
否则在表中数据量中断的时候,假设用户输入为%%,会进行全表模糊查询,
严重情况下可导致DOS ,参考http://www.tothenew.com/blog/sql-wildcards-is-your-application-safe/

IN条件

使用和#{}

Mapper接口方法

List<User> getUserListIn(@Param("nameList") List<String> nameList);
<select id="selectUserIn" resultType="com.example.User">
  SELECT * FROM user WHERE name in
  <foreach item="name" collection="nameList"
           open="(" separator="," close=")">
        #{name}
  </foreach>
</select>
mybatis - 注解开发 构建SQL 一.Mybatis注解开发单表操作 1.1 MyBatis的常用注解 这几年来注解开发越来越流行,Mybatis也可以使用注解开发方式,这样我们就可以减少编写Mapper 映射文件了。我们先围绕一些基本的CRUD来学习,再学习复杂映射多表操作。 @Insert:实现新增 @Update:实现更新 @Delete:实现删除 @Select:实现查询 @Result:实现结果集封装 @Results:可以与@Result 一起使用,封装多个结果集 @One:实现一对一结果集封装 @Many:实现一对多结果集封装 阅读详情

相关推荐

JAVA:MyBatis 高级标签使用技巧的详细指南

JAVA:MyBatis 高级标签使用技巧的详细指南

木头 1203

mybatis中concat的用法

案例一:条件查询+分页操作  pojo类(作用:多参数传递) public class PageParams { private int start ; private int limit; /*******setter and getter*********/ } 接口方法 传递一个pojo类及另外参数 可用一个pojo类来代替,mapper中相应sql...

xiangwang2016的博客 4万+

DolphinScheduler+DataX实战:5分钟搞定MySQL到Hive数据同步(附完整JSON配置)

本文详细介绍了如何利用DolphinScheduler与DataX构建企业级数据同步流水线,实现MySQL到Hive的高效数据同步。文章提供了从环境部署、核心组件配置到完整JSON配置的实战指南,并深入探讨了性能调优、增量同步策略以及生产环境下的监控与错误处理,帮助读者快速搭建稳定可靠的数据同步方案。

5b6n7m8的博客 252

MyBatis 中 `CONCAT` 函数的用法

在使用 MyBatis 进行数据库操作时,CONCAT函数是一个非常有用的工具,它允许我们将多个字符串或列值连接成一个单一的字符串。这在生成复合字段(例如将名字和姓氏合并为全名)或者构建复杂的查询条件时特别有用。CONCAT。

小李同学的博客 2078

若依框架(ruoyi vue版)集成jeecg积木报表整体完整实用教程(超长篇幅耐心阅读)

若依框架(ruoyi vue版)集成jeecg积木报表整体完整实用教程,主要说明jeecg积木报表的集成、jeecg积木报表嵌入若依菜单、token权限控制,以及iframe嵌入表格等内容。

weixin_53067723的博客 4639

东方财富网 数据访问接口及字段说明

东方财富网 数据访问接口和字段说明

雨中山草 2万+

mybatis——concat()方法

concat介绍 CONCAT(字串1, 字串2, 字串3, …): 将字串1、字串2、字串3,等字串连在一起。 应用场景主要为模糊查询

m0_51082307的博客 4788

水下探测小白必看:单波束vs多波束声呐,5分钟搞懂核心区别

本文为水下探测新手清晰解析了单波束与多波束声呐的核心区别。单波束声呐如同精准的“手电筒”,进行逐点扫描,适用于定点测深和目标探测;而多波束声呐则像“聚光灯”,能一次性覆盖一个扇区,高效获取海底地形三维信息,是海底测绘和水下三维建模的理想选择。文章通过生动的比喻和对比表格,帮助读者快速理解两者原理、效率差异及适用场景。

linux6sysadmin的博客 1043

Mybatis使用concat函数

开发时遇到一个需求,用户角色存在变更,使用关联关系浪费空间,于是想到使用在数据库字段中存放字符串,以,分割,这样获取到数据之后使用AuthorityUtils.commaSeparatedStringToAuthorityList(param)即可将用户角色转成list集合,数据库中字段信息如下 如图所示,用户role字段对应用户角色信息,但是用户角色可能会添加也可能会删除某个角色,当然查出来利...

single_cong的博客 1万+

团结引擎+OpenHarmony 记录 (持续更新中)

获取不到的原因是因为二者不在同一个线程中,所以数据没有同步。而 globalThis.context 数据进行了同步。(TuanjieMainWorkerHandler.ts中可以看到)在进行绘制 UI 的时候 ,如果组件有 Native API 就可能不会显示出来,例如 web 控件就不能展示出来,刚加上权限的时候 会报错 因为缺少 reason ,添加上就不会报错了。只有纯 UI 控件是可以展示出来的,注释掉 web控件后就可以。

m_cainiaokuaifei的博客 1490

Codex 100个真实案例 - 用AI做股票K线分析工具(技术指标全自动)

本案例将用 Codex 从零搭建一个完整的股票 K 线分析工具。通过自然语言驱动,我们让 AI 自动完成股票数据获取(akshare)、K 线图绘制(mplfinance + ECharts)、技术指标计算(MA/EMA/MACD/RSI/KDJ/布林带)、买卖信号提示(金叉/死叉、超买超卖)、多股对比分析、Web 可视化界面(Flask + ECharts)、PDF 报告生成以及定时监控邮件推送等全套功能。全程用自然语言指令驱动 Codex,零手写代码实现专业级量化分析平台!

yueyeguzhuo的专栏 863

MyBatis注解开发

注解开发通常指的是在编程中使用注解(Annotation)的开发方式。注解是一种为程序代码添加元数据(metadata)的方式,提供了关于代码的额外信息,用于告诉编译器、解释器或其他工具如何处理被注解的代码。注解方式比较简单,但是实际开发不推荐使用注解,使用配置文件的方式,不需要改源代码。二、SQL常用注解@Insert:添加@Update:修改@Delete:删除@Select:查询@Result:实现结果集封装@Results:可以和@Result一起使用,封装多个结果集。

2301_78566776的博客 1315

【即插即用模块】Transformer篇 | ICCV 2025 | MALA :注意力分布神似Softmax,告别线性注意力性能短板!

MALA(Magnitude-Aware Linear Attention)是一种改进的线性注意力机制,通过引入缩放因子和偏移项,解决了传统线性注意力忽视查询幅度的问题,使其分布更接近Softmax Attention。该模块具有线性复杂度(O(n)),结合RoPE和LEPE编码实现全局-局部位置信息混合,通过z值调制平衡信息权重。实验表明MALA在轻量级视觉任务中能有效平衡效率与精度,注意力可视化显示其分布与Softmax Attention高度相似。代码提供完整的RoPE位置编码和线性注意力

主要更新底层视觉(去噪、超分等)相关的科研内容,形式为【论文精读】+【论文复现】 1106

MyBatis 使用教程及插件开发

MyBatis 使用教程代码演示

小凯的博客 1152

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

【MyBatis】Mybatis 注解开发

【MyBatis】Mybatis 注解开发1. 常用的注解说明2. 通过注解实现基本CRUD操作3. 使用注解实现一对多复杂关系映射3.1 复杂关系映射的注解说明3.2 使用注解实现一对一复杂关系映射及延迟加载3.3 使用注解实现一对多复杂关系映射及延迟加载4. 基于注解的二级缓存 1. 常用的注解说明 @Insert:实现新增 @Update:实现更新 @Delete:实现删除 @Select:...

来日浅谈的博客 543

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

MyBatis入门——使用注解开发

MyBatis入门——使用注解开发一、面向接口编程二、使用注解开发三、MyBatis详细的执行流程四、注解实现CRUD4.1 查询① 查询全部信息② 根据id查询信息4.2 增加4.3 修改4.4 删除五、@Param()注解 Tips:请先阅读: 一、MyBatis入门——第一个MyBatis项目搭建文章 https://blog.youkuaiyun.com/Gauss7/article/details/115264612 二、MyBatis入门——基本CRUD代码编写 https://blog.youkuaiyun.com

Weiyu Tang的博客 339

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

mybatis注解开发

mybatis注解开发 1.概述 Mybatis最大的特点是使用XML存储SQL语句,但是Mybatis也可以使用注解开发方式,好处是不用编写Mapper映射文件,坏处是SQL语句又耦合在Java代码中了。本次我们先围绕一些基本的 CRUD 来学习,再学习复杂映射关系及延迟加载。 2.Mybatis的注解说明 @Insert:实现新增 @Update:实现更新 @Delete:实现删除 @Select:实现查询 @Result:实现结果集封装 @Results:可以与@Result一起使用,封装多个结果集

xiaotai1234的博客 411

Mybatis的基本使用与企业常用MyBatis开发Dao方式

MyBatis是一个优秀的“不完全的”ORM框架,因为它需要程序员手动写SQL,而相对于Hibernate来说更加的灵活。它完成了关系模型到对象模型的映射,话不多说,直奔主题。

dearbaba_8520的博客 455

Mybatis使用注解开发

lyz的自学笔记 文章目录一、使用注解开发1、面向接口开发2、使用注解开发 一、使用注解开发 1、面向接口开发 在真正的开发中,很多时候会选择面向接口编程 根本原因:解耦可扩展,提高复用,分层开发中,上层不用管具体的实现,大家都遵守共同的标准,使得开发变得容易,规范性更好 1、关于接口的理解 接口从更深层次的理解,应是定义(规范,约束)与实现(名实分离的原则)的分离 2、 接口应有两类: 第一类是对一个个体的抽象,他可对应为一个抽象体 第二类是对一个个体某一方面的抽象,即形成一个抽象面 一个体有可能

weixin_50063227的博客 463

MyBatis 注解开发详解

MyBatis 提供了基于 XML 配置和基于注解的两种开发方式。注解方式相对简单,但实际开发中更推荐使用 XML 配置方式,以减少对源代码的修改,提高可维护性。注解方式可以快速开发,但 XML 配置更具灵活性和可维护性。@One和@Many结合可以实现延迟加载,优化查询性能。CRUD 操作通过@Insert@Select@Update@Delete进行实现。一对多、多对一映射可以用@One和@Many进行关联查询。

Future_yzx的博客 1064

Mybatis 使用注解开发

Param多参数方法,避免参数混淆通过名字直接引用参数,尤其在动态 SQL 中#{}与${}${}和#{}的区别_#{}和${}-优快云博客lambokLombok 使用教程(超级详细) - 犬小哈教程是什么?一个java库,通过注解的方式简化了java代码的编写。

redemption_2的博客 935

MyBatis 从入门到精通:使用注解开发的MyBatis

优点描述解耦降低模块之间的依赖性,使系统更加灵活可拓展方便对系统进行扩展,增加新的功能模块提高复用多个模块可以共享同一个接口,提高了代码的复用性规范性更好接口定义了模块之间的通信规范,使得系统的设计更加规范化本文介绍了使用注解开发的MyBatis应用,包括面向接口编程的优点、实践方式,以及如何利用注解简化CRUD操作。通过合理地应用面向接口编程和注解开发,能够提高系统的灵活性和开发效率。

沉淀所学,分享所思,让热爱与成长同行。商务记录AI实战经验,助力开发者快速成长。 热爱AI,希望做出有影响力的技术成果。 技术点亮生活,分享连接价值与机会。 专注AI落地实战,陪你走好技术每一步。 1227

MyBatis——MyBatis开发流程

MySql驱动依赖日志依赖:Log4J测试依赖:junit连换池依赖这些都是项目基础的依赖配置,后面根据项目需求可添加其他的依赖项,比如:分页组件依赖等。我们是在pom.xml文件中配置的,在pom.xml文件中的project标签中加入下面的信息:导入依赖MyBatis核心依赖mybatis3.4.6MySql驱动依赖mysql5.1.25日志依赖:Log4Jlog4jlog4j1.2.17测试依赖:junitjunitjunit4.12test。

2401_86402635的博客 1234
上一篇: spring boot结合shiro实现用户-角色-权限的控制(包含用户名密码登陆和手机号验证码登陆)
下一篇: JDK8 的 Lambda、Stream、LocalDate的使用总结
意田天
博客等级 码龄7年 41粉丝 89原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

意田天

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值