J2EE系列之MyBatis学习笔记(七)-- 动态sql
来源:互联网 发布:seo内容制作什么意思 编辑:程序博客网 时间:2024/06/05 11:33
上一节讲到了动态sql中的if条件和:choose,when 和otherwise 条件。这一节讲述更多的动态sql条件。
一、where条件:where条件具有以下两个功能:
1,自动加上where;
2,如果where 子句以and 或者or 开头,则自动删除第一个and 或者or;
上一节在讲if条件的时候,sql映射器中为了防止传入的map为空,在where后面加上了1=1这个常值条件,这样处理总给人一种不严谨的感觉。现在使用where条件就可以完全解决这个问题了。
在StudentMapper中添加接口:
public List<Student> searchStudents3(Map<String,Object> map);
sql映射器中实现这个方法:
<select id="searchStudents3" parameterType="Map" resultMap="StudentResult">select * from t_student<where><if test="name!=null">and name like #{name}</if><if test="age!=null">and age=#{age}</if><if test="gradeId!=null">and gradeId = #{gradeId}</if></where></select>这里使用了where条件。where条件会在有<where>的地方自动加上where,另外如果where子句以and或者or开头的话,会自动删除第一个and或者or。如果where子句为空,也不会添加where了。
添加测试方法:
@Testpublic void testSearchStudents3() {logger.info("查询学生(带条件)");Map<String,Object> map = new HashMap<String,Object>();map.put("name", "%李%");List<Student> studentList = studentMapper.searchStudents3(map);for(Student s:studentList){System.out.println(s);}}运行这个测试方法,执行where条件后,拼接的sql语句为:select * from t_student where name like %李%(在拼接sql语句的时候自动加上where,如果where子句以and或or开头,则删除第一个and或者or)。运行这个测试方法,能够成功查询出想要的学生信息。
二、trim 条件
功能和where 元素类似,提供了前缀,后缀功能,更加灵活。看实例:
1.添加接口方法:
public List<Student> searchStudents4(Map<String,Object> map);
2.使用trim条件实现该方法:
<select id="searchStudents4" parameterType="Map" resultMap="StudentResult">select * from t_student<trim prefix="where" prefixOverrides="and|or"><if test="name!=null">and name like #{name}</if><if test="age!=null">and age=#{age}</if><if test="gradeId!=null">and gradeId = #{gradeId}</if></trim></select>
这里使用trim条件,prefix属性指定前缀,这里是where,也就是拼写sql语句的时候,在拼接trim里面的语句之前加上where;prefixOverrides表示前缀覆盖,它的值是and|or,意思是如果trim条件里面的语句以and或者or开头,则删除这个and或者or。可以看到这样的话其功能和where条件非常的像。其灵活的地方是还可以添加后缀(suffix属性以及后缀覆盖suffixOverrides属性,不过添加后缀使用的非常少)。
3.添加测试方法:
@Testpublic void testSearchStudents4() {logger.info("查询学生(带条件)");Map<String,Object> map = new HashMap<String,Object>();//map.put("gradeId", 2);map.put("name", "%李%");//map.put("age", 11);List<Student> studentList = studentMapper.searchStudents4(map);for(Student s:studentList){System.out.println(s);}}
运行这个测试方法查到相应的学生信息。
三、foreach 循环
假设有100多个班级,我们要查询其中1~5班的所有学生。写成sql语句为:select * from t_student where gradeId in (1,2,3,4,5)。当查询的班级变化时,也要重新手动的写查询语句。现在使用foreach循环能够动态的实现 班级的变化。
1.添加接口方法:
public List<Student> searchStudents5(Map<String,Object> map);
2.实现该接口方法:
<select id="searchStudents5" parameterType="Map" resultMap="StudentResult">select * from t_student<if test="gradeIds != null"><where>gradeId in <foreach item="gradeId" collection="gradeIds" open="(" separator="," close=")">#{gradeId}</foreach></where></if></select>
这里使用了foreach循环。其中
<foreach item="gradeId" collection="gradeIds" open="(" separator="," close=")">#{gradeId}</foreach>会把传入的班级名字以逗号隔开,并放在()中。open属性值为“(”,close值为“)”:表示将foreach里面的内容放在()中;separator属性值为“,”:表示foreach里面的内容使用逗号隔开。collection属性值为gradeIds,表示对于集合gradeIds中的所有元素,item属性值为gradeId表示从gradeIds中取出一个元素赋值给gradeId。
3.添加测试方法:
@Testpublic void testSearchStudents5() {logger.info("查询学生(带条件)");Map<String,Object> map = new HashMap<String,Object>();List<Integer> gradeIds = new ArrayList<Integer>();gradeIds.add(1);gradeIds.add(2);map.put("gradeIds", gradeIds);List<Student> studentList = studentMapper.searchStudents5(map);for(Student s:studentList){System.out.println(s);}}
这里gradeIds中的值为1和2,最终拼接成的sql语句为:select * from t_student where gradeId in (1,2)。运行这个测试方法,能够得到想要的学生信息。
四、set 条件:set条件和where都是使用的最多的条件,set条件常用在更新数据库中。set条件具有以下特性:
1,自动加上set;
2,自动剔除最后一个逗号“,”;
之前更新数据库中的信息时,是把一条数据的所有项都进行更新,即使有的项并没有更新。使用set语句能够只更新变化的项。
3.StudentMapper中添加方法:
public int updateStudent(Student student);
4.使用set条件实现这个方法:
<update id="updateStudent" parameterType="Student">update t_student<set><if test="name!=null">name=#{name},</if><if test="age!=null">age=#{age},</if></set>where id=#{id}</update>
在<set>的位置会自动添加set,另外还会去掉set语句中最末尾的逗号。
5.添加测试方法:
@Testpublic void testUpdateStudent(){logger.info("更新学生");Student student = new Student();student.setId(1);student.setName("张三3");student.setAge(13);studentMapper.updateStudent(student);sqlSession.commit();}
这里把id为1的学生的姓名改成张三3,年龄改成13岁。拼接成的sql语句为:update t_student set name=张三3,age=13 where id=1;
运行这个测试方法,数据库中发生了相关的变化。
阅读全文
0 0
- J2EE系列之MyBatis学习笔记(七)-- 动态sql
- J2EE系列之MyBatis学习笔记(六)-- 动态sql
- (七)mybatis学习之动态SQL
- J2EE系列之MyBatis学习笔记(二)-- mybatis配置
- J2EE系列之MyBatis学习笔记(三)-- 使用XML配置SQL映射器
- J2EE系列之MyBatis学习笔记(十)-- 使用注解配置sql映射器
- J2EE系列之MyBatis学习笔记(十一)-- 使用注解配置sql映射器
- J2EE系列之MyBatis学习笔记(十二)-- 使用注解配置sql映射器
- J2EE系列之MyBatis学习笔记(一)-- 简介
- J2EE系列之MyBatis学习笔记(八)-- 杂项
- J2EE系列之MyBatis学习笔记(九)-- 杂项
- J2EE系列之MyBatis学习笔记(四)-- mybatis关系映射(一对一映射)
- J2EE系列之MyBatis学习笔记(五)-- mybatis关系映射(一对多映射)
- Mybatis学习笔记七:动态SQL语句的使用
- Mybatis学习笔记之四:动态SQL
- J2EE系列之Spring4学习笔记(七)--AOP详解(AOP简介)
- J2EE系列之Struts2学习笔记(七)--struts.xml配置
- J2EE系列之Hibernate4学习笔记(七)--Session常用方法
- CMake 笔记一
- Internet 路由结构 study
- Java时间之间的天数计算,工作日计算
- ExpandableListView使用(三)-ScrollView嵌套ExpandableListView,列表显示不全
- GemFire/Geode中的国际化(二)
- J2EE系列之MyBatis学习笔记(七)-- 动态sql
- 抽象类、多态
- 再谈“我是怎么招聘程序员的”
- Maven_Kafka 实例
- Echarts 图表
- 快速幂和矩阵快速幂
- 路径规划算法概论
- MYSQL ERROR 1862 (HY000): Your password has expired.
- 如何查看Linux 硬件配置信息