【MyBatis】| MyBatis使用⼩技巧
创始人
2024-05-16 14:35:42
0

目录

一:MyBatis使用⼩技巧

1. #{}和${}

2. typeAliases

3. mappers

4. IDEA配置⽂件模板

5. 插⼊数据时获取⾃动⽣成的主键


一:MyBatis使用⼩技巧

1. #{}和${}

#{}:先编译sql语句,再给占位符传值,底层是PreparedStatement实现。可以防⽌sql注⼊,⽐较常⽤。

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

(1)定义接口CarMapper ,面向接口编程

package com.bjpowernode.mybatis.mapper;import com.bjpowernode.mybatis.pojo.Car;import java.util.*;public interface CarMapper {// 根据汽车类型查询List  selectByCarType(String carType);
}

(2)在CarMapper.xml文件中编写sql语句

注意:namespace是接口CarMapper的完整类名,id是接口对应的方法名



(3)编写测试类,看执行结果对比

package com.bjpowernode.mybatis.test;import com.bjpowernode.mybatis.mapper.CarMapper;
import com.bjpowernode.mybatis.pojo.Car;
import com.bjpowernode.mybatis.utils.SqlSessionUtils;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;import java.util.List;public class CarMapperTest {@Testpublic void testSelectByCarType(){SqlSession sqlSession = SqlSessionUtils.openSession();CarMapper mapper = sqlSession.getMapper(CarMapper.class);List cars = mapper.selectByCarType("燃油车");for (Car car :cars){// 会调toString方法System.out.println(car);}sqlSession.close();}
}

①使用#{}执行结果,能正常执行结果

特点:先执行SQL语句的编译,然后给SQL语句的占位符问号?传值

②使用${}执行结果,会抛出异常,直接拼接字符串但是没有引号

特点:先执行SQL语句的拼接,然后再对SQL语句进行编译

(4)#{}和${}的选择

注:如果需要SQL语句的关键字放到SQL语句中,只能使用${},因为#{}是以值的形式放到SQL语句当中;例如:升序或者降序排需要传asc或者desc,此时要把这个关键字传进去,就需要${}

①接口类中的方法

package com.bjpowernode.mybatis.mapper;
import com.bjpowernode.mybatis.pojo.Car;
import java.util.*;public interface CarMapper {// 根据汽车类型查询List  selectByCarType(String carType);// 查询所有的汽车信息,然后通过asc升序,desc降序List selectByAscOrDesc(String ascOrDesc);
}

②编写sql语句,根据传参按照produce_time升序或者降序



③编写测试程序

package com.bjpowernode.mybatis.test;import com.bjpowernode.mybatis.mapper.CarMapper;
import com.bjpowernode.mybatis.pojo.Car;
import com.bjpowernode.mybatis.utils.SqlSessionUtils;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;import java.util.List;public class CarMapperTest {@Testpublic void selectByAscOrDesc(){SqlSession sqlSession = SqlSessionUtils.openSession();CarMapper mapper = sqlSession.getMapper(CarMapper.class);List cars = mapper.selectByAscOrDesc("asc");for (Car car :cars){// 会调toString方法System.out.println(car);}sqlSession.close();}
}

使用#{},先编译在传值,传的是一个字符串,会有引号,明显不符合语法!

 使用${},先把关键字拼串上去,在进行编译,符合语法规则!

(5) 使用${}完成表名拼接

注:这里需要查询新的表名,所以需要编写新的PoJo类Log、新建配置文件LogMapper.xml、新建一个接口LogInterface、新建测试类LogMapperTest类进行测试、在核心配置文件mybatis-config.xml当中引入LogMapper.xml

①现实业务当中,可能会存在分表存储数据的情况,因为一张表存储数据的话,数据量太大,查询效率比较低。
②可以将这些数据有规律的分表存储,这样扫描的数据量变少了,在查询的时候效率就比较高。例如日志表:专门存储日志信息的,可以每天生成一个新表,每张表以当天日期作为名称,例如:t_log_20220901、t_log_20220902....
③假如想知道某一天的日志信息,假设今天是20230103,那么直接把日期传进去,完成“t_log_日期表”的拼接。




(6)使用${}完成批量删除

注:批量删除对应的sql语句有两种写法

第一种:使用or的形式,delete from t_user where id = 1 or id = 2 or id = 3;

第二种:使用in的形式,delete from t_user where id in(1, 2, 3);

①定义的方法中参数实际上是一个String类型的字符串,我们传参的时候,也是一个字符串传过去,例如:mapper.deleteBatch("1,2,3")的形式。

②关键是我们先拼串再编译,还是先编译在传值;前者是字符串的完美拼接,后者是直接把一个字符串传过去,会带有引号!

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

(7)使用${}完成模糊查询

需求:根据汽车品牌进行模糊查询
例如:select * from t_car where brand like '%奔驰%';

①如果使用"%#{brand}%",最终#{}底层肯定是转化为?,但是比较尴尬的是放到双引号或者单引号"?"的?是无法识别的,所以无法进行传值!

②解决方法1:使用"%${brand}%",会先进行拼串,然后在编译!

③解决方法2:concat函数,这个是mysql数据库当中的一个函数,专门进行字符串拼接,concat('%',#{brand},'%');这里也可以使用${band},外面加一个单引号,比较鸡肋,
concat('%','${brand}','%')。

④解决方法3:"%"#{brand}"%",把两个%用引号括起来,就能识别中间的?了,就能正常传值了。

2. typeAliases

使用 typeAliases标签完成别名机制!

(1)我们打开CarMapper.xml文件,发现resultType标签的全限定名称很长,包括我们以后写其它类型的查询语句,都要写这个带包的类名;所以就使用别名机制先定义别名。

 

(2)第一种:在核心配置文件mybatis-config.xml文件中使用typeAliases标签下的子标签typeAlias标签起别名。

注:namespace标签必须写全限定名称,是不能起别名的!

①type属性:指定给那个类型起别名

②alias:指定别名

    

③ 这样就能在CarMapper.xml文件中运用别名了,并且不区分大小写!

 

④实际上alias属性是可以省略的,有默认的别名,别名是类的简名;例如:com.bjpowernode.mybatis.pojo.Car对应的就是Car、car、cAr等等,不区分大小写。

(3)第二种:在核心配置文件mybatis-config.xml文件中使用typeAliases标签下的子标签package指定包名即可。(常用)

我们使用package标签指定一个包名,那么这个包下所有的类全部自动起别名,别名就是类简名,不区分大小写

    

 (4)小总结

所有别名不区分大小写;namespace不能使用别名机制!

    

3. mappers

(1)mapper标签的属性可以有三个:

①resource:这种方式是从类的根路径下开始查找资源;采用这种方式,配置文件需要放到类路径当中才行。
②url:这种方式是一种绝对路径的方式,这种方式不要求配置文件必须放到类路径当中,哪里都行,只要提供一个绝对路径就行;这种方式使用极少,因为移植性太差。
③class:这个位置提供的是mapper接口的全限定接口名,必须带有包名的。
例如:,class指定的是:com.powernode.mybatis.mapper.CarMapper,那么mybatis框架会自动去com/powernode/mybatis/mapper目录下查找CarMapper.xml文件。

注意:也就是说,如果采用这种方式,必须保证CarMapper.xml文件和CarMapper接口必须在同一个目录下,并且名字一致。如:CarMapper接口-> CarMapper.xml。

解释:所谓的同一个目录,是在resource目录下创建包名,并且这个包名与java下的CarMapper接口包名必须一致,然后把配置文件CarMapper.xml扔到包名里;实际上java和resource都是根目录,只不过两种展现形式!

解释:在resource下创建包,实际上是创建目录,因为只有在java下创建包才是"点"的形式,例如:com.bjpowernode就表示com目录下的bjpowernode目录;对于resource下创建包就是直接创建目录,例如:com/bjpowernode也表示com目录下的bjpowernode目录,如果采用com.bjpowernode就表示一个名为com.bjpowernode的目录。

  要求类的根路径下必须有:CarMapper.xml 要求在d:/下有CarMapper.xml文件 全限定接口名,带有包名

(2)假如有很多个接口名,要写很多个全限定接口名也很麻烦;实际上在mappers标签下还有一个package属性,用来指定包名,这种方式在开发中是比较常用的。

前提:XML文件必须和接口放在一起,并且名字一致!

解释:指定报名,实际上就是指定这个路径,在这个路径下查找配置文件。


4. IDEA配置⽂件模板

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

(1)准备好的mybatis-config.xml核心配置文件的模板



(2)准备好的SqlMapper.xml配置文件的模板




(3)步骤:File--->Settings--->Editor--->File and Code Templates

(4)使用:以后直接alt+insert就能找到这个模板

 (5)选定这个模板后,就会让你输出文件的名字,例如:mybatis-config 

(6)点击ok,就会自动生成我们自定义模板的核心配置文件mybatis-config.xml

5. 插⼊数据时获取⾃动⽣成的主键

(1)前面用的主键一直是自动生成的,所以我们并不知道主键是多少,要是下面这种业务,⼀个⽤户有多个⻆⾊,一对多,两张表,多的表加外键

 (2)插⼊⼀条新的记录之后,⾃动⽣成了主键,⽽这个主键需要在其他表中使⽤时;插⼊⼀个⽤户数据的同时需要给该⽤户分配⻆⾊:需要将⽣成的⽤户的id插⼊到⻆⾊表的user_id字段 上。

①第⼀种⽅式:可以先插⼊⽤户数据,再写⼀条查询语句获取id,然后再插⼊user_id字段。【⽐较麻烦】

②第⼆种⽅式:mybatis提供了⼀种⽅式更加便捷。

(3)主要是在插入数据时,使用两个属性

①useGeneratedKeys="true" 表示使用自动生成的主键值。
②keyProperty="id" 指定主键值赋值给对象的哪个属性,就表示将主键值赋值给Car对象的id属性。

insert into t_car values(null,#{carNum},#{brand},#{guidePrice},#{produceTime},#{carType})

(4)测试结果

①如果不加上这两个参数,打印结果主键显示null

 ②如果加上这两个参数,打印结果就会显示自动生成的主键

相关内容

热门资讯

安卓系统应用数据目录,揭秘系统... 你有没有想过,你的安卓手机里那些应用,它们的数据都藏在哪个角落呢?今天,就让我带你一探究竟,揭开安卓...
kindle 安卓 系统 刷机... 亲爱的读者们,你是不是也和我一样,对电子阅读设备情有独钟?尤其是那款小巧便携的Kindle,简直是阅...
平板 win 安卓 双系统,... 你有没有想过,拥有一台既能运行Windows系统,又能流畅使用安卓应用的多功能平板电脑,是不是能让你...
电脑安卓和苹果系统,电脑操作系... 你有没有发现,现在无论是工作还是娱乐,电脑已经成了我们生活中不可或缺的好伙伴呢!而在这众多电脑中,安...
手机安卓系统下载5.0,引领智... 你有没有发现,最近手机界又掀起了一股热潮?没错,就是安卓系统5.0的下载。这可是安卓家族里的一大亮点...
小森生活系统安卓,打造绿色生态... 你知道吗?最近在手机应用市场上,有个叫做“小森生活系统安卓”的新玩意儿火得一塌糊涂。它就像一个神奇的...
王者荣耀安卓系统更换,畅享全新... 最近是不是发现你的王者荣耀游戏体验有点不对劲?别急,让我来给你揭秘一下安卓系统更换背后的那些事儿!一...
ios系统数据如何导入安卓系统... 你是不是也有过这样的经历:手机里存满了珍贵的照片、视频和联系人,突然有一天,你决定换一台安卓手机,却...
王者荣耀启动安卓系统,畅享指尖... 你知道吗?最近王者荣耀可是大动作连连,竟然宣布要启动安卓系统了!这消息一出,瞬间在游戏圈引起了不小的...
安卓始终显示系统栏,安卓系统栏... 你是不是也遇到了这个问题?手机屏幕上那个讨厌的系统栏,有时候它就像一个顽皮的小鬼,总是赖在你的屏幕上...
苹果系统可以装在安卓,探索跨平... 你知道吗?最近在科技圈里可是掀起了一股热潮呢!那就是——苹果系统竟然可以装在安卓设备上!是不是听起来...
安卓系统双清目的,安卓系统双清... 你知道吗?最近在安卓系统圈子里,有个话题可是热得不得了,那就是“双清”。别小看这个“双清”,它可是关...
安卓系统台电平板,畅享智能生活... 你有没有发现,最近身边的朋友都开始讨论起一款叫做台电的安卓系统平板电脑呢?这可不是随便说说,这款平板...
三菱安卓系统,智能科技与驾驶体... 亲爱的读者,你是否曾好奇过,那些在我们生活中默默无闻的汽车品牌,它们是如何将科技与驾驶体验完美结合的...
安卓系统为什么好,引领智能生活... 你有没有发现,身边的朋友、同事,甚至家人,几乎人手一台安卓手机?这可不是偶然现象哦!安卓系统,这个来...
安卓如何改键盘系统,Andro... 你是不是也和我一样,对安卓手机的键盘系统有点儿不满意?想要换一个更顺手的键盘,但又不知道怎么操作?别...
怎么升级安卓14系统,解锁安卓... 你有没有发现,你的安卓手机最近是不是有点儿慢吞吞的?别急,别急,升级到安卓14系统,让你的手机焕发新...
安卓手机如何系统内录,轻松生成... 你有没有想过,有时候想要记录下手机里的精彩瞬间,却发现没有合适的工具?别急,今天就来教你怎么在安卓手...
最绚丽的安卓系统,最绚丽版本全... 哇,你知道吗?在安卓的世界里,有一款系统,它就像是一颗璀璨的明珠,闪耀着最绚丽的色彩。它就是——最绚...
小米系统安卓通知权限,深度解析... 亲爱的手机控们,你是否曾为手机通知栏里乱糟糟的信息而烦恼?又或者,你是否好奇过,为什么有些应用总是能...