Spring学习笔记(七):MyBatis映射器+动态SQL个人文章

注意顺序不能颠倒,否则启动时会发生异常。

MyBatis的映射器由一个接口加上XML映射文件组成,是最复杂的组件,映射文件常用元素如下:

下面先来看一下最常用的其中id是唯一标识符,接受一个Integer,返回com.pojo.User对象,结果集自动映射到com.pojo.User中。

常用属性如下:

并修改UserDao,添加一个selectById方法:

UserselectById(Integerid);可以直接测试了:

@TestpublicvoidselectById(){System.out.println(dao.selectById(1));}下面来看一下如何传递多个参数。

有了最基本的select后,传递id这种单一参数很容易,但是实际情况中很多时候需要传递多个参数,MyBatis中传递多个参数有两种方式:

可以使用Map传递多个参数,示例参数名name以及age是Map的键。

接着在UserDao下添加:

UserselectByMap(Mapmap);然后在主类中使用Map添加键值对:

@TestpublicvoidselectByMap(){Mapmap=newHashMap<>();map.put("name","111");map.put("age","33");System.out.println(dao.selectByMap(map));}这样就能传递多个参数进行查询了。

传递多个参数的另一种方法是利用JavaBean传递,创建一个POJO类:

@Getter@Setter@Builder@ToStringpublicclassUserPOJO{privateStringname;privateIntegerage;}修改UserDao接口方法:

publicUserselectByPOJO(UserPOJOuser)接着修改映射文件,实际上修改parameterType即可:

select*fromuserwherenamelikeconcat('%',#{name},'%')andage=#{age}注意访问传递的参数时直接使用POJO类的属性名即可,无须加上类似UserPOJO.的前缀。

最后进行测试:

@TestpublicvoidselectByPOJO(){UserPOJOpojo=UserPOJO.builder().age(33).name("111").build();System.out.println(dao.selectByPOJO(pojo));}3.2用于插入,大部分属性与类似,简单示例如下:

updateusersetname=#{name},age=#{age}whereid=#{id}deletefromuserwhereid=#{id}同理update/delete返回一个整数,表示操作影响的行数,因此设置UserDao接口如下:

intupdateUser(Useruser);intdeleteUser(Integerid);测试:

@TestpublicvoidupdateUser(){Useruser=User.builder().id(3).name("3333333").age((short)11).build();selectAll();System.out.println(dao.updateUser(user));selectAll();}@TestpublicvoiddeleteUser(){selectAll();System.out.println(dao.deleteUser(3));selectAll();}3.4用于定义SQL的一部分,以方便后面的SQL语句引用,比如:

id,name,ageselectfromuserUserDao接口:

ListselectBySqlColumn();测试:

@TestpublicvoidselectBySqlColumn(){System.out.println(dao.selectBySqlColumn());}4上面提高过,要强大,但是需要手动定义映射关系,一个常见的如下:

4.1使用Map查询SQL的结果可以使用Map/POJO存储,使用Map存储不需要手动编写,默认表属性名是键值对的键:

select*fromuser可用List来接收返回结果,一条记录映射到一个Map对象,Map中的key是select的字段名。

示例的UserDao方法如下:

List>selectReturnMap();其中Map类型为Map,测试方法如下:

@TestpublicvoidselectReturnMap(){dao.selectReturnMap().forEach(System.out::println);}4.2使用POJO如果使用POJO存储返回的对象时,需要先定义一个POJO类,可以在上面的UserPOJO基础上加上一个id属性:

@Getter@Setter@Builder@ToStringpublicclassUserPOJO{privateIntegerid;privateStringname;privateIntegerage;}接着编写映射文件:

其中property指定POJO的属性,column是表字段名,最后配合返回结果可以用List接收:

ListselectReturnPOJO();测试方法:

MyBatis支持一对一以及一对多级联,没有对多对多级联提供支持,但是可以用多个一对多级联实现多对多级联。下面分别来看一下。

一对一级联查询是最常见的级联查询,可以通过中的进行配置,通常使用的属性如下:

下面通过一个例子进行说明,例子分五步:

为了方便新增表以及数据都写在一起:

usetest;droptableifexistsidcard;droptableifexistsperson;createtableidcard(idint(10)primarykeyauto_increment,codechar(18)collateutf8mb4_unicode_cidefaultnull);createtableperson(idint(10)primarykey,namevarchar(20)collateutf8mb4_unicode_cidefaultnull,agesmallintdefaultnull,idcard_idint(10)defaultnull,keyidcard_id(idcard_id),constraintidcard_idforeignkey(idcard_id)referencesidcard(id));insertintoidcard(`code`)values('123456789123456789');insertintoperson(`id`,`name`,`age`,`idcard_id`)values(1,'111',22,1);5.1.2实体类@DatapublicclassIdCard{privateIntegerid;privateStringcode;}@DatapublicclassPerson{privateIntegerid;privateStringname;privateIntegerage;privateIdCardcard;}另外还需要创建一个映射结果的POJO类:

@DatapublicclassPersonPOJO{privateIntegerid;privateStringname;privateShortage;privateStringcode;}5.1.3映射文件映射文件分为两个:

首先是IdCardMapper.xml,加上一个中的resultMap指定该map的id即可。使用这种方法执行的是两次SQL:

最后再把结果整起起来,开启调试可以发现实际上也是执行了两条SQL:

而第二个中,在里面没有了select属性,直接将结果映射到SelectPersonById中,这是执行一条SQL语句的结果:

selectp.*,ic.codefrompersonp,idcardicwherep.idcard_id=ic.idandp.id=#{id}实际查询如下:

如果需要重要可以将其配置成,比如:

而最后一个

第二个类似,将查询的结果直接映射到Orders的属性上面。最后一种是直接使用连接查询。

publicinterfaceOrdersDao{ListselectOrdersById(Integerid);}publicinterfaceUserWithOrdersDao{UserWithOrdersselectUserOrders1(Integerid);UserWithOrdersselectUserOrders2(Integerid);ListselectUserOrders3(Integerid);}5.2.5测试@TestpublicvoidselectUserOrders(){System.out.println(dao.selectUserOrders1(1));System.out.println(dao.selectUserOrders2(1));System.out.println(dao.selectUserOrders3(1));}5.3多对多MyBaits其实不支持多对多级联,但是可以通过多个一对多级联实现,比如一个订单对应多个商品,一个商品对应多个订单,这样两者就是多对多级联关系,这样使用一个中间表,就可以转换为两个一对多关系。

下面同样通过五个步骤实现多对多级联。

需要订单表、商品表以及一个中间表,由于订单表Orders之前已创建,这里只需要创建两个表:

usetest;createtableproduct(idint(10)primarykeyauto_increment,namevarchar(10)collateutf8mb4_unicode_cidefaultnull,pricedoubledefaultnull);createtableorders_detail(idint(10)primarykeyauto_increment,orders_idint(10)defaultnull,product_idint(10)defaultnull,keyorders_id(orders_id),keyproduct_id(product_id),constraintorders_idforeignkey(orders_id)referencesorders(id),constraintproduct_idforeignkey(product_id)referencesproduct(id));insertintoproduct(`name`,`price`)values('product1',1.1),('product2',2.2),('product3',3.3);insertintoorders_detail(`orders_id`,`product_id`)values(1,1),(1,2),(1,3),(2,1),(2,3);5.3.2实体类订单类可以沿用之前的,只需要两个实体类:

publicinterfaceOrdersWithProductDao{ListselectOrdersAndProduct();}5.3.5测试@Testpublicvoidtest(){ApplicationContextcontext=newClassPathXmlApplicationContext("applicationContext.xml");OrdersWithProductDaodao=context.getBean(OrdersWithProductDao.class);System.out.println(dao.selectOrdersAndProduct());}6动态SQL最后来看一下动态SQL,动态SQL可以避免手动拼接SQL语句,比如在某些条件成立的情况下添加andxxx=xxxx之类的操作。先来看一下最常用的

类似Java中的if语句,最简单的例子如下:

select*fromuserwhere1=1andnamelikeconcat('%',#{name},'%')0">andage=#{age}也就是说当test中的条件成立时,便添加andxxx语句。注意test这个属性是必须的,不能省略。

(注这里用到了一个关键的1=1,仅作说明使用,实际开发请勿使用1=1进行拼接)

Dao接口:

ListselectByIf(Useruser);测试:

@TestpublicvoidtestIf(){System.out.println(dao.selectByIf(User.builder().age((short)33).name("111").build()));}6.2++类似Java中的switch语句:

当其中一个成立时,语句便结束,类似于自动加上了"break"。

示例:

select*fromuserwhere1=1andnamelikeconcat('%',#{name},'%')0">andage=#{age}andid!=3Dao接口:

ListselectByChoose(Useruser);测试:

@TestpublicvoidtestChoose(){System.out.println(dao.selectByChoose(User.builder().age((short)33).build()));}6.3主要功能:

这里是一个使用来实现的例子:

select*fromuserandnamelikeconcat('%',#{name},'%')Dao接口:

ListselectByTrim(Useruser);测试:

@TestpublicvoidtestTrim(){System.out.println(dao.selectByTrim(User.builder().build()));System.out.println(dao.selectByTrim(User.builder().name("test2").build()));}6.4最常用的就是拼接查询条件,比如有多个查询条件,仅仅使用多个的话会出现首个有一个多余的and的问题,而使用会进行智能处理,当然也对or适用,例子如下:

select*fromuserandnamelikeconcat('%',#{name},'%')0">andage=#{age}Dao接口:

ListselectByWhere(Useruser);测试:

@TestpublicvoidtestWhere(){System.out.println(dao.selectByWhere(User.builder().build()));System.out.println(dao.selectByWhere(User.builder().name("111").build()));System.out.println(dao.selectByWhere(User.builder().age((short)-3).build()));}6.5一般配合update语句使用,比如:

updateusername=#{name},0">age=#{age}whereid=#{id}Dao接口:

intupdateBySet(Useruser);测试:

@TestpublicvoidtestSet(){System.out.println(dao.updateBySet(User.builder().name("999999").age((short)39).id(1).build()));System.out.println(dao.selectByWhere(User.builder().build()));}6.6主要用于in中,可以认为是一个集合,典型的使用场景是selectxxxfromxxxwherexxxin

的主要属性有:

例子:

select*fromuserwhereidin#{item}Dao接口:

ListselectByForeach(Listid);测试:

@TestpublicvoidtestForeach(){System.out.println(dao.selectByForeach(List.of(1,2,3)));}6.7可用于对字符串进行拼接,对于字符串拼接,MySQL使用的是concat,而Oracle使用的是||,而MyBatis提供了可以屏蔽这种DBMS之间的差异,无需修改xml即可进行移植,例子如下:

select*fromuserwherenamelike#{new_name}Dao接口:

ListselectByBind(Useruser);测试:

@TestpublicvoidtestBind(){System.out.println(dao.selectByBind(User.builder().name("test1").build()));}

THE END
1.一对一,一对多,多对多三种关系简单理解一对多关系今天单位有个小朋友问起,一对一,一对多,多对多 这三种关系该怎么理解。 一、一对一的关系 简单的说这个东西是和你绑定的,你和它都是唯一的对应关系。 举例说明:你和你的身份证号,你和你的学生卡,你和银行卡 等等,这些关系都是一对一的关系。 https://blog.csdn.net/weixin_44793582/article/details/134457223
2.数据库一对多和多对一:有何不同?阿里云数据库在数据库设计中,一对多和多对一是常见的关系模式。虽然它们都涉及到两个实体之间的关联,但它们之间存在一些关键的区别。本文将探讨一对多和多对一的关系模式,并解释它们之间的差异。 一对多关系 一对多关系是指一个实体与另一个实体之间存在一对一的映射关系。在这种关系中,一个实体可以与多个其他实体相关联,而另一https://www.321.net/RDS_help/328440.html
3.Mybatis一对多查询列表属性处理示例详解java到此这篇关于Mybatis一对多查询列表属性处理的文章就介绍到这了,更多相关Mybatis一对多查询列表属性内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家! 您可能感兴趣的文章: MyBatis多对多一对多关系查询嵌套处理 Mybatis实现一对多映射处理 Mybatis实现一对一、一对多关联查询的方法(示例https://www.jb51.net/article/284240.htm
4.关于Leftjoin,你可能不知道这些腾讯云开发者社区一、left join 之后的记录有几条 关于这一点,是要理解left join执行的条件。在A join B的时候,我们在on语句里指定两表关联的键。只要是符合键值相等的,都会出现在结果中。这里面有一对一,一对多,多对多等几种情况。我们用例子来说明。 1.一对一 https://cloud.tencent.com/developer/article/1555171
5.多对多mysql多对多和一对多的区别一、什么是一对一、一对多、多对一及多对多关系(以简单的学生和老师的关系为例来说): 1、一对一:学生具有学号和姓名(假定没有同名的学生)这两个属性,那么我知道了学生的学号也就能找到对应的学生姓名,如果我找到了学生的姓名也就能够找到学生的学号,两者之间是一一对应的,即一对一。 2、一对多:以一个学生为https://blog.51cto.com/u_16099279/8572358
6.职业兴趣深度探索——利用HOLLAND职业兴趣测评找到适合自己的职业然而从学(专)业与职业的相关性来讲,它们并不都是一一对应的关系,而是呈现出一对一、一对多、多对多等非常复杂的相关关系。比如数控机床专业它所对应的职业最适合的也只有企业中数控机床的操作与维护,最后发展成为高级技师。烹饪专业在毕业后最合适的也只是成为一名厨师。同时又有些专业其职业方向比较宽泛,比如经济学https://www.jianshu.com/p/3edf589124f3
7.MySQL数据库设计(表之间的3种关联关系)表与表之间一般存在三种关系,即一对一,一对多,多对多关系。 下面分别就三种关系讲解数据库相关设计的思路和思考过程。 一、一对一关系 例如,下面的一张表,保存了人的相关信息,有男有女,要求查处所有的夫妻。 sql代码: CREATETABLEIFNOTEXISTSperson( idINTPRIMARYKEYAUTO_INCREMENT, snameVARCHAR(10), sexhttps://developer.aliyun.com/article/933879
8.mybatis基础系列(四)——关联查询延迟加载一级缓存与二级缓存上面我们已经知道使用association、collection可以实现一对一及一对多映射,association、collection还有另外一个延迟加载的功能。 延迟加载(lazy load)是关联对象默认的加载方式,延迟加载机制是为了避免一些无谓的性能开销而提出来的,所谓延迟加载就是当在真正需要数据的时候,才真正执行数据加载操作。 mybatis默认没有开启延迟加https://www.imooc.com/article/262388
9.分配成本控制范围和公司代码(SAP库公司代码到成本控制范围的分配必须根据公司在物流和会计核算方面的流程来进行。组织环境也十分重要。一旦进行了决策和分配,要更改成本控制范围和公司代码之间的一对一或一对多关系将十分困难,至少非常耗时。 公司代码和成本控制范围组织单位可通过多种方法进行组合。通过这些组合,可使用不同的结构来表示组织。 http://help.sap.com/doc/saphelp_erp60_sp/6.0/zh-CN/08/513f4b43b511d182b30000e829fbfe/content.htm
10.手机秒变全球对讲机——微喇蓝牙对讲按键测评在使用过程中 个人认为微喇通讯大致可分为一对多/多对多、一对一两种。 一对多/多对多 可以理解为群聊,这种模式可以和很多人进行通话,频道内所有用户都会收到你所发送的信息 一对一 可以理解为私聊,这种模式 适合个人点对点通讯,只有你们两个人的秘密. https://aikahao.xcar.com.cn/item/433097.html
11.使用TypeScript访问MySQL数据库数据库DeepakVohra搭建环境 创建项目 配置项目 创建实体 创建数据库连接,生成数据表 运行应用程序 查看数据表 使用Repository 添加数据 使用连接管理器查找实体 使用Repository 查找实体 更新数据 移除数据 创建一对一的关系 通过关系查找对象 创建一对多的关系 创建多对多的关系https://www.infoq.cn/article/MkWcQEJo5GE*17Sj2cg2
12.智能时代来临:课堂教学正在发生深刻变化构建优秀教师智慧共享空间,为学生提供优秀教师一对一、一对多辅导。进行区域教育供给侧结构性改革,着力解决目前学校教学难以满足学生个性化学习需求问题,实现线下与线上教学融合:线下教学主要解决教学的共性问题;而线上教学主要解决满足学生的个性化需求、精准化服务问题。 https://3w.huanqiu.com/a/e39907/9CaKrnKrQka
13.有偿开展“一对一““一对多”学科类校外培训,将被处10万元以下罚款9月12日,教育部发布了《校外培训行政处罚暂行办法》,对利用居民楼、酒店、咖啡厅等场所有偿组织开展“一对一”“一对多”等校外培训的自然人、法人或者其他组织变相开展学科类校外培训,将处5万元以下罚款,情节特别严重的,处5万元以上10万元以下罚款。 教育部校外教育培训监管司负责人就《办法》有关问题回答了记者提问https://www.xhby.net/content/s653aa739e4b0d7f4ebf1a738.html
14.空间数据库一对一关系 一对多关系 多对多关系 一对一关系:将表与表绑定 GIS 中的一对一关系是什么?将一个要素链接到表中的一个条目时,这是一种一对一的关系(1-1)。 GIS 的独特之处在于,一个表格与地理坐标联系在一起。例如,以下是德国三个城市的地理位置: https://www.osgeo.cn/post/1819e
15.一对一语音聊天源码,一对一视频直播app开发云豹一对一直播源码,2024版本更新上线!一款主打语音聊天和视频互动的私密付费社交系统,完全开源的程序源码,客户可根据自己的需求进行任意功能的二次开发,我们的专,业技术团队为每一位合作客户提供系统搭建部署服务,以及售后服务,保证客户的一对一直播系统稳定流畅的运行。 https://product.11467.com/info/6280039.htm
16.访惠聚创新建立“(1+1)+N”帮扶工作机制为村干部队伍“强筋自治区自然资源厅驻各村工作队针对党员意识差、作用发挥不明显、年龄老化等问题,建立工作队队员与村党员一对一、一对多帮扶机制,重点在加强学习、提高认识上面对面谈心、辅导,定期组织党员一同学习党的理论知识、学习法律法规。 2018年以来,各工作队组织开展党员帮带活动60余次,通过跟踪帮带、定向培养、定期谈心谈话、掌https://zrzyt.xinjiang.gov.cn/xjgtzy/hdxx/201902/5c90dd2c01e84f9f932f8cacdcc9a812.shtml
17.深圳市扶禾心理教育咨询顾问有限公司配套设施齐全,可供80学员同时进行一对一、一对多授课。 人身保险,半封闭式管理,统一食宿,安全设施配备齐全。 空调宿舍,每个宿舍配有两位生活老师24小时陪伴, 生活老师、心理老师、文化课老师和学生同吃同住,言传身教,境教陪伴。 学校安全设施和餐饮宿舍等符合标准,保证学生食宿安全。 https://www.meipian.cn/2beo9z40