动态sql:sql映射文件中sql语句是变化的,可以根据条件获取到不同的sql语句,主要是where部分发生变化。
动态sql的实现:使用mybatis提供的标签,<if>,<where>,<foreach >
<if>用法
接口方法:
public interface StudentDao {
//接口定义方法,传一个java对象
List<Student> selectStudentIF(Student student);
}
sql映射文件:
<if>弊端
当第一个if不成立时,第二个if成立时,会把or age = #{age}加到sql语句后面,会造成sql语法错误
<where>用法
用来包含多个<if>的 ,当多个if有一个成立的,<where>会自动增加一个where关键字,并去掉if中多余的 and , or
用法:
1.先定义接口方法
/动态sql where使用
List<Student> selectStudentwhere(Student student);
2.sql映射文件
<select id="selectStudentwhere" resultType="Student">
select id,name,email,age from student
<where>
<if test="name != null and name != ''">
name = #{name}
</if>
<if test="age >= 20">
or age = #{age}
</if>
</where>
</select>
<where>避免了<if>的弊端,推荐使用
<foreach>
<foreach>循环java中的数组,list集合,主要用在sql的in语句中
使用方法:
1.定义接口方法
接口方法参数是List集合,集合中存放数字1001.1002.1003
//动态sql foreach
List<Student> selectForeach(List<Integer> integers);
2.sql映射文件
<select id="selectForeach" resultType="Student">
select * from student where id in
<foreach collection="list" item="stu" open="(" close=")" separator="," >
#{stu}
</foreach>
</select>
collection:表示接口中的方法参数的类型,如果是数组使用array,如果是list集合使用list
separator:集合成员之间的分隔符
cloes:循环结束时的字符
open:循环开始时的字符
item:自定义的,表示数组和集合成员的变量,也就是要循环的参数
3测试类:
@Test
public void selectSQLForeach(){
SqlSession sqlSession = MyBatisUtils.getSqlSession();
StudentDao dao = sqlSession.getMapper(StudentDao.class);
List<Integer> integerList = new ArrayList<>();
integerList.add(1001);
integerList.add(1002);
integerList.add(1003);
List<Student> studentList = dao.selectForeach(integerList);
for (Student stu : studentList){
System.out.println("====>>Foreach"+stu);
}
}
<Foreach>
1.定义方法,方法参数是list集合,集合中放的是java对象
//动态sql foreach Studentjava对象list集合
List<Student> selectForeach2(List<Student> students);
2.sql映射文件
通过stu.id拿到java对象的id 属性值
<select id="selectForeach2" resultType="Student">
select * from student where id in
<foreach collection="list" item="stu" open="(" close=")" separator="," >
#{stu.id}/*stu.id 指 java对象的id属性值*/
</foreach>
</select>
3.测试类
先创建一个List集合在创建三个Student对象并给id属性赋值,添加到list集合中
@Test
public void selectSQLForeach2(){
SqlSession sqlSession = MyBatisUtils.getSqlSession();
StudentDao dao = sqlSession.getMapper(StudentDao.class);
List<Student> studentList = new ArrayList<>();
Student s1 = new Student();
s1.setId(1005);
studentList.add(s1);
Student s2 = new Student();
s2.setId(2001);
studentList.add(s2);
Student s3 = new Student();
s3.setId(2002);
studentList.add(s3);
List<Student> ss = dao.selectForeach2(studentList);
for (Student stu : studentList){
System.out.println("====>>Foreach222"+stu);
}
}
复用sql语句
先定义:<sql id = "自定义名称"> sql语句 </sql>
在使用:<include refid = "id的值"/>