mybatis级联查询list_MyBatis实践之动态SQL及关联查询

本文介绍了MyBatis的动态SQL功能,包括if、choose/when/otherwise、set和foreach元素的使用,并展示了如何进行级联查询,包括一对一、一对多和多对多的关联查询。此外,还探讨了MyBatis的延迟加载特性,以优化数据库性能。
摘要由CSDN通过智能技术生成

序言

MyBatis,大家都知道,半自动的ORM框架,原来叫ibatis,后来好像是10年apache软件基金组织把它托管给了goole code,就重新命名了MyBatis,功能相对以前更强大了。它相对全自动的持久层框架Hibernate,更加灵活,更轻量级,这点我还是深有体会的。

MyBatis的一个强大特性之一就是动态SQL能力了,能省去我们很多串联判断拼接SQL的痛苦,根据项目而定,在一定的场合下使用,能大大减少程序的代码量和复杂程度,不过还是不是过度太过复杂的使用,以免不利于后期的维护和扩展。

动态SQL

动态SQL提供了对SQL语句的灵活操作,通过表达式进行判断,对SQL进行拼接/组装.

if

对查询条件进行判断,如果输入参数不为空才进行查询条件的拼接.

mapper

SELECT * FROM user

AND id = #{id}

AND name = #{name}

AND password = #{password}

会自动处理第一个AND(MyBatis还提供了自定义行为的元素, 详细可参考MyBatis文档).

UserDAO

List selectUser(User user) throws Exception;

Client

@Test

public void selectUserClient() throws Exception {

UserDAO dao = session.getMapper(UserDAO.class);

User user = dao.selectUser(new User(null, null, "new_password"));

System.out.println(user);

}

由于id与name为null, 因此这两个条件不会拼接在SQL中,这一点可以调试时日志中看出.

choose/when/otherwise

有些时候,我们并不想用到所有的条件语句,而只想从中选择一二.针对这种情况,MyBatis提供了元素,他有点像Java中的switch.

SELECT * FROM user

AND id = #{id}

AND name = #{name}

AND password = #{password}

set

用于动态更新语句的解决方案为,set元素可以被用于动态包含需要更新的列, 而舍去其他的.

UPDATE user

name = #{name} ,

password = #{password} ,

WHERE id = #{id};

foreach

使用foreach可以实现向SQL中传递数组或List:

传入List

查询多个id的用户信息, 可以由下面两种SQL实现:

SELECT * FROM user WHERE (id = ? OR id = ? OR id = ?);

SELECT * FROM user WHERE id IN (?, ?, ?, ?);

因此其foreach的定义也有如下两种方案:

SELECT *

FROM user

id = #{id}

SELECT *

FROM user

#{id}

元素 描述

collection SQL解析的参数名

index 循环下标

item 单个元素的名

open 循环开始输出

close 循环结束输出

separator 中间分隔输出

传递List作为parameterType时,SQL解析参数名固定为list.

UserDAO

List selectUser(List ids) throws Exception;<

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值