Mybatis动态映射,这次终于搞明白了

@Repository

public interface UserMapper {

User selectUserById(@Param(“name”) String userName, @Param(“id”) Integer id);

}

UserService.java内容:

public interface UserService {

User selectUserById(String userName, Integer id);

}

UserServiceImpl.java内容:

import com.tian.mybatis.entity.User;

import com.tian.mybatis.mapper.UserMapper;

import com.tian.mybatis.service.UserService;

import org.springframework.stereotype.Service;

import javax.annotation.Resource;

@Service

public class UserServiceImpl implements UserService {

@Resource

private UserMapper userMapper;

@Override

public User selectUserById(String userName, Integer id) {

return userMapper.selectUserById(userName, id);

}

}

UserController.java内容:

import com.tian.mybatis.entity.User;

import com.tian.mybatis.service.UserService;

import org.springframework.web.bind.annotation.GetMapping;

import org.springframework.web.bind.annotation.RestController;

import javax.annotation.Resource;

@RestController

public class UserController {

@Resource

private UserService userService;

@GetMapping(“/test”)

public User selectUserById() {

return userService.selectUserById(“tian”, 1);

}

}

Application.java内容:

import org.mybatis.spring.annotation.MapperScan;

import org.springframework.boot.SpringApplication;

import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication

@MapperScan(“com.tian.mybatis.mapper”)

public class Application {

public static void main(String[] args) {

SpringApplication.run(Application.class, args);

}

}

把项目启动起来,然后进行访问/test。

http://localhost :9002/test

返回:

Mybatis动态映射,这次终于搞明白了

上面的这个案例也是我们工作中的代码案例,我们工作但部分都使用这种方式。

Mybatis动态映射,这次终于搞明白了

下面的所有演示都是基于上面这些代码进行调整而成的。

回到正题。

上面的案例中使用了where+if。案例中貌似有个问题:

Mybatis动态映射,这次终于搞明白了

如果id=null,岂不是多了个and吗?

我们修改controller中的代码

@GetMapping(“/test”)

public User selectUserById() {

return userService.selectUserById(“tian”, null);

}

为了能让sql输出,我们在配置文件添加了一个配置项:

logging:

level:

com:

tian:

mybatis:

mapper: debug

再次执行,输出和前面是一样的。控制台输出的sql中并没有and。这就是所谓的动态映射的强大功能之一。

如果我们不使用动态映射标签,在处理or或者and的时候很有可能出问题。

if元素的test用于判断表达式是否符合,符合则继续拼接SQL语句。

建议

======================================================================

建议使用这种动态标签,不要使用原生态,因为有时候总有意想不到的判断导致多了一个and或者or,于是就出现bug,严重的可能导致线上某个功能不可能用。

if+trim+foreach实现多条件查询

==========================================================================================

对前面的代码进行调整

select * from m_user

id in

#{id}

AND gender = #{gender}

UserMapper.java增加

List selectUsersByIds(@Param(“idList”) List idList, @Param(“gender”) Integer gender);

controller新增方法:

@GetMapping(“/users”)

public List selectUsersByIds() {

List idList = new ArrayList<>();

idList.add(1);

idList.add(2);

idList.add(3);

idList.add(4);

idList.add(5);

return userService.selectUsersByIds(idList, null);

}

项目跑起来,访问

http://localhost :9002/users

输出:

Mybatis动态映射,这次终于搞明白了

sql输出:

对上面相关属性进行说明

trim的属性

  • prefix:前缀: 作用是通过自动识别是否有返回值后,在trim包含的内容上加上前缀,如上述示例的where。

  • suffix:后缀: 作用是在trim包含的内容上加上后缀。

  • prefixOverrides::对于trim包含内容的首部进行指定内容,(如上述示例的 and | or) 的忽略(去余);

  • suffixOverrides::对于trim包含内容的首位部进行指定内容的忽略。

foreach的属性

  • item:表示集合中每一个元素进行迭代时的别名。

  • index::指定一个名称,表示在迭代的过程中,每次迭代到的位置。

  • open:表示该语句以什么开始(既然是in条件语句,必然是 ’ ( ’ 开始)

  • separator::表示每次进行迭代的时候以什么符号作为分隔符(既然是in条件语句,必然是 ’ , ’ 分隔)

  • close::表示该语句以什么结束(既然是in条件语句,必然是 ’ ) ’ 结束)

  • collection:最关键,并且最容易出错的属性。需注意,该属性必须指定,不同情况下,该属性值是不同的,主要有三种情况:

Mybatis动态映射,这次终于搞明白了

@Param是Mybatis中的注解,写的时候别引用错了,@Param(“name”),这里的name就是我们在Mapper.xml中使用的名称。

在项目中我见过很多人这么干,就是当where语句后面不太确定能有条件出现时,使用

slect …from…where 1=1

看看你的代码是否也有?

set

=======================================================================

set元素可以用于动态包含需要更新的列,忽略其它不更新的列。

UserMapper.xml新增

update m_user

name = #{userName},

gender = #{gender},

age = #{age},

where id=#{id}

UserMapper.java新增

int updateAuthorIfNecessary(User user);

controller新增

@PostMapping(“/updateUser”)

public String update() {

User user = new User();

user.setAge(18);

user.setUserName(“田哥”);

user.setId(1);

return userService.updateAuthorIfNecessary(user) == 1 ? “success” : “fail”;

}

重启项目,访问

http://localhost :9002/updateUser

输出:success

数据库表中数据已经修改成功:

SQL输出

这个例子中,set 元素会动态地在行首插入 SET 关键字,并会删掉额外的逗号(这些逗号是在使用条件语句给列赋值时引入的)。

换一种方式

我们把上面的xml中diam进行调整:

update m_user

name = #{userName},

gender = #{gender},

age = #{age},

where id=#{id}

controller修改:

@PostMapping(“/updateUser”)

public String update() {

User user = new User();

user.setAge(19);

user.setUserName(“tian”);

user.setId(1);

return userService.updateAuthorIfNecessary(user) == 1 ? “success” : “fail”;

}

最后看看SQL输出:

Mybatis动态映射,这次终于搞明白了

自动给我们加上了SET关键字。并且数据库修改成功。

Mybatis动态映射,这次终于搞明白了

choose

==========================================================================

相当于Java中的switch语句,通常与when和otherwise搭配。

有时候,我们不想使用所有的条件,而只是想从多个条件中选择一个使用。针对这种情况,MyBatis 提供了 choose 元素,它有点像 Java 中的 switch 语句。

最后

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,不论你是刚入门Java开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
选择一个使用。针对这种情况,MyBatis 提供了 choose 元素,它有点像 Java 中的 switch 语句。

最后

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

[外链图片转存中…(img-Xw0M7bNl-1715839963750)]

[外链图片转存中…(img-h811ayud-1715839963751)]

[外链图片转存中…(img-98022VKJ-1715839963751)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,不论你是刚入门Java开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值