Mybatis动态SQL实例详解
动态SQL
什么是动态SQL?
MyBatis的官方文档中是这样介绍的?
动态SQL是MyBatis的强大特性之一。如果你使用过JDBC或其它类似的框架,你应该能理解根据不同条件拼接SQL语句有多痛苦,例如拼接时要确保不能忘记添加必要的空格,还要注意去掉列表最后一个列名的逗号。利用动态SQL,可以彻底摆脱这种痛苦。
使用动态SQL并非一件易事,但借助可用于任何SQL映射语句中的强大的动态SQL语言,MyBatis显著地提升了这一特性的易用性。
如果你之前用过JSTL或任何基于类XML语言的文本处理器,你对动态SQL元素可能会感觉似曾相识。在MyBatis之前的版本中,需要花时间了解大量的元素。借助功能强大的基于OGNL的表达式,MyBatis3替换了之前的大部分元素,大大精简了元素种类,现在要学习的元素种类比原来的一半还要少。
换句话说,我们可以根据传入参数的不同,来执行不同的查询条件。
IF标签:
如何使用?
我们首先创建一个Mapper接口,起名为:UserMapper,并增加一个方法
publicinterfaceUserMapper{ publicListfindByCondition(Useruser); }
同时创建一个xml文件,起名为UserMapper.xml然后编写SQL
SELECT*FROMuserwhere1=1 andid=#{id} andusername=#{username}
这个SQL的意思是:
- 当id不为null的时候执行的SQL是:SELECT*FROMuserwhereid=#{id}
- 当id为null的时候执行的SQL是SELECT*FROMuserwhere1=1
很明显我们可以看到where1=1是多余的,因此我们可以这样写:
SELECT*FROMuser andid=#{id} andusername=#{username}
测试:
编写一个测试类:
packagecom.dxh.test; importcom.dxh.dao.UserMapper; importcom.dxh.pojo.User; importorg.apache.ibatis.io.Resources; importorg.apache.ibatis.session.SqlSession; importorg.apache.ibatis.session.SqlSessionFactory; importorg.apache.ibatis.session.SqlSessionFactoryBuilder; importorg.junit.Test; importjava.io.IOException; importjava.io.InputStream; importjava.util.List; publicclassTestMain{ @Test publicvoidtest1()throwsIOException{ InputStreamresourceAsStream=Resources.getResourceAsStream("sqlMapConfig.xml"); SqlSessionFactorybuild=newSqlSessionFactoryBuilder().build(resourceAsStream); SqlSessionsqlSession=build.openSession(); UserMappermapper=sqlSession.getMapper(UserMapper.class); Useruser=newUser(); user.setId(1); ListbyCondition=mapper.findByCondition(user); for(Useruser1:byCondition){ System.out.println(user1); } System.out.println("======"); Useruser2=newUser(); List byCondition2=mapper.findByCondition(user2); for(Useruser3:byCondition2){ System.out.println(user3); } } }
我们执行两次mapper.findByCondition(),分别传入user和user2,一个的id有被赋值,一个没有,最后的结果为:
User{id=1,username='lucy'}
======
User{id=1,username='lucy'}
User{id=2,username='李四'}
User{id=3,username='zhaowu'}
foreach标签:
当我们需要查询出id为1、2、3时应该怎么做?SQL应该这样写:SELECT*FROMuserwhereidin(1,2,3)。那么使用mybatis的foreach标签应该如何使用?
如何使用?
在UserMapper接口中增加一个方法:List
publicListfindByIds(int[]arr);
在UserMapper.xml中编写:
SELECT*FROMuser #{id}
我们可以看到,foreach中我们使用到了5个值:
- collection这里就是写我们传入的类型,如果是数组就是array,如果是集合就是list
- open我们之前说到SELECT*FROMuserwhereidin(1,2,3)正确的SQL应该这样写,那么open就是填写我们需要拼接的前半部分
- close填写我们需要拼接的后半部分
- item我们需要遍历的值是id,所以就填写id
- separator......whereidin(1,2,3)1,2,3之间用,分割。
测试:
@Test publicvoidtest2()throwsIOException{ InputStreamresourceAsStream=Resources.getResourceAsStream("sqlMapConfig.xml"); SqlSessionFactorybuild=newSqlSessionFactoryBuilder().build(resourceAsStream); SqlSessionsqlSession=build.openSession(); UserMappermapper=sqlSession.getMapper(UserMapper.class); int[]arr={1,3}; ListbyCondition=mapper.findByIds(arr); for(Useruser1:byCondition){ System.out.println(user1); } }
输出结果:
User{id=1,username='lucy'}
User{id=3,username='zhaowu'}
正确~
最后
这里只是介绍了两个经常使用的标签,mybatis中还有很多标签,比如choose、when、otherwise、trim、set等等
值得一说的是Mybatis的官方网站中已经支持中文了,母语看着更舒服~
https://mybatis.org/mybatis-3/zh/
到此这篇关于Mybatis动态SQL的文章就介绍到这了,更多相关Mybatis动态SQL内容请搜索毛票票以前的文章或继续浏览下面的相关文章希望大家以后多多支持毛票票!