MyBatis框架-动态SQL-XML中的常用标签+特别字符在XML中的显示 ...

农民  论坛元老 | 2024-11-26 15:53:24 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 1021|帖子 1021|积分 3063

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
一、if标签、where标签、trim标签、choose标签、set标签、foreach标签
1、题目引入:where关键字和and关键字在动态SQL内里应该如何添加?
(1)if标签:
test属性的值是判断条件
if标签内里的内容是条件成立时添加到SQL语句中的字符串
(2)代码一:是否添加where关键字
  1. <select id="findStudents" parameterType="Student" resultType="Student">
  2.         select * from student where
  3.         <if test="name!=null">
  4.             name = #{name}
  5.         </if>/*条件一*/
  6.         <if test="gender!=null">
  7.              gender = #{gender}
  8.         </if>/*条件二*/
  9.         <if test="phone!=null">
  10.              phone= #{phone}
  11.         </if>/*条件三*/
  12.     </select>
复制代码


  • 如果添加where关键字,如果三个条件全部成立,则where关键字背面将会没有查询条件,得到不正确的SQL语句
  • 如果不添加where关键字,如果三个条件中有成立的条件,没有where关键字,也会得到不正确的SQL语句
(3)代码二:是否添加and关键字
  1. <select id="findStudents" parameterType="Student" resultType="Student">
  2.         select * from student
  3.         <if test="name!=null">
  4.             name = #{name}
  5.         </if>/*条件一*/
  6.         <if test="gender!=null">
  7.              and gender = #{gender}
  8.         </if>/*条件二*/
  9.         <if test="phone!=null">
  10.              and phone = #{phone}
  11.         </if>/*条件三*/
  12.     </select>
复制代码


  • 如果添加and关键字,如果只有条件二和条件三成立,那么得到的SQL语句前面多了一个and关键字,这条SQL语句为不正确的SQL语句
  • 如果不添加and关键字,如果只有条件二和条件三成立,那么得到的SQL语句的两个查询条件之间没有关键字进行连接,这条SQL语句为不正确的SQL语句
2、where标签解决动态SQL语句中的where关键字和and关键字的添加题目
(1)where标签:


  • 特点:
A、当where标签中的if标签的条件只要有一个成立,会在SQL语句的查询条件最前面自动添加一个where关键字
B、当where标签中成立的条件的开头有and/or关键字时,and/or关键字会被自动去除
 (2)代码验证:从数据库中查询所有的女同学信息
焦点代码:
  1. <select id="findStudents" parameterType="Student" resultType="Student">
  2.         select * from student
  3.         <where>
  4.             <if test="name!=null">
  5.                 name = #{name}
  6.             </if>
  7.             <if test="gender!=null">
  8.                 and gender = #{gender}
  9.             </if>
  10.             <if test="phone!=null">
  11.                 and phone = #{phone}
  12.             </if>
  13.         </where>
  14.     </select>
复制代码
测试代码:
  1. SqlSession sqlSession=MybatisUtil.getSqlSession();
  2.         StudentDao studentDao=sqlSession.getMapper(StudentDao.class);
  3.         Student student=new Student();
  4.         student.setGender("女");
  5.         List<Student>list=studentDao.findStudents(student);
  6.         System.out.println(list);
  7.         sqlSession.close();
复制代码
结果输出:

3、trim标签解决动态SQL语句中的where关键字和and关键字的添加题目
(1)trim标签:


  • prefix属性:其值是要在条件前面添加的指定的前缀,只有当有条件成立时该前缀才会自动添加到条件前面
  • prefixOverrides属性:其值是条件语句开头要覆盖掉的关键字,如果条件语句开头存在该关键字,那么该关键字将会被去除
(2)代码:查询电话号为123456的学生的信息
焦点代码:
  1. <select id="findStudents" parameterType="Student" resultType="Student">
  2.         select * from student
  3.         <trim prefix="where" prefixOverrides="and|or">
  4.             <if test="name!=null">
  5.                 name = #{name}
  6.             </if>
  7.             <if test="gender!=null">
  8.                 and gender = #{gender}
  9.             </if>
  10.             <if test="phone!=null">
  11.                 or phone = #{phone}
  12.             </if>
  13.         </trim>
  14.     </select>
复制代码
 测试代码:
  1. SqlSession sqlSession=MybatisUtil.getSqlSession();
  2.         StudentDao studentDao=sqlSession.getMapper(StudentDao.class);
  3.         Student student=new Student();
  4.         student.setPhone("123456");
  5.         List<Student>list=studentDao.findStudents(student);
  6.         System.out.println(list);
  7.         sqlSession.close();
复制代码
结果输出:

4、choose标签解决简化不同条件查询同一类对象的题目
(1)choose标签:choose标签内里有when标签和otherwise标签两种标签。其中when标签有一个test属性,其值为判断条件,当该条件满足时会将when标签中的内容作为结果进行返回。而otherwise标签则是当其前面的when标签中的条件都不被满足时才会将otherwise标签中的内容作为结果进行返回。choose标签所实现的作用等效于if-else if-else
(3)代码:根据指定的姓名或电话号查询学生表
焦点代码:
  1. <select id="findStudents" parameterType="Student" resultType="Student">
  2.         select * from student
  3.         <trim prefix="where" prefixOverrides="and|or">
  4.             <choose>
  5.                 <when test="name!=null">
  6.                     name = #{name}
  7.                 </when>
  8.                 <when test="phone!=null">
  9.                     phone = #{phone}
  10.                 </when>
  11.                 <otherwise>
  12.                     gender = '男'
  13.                 </otherwise>
  14.             </choose>
  15.         </trim>
  16.     </select>
复制代码
测试代码1:
  1. /*student.setName("tom");*/
  2. student.setPhone("178942");
复制代码
运行结果1:

测试代码2:
  1. /*student.setName("tom");*/
  2. student.setPhone("178942");
复制代码
运行结果2:

测试代码3:
  1. /*student.setName("tom");*/
  2. /*student.setPhone("178942");*/
复制代码
运行结果3:

5、set标签解决updateSQL语句在实现多属性修改同类对象只需一个update标签所带来的开头缺set关键字和末了逗号多余的题目(实现修改同一类对象只必要一个update标签加一个修改方法)
(1)set标签:set标签的作用是当set标签中有结果返回时会在返回结果的开头加上set关键字并且去除返回结果末了的逗号
(2)代码:
焦点代码1:
  1. <update id="updateStudent" parameterType="Student">
  2.         update student
  3.         <set>
  4.             <if test="name!=null">
  5.                 name=#{name},
  6.             </if>
  7.             <if test="gender!=null">
  8.                 gender=#{gender},
  9.             </if>
  10.             <if test="phone!=null">
  11.                 phone=#{phone}
  12.             </if>
  13.         </set>
  14.         where id=#{id}
  15.     </update>
复制代码
测试代码 1:修改学生的姓名和性别
  1. SqlSession sqlSession=MybatisUtil.getSqlSession();
  2. StudentDao studentDao=sqlSession.getMapper(StudentDao.class);
  3. Student student = new Student();
  4. student.setName("liming");
  5. student.setGender("男");
  6. student.setId(9);
  7. studentDao.updateStudent(student);
  8. sqlSession.commit();
  9. sqlSession.close();
复制代码
运行结果1: 

焦点代码2:
  1. <update id="updateStudent" parameterType="Student">
  2.         update student
  3.         <trim prefix="set" suffixOverrides=",">
  4.             <if test="name!=null">
  5.                 name=#{name},
  6.             </if>
  7.             <if test="gender!=null">
  8.                 gender=#{gender},
  9.             </if>
  10.             <if test="phone!=null">
  11.                 phone=#{phone}
  12.             </if>
  13.         </trim>
  14.         where id=#{id}
  15.     </update>
复制代码
测试代码 1:修改学生的电话号码
  1. SqlSession sqlSession=MybatisUtil.getSqlSession();
  2.         StudentDao studentDao=sqlSession.getMapper(StudentDao.class);
  3.         Student student = new Student();
  4.         student.setPhone("24680");
  5.         student.setId(9);
  6.         studentDao.updateStudent(student);
  7.         sqlSession.commit();
  8.         sqlSession.close();
复制代码
运行结果2: 

6、foreach标签解决在构建in条件时在SQL语句中迭代集合的题目
(1)foreach标签


  • item属性的值是集合中的元素进行迭代时的别名
  • index属性的值是集合中元素进行迭代时迭代到的位置
  • collection属性的值是集合的类型:list/array
  • open属性的值是语句的开始字符串
  • separator属性的值是元素进行迭代时元素之间的分隔符
  • close属性的值是语句的结束字符串
(2)代码:
焦点代码1:
  1. <delete id="deleteStudents">
  2.         delete from student
  3.         <where>
  4.             <foreach collection="list" open="id in(" item="id" separator="," close=")" >
  5.                 #{id}
  6.             </foreach>
  7.         </where>
  8.     </delete>
复制代码
测试代码1:在学生表中删除id为6,10的学生的信息
  1. SqlSession sqlSession=MybatisUtil.getSqlSession();
  2.         StudentDao studentDao=sqlSession.getMapper(StudentDao.class);
  3.         List<Integer> ids = Arrays.asList(6,10);
  4.         studentDao.deleteStudents(ids);
  5.         sqlSession.commit();
  6.         sqlSession.close();
复制代码
运行结果1:

焦点代码2:
  1. <select id="findStudents1" resultType="Student">
  2.         select
  3.         <foreach collection="array" item="colName" separator=",">
  4.             ${colName}
  5.         </foreach>
  6.         from student
  7.     </select>
复制代码
测试代码2:查询学生的指定属性列(1个或多个属性列)
  1. SqlSession sqlSession=MybatisUtil.getSqlSession();
  2.         StudentDao studentDao=sqlSession.getMapper(StudentDao.class);
  3.         String[] colNames = {"gender","phone"};
  4.         List<Student>list=studentDao.findStudents1(colNames);
  5.         System.out.println(list);
  6.         sqlSession.close();
复制代码
运行结果2:

二、特别符号在XML文件中的显示
1、在MyBatis中的XML文件中,要想显示特别符号<、>、"、'、&,一种方法是对这些符号进行转义,以转义字符的情势在XML文件中进行显示
  1. select * from student where id
  2.         <if test="phone!=null &amp; gender!=null">
  3.             > #{id}
  4.         </if>
复制代码
特别字符        转义字符
<        <
>>
""
'&pos;
&&
 另一种方法是利用<![CDATA[]]>包裹特别字符在XML文件中进行显示
  1. select * from student where id <![CDATA[<]]> 10
复制代码
2、<![CDATA[]]>
(1)<![CDATA[]]>是XML语法,在CDATA中的所有内容都会被解析器忽略。
(2)如if标签、where标签等的标签如果在CDATA中都不会被解析,因此我们只把有特别字符且无标签的内容放在<![CDATA[]]>中。
(3)<![CDATA[]]>不能在双标签的头标签中被利用,否则程序会堕落。
  1. <if test="phone!=null <![CDATA[&]]> gender!=null">
  2.             > #{id}
  3.         </if>
复制代码


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

农民

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表