9. Mybatis 小技巧

news/2024/9/23 11:18:00

1. #{ } 和 $

#{ } 和 ${ } 的区别

#{ }:先编译sql语句,再给占位符传值,底层是PreparedStatement实现。可以防止sql注入,比较常用。

${}:先进行sql语句拼接,然后再编译sql语句,底层是Statement实现。存在sql注入现象。只有在需要进行sql语句关键字拼接的情况下才会用到。

什么情况下必须使用${}

当需要进行sql语句关键字拼接的时候。必须使用${}

  • 拼接表名:代码演示:

    <select id="selectAllByTableName" resultType="car">selectid,car_num as carNum,brand,guide_price as guidePrice,produce_time as produceTime,car_type as carTypefrom${tableName}
    </select>
    
  • 批量删除 , 代码演示:

    <delete id="deleteBatch">delete from t_car where id in(${ids})
    </delete>
    
  • 模糊查询

    • 使用${} 代码演示:

      <select id="selectLikeByBrand" resultType="Car">selectid,car_num as carNum,brand,guide_price as guidePrice,produce_time as produceTime,car_type as carTypefromt_carwherebrand like '%${brand}%'
      </select>
      
    • 使用#{}代码演示:

      • 第一种:concat函数

        <select id="selectLikeByBrand" resultType="Car">selectid,car_num as carNum,brand,guide_price as guidePrice,produce_time as produceTime,car_type as carTypefromt_carwherebrand like concat('%',#{brand},'%')
        </select>
        
      • 第二种:双引号方式 : 这种方法比较常用

        <select id="selectLikeByBrand" resultType="Car">selectid,car_num as carNum,brand,guide_price as guidePrice,produce_time as produceTime,car_type as carTypefromt_carwherebrand like "%"#{brand}"%"
        </select>
        

2. typeAliases

2.1 第一种方式:typeAlias

代码演示:

    <typeAliases><typeAlias type="com.north.mybatis.pojo.Car"></typeAlias></typeAliases>
  • 首先要注意typeAliases标签的放置位置,如果不清楚的话,可以看看错误提示信息。

    image

  • typeAliases标签中的typeAlias可以写多个。

  • typeAlias:

    • type属性:指定给哪个类起别名
    • alias属性:别名。
  • alias属性不是必须的,如果缺省的话,type属性指定的类型名的简类名作为别名。

  • alias是大小写不敏感的。也就是说假设alias="Car",再用的时候,可以CAR,也可以car,也可以Car,都行。

2.2 第二种方式:package (比较常用)

代码演示:

    <typeAliases><package name="com.north.mybatis.pojo"/></typeAliases>

如果一个包下的类太多,每个类都要起别名,会导致typeAlias标签配置较多,所以mybatis用提供package的配置方式,只需要指定包名,该包下的所有类都自动起别名,别名就是简类名。并且别名不区分大小写。

3. mappers 设置讲解

SQL映射文件的配置方式包括四种:

  • resource:从类路径中加载
  • url:从指定的全限定资源路径中加载
  • class:使用映射器接口实现类的完全限定类名
  • package:将包内的映射器接口实现全部注册为映射器

3.1 resource 讲解

这种方式是从类路径中加载配置文件,所以这种方式要求SQL映射文件必须放在resources目录下或其子目录下。

<mappers><mapper resource="org/mybatis/builder/AuthorMapper.xml"/><mapper resource="org/mybatis/builder/BlogMapper.xml"/><mapper resource="org/mybatis/builder/PostMapper.xml"/>
</mappers>

3.2 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.3 class 讲解 (记住这种包命名方式)

如果使用这种方式必须满足以下条件:

  • SQL映射文件和mapper接口放在同一个目录下。
  • SQL映射文件的名字也必须和mapper接口名一致。
<!-- 使用映射器接口实现类的完全限定类名 -->
<mappers><mapper class="org.mybatis.builder.AuthorMapper"/><mapper class="org.mybatis.builder.BlogMapper"/><mapper class="org.mybatis.builder.PostMapper"/>
</mappers>

将CarMapper.xml文件移动到和mapper接口同一个目录下:

  • 在resources目录下新建:com/powernode/mybatis/mapper【这里千万要注意:不能这样新建 com.powernode.mybatis.dao】
  • 将CarMapper.xml文件移动到mapper目录下
  • 修改mybatis-config.xml文件
<mappers><mapper class="com.powernode.mybatis.mapper.CarMapper"/>
</mappers>

3.4 package

如果class较多,可以使用这种package的方式,但前提条件和上一种方式一样。

<!-- 将包内的映射器接口实现全部注册为映射器 -->
<mappers><package name="com.north.mybatis.mapper"/>
</mappers>

4. idea配置文件模板

mybatis-config.xml和SqlMapper.xml文件可以在IDEA中提前创建好模板,以后通过模板创建配置文件。

image

5. 插入数据时获取自动生成的主键

前提是:主键是自动生成的。

业务背景:一个用户有多个角色。

插入一条新的记录之后,自动生成了主键,而这个主键需要在其他表中使用时。

插入一个用户数据的同时需要给该用户分配角色:需要将生成的用户的id插入到角色表的user_id字段上。

第一种方式:可以先插入用户数据,再写一条查询语句获取id,然后再插入user_id字段。【比较麻烦】

第二种方式:mybatis提供了一种方式更加便捷。

image

CarMapper 代码

/*** 获取自动生成的主键* @param car*/
void insertUseGeneratedKeys(Car car);

CarMapper.xml 代码

<insert id="insertUseGeneratedKeys" useGeneratedKeys="true" keyProperty="id">insert into t_car(id,car_num,brand,guide_price,produce_time,car_type) values(null,#{carNum},#{brand},#{guidePrice},#{produceTime},#{carType})
</insert>

测试代码:

@Test
public void testInsertUseGeneratedKeys(){CarMapper mapper = SqlSessionUtil.openSession().getMapper(CarMapper.class);Car car = new Car();car.setCarNum("5262");car.setBrand("BYD汉");car.setGuidePrice(30.3);car.setProduceTime("2020-10-11");car.setCarType("新能源");mapper.insertUseGeneratedKeys(car);SqlSessionUtil.openSession().commit();System.out.println(car.getId());
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

DK盾VPS,您的专属云上堡垒

【探索未来网络的无限可能 —— DK盾VPS,您的专属云上堡垒】 在数字化浪潮中,稳定、高效、安全的网络服务是企业与个人用户追求卓越的关键。DK盾VPS,作为新一代虚拟专用服务器的杰出代表,正以卓越的性能和全方位的安全防护,引领着云服务的新潮流。 【性能卓越,畅享极速体…

Hadoop电商日志数据分析(三)

ETL 1.ETL的重要性 ==> 存在的问题:每个MR作业都去全量读取待处理的原始日志,如果数据量很大,将非常不可取ETL:数据从来源端经过抽取(Extract)、转换(Transform)、加载(Load)至目的端的过程 为什么要ETL:没有必要解析出所有数据,只需要解析出有价值的字段即可。…

C140 线段树分治+01Trie P4585 [FJOI2015] 火星商店问题

视频链接:C140 线段树分治+01Trie P4585 [FJOI2015] 火星商店问题_哔哩哔哩_bilibili C09【模板】可持久化字典树(Trie) - 董晓 - 博客园 (cnblogs.com) P4585 [FJOI2015] 火星商店问题 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)// 线段树分治 O(nlognlogn) #includ…

Hadoop电商日志数据分析(一)

项目要求 根据电商日志文件,分析: 1 . 统计页面浏览量(每行记录就是一次浏览) 2 . 统计各个省份的浏览量 (需要解析IP) 3 . 日志的ETL操作(ETL:数据从来源端经过抽取(Extract)、转换(Transform)、加载(Load)至目的端的过程)为什么要ETL:没有必要解析出所有数据…

单运放的浮动供电电路的进一步解释讲解

有时候需要运算放大器输出高一些的电压,或者输入高一些的电压,又或者输入输出都高一些。最简单的办法就是使用钞能力,只要钱给够,加上允许的时间够长,那么总可以买到甚至定制到合适的运算放大器。如果使用数量不多,也可以自己搭建分立元件的运算放大器,达到需求的功能。…

LLM大模型: RAG的langchain+向量数据库实现和评估方案

LLM大模型的核心功能之一就是聊天对话(信息检索),RAG的使用必不可少!大致的流程是:用户的query先转成embedding,去向量数据库查询最接近的top K回答;然后这query + top K的回答 + 其他context一起进入LLM,让LLM整合上述所有的信息后给出最终的回复!为了简便、快速地实…

FFmpeg开发笔记(三十二)利用RTMP协议构建电脑与手机的直播Demo

不管是传统互联网还是移动互联网,实时数据传输都是刚需,比如以QQ、微信为代表的即时通信工具,能够实时传输文本和图片。其中一对一的图文通信叫做私聊,多对多的图文通信叫做群聊。 除了常见的图文即时通信,还有实时音视频通信,比如一对一的音频通话、一对一的视频通话等等…

PS

基本概念色彩格式RGB CMYK其他工具图层:文字图层 图像图层 智能对象栅格化:接触智能对象的像素保护蒙版普通蒙版 剪切蒙版 alt+两图层间单击混合选项图层文字部分右键 镂空、不透明度……图层混合小结:魔棒 色彩容差抠图 ctrl+J练习:bezier.method.ac小结: