之前在a_26_0学MyBatis快速入门的时候,讲了映射文件简单的增删改查,这节课将深入学习MyBatis的映射文件 学这节课之前,请你保证已经对上节课dao层的代理开发方式很熟悉,因为这节课我们写接口不写对应的实现类,也就是使用代理开发方式简化掉实现类 并且还要熟悉前面a_27学的增删改查

 

动态sql概述和环境搭建

 

MyBatis的映射文件中,前面我们的SQL都是比较简单的,有些时候业务逻辑复杂时,我们的SQL是动态变化的,也就是会根据业务层传递给dao层的参数不同, 导致SQL语句也不同,此时在前面的学习中就不能满足要求了

 

具体操作如下

 

第一步: 在src/main/java目录下,右键java,新建com.huanf.domain.User类,写入如下

 

第二步: 在src/main/java目录下,右键java,新建com.huanf.mapper.UserMapper接口,写入如下

 

第三步: 在src/main/resources目录下新建jdbc.properties文件,写入如下

 

第四步: 在src/main/resources目录下新建log4j.properties文件,写入如下

 

第五步: 在src/main/resources目录下新建sqlMapConfig.xml文件,写入如下

 

 

第六步: 在src/main/resources目录下新建com/huanf/mapper目录,里面新建UserMapper.xml文件,写入如下

 

第七步: 在src/test/java目录新建com.huanf.test.MapperTest类,写入如下

 

第八步: 在pom.xml写入如下

 

第九步: 在MapperTest类运行测试

 

动态sql if

 

上面存在的问题: 当MapperTest类的模拟数据(用户前端填写的数据),如果没有用户没有填写password,那我们的程序就不能正确执行 分析: UserMapper.xml里面的查询语句不能连续两个and写死。解决: 在UserMapper.xml里面的查询语句,使用if标签来允许某些值可以为空

 

具体操作: 把原先的UserMapper.xml修改为如下

 

注意上面代码的1=1是额外加上去的,作用是避免出现where and的出现,因为SQL语句中where是不能直接接and 注意上面代码的'select * from user where 1=1'中的where 1=1,写的不规范,由于MyBatis已经为我们提供了一个标签,所以我们可以优化,如下 最后在MapperTest类运行测试

 

动态sql foreach

 

循环执行sql的拼接操作,例如: select * from user where id in(1,2,5),表示查询user表中id为1、2、5对应的数据

 

具体操作如下:

 

第一步: 把UserMapper接口修改为如下

 

第二步: 在UserMapper.xml添加如下

 

第三步: 在MapperTest类添加如下

 

第四步: 在MapperTest类运行test2()测试

 

动态sql sql片段的抽取

 

上面存在的问题: 在UserMapper.xml里写多条动态sql,所谓动态sql就是写了if标签的sql语句,所谓多条就是写了多个标签,有一样的sql语句片段,例如都有select * from user,为简化以及后期维护,我们可以把一样的sql抽取出来

为什么要抽取: 当后期我们的数据库表不叫user,而是叫other,如果你有很多标签的user为other, 相当麻烦,但是如果我们把这些