来源:iyu77.blog.csdn.net/article/details/125761737MyBatis对JDBC通过Mapper代理的方式进行了封装。通过“属性和字段映射”,可以轻松解决以往繁琐的操作。MyBatis的动态SQL完美展现了DBMS的独特魅力1.多条件查询基于Mybatis的多条件查询,就是将原始SQL写在Mapper代理的映射文件中,然后在界面,就像这样:与原来的JDBC集相比,通过MyBatis确实解决了很多硬编码的问题,但是用户的查询始终是动态操作。他可能会在多个条件中选择少量的条件进行查询。我们的SQL是死的,而用户需要对应的SQL是活跃的,会造成不匹配,造成语法错误。比如根据这个表,如果我们想根据一些字段去查全,就可以写出需求对应的SQL,但是如果我的查询条件是少了还是多了呢?如果用户只想按一个条件查询,那么如果他不输入其他占位符,它将变为空。如果他不能通过语法,他自然无法检查,他不得不重写SQL。这是何等的麻烦。这时,MyBatis的特性就体现出来了———动态SQL2.动态SQL和SQL语句会随着用户的输入或外部条件的变化而变化,称为动态SQL1。if-where是Mapper代理开发的,我们可以以xml的形式编写我们的SQL和动态SQL的特性也是在这一招中诞生的。在原来的Mapper文件中,我们做了如下改造,让普通的SQL看起来焕然一新:>andSTATUS=#{STATUS}andcompany_namelike#{companyName}andbracd_namelike#{bracdName}"可以自动去掉标签对于我们and”,这样无论查询条件如何变化,如果我按照这个逻辑流程,就不会出现导致查询失败的SQL语法错误,因为null的情况已经被if过滤掉了,which真是太神奇了!推荐一个开源免费的SpringBoot最全教程:https://github.com/javastacks...2.choose-when-orwise可以实现动态选择单条件:在MyBatisMapper代理中,相当于switch,等同于caseselect*frommybatiswhereSTATUS=#{STATUS}company_namelike#{companyName}bracd_namelike#{bracdName}当>1=1不同于多条件查询,SQL语句中只有一条分支生效。写1=1让语法有效,否则如果选择条件,则返回正常结果3.foreach对于批量删除场景,传统的方法是使用in关键字结合占位符来判断,像这样whereidin(?,?,?)但是对于动态的场景,批次的个数总是不确定的,这就导致需要在SQL中改变占位符的个数,又是一个麻烦PS:MyBatis将array参数封装成一个地图集。默认情况下(K-V)array=array,下面使用@Param注解来改变map集合中的默认key。所以MyBatis中的解决了这个麻烦:本质是通过遍历的形式,批量通过id数组或者集合来确定要删除的数据。collection属性确定要遍历的数组/集合。item属性用于存储选中的元素并将其放在占位符中。separator属性表示分隔符deletefrpmmybatiswhereidin#{id};有人会问为什么这里只有一个#{id},而我的属性字段不止一个?这个id不是另一个id,是一个array/set3.多表操作多个表之间的关系是一对一,一对多,多对一,多对多,其中每一个都有建表的原理,以用户-订单模型为例。使用传统的方式进行多表查询无非就是通过id连接表,然后将返回的结果进行打包。在MyBatis中也是如此。我们在Mapper文件中写入表字段之间的映射关系,并定义类型,但是这个过程有点复杂,但是经过一次配置,可以大大减少硬编码问题,提高效率1.一对一用户有命令的话,首先要做的就是构建实体类,写接口方法,配置Mapper文件。多表操作的问题出在配置文件上。我这里举例详细说明一下:1.先写表CREATETABLEorders(idINTPRIMARYKEY,ordertimeVARCHAR(20)NOTNULLDEFAULT'',totalDOUBLE,uidINT);INSERTINTOordersVALUES(1,2020,2000,1);INSERTINTOordersVALUES(2,2021,3000,2);INSERTINTOordersVALUES(3,2022,4000,3);CREATETABLEUSER(idINTPRIMARYKEY,usernameVARCHAR(50)NOTNULLDEFAULT'',passwordsVARCHAR(50)NOTNULLDEFAULT'');插入用户值(1,'lyy',333);插入用户值(2,'myy',444);插入用户值(3,'xyy',555);2.编写Mapper配置文件,编写实体类将一个实体写入另一个实体的属性时,体现的是关联,比如“订单归用户所有”。正是因为这个关系,我们才会在order实体类中写privateUser用户;这个属性,让根据id连接的两个实体可以完美连接!就像这样:通过连接两个表对应的实体类,但是主键ID需要在当前实体(order)中使用单独的标签属性:属性名(privateUseruser)javaType:当前实体(属性的类型(User)在order中)这两个user本质上是不同的,就好像前者是在一个人的名字里,后者是被调用的人一样。MyBatis似乎利用了这个特性。两个实体以标签的形式连接SELECT*,o.idoidFROM命令o,USERuWHEREo.uid=u.idSQL链接和原来没有什么区别,同样通过resultMap封装了字段和属性映射2.一对多一个用户有多个订单首先添加一个privateListorderList;给原来的User实体表示“用户有哪些订单”privateListorderList;,目的是将订单的信息封装到用户这个属性中,体现在Mapper文件中:property:集合名称,User实体中的orderlist属性ofType:当前集合中的数据类型,即orderentity然后写一对多的SQL:综上所述,相对于一对一,一对多只是在那个“一”里面加上封装“多”的属性,然后稍微调整一下SQL3。多对多用户多角色多对多建表的原理是引入一个中间表来维护外键,即一张表通过中间表查找另一张表。与一对多模型类似,先在User实体类中添加一个“用户有哪些角色”属性privateListroleList;其次,配置Mapper文件:多表的连接是基于中间表的,通过Mapper文件中的映射实现。具体来说,两个外观的id(userId和roleId)在id标签中配置为同一个属性,像这样:SQL链接必须使用多对多例程SELECT*FROMUSERu,user-roleur,rolerWHEREu.id=ur.userIdANDur.roleId=r.id回想一下,在进行多表操作时,MyBatis为我们带来了什么?它确实减少了很多硬编码。每次创建新SQL时,我只需要更改标签中的几个属性。只要我明确了字段和属性的映射关系,在MyBatis中进行多表操作就是一个“签到”4.注解开发对于简单的CRUD注解开发可以大大提高效率。顾名思义,就是在注解中写SQL。查询(@Select):添加(@Insert):修改(@Update):删除(@Delete):近期热点文章推荐:1.1,000+Java面试题及答案(2022最新版)2.厉害了!Java协程来了。..3.SpringBoot2.x教程,太全面了!4.不要用爆破爆满画面,试试装饰者模式,这才是优雅的方式!!5.《Java开发手册(嵩山版)》最新发布,赶快下载吧!感觉不错,别忘了点赞+转发!