动态sql
4.2、动态sql的实现
1.动态sql的实现,sql的内容是变化的,可以根据条件获取不同的sql语句,主要是where部分的变化。
2.动态sql的实现,使用的是mybatis提供的标签, if ,where,foreach.
- if是判断条件的,语法<if test="判断java对象的属性值” >
//动态sql,使用java对象做为参数
List<Student> selectStudentIf(Student student);
- if test="使用参数java对象的属性值作为判断条件,语法:属性=xxx值“这里要注意sql语句的书写,很容易出现sql语句出错
<select id="selectStudentIf" resultType="com.xw.domain.Student">
select id,name,email,age from student where
<if test="name!= null and name!=''">
name=#{name}
</if>
<if test="age>0">
and age>#{age}
</if>
</select>
测试代码
@Test
public void testSelectStudentIf(){
SqlSession sqlSession=MybatisUtils.getSqlSession();
StudentDao dao=sqlSession.getMapper(StudentDao.class);
Student stu=new Student();
// stu.setName("小王");
stu.setAge(30);
List<Student> students = dao.selectStudentIf(stu);
for (Student stu1:students) {
System.out.println("查询的学生:"+stu1);
}
- where 用来包含多个if的,当多个if有一个成立的,where会自动增加一个where关键字。并且会去掉if中多余的and,or等。
StudentDao中的代码
//where的使用
List<Student> selectStudentWhere(Student student);
StudentDao.xml中的代码
<!--where的语法:<where><if></if> <if></if>...</where>-->
<select id="selectStudentWhere" resultType="com.xw.domain.Student">
select id,name,email,age from student
<where>
<if test="name!=null and name!=''">
name=#{name}
</if>
<if test="age>0">
or age>#{age}
</if>
</where>
</select>
测试代码
@Test
public void testSelectStudentWhere(){
SqlSession sqlSession=MybatisUtils.getSqlSession();
StudentDao dao=sqlSession.getMapper(StudentDao.class);
Student student=new Student();
// student.setName("小王");
student.setAge(22);
List<Student> students = dao.selectStudentWhere(student);
for (Student stu:students){
System.out.println("查询的学生:"+stu);
}
}
注意:使用where的好处:即使第一个name属性没有,下一个age前面的or也会被去掉
- foreach循环java中的数组,List集合的,主要用在sql的in语句中,
StudentDao中的代码
//foreach的用法 1
List<Student> selectStudentForeachOne(List<Integer>idList);
StudentDao.xml中的代码
<!--foreach使用1,List<Integer>
collection:表示的接口中的方法参数的类型,如果数组使用array,如果是List集合使用List
item:自定义的,表示数组和集合成员的变量。
open:循环开始的的字符
close:循环结束时的字符
separator:集合成员之间的分割符
open和close和separator也可以自己在外拼接,
-->
<select id="selectStudentForeachOne" resultType="com.xw.domain.Student">
select id,name,email,age from student where id in
<foreach collection="list" item="id" open="(" close=")" separator=",">
#{id}
</foreach>
</select>
测试代码
@Test
public void testSelectStudentForeachOne(){
SqlSession sqlSession=MybatisUtils.getSqlSession();
StudentDao dao =sqlSession.getMapper(StudentDao.class);
List<Integer>list=new ArrayList<>();
list.add(1001);
list.add(1002);
list.add(1003);
List<Student> students = dao.selectStudentForeachOne(list);
for(Student student:students){
System.out.println(student);
}
}
- foreach的用法2
StudentDao中的代码:
List<Student> selectStudentForeachTwo(List<Student>stuList);
StudentDao.xml中的代码
<!--foreach的第二种使用方法-->
<select id="selectStudentForeachTwo" resultType="com.xw.domain.Student">
select id,name,email,age from student where id in
<foreach collection="list" item="stu" open="(" close=")" separator=",">
#{stu.id}
</foreach>
</select>
测试代码
@Test
public void testSelectStudentForeachTwo(){
SqlSession sqlSession=MybatisUtils.getSqlSession();
StudentDao dao =sqlSession.getMapper(StudentDao.class);
List<Student>list=new ArrayList<>();
Student stu=new Student();
stu.setId(1001);
list.add(stu);
stu=new Student();
stu.setId(1002);
list.add(stu);
List<Student> students = dao.selectStudentForeachTwo(list);
for(Student student:students){
System.out.println(student);
}
}
- 动态sql之代码片段,就是复用一些语法。
- 先定义
<sql id="自定义名唯一的">sql语句,表名,字段等</sql>
- 然后在需要的地方使用
<include refid="id的值"/>
来引用。(使用非常灵活)
- 先定义
代码实现:
<sql id="select">
select id,name,email,age from student
</sql>
<select id="selectStudentForeachOne" resultType="com.xw.domain.Student">
<include refid="select"/> where id in
<foreach collection="list" item="id" open="(" close=")" separator=",">
#{id}
</foreach>
</select>