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

目录

八、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 carTypefrom t_carorder 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

 @Testpublic 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

 @Testpublic 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_studentwhere 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

    @Testpublic 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_studentwhere name = #{name}and sex = #{sex};</select>

9.6@Param源码分析

 

 

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

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

相关文章

封装一个类似微信通讯录带有字母检索功能的vue组件

这里我们直接使用scrollIntoView方法 该方法将调用它的元素滚动到浏览器窗口的可见区域 语法 element.scrollIntoView&#xff08;&#xff09;; // 等同于element.scrollIntoView(true) element.scrollIntoView&#xff08;alignToTop&#xff09;; //布尔参数 element.scro…

编译Android平台的OpenCV库并启用OpenCL及Contrib

1.下载好OpenCV与OpenCV_Contirb 版本: 4.7 编译主机系统: Ubuntu 20.04 LTS 准备环境与工具: ANDRIOD SDK 与 NDK ,CMAKE ,NINJA ,GCC,G++ ,MAKE 开始编译: ../opencv/platforms/android/build_sdk.py --extra_modules_path=../opencv_contrib/modules --no_samples_bu…

想知道好用的音频翻译软件有哪些?

随着全球化进程的加速和语言交流需求的增长&#xff0c;音频翻译软件正日益受到关注和应用。这样的软件以其高效、准确的翻译能力以及广泛的应用场景赢得了青睐。音频翻译软件具备诸多优势&#xff0c;如通过语音输入实时转化为文字输出&#xff0c;提供了便捷的写作工具&#…

1.监控分布式--zabbix

文章目录 监控分布式-zabbix、prometheus概念工作原理功能组件部署zabbix安装Nginx和PHP环境部署数据库编码安装zabbix编译安装zabbix server客户端安装zabbix agent服务 监控分布式-zabbix、prometheus 利用一个优秀的监控软件&#xff0c;我们可以: 通过一个友好的界面进行…

CTP WEB 100练(1/100)

考点&#xff1a;PHP代码审计 抓包发现source.php&#xff0c;访问下&#xff0c;出现了php代码 代码主体在这部分&#xff0c;满足三个条件&#xff1a;file不为空&file是字符串&checkFile通过 if (! empty($_REQUEST[file])&& is_string($_REQUEST[file])&am…

CentOS Linux的最佳替代方案(一)_Rocky Linux OS 8.6基础安装教程

CentOS Linux的最佳替代方案&#xff08;一&#xff09;_Rocky Linux OS 8.6基础安装教程 一 Rocky Linux介绍和发展历史 Rocky Linux 官网&#xff1a;https://rockylinux.org/ 在CentOS官方宣布停止Centos的维护之后&#xff0c;Centos的创始人Gregory Kurtzer宣布启动新的…

eNSP的使用

目录 配置路由器 DHCP——动态主机配置协议 工作过程&#xff1a; 第一种场景——PC首次获取IP地址的情况 第二种场景——pc&#xff08;客户都&#xff09;再次获取IP地址的情况 DHCP配置&#xff1a; Telnet 搭建好图后 1.看广播域&#xff08;路由器有几个接口就有几…

苹果开发者账号续费流程及苹果开发者账号续费流程及下架处理

已上架的App在AppStore上无法搜索到的问题 在AppStore上搜不到已经上架的应用程序可以采取以下解决办法&#xff1a; 拨打iTunes提供的支持电话&#xff1a;4006-701-855&#xff08;中国时间9:00-17:00&#xff09;。发送邮件给Review团队&#xff0c;在iTunes Connect登录后…

【ARM】-进入和退出异常中断的过程

文章目录 ARM 处理器对异常中断的响应过程从异常中断处理程序中返回 ARM 处理器对异常中断的响应过程 ARM 指令为三级流水线&#xff1a;取地&#xff0c;译码和执行 进入中断的时候 LR PC -4 当出现异常时&#xff0c;ARM 内核自动执行以下操作 将 cpsr 寄存器的值保存到…

vue 访问第三方 跨域, 配置vue.config.js

目录 0 config 文件被修改 一个要重启vscode 配置文件才会生效 1 第一种 (有两种写法) 1.1 配置vue.config.js 1.2 axios 使用 1.3 终端打印 2 第二种方法 --> 错误 --> 没有运行成功 2.1 配置vue.config.js --> 就是api 不被设置成 替换为 / 2.2 axios 使用…

chatGPT如何开启 Browsing 功能,实现即时联网查询?

Openai 为每一个 chatGPT Plus 用户都开放了 Browsing 和 plugins 功能。 前者可以在 ChatGPT 觉得有必要的时候&#xff08;比如你问它今天的新闻&#xff09;&#xff0c;自动联网查询&#xff0c;后者是第三方开发者开发的插件&#xff0c;数量繁多&#xff0c;可以解决各种…

防火墙基本原理详解

概要 防火墙是可信和不可信网络之间的一道屏障&#xff0c;通常用在LAN和WAN之间。它通常放置在转发路径中&#xff0c;目的是让所有数据包都必须由防火墙检查&#xff0c;然后根据策略来决定是丢弃或允许这些数据包通过。例如&#xff1a; 如上图&#xff0c;LAN有一台主机和一…