动态sql语句
动态sql语句概述
Mybatis 的映射文件中,前面我们的 SQL 都是比较简单的,有些时候业务逻辑复杂时,我们的 SQL是动态变化的,此时在前面的学习中我们的 SQL 就不能满足要求了。
参考的官方文档,描述如下:
动态 SQL 之<if>
如下:
<select id="findByCondition" parameterType="student" resultType="student"> select * from student <where> <if test="id!=0"> and id=#{id} </if> <if test="username!=null"> and username=#{username} </if> </where> </select>
当查询条件id和username都存在时,控制台打印的sql语句如下:
//获得MyBatis框架生成的StudentMapper接口的实现类 StudentMapper mapper = sqlSession.getMapper( StudentMapper.class); Student condition = new Student(); condition.setId(1); condition.setUsername("lucy"); Student student = mapper.findByCondition(condition);
当查询条件只有id存在时,控制台打印的sql语句如下:
//获得MyBatis框架生成的UserMapper接口的实现类 StudentMapper mapper = sqlSession.getMapper( StudentMapper.class); Student condition = new Student(); condition.setId(1); Student student = mapper.findByCondition(condition);
总结语法:
<where>:条件标签。如果有动态条件,则使用该标签代替 where 关键字。 <if>:条件判断标签。 <if test=“条件判断”> 查询条件拼接 </if>
动态 SQL 之<foreach>
循环执行sql的拼接操作,例如:SELECT * FROM student WHERE id IN (1,2,5)。
<select id="findByIds" parameterType="list" resultType="student"> select * from student <where> <foreach collection="array" open="id in(" close=")" item="id" separator=","> #{id} </foreach> </where> </select>
测试代码片段如下:
//获得MyBatis框架生成的UserMapper接口的实现类 StudentMapper mapper = sqlSession.getMapper(StudentMapper.class); int[] ids = new int[]{2,5}; List<Student> sList = mapper.findByIds(ids); System.out.println(sList);
总结语法:
<foreach>:循环遍历标签。适用于多个参数或者的关系。 <foreach collection=“”open=“”close=“”item=“”separator=“”> 获取参数 </foreach>
SQL片段抽取
Sql 中可将重复的 sql 提取出来,使用时用 include 引用即可,最终达到 sql 重用的目的
<!--抽取sql片段简化编写--> <sql id="selectStudent" select * from student</sql> <select id="findById" parameterType="int" resultType="student"> <include refid="selectStudent"></include> where id=#{id} </select> <select id="findByIds" parameterType="list" resultType="student"> <include refid="selectStudent"></include> <where> <foreach collection="array" open="id in(" close=")" item="id" separator=","> #{id} </foreach> </where> </select>
我们可以将一些重复性的 SQL 语句进行抽取,以达到复用的效果。
- <sql>:抽取 SQL 语句标签。 - <include>:引入 SQL 片段标签。 <sql id=“片段唯一标识”>抽取的 SQL 语句</sql> <include refid=“片段唯一标识”/>
知识小结
MyBatis映射文件配置:
<select>:查询 <insert>:插入 <update>:修改 <delete>:删除 <where>:where条件 <if>:if判断 <foreach>:循环 <sql>:sql片段抽取