[SSM]MyBatis常用技巧和参数处理

news2024/11/25 5:42:45

目录

八、MyBatis小技巧

8.1#{}和${}

8.2别名机制:typeAliases

8.3mappers

​编辑

8.4IDEA配置文件模板

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

九、MyBatis参数处理

9.1单个简单参数类型

9.2Map参数

9.3实体类参数

9.4多参数

9.5@Param注解(命名参数)

9.6@Param源码分析


八、MyBatis小技巧

8.1#{}和${}

#{}和${}的区别

  • #{}:底层使用PreparedStatement。特点:先进行SQL语句的编译,然后给SQL语句的占位符?传值,可以避免SQL注入的风险。

  • ${}:底层使用Statement。特点:先进行SQL语句的拼接,然后再对SQL语句进行编译。存在SQL注入的风险。

  • 如果需要SQL语句的关键字放入SQL语句中,只用使用${},因为#{}是以值的形式放到SQL语句当中的。例如:

select id,
        car_num      as carNum,
        brand,
        guide_price  as guidePrice,
        produce_time as produceTime,
        car_type     as carType
 from t_car
 order by produce_time ${AscOrDesc};

拼接表名

  • 业务背景:实际开发中,有的表数据量非常庞大,可能会采用分表方式进行存储,比如每天生成一张表,表的名字与日期挂钩,例如:2022年8⽉1⽇⽣成的表:t_log_20220801。

  • 使用#{}:select * from 't_log_20220801'

  • 使用${}:select * from t_log_20220801

  • 正确形式:

    <select id="selectAllByTable" resultType="com.hhb.pojo.Log">
        select * from t_log_${date}
    </select>

批量删除

  • 对应的sql语句:

    • delete from t_car where id=1 or id=2 or id=3;
    • delete from t_car where id in(1,2,3)
  • 使用#{}:delete from t_car where id in('1,2,3');

    • 执行错误:1292 - Truncated incorrect DOUBLE value: '1,2,3'

  • 使用${}:delete from t_user where id in(1, 2, 3);

  • delete from t_car where id in(${ids})

模糊查询:like

  • 对应的sql语句:

    • select * from t_car where brand like '%奔驰%';
  • 第一张方案:

    • '%${brand}%'
  • 第二种方案:concat函数,这个是mysql数据库中的一个函数,专门进行字符串拼接

    • concat('%',#{brand},'%')
  • 第三种方案:

    • concat('%','${brand}','%')
  • 第四种方案:常用

    • "%"#{brand}"%"

8.2别名机制:typeAliases

<typeAliases>
    <!--别名自己指定的-->
    <typeAlias type="com.powernode.mybatis.pojo.Car" alias="aaa"/>
    <typeAlias type="com.powernode.mybatis.pojo.Log" alias="bbb"/>
​
    <!--采用默认的别名机制-->
    <typeAlias type="com.powernode.mybatis.pojo.Car"/>
    <typeAlias type="com.powernode.mybatis.pojo.Log"/>
​
    <!--包下所有的类自动起别名。使用简名作为别名。-->
    <package name="com.powernode.mybatis.pojo"/>
</typeAliases>
所有别名不区分大小写。
namespace不能使用别名机制。

8.3mappers

resource

<mapper resource="CarMapper.xml"/>

这种方式是从类的根路径下开始查找资源,要求类的根路径下必须有:CarMapper.xml。

url

<mapper url="file:///d:/CarMapper.xml"/>

这种方式是一种绝对路径的方式,这种方式不要求配置文件必须放到类路径当中,哪里都行,只要提供一个绝对路径就行,这种方式极少使用,因为移植性太差。

class

<mapper class="com.hhb.mapper.CarMapper"/>
  • 这种方式class中提供的是mapper接口的全限定接口名,必须带有包名。

  • 使用这种方式的前提:CarMapper.xml文件的位置不能随便放,必须和CarMapper接口放在一起,XML文件的名字必须和接口一致。

<package name="com.hhb.mapper"/>
  • 这种方式是实际开发中使用的。

  • 使用这种方式的前提:CarMapper.xml文件的位置不能随便放,必须和CarMapper接口放在一起,XML文件的名字必须和接口一致。

  • 注意:在IDEA的resources目录下新建多重目录的话,必须这样创建:com/hhb/mapper,不能这样创建:com.hhb.mapper

8.4IDEA配置文件模板

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

 

 

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

<insert id="insertCarUseGeneratedKeys" useGeneratedKeys="true" keyProperty="id">
        insert into t_car values(null,#{carNum},#{brand},#{guidePrice},#{produceTime},#{carType})
    </insert>
  • useGeneratedKeys="true":使用自动生成的主键值

  • keyProperty="id":指定主键值赋给对象的哪个属性,这个就表示将主键值赋值给Car对象的id属性。

九、MyBatis参数处理

9.1单个简单参数类型

  • 简单类型包括:

    • byte short int long float double char

    • Byte Short Integer Long Float Double Character

    • String

    • java.util.Date

    • java.sql.Date

<select id="selectByName" resultType="student" parameterType="java.lang.String">
 select * from t_student where name = #{name, javaType=String, jdbcType=VARCHAR}
</select>
  • sql语句中的javaType,jdbcType,parameterType属性都是用来帮助mybatis进行类型确定的,不过这些配置多数是可以省略的,因为mybatis它有强大的自动类型推断机制。

  • 如果参数只有一个的话,#{}里面的内容可以随便写。

9.2Map参数

  • 需求:插⼊⼀条Student数据

StudentMapper.xml

<!--<insert id="insertStudentByMap" parameterType="map">-->
<insert id="insertStudentByMap">
    insert into t_student(id, name, age, height, birth, sex)
    values (null, #{姓名}, #{年龄}, #{身高}, #{日期}, #{性别});
</insert>

StudentMapperTest

 @Test
    public void testInsertStudentByMap() {
        SqlSession sqlSession = SqlSessionUtil.openSession();
        StudentMapper mapper = sqlSession.getMapper(StudentMapper.class);
        Map<String, Object> map = new HashMap<>();
        map.put("姓名","赵云");
        map.put("年龄",25);
        map.put("身高",186.0);
        map.put("日期",new Date());
        map.put("性别","男");
        int count = mapper.insertStudentByMap(map);
        System.out.println(count);
        sqlSession.commit();
        sqlSession.close();
    }
  • sql语句中的javaType,jdbcType,parameterType属性可以省略。

  • insert语句中的value值必须是map中的key值。

9.3实体类参数

  • 需求:插⼊⼀条Student数据

StudentMapper.xml

<!--<insert id="insertStudentByPojo" parameterType="student">-->
    <insert id="insertStudentByPojo">
        insert into t_student(id, name, age, height, birth, sex)
        values (null, #{name}, #{age}, #{height}, #{birth}, #{sex});
    </insert>

StudentMapperTest

 @Test
    public void testInsertStudentByPojo() {
        SqlSession sqlSession = SqlSessionUtil.openSession();
        StudentMapper mapper = sqlSession.getMapper(StudentMapper.class);
        Student student = new Student(null, "刘备", 36, 180.0, new Date(), '男');
        int count = mapper.insertStudentByPojo(student);
        System.out.println(count);
        sqlSession.commit();
        sqlSession.close();
    }
  • sql语句中的javaType,jdbcType,parameterType属性可以省略。

9.4多参数

  • 需求:根据学生姓名和性别进行查询

StudentMapper.xml

    <select id="selectByNameAndSex" resultType="student">
        select *
        from t_student
        where name = #{arg0}
          and sex = #{arg1};
    </select>
  • 这是多参数,mybatis框架会自动创建一个map集合,并且将map集合以如下方式存储:

    map.put("arg0", name);
    map.put("arg1", sex);
    map.put("param1", name);
    map.put("param2", sex);
  • 低版本的mybatis中,使用的是:#{0}和#{1}...

  • 高版本的mybatis中,使用的是:#{arg0}和#{arg1}...或者:#{param1}和#{param2}...两者可以混合使用。

StudentMapperTest

    @Test
    public void testSelectByNameAndSex() {
        SqlSession sqlSession = SqlSessionUtil.openSession();
        StudentMapper mapper = sqlSession.getMapper(StudentMapper.class);
        List<Student> students = mapper.selectByNameAndSex("张三", "男");
        students.forEach(student -> System.out.println(student));
        sqlSession.commit();
        sqlSession.close();
    }

9.5@Param注解(命名参数)

  • 需求:根据学生姓名和性别进行查询。

  • 使用@param注解增强可读性。

StudentMapper

 List<Student> selectByNameAndSex2(@Param("name") String name, @Param("age") Character sex);
  • 核心:@Param("这里填写的其实是map集合的key")。

StudentMapper.xml

    <select id="selectByNameAndSex2" resultType="student">
        select *
        from t_student
        where name = #{name}
          and sex = #{sex};
    </select>

9.6@Param源码分析

 

 

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

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

相关文章

面向对象五大基本原则

面向对象五大基本原则 更多精彩 先案例后讲解&#xff0c;这里是代码教父&#xff0c;今天讲解面向对象的五大基本原则&#xff1a; 单一职责原则&#xff08;The Single Responsibility Principle&#xff09;开闭原则&#xff08;The Open-Closed Principle&#xff09;里氏…

javassit 01

Javassist&#xff1a; Javassist是一个开源的分析、编辑和创建Java字节码的类库。是由东京工业大学的数学和计算机科学系的 Shigeru Chiba &#xff08;千叶 滋&#xff09;所创建的。它已加入了开放源代码JBoss 应用服务器项目&#xff0c;通过使用Javassist对字节码操作为JB…

Java SSM 重制版(三)SpringSecurity

SpringSecurity 基于Spring6的重制版&#xff0c;截止目前&#xff0c;最新的版本是6.1.1版本。 前置课程&#xff1a;《Spring核心内容》《SpringMvc》《JavaWeb》《Java9-17新特性》 安全是开发者永远绕不开的话题&#xff0c;一个不安全的网站&#xff0c;往往存在着各种…

主机与虚拟机ubuntu网络无法ping通问题

一. 主机与虚拟机无法ping通问题 在嵌入式开发中&#xff0c;经过会涉及网络方面的问题。最常用到的是开发板在 虚拟机&#xff08;ubuntu&#xff09;通过NFS服务挂载到ubuntu中&#xff0c;这里就涉及网络是否可以ping通问题。 开发板 ping 通 ubuntu虚拟机系统的前提&…

基于matlab使用视频和深度学习进行手势识别(附源码)

一、前言 此示例首先演示如何使用预训练的SlowFast视频分类器执行手势识别&#xff0c;然后演示如何使用迁移学习在自定义手势识别数据集上训练分类器。 基于视觉的人类手势识别涉及使用一组视频帧预测手势&#xff0c;例如挥手打招呼、手语手势或鼓掌。手势识别的一个吸引人…

启动失败之源发行版 17 需要目标发行版 17

一、java: 警告: 源发行版 17 需要目标发行版 17 1.1.原因 :JDK 版本不对。 这里可以看到&#xff0c;项目需要的是JDK17&#xff0c;而我这里用的是JDK1.8。 1.2.修改 这里有两种操作&#xff0c;一种是修改项目版本&#xff0c;一种是修改JDK版本。无论是哪一种&#xff0…

CentOS7使用ping命令测试主机或者外部网络不通(已解决)

CentOS7使用ping命令测试主机或外部网路显示“目标主机不可达”或者其他原因失败。 说明 当尝试了所有修改配置&#xff0c;关闭防火墙等操作之后&#xff0c;还是没有成功的条件下。 查看计算机中的VMware相关的服务是否打开。 此电脑–右击–管理–服务与应用程序–服务 …

【小吉带你学Git】Git命令(用户签名,本地库,暂存区,文件,版本 等命令)

&#x1f38a;专栏【Git】 &#x1f354;喜欢的诗句&#xff1a;更喜岷山千里雪 三军过后尽开颜。 &#x1f386;音乐分享【如愿】 &#x1f33a;欢迎并且感谢大家指出小吉的问题&#x1f970; 文章目录 &#x1f354;设置用户签名⭐命令⭐如何在Windows上面查看自己的签名 &am…

eNSP-静态路由表的配置

eNSP-静态路由表的配置 文章目录 eNSP-静态路由表的配置一、拓扑结构二、关键语句三、完整代码四、测试验证 一、拓扑结构 二、关键语句 ip route-static x.x.x.x y z.z.z.z 语法&#xff1a;目标网段 掩码 下一跳 例如 PC1所在网段访问PC2所在网段 在AR1中输入 ip route-st…

scratch 鼠标控制角色移动

scratch 鼠标控制角色 本程序使用鼠标操作“机器人”角色跟随鼠标&#xff0c;距离较小时暂停移动&#xff1b;“小狗”角色连续在随机位置生成、水平移动、碰到边缘反弹、碰到“机器人”角色时删除。 目前scratch程序的制作已经告一段落了&#xff0c;进一步开发需要更多规划…

Redis【实战篇】---- 达人探店

Redis【实战篇】---- 达人探店 1. 达人探店 - 发布探店笔记2. 达人探店 - 查看探店笔记3. 达人探店 - 点赞功能4. 达人探店 - 点赞排行榜 1. 达人探店 - 发布探店笔记 发布探店笔记 探店笔记类似点评网站的评价&#xff0c;往往是图文结合。对应的表有两个&#xff1a; tb_bl…

集成算法概述

集成算法的基本思想&#xff1a;训练时用多种分类器一起完成同一份任务。 测试时对待测试样本分别通过不同的分类器&#xff0c;汇总最后的结果。投票方式&#xff0c;可分为软投票和硬投票。 集成算法一般有三种&#xff0c;分别是Bagging模型、Boosting模型和Stacking模型。 …

微前端(拆分和细化,整合历史系统)

接入微前端 项目背景说明 假如我们完成了基于Vue2的项目&#xff0c;假设另外一个团队的小伙伴来实现前台可视化部分&#xff0c;他们使用的是最新的Vue3技术栈&#xff0c;现在有一个需求&#xff0c;他们的前台项目想直接使用我们的登录功能&#xff0c;获得token&#xff…

使用Thread和队列Queue实现线程池复用线程

线程池实现 线程池是一个线程管理技术&#xff0c;创建一个或者多个线程进行管理&#xff0c;避免线程的创建和销毁带来的开销线程过多会带来调度开销&#xff0c;进而影响缓存局部性和整体性能。而线程池维护着多个线程&#xff0c;等待着监督管理者分配可并发执行的任务。这…

【BUG历险记】vivado报错:binding vhdl entity ‘ xxxxx ‘does not have port ‘ xxxxx ‘解决方案

&#x1f3d4;【BUG历险记】vivado报错&#xff1a;binding vhdl entity xxxxx does not have port xxxxx 解决方案 问题描述 我在编写雷达的脉冲压缩仿真时&#xff0c;先例化了FFT和复数乘法器&#xff0c;并仿真验证通过了&#xff1b;再例化IFFT&#xff0c;结果仿真时…

可信区块链运行监测服务平台(TBM)正式发布

6月29日&#xff0c;“Web3.0信任科技大会”于长沙开幕&#xff0c;大会由长沙市人民政府、中国信息通信研究院、中国通信标准化协会联合主办&#xff0c;长沙市委网络安全和信息化委员会办公室、长沙市工业和信息化局、长沙经济技术开发区管理委员会、可信区块链推进计划和中国…

leetcode周赛352

leetcode周赛352 1. 最长奇偶子数组 思路分析 这是一道变形的双指针题目我们可以使用相关算法模板基础上来书写左边界&#xff1a;偶数&#xff0c;且小于值threshold;所以我们需要寻找符合要求的左边界判断是否奇偶相间&#xff1a;只有 奇数偶数奇数 class Solution {static…

国产MCU-CW32F030开发学习--移植rtthread-nano

国产MCU-CW32F030开发学习–移植rtthread-nano 硬件平台 CW32_48F大学计划板CW32_IOT_EVA物联网开发评估套件 RT-Thread Nano RT-Thread Nano 是一个极简版的硬实时内核&#xff0c;它是由 C 语言开发&#xff0c;采用面向对象的编程思维&#xff0c;具有良好的代码风格&…

git clone 丢东西

1. git clone 丢东西 使用git clone https://gitee.com/123456789/123456789.git 克隆gitee 远程库上的代码发现少了一部分&#xff0c;只克隆了一部分下来&#xff0c;反复删除重新克隆都是一样的结果 2. 克隆下来后的文件&#xff0c;该目录下只有5 个文件&#xff0c;少了…

一文读懂北斗三号短报文!通信频度、电文长度、北斗民用智能卡申请、典型终端全面介绍

一、北斗短报文概述 北斗卫星导航系统&#xff08;Beidou Navigation Satellite System&#xff09;是中国自主研发和建设的全球卫星导航系统。该系统由一系列卫星、地面监控站和用户终端组成&#xff0c;旨在提供高精度、高可靠性的定位、导航和授时服务。北斗卫星导航系统的发…