MyBatis小技巧

MyBatis小技巧

  • 一、#{}和${}
    • 1.#{}和${}的区别
    • 2.什么情况下必须使⽤${}
  • 二、别名机制-typeAliases
    • 1.typeAlias
    • 2.package
  • 三、mappers的配置
    • 1.mapper
      • (1)resource
      • (3)URL
      • (3)class
    • 2.package
  • 四、插⼊数据时获取⾃动⽣成的主键


一、#{}和${}

1.#{}和${}的区别

  • #{}:先编译sql语句,再给占位符传值,底层是PreparedStatement实现。可以防⽌sql注⼊,⽐较常⽤。
  • ${}:先进⾏sql语句拼接,然后再编译sql语句,底层是Statement实现。存在sql注⼊现象。只有在需要进⾏sql语句关键字拼接的情况下才会⽤到。
  • 原则:能⽤ #{} 就不⽤ ${}。

2.什么情况下必须使⽤${}

  • 当需要进⾏sql语句关键字拼接的时候。必须使⽤${}。
  • 案例:
    • ① 通过向sql语句中注⼊asc或desc关键字,来完成数据的升序或降序排列。
    • ② 拼接表名。
      • 业务背景:实际开发中,有的表数据量⾮常庞⼤,可能会采⽤分表⽅式进⾏存储,⽐如每天⽣成⼀张表。表的名字与⽇期挂钩,例如:2022年8⽉1⽇⽣成的表:t_user20220108。2000年1⽉1⽇⽣成的表:t_user20000101。此时前端在进⾏查询的时候会提交⼀个具体的⽇期,⽐如前端提交的⽇期为:2000年1⽉1⽇,那么后端就会根据这个⽇期动态拼接表名为:t_user20000101。有了这个表名之后,将表名拼接到sql语句当中,返回查询结果。
      • 使⽤ #{} 会是这样:select * from ‘article’
      • 使⽤ ${} 会是这样:select * from article
    • ③ 批量删除
      • 对应的sql语句:
        • delete from t_user where id = 1 or id = 2 or id = 3;
        • delete from t_user where id in(1, 2, 3);
      • 假设现在使⽤in的⽅式处理,前端传过来的字符串:1, 2, 3
        • 使⽤#{} :delete from t_user where id in(‘1, 2, 3’)
        • 使⽤${} :delete from t_user where id in(1, 2, 3)
    • ④ 模糊查询

二、别名机制-typeAliases

  • resultType 属性⽤来指定查询结果集的封装类型、parameterType 属性用来指定传递的参数类型(namespace 不能使用别名机制),这个名字太⻓,可以在 mybatis-config.xml ⽂件中使⽤ typeAliases 标签来起别名,包括两种⽅式:
  • ⾸先要注意 typeAliases 标签的放置位置,如果不清楚的话,可以看看错误提示信息。

1.typeAlias

<typeAliases><typeAlias type="com.gdb.mybatis.pojo.Car" alias="Car"/>
</typeAliases>
  • typeAliases标签中的typeAlias可以写多个。
  • typeAlias:
    • type属性:指定给哪个类起别名
    • alias属性:别名。
      • alias属性不是必须的,如果缺省的话,type属性指定的类型名的简类名作为别名。
      • alias是⼤⼩写不敏感的。也就是说假设alias=“Car”,再⽤的时候,可以CAR,也可以car,也可以Car,都⾏。

2.package

<typeAliases><package name="com.powernode.mybatis.pojo"/>
</typeAliases>
  • 如果⼀个包下的类太多,每个类都要起别名,会导致 typeAlias 标签配置较多,所以 mybatis 又提供 package 的配置⽅式,只需要指定包名,该包下的所有类都⾃动起别名,别名就是简类名。并且别名不区分⼤⼩写。
  • package也可以配置多个的。

三、mappers的配置

1.mapper

(1)resource

  • 这种⽅式是从类路径中加载配置⽂件,所以这种⽅式要求SQL映射⽂件必须放在resources⽬录下或其⼦
    ⽬录下。
<mappers><mapper resource="article2.xml"/><mapper resource="com/gdb/mybatis/mapper/article1.xml"/>
</mappers>

(3)URL

  • 这种⽅式显然使⽤了绝对路径的⽅式,这种配置对SQL映射⽂件存放的位置没有要求,随意。这种方式的移植性差,一般都不会使用。
<mappers><mapper url="file:///var/mappers/AuthorMapper.xml"/><mapper url="file:///var/mappers/BlogMapper.xml"/><mapper url="file:///var/mappers/PostMapper.xml"/>
</mappers>

(3)class

  • 如果使⽤这种⽅式必须满⾜以下条件:
    • SQL映射⽂件和mapper接⼝放在同⼀个⽬录下。

      • 在resources⽬录下新建:com/powernode/mybatis/mapper【这⾥千万要注意:不能这样新建com.powernode.mybatis.mapper】
      • 如果将 xxx.xml 文件放在了 java 目录下,需要在 pom.xml 文件中添加如下配置。
      <build><!--配置maven在构建项目的时候除了编译Java源文件以外也编译所有的.xml文件--><resources><resource><directory>src/main/java</directory><includes><include>**/*.xml</include></includes></resource><resource><directory>src/main/resources</directory><includes><include>**/*.*</include></includes></resource></resources>
      </build>
      
    • SQL映射⽂件的名字也必须和mapper接⼝名⼀致。

<mappers><!-- 使⽤映射器接⼝实现类的完全限定类名 --><mapper class="com.gdb.mybatis.mapper.ArticleMapper"/>
</mappers>

2.package

  • 如果 class 较多,可以使⽤这种 package 的⽅式,但前提条件和 class 的⽅式⼀样。
<!-- 将包内的映射器接⼝实现全部注册为映射器 -->
<mappers><package name="com.gdb.mybatis.mapper"/>
</mappers>

四、插⼊数据时获取⾃动⽣成的主键

  • 插⼊⼀条新的记录之后,⾃动⽣成了主键,⽽这个主键需要在其他表中使⽤时。
  • 插⼊⼀个⽤户数据的同时需要给该⽤户分配⻆⾊:需要将⽣成的⽤户的id插⼊到⻆⾊表的user_id字段上。
  • 第⼀种⽅式:可以先插⼊⽤户数据,再写⼀条查询语句获取id,然后再插⼊user_id字段。【⽐较麻烦】
  • 第⼆种⽅式:mybatis提供了⼀种⽅式更加便捷。
public interface ArticleMapper {int insert(Article row);
}
<insert id="insert" parameterType="com.gdb.generate.pojo.Article"  useGeneratedKeys="true" keyProperty="id">insert into articlevalues(null, #{userId}, #{title}, #{summary}, #{readCount}, #{createTime}, #{updateTime})
</insert>
  • useGenerateKeys = “true” 使用自动生成的主键
  • keyProperty = “id” 指定主键值赋值给对象的那个属性。这个就表示将主键值赋值给 Article 对象的 id 属性。
import com.gdb.generate.mapper.ArticleMapper;
import com.gdb.generate.pojo.Article;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Test;import java.util.Date;public class GeneratorTest {@Testpublic void testGenerator() throws Exception {SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsStream("mybatis-config.xml"));SqlSession sqlSession = sqlSessionFactory.openSession();ArticleMapper mapper = sqlSession.getMapper(ArticleMapper.class);// 增Article article = new Article(null, 2354, "springboot 配置文件", "外部化配置文件", 12346, new Date(), new Date());int count = mapper.insert(article);System.out.println("插⼊了⼏条记录:" + count);System.out.println(article);sqlSession.commit();sqlSession.close();}
}

在这里插入图片描述


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/261620.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

pikachu靶场-CSRF

CSRF: 介绍&#xff1a; Cross-site request forgery简称为"CSRF”。 在CSF的攻击场景中攻击者会伪造一个请求&#xff08;这个请求一般是一个链接&#xff09; 然后欺骗目标用户进行点击&#xff0c;用户一旦点击了这个请求&#xff0c;整个攻击也就完成了&#xff0…

泽攸科普——扫描电子显微镜(SEM)像衬度形成原理

扫描电镜通过电子束在样品表面进行周而复始的扫描运动&#xff0c;同时实时监测各种信号图像的产生&#xff0c;然后根据产生的信号多少来调制图像。 引起各种信号产生的扫描电镜图像衬度的来源有三个方面&#xff1a; 1. 试样本身性质&#xff1a;包括表面的凹凸不平、成分的…

把excel模版保存到文件夹里不走接口进行下载的方法

把excel保存到文件夹不走接口进行下载&#xff0c;一定要注意&#xff0c;需要放到public下的static文件夹下&#xff0c;如果没有static文件夹&#xff0c;就新建一个 &#xff01;&#xff01;&#xff01;不放在static文件夹下可能会报错&#xff0c;提示&#xff1a;无法从…

尾矿库排洪系统结构仿真软件WKStruc(可试用)

1、背景介绍 尾矿库作为重大危险源之一&#xff0c;在国际灾害事故排名中位列第18位&#xff0c;根据中国钼业2019年8月刊《中国尾矿库溃坝与泄漏事故统计及成因分析》的统计&#xff0c;在46起尾矿库泄漏事故中&#xff0c;由于排洪设施导致的尾矿泄漏事故占比高达1/3&#x…

Mysql第二关之存储引擎

简介 所有关于Mysql数据库优化的介绍仿佛都有存储引擎的身影。本文介绍Mysql常用的有MyISAM存储引擎和Innodb存储引擎&#xff0c;还有常见的索引。 Mysql有两种常见的存储引擎&#xff0c;MyISAM和Innodb&#xff0c;它们各有优劣&#xff0c;经过多次优化和迭代&#xff0c;…

基于 QUIC 协议的 HTTP/3 正式发布!

近期&#xff0c;超文本传输协议新版本 HTTP/3 RFC 文档&#xff0c;已由互联网工程任务组&#xff08;IETF&#xff09;对外发布。HTTP/3 全称为 HTTP-over-QUIC&#xff0c;指在 QUIC&#xff08;Quick UDP Internet Connections, 快速 UDP 互联网连接&#xff09;上映射 HTT…

TSINGSEE青犀AI智能分析网关V4初始配置与算法相关配置介绍

TSINGSEE青犀AI智能分析网关V4内置了近40种AI算法模型&#xff0c;支持对接入的视频图像进行人、车、物、行为等实时检测分析&#xff0c;上报识别结果&#xff0c;并能进行语音告警播放。硬件管理平台支持RTSP、GB28181协议、以及厂家私有协议接入&#xff0c;可兼容市面上常见…

CSS基础属性

【三】基础属性 【1】高度和宽度 &#xff08;1&#xff09;参数 width&#xff08;宽度&#xff09;&#xff1a;用于设置元素的宽度。可以使用具体的数值&#xff08;如像素值&#xff09;或百分比来指定宽度。 height&#xff08;高度&#xff09;&#xff1a;用于设置元…

Excel练习:双层图表

Excel练习&#xff1a;双层图表 学习视频Excel制作双层图表&#xff0c;很多人都不会&#xff0c;其实只需1步操作就够了&#xff01;_哔哩哔哩_bilibili ​​ 通过调整两个图形的显示范围实现 增加折现图的负数显示范围&#xff0c;使折现图仅出现在整体图形的上方增加柱形…

白话微机:8.解释FPGA以及一些考研面试问题

一. 前言&#xff08;更新世界观&#xff09; 在“微机世界”&#xff0c;普通的城市(单片机)里&#xff0c;人又有一个别的名字叫做“数据”&#xff0c;人有0有1&#xff1b;人们也有住房&#xff0c;这些住房在这个世界叫做“存储器”&#xff1b;地上有路&#xff0c;这些路…

吴恩达机器学习全课程笔记第三篇

目录 前言 P42-P48 神经元和大脑 神经网络中的层 更复杂的神经网络 前向传播&#xff08;做出预测&#xff09; P49-P53 代码中的推理 构建一个神经网络 P54-P60 矩阵乘法 TensorFlow框架实现神经网络 前言 这是吴恩达机器学习笔记的第三篇&#xff0c;第二篇笔记…

解决elementUI固定列后,下方多了一条横线的问题

最近遇到一个bug,如下图,el-table的操作列使用fixed属性固定后,下方多了一条横线: 我们将样式设置高优先,以覆盖内联样式,如下是less里使用穿透样式解决的办法: <style lang="less" scoped> /deep/ .el-table__fixed-right {height: 100

uni-app 开发调试自动打开手机屏幕大小界面(Aidex移动端开发项目)

上效果&#xff1a; 下载Aidex的移动端项目并打开&#xff1a; 若依-ruoyi-AiDex-Uniapp: 若依-Ruoyi APP 移动解决方案&#xff0c;基于uniappuView封装的一套基础模版&#xff0c;开箱即用&#xff0c;免费开源&#xff0c;一份代码多终端适配&#xff0c;支持H5、支付宝小程…

阿里云香港轻量应用服务器网络线路cn2?

阿里云香港轻量应用服务器是什么线路&#xff1f;不是cn2。 阿里云香港轻量服务器是cn2吗&#xff1f;香港轻量服务器不是cn2。阿腾云atengyun.com正好有一台阿里云轻量应用服务器&#xff0c;通过mtr traceroute测试了一下&#xff0c;最后一跳是202.97开头的ip&#xff0c;1…

UE蓝图 入口(FunctionEntry)节点和源码

系列文章目录 UE蓝图 Get节点和源码 UE蓝图 Set节点和源码 UE蓝图 Cast节点和源码 UE蓝图 分支(Branch)节点和源码 UE蓝图 入口(FunctionEntry)节点和源码 文章目录 系列文章目录一、FunctionEntry节点功能二、入口节点用法1. 创建函数2. 命名函数3. 定义参数4. 编写函数逻辑5…

喜讯 | 重庆炼石入选重庆市科技局科技型企业

近日&#xff0c;重庆炼石网络技术有限公司&#xff08;以下简称“重庆炼石”&#xff09;经过严格审查&#xff0c;获得由重庆市科学技术局备案、重庆生产力促进中心&#xff08;重庆市科技型企业系统受托管理单位&#xff09;发证的《重庆市科技型企业备案证书》&#xff0c;…

国产洗地机品牌哪个好?热门品牌洗地机推荐

随着人们生活节奏的加快和生活压力的增加&#xff0c;“懒人好物”逐渐成为消费热点。在家庭清洁方面&#xff0c;吸尘器是最早被广泛接受的工具&#xff0c;但随着人们对便捷性和效率的需求增加&#xff0c;家用洗地机和扫地机器人等新型清洁工具开始受到欢迎。这些工具的出现…

入门OpenCV:图像阈值处理

图像阈值是一种简单、高效的图像分割方法&#xff0c;目的是将图像转换成二值图像。这个过程涉及比较像素值和阈值&#xff0c;根据比较结果来确定每个像素点的状态&#xff08;前景或背景&#xff09;。图像阈值在处理二维码、文本识别、物体跟踪等领域中非常有用。本博客旨在…

【图片公式识别】图片公式转Word与LaTeX文档:智能识别与转换

前言 嘿&#xff0c;大家好呀&#xff01;&#x1f44b; 谁都知道&#xff0c;写 Word 文档里的公式可不是一件简单的事情&#xff01;你辛辛苦苦在键盘上敲出的数学公式&#xff0c;结果随着 Word 版本的更新&#xff0c;竟然变成了一张图片&#xff01;&#x1f624; 这简直就…

微信小程序video 点击自动全屏播放

//因为这个地址可能是图片也可能是视频 点击 图片可以预览&#xff0c;点击视频可放大全屏自动播放。 代码如下 <view v-else :class{contentImg: x.picture.length0} style"margin-top: 10px;"v-for"(x1, y1) in x.picture" :key"y"><…