曲靖网站微信建设,wordpress 文章置顶显示,为什么网站用静态页面,wordpress农业模板下载动态SQL标签简介: MyBatis的一个强大的特性之一通常是它的动态SQL能力。如果你有使用JDBC或其他相似框架的经验,你就明白条件地串联SQL字符串在一起是多么的痛苦,确保不能忘了空格或在列表的最后省略逗号。动态SQL可以彻底处理这种痛苦。
Mybatis中实现动态sql的标签有#x…动态SQL标签简介: MyBatis的一个强大的特性之一通常是它的动态SQL能力。如果你有使用JDBC或其他相似框架的经验,你就明白条件地串联SQL字符串在一起是多么的痛苦,确保不能忘了空格或在列表的最后省略逗号。动态SQL可以彻底处理这种痛苦。
Mybatis中实现动态sql的标签有 if where trim set choose foreach
示例对象Student
package com.ffyc.mybatis.model;public class Student {private Integer id;private Integer num;//建议不使用基本类型使用包装类型包装类型默认值都是null后期判断会方便private String name;private String gender;private Major major;//类与类之间的关联关系 has-a关系 什么有什么将专业信息封装到专业对象中减少冗余public Major getMajor() {return major;}public void setMajor(Major major) {this.major major;}public Integer getId() {return id;}public void setId(Integer id) {this.id id;}public Integer getNum() {return num;}public void setNum(Integer num) {this.num num;}public String getName() {return name;}public void setName(String name) {this.name name;}public String getGender() {return gender;}public void setGender(String gender) {this.gender gender;}Overridepublic String toString() {return Student{ id id , num num , name name \ , gender gender \ , major major };}
}if标签 判断标签用于添加判断条件 当我们查询学生列表时若是不查询特定名字则打印所有学生信息若是要查询特定名字则我们只需要选择对应名字的学生示例如下
Dao:
ListStudent findStudents(Student student);
select idfindStudents resultTypeStudentselect * from studentif testname!nullwhere name #{name}/if
/select--
where标签 判断内部if标签如果有一个返回true会自动添加一个where关键字还会自动去除where后多余关键字. 在进行多条件查询时例如姓名编号性别。若性别为null则只需要查询姓名与编号相同的行意思就是几个元素不为null就加几个判断条件。这时候就可以使用where进行多个条件的判断
Dao:
ListStudent findStudents(Student student);
select idfindStudents resultTypeStudentselect * from student whereif testname!nullname #{name}/ifif testnum!0and num #{num}/ifif testgender!nulland gender #{gender}/if/select
很明显当我们写出来后会发现一个很糟糕的问题要是传入的name值为null查询语句 select * from student where and num? and gender?
where后面出现了一个多余的关键字‘and’.
这该怎么解决
有一种简单而暴力的方法
select idfindStudents resultTypeStudentselect * from student where 11if testname!nulland name #{name}/ifif testnum!0and num #{num}/ifif testgender!nulland gender #{gender}/if/select
这样一来就不会出现where后面出现多余关键字的现象这也是在where标签出现之前程序猿面对这种问题采取的措施。
有人就觉得了有没有优雅一点的写法 这时候就到我们where标签出场了
select idfindStudents resultTypeStudentselect * from studentwhereif testname!nulland name #{name}/ifif testnum!0and num #{num}/ifif testgender!nulland gender #{gender}/if/where/select 雅太雅了where标签会自动添加一个where关键字还会自动去除where后多余关键字。
choose标签 choose标签与when标签和otherwise标签配用用于判定多重条件的语句 应用场景若传值有名字则查找名字若没有则查找编号若还是没有则查找名为kk的人
Dao
ListStudent findStudents(Student student);
select idfindStudents resultTypeStudentselect * from student wherechoosewhen testname!nullname#{name}/whenwhen testnum!nullnum#{num}/whenotherwisenamekk/otherwise/choose/select
当传值为name“张三” num1 当传值为 namenull num1 当传值为 namenull numnull trim标签 当我们需要修改某些数据时我们可以用到trim来删去多余的符号(或关键字)或是添加我们需要的符号(或关键字) 应用场景修改指定id的某几列
Dao:
void updatestudent(Student student);
update idupdatestudent parameterTypestudentupdate studenttrim prefixset suffixOverrides,if testname!nullname#{name},/ifif testnum!nullnum#{num},/ifif testgender!nullgender#{gender}/if/trimwhere id#{id}/update
在student后添加“set”删去最后的“,”.
当传值为nameop num1005 id1 set标签 在标签前添加set将最后的多余的逗号删除 应用场景与上面的trim标签相同修改指定id的某几列
Dao:
void updatestudent(Student student);
update idupdatestudent parameterTypestudentupdate studentsetif testname!nullname#{name},/ifif testnum!nullnum#{num},/ifif testgender!nullgender#{gender}/if/setwhere id#{id}/update foreach标签 主要用在构建in条件中它可以在SQL语句中进行迭代一个集合。foreach元素的属性主要有itemindexcollectionopenseparatorclose。 item 定义一个变量接收每次循环中获得的元素 collection 循环的集合类型 list-集合 array-数量 open 循环开始的一个符号 close 循环结束的一个符号 separator 每次循环后的一个分隔符号 index 循环时生成的索引 应用场景当需要使用到一串相同类型变量时可以与List或Integer[]搭配使用 (1)当需要删除一组数据时我们可以接收这组数据的id再用foreeach标签循环检索
Dao:
void deleteStudent(ListInteger list); 或
void deleteStudent(Integer[] array);
delete iddeleteStudentdelete from student where id inforeach itema collectionlist open( close) separator,#{a}/foreach/delete
当传值为[7,8] (2)查找所有学生的指定信息
Dao:
ListStudent findstudentbycolumn(ListString list);
select idfindstudentbycolumn resultTypestudentselectforeach itema collectionlist separator,${a}/foreachfrom student/select
当传值为name,num 最后补充一点 为什么整数类型不用基本类型而是用包装类 其实基本类型是可以使用的但是基本类型被定义后默认值为0而包装类型默认值为null若是基本类型每次判断需要把!null换成!0这样我们需要判断该变量的初始值是0还是null而使用包装类就不需要思考因为和其它变量一样都是null因此一般使用包装类进行交互。