1.动态sql:sql的内容是变化的,可以根据条件获取到不同的sql语句。主要是where部分发生变化。
2.动态sql的实现使用的是mybatis提供的标签:<if>,<where>,<foreach>
一:<if>是判断条件的
语法:
<if test="判断java对象的属性值"> 部分sql语句 </if>
4.示例演示
1.接口
// 动态sql,使用java对象作为参数 List<Student> selectStudentIf(Student student);
2.StudentDao.xml
<!-- if<test = "使用参数java对象的属性值作为判断条件 语法:属性名=xx值"> --> <select id="selectStudentIf"resultType="com.dccomics.domain.Student"> select id,name,age from t_student where <if test="name != null and name !=‘‘ "> name=#{name} </if> <if test="age > 0"> and age > #{age} </if> </select>
3.测试类
@Test public void testSelectStudentIf(){ SqlSession sqlSession = MyBatisUtils.getSqlSession(); StudentDao dao = sqlSession.getMapper(StudentDao.class); Student student = new Student(4,"jason",20); List<Student> students = dao.selectStudentIf(student); for(Student stu:students){ System.out.println("学生是" + stu); } sqlSession.close(); }
二:<where>标签
<where>用来包含多个<if>标签,当多个if中只要有一个成立的,<where>就会自动增加一个where关键字,并去掉<if>中多余的and、or等关键字。
1.接口
// 动态sql,使用java对象作为参数 List<Student> selectStudentWhere(Student student);
2.StudentDao.xml
<!-- 使用where标签 --> <select id="selectStudentWhere"resultType="com.dccomics.domain.Student"> select id,name,age from t_student <where> <if test="name != null and name !=‘‘ "> name=#{name} </if> <if test="age > 0"> and age > #{age} </if> </where> </select>
3.测试类
@Test public void testSelectStudentWhere(){ SqlSession sqlSession = MyBatisUtils.getSqlSession(); StudentDao dao = sqlSession.getMapper(StudentDao.class); Student student = new Student(4,"jason",20); List<Student> students = dao.selectStudentWhere(student); for(Student stu:students){ System.out.println("学生是" + stu); } sqlSession.close(); }
三:<foreach>标签用于实现对数组与集合的遍历,主要用在in语句中
1.接口中:List<Student> selectForEachOne(List<Integer> idlist);
2.StudentDao.xml
3.测试类
foreach第二种用法
1.接口中:List<Student> selectForEachTwo(List<Student> stulist);
2.StudentDao.xml
3.测试类
动态SQL之代码片段
<sql>标签用于定义SQL片段,以便其它SQL标签复用。它可以定义SQL语句中的任何部分。