Mybatis介紹之 動態SQL
動態 SQL
動態 SQL 是 MyBatis 的強大特性之一。如果你使用過 JDBC 或其它類似的框架,你應該能理解根據不同條件拼接 SQL 語句有多痛苦,例如拼接時要確保不能忘記新增必要的空格,還要注意去掉列表最後一個列名的逗號。利用動態 SQL,可以徹底擺脫這種痛苦。
使用動態 SQL 並非一件易事,但藉助可用於任何 SQL 對映語句中的強大的動態 SQL 語言,MyBatis顯著地提升了這一特性的易用性。
如果你之前用過 JSTL 或任何基於類 XML 語言的文字處理器,你對動態 SQL 元素可能會感覺似曾相識。在 MyBatis 之前的版本中,需要花時間瞭解大量的元素。藉助功能強大的基於 OGNL 的表示式,MyBatis 3 替換了之前的大部分元素,大大精簡了元素種類,現在要學習的元素種類比原來的一半還要少。
if
choose (when, otherwise)
trim (where, set)
foreach
一、MyBatis動態語句分為4種元素:
MyBatis的動態SQL語句是基於OGNL表示式的。可以方便的在SQL語句中實現某些邏輯,總體說來MyBatis動態SQL語句主要有以下幾類:
⭐ if語句(簡單的條件判斷)。
⭐ choose(when,otherwize),相當於Java語言中的switch,與JSTL中的choose很類似。
⭐ trim(對包含的內容加上prefix,或者suffix等,字首,字尾)。
⭐ where(主要是用來簡化SQL語句中where條件判斷的,能智慧的處理and or,不必擔心多餘導致語法錯誤)。
⭐ set(主要用於更新時)。 6、foreach(在實現MyBatis in語句查詢時特別有用)。
下面用介紹幾種方式:
依據資料庫建立class類,student類
ClassInfo
package cn.yyj1.entity;
import java.util.List;
public class ClassInfo {
private int classid;
private String className;
private List studentInfoList;
public List getStudentInfoList() {
return studentInfoList;
}
public void setStudentInfoList(List studentInfoList) {
this.studentInfoList = studentInfoList;
}
public int getClassid() {
return classid;
}
public void setClassid(int classid) {
this.classid = classid;
}
public String getClassName() {
return className;
}
public void setClassName(String className) {
this.className = className;
}
public ClassInfo(int classid, String className) {
this.classid = classid;
this.className = className;
}
public ClassInfo() {
}
}
StudentInfo類
package cn.yyj1.entity;
public class StudentInfo {
private String studentid;
private String studentName;
private String studentSex;
private String studentPhone;
private String studentAddress;
private int studentAge;
private int stuclassid;
//私有的 型別 名字
//只有空的構造方法 才能查到className 的資訊
private ClassInfo classInfo;
public String getStudentid() {
return studentid;
}
public void setStudentid(String studentid) {
this.studentid = studentid;
}
public String getStudentName() {
return studentName;
}
public void setStudentName(String studentName) {
this.studentName = studentName;
}
public String getStudentSex() {
return studentSex;
}
public void setStudentSex(String studentSex) {
this.studentSex = studentSex;
}
public String getStudentPhone() {
return studentPhone;
}
public void setStudentPhone(String studentPhone) {
this.studentPhone = studentPhone;
}
public String getStudentAddress() {
return studentAddress;
}
public void setStudentAddress(String studentAddress) {
this.studentAddress = studentAddress;
}
public int getStudentAge() {
return studentAge;
}
public void setStudentAge(int studentAge) {
this.studentAge = studentAge;
}
public int getStuclassid() {
return stuclassid;
}
public void setStuclassid(int stuclassid) {
this.stuclassid = stuclassid;
}
public ClassInfo getClassInfo() {
return classInfo;
}
public void setClassInfo(ClassInfo classInfo) {
this.classInfo = classInfo;
}
public StudentInfo(String studentid, String studentName, String studentSex, String studentPhone, String studentAddress, int studentAge, int stuclassid, ClassInfo classInfo) {
this.studentid = studentid;
this.studentName = studentName;
this.studentSex = studentSex;
this.studentPhone = studentPhone;
this.studentAddress = studentAddress;
this.studentAge = studentAge;
this.stuclassid = stuclassid;
this.classInfo = classInfo;
}
public StudentInfo(String studentName, String studentSex, String studentPhone, String studentAddress, int studentAge, int stuclassid, ClassInfo classInfo) {
this.studentName = studentName;
this.studentSex = studentSex;
this.studentPhone = studentPhone;
this.studentAddress = studentAddress;
this.studentAge = studentAge;
this.stuclassid = stuclassid;
this.classInfo = classInfo;
}
public StudentInfo() {
}
}
建立mapper類 和mapper.xml
package cn.yyj1.mapper;
import cn.yyj1.entity.ClassInfo;
import cn.yyj1.entity.StudentInfo;
import org.apache.ibatis.annotations.Param;
import java.util.List;
import java.util.Map;
public interface StudentInfoMapper {
//根據班級編號查詢所屬班級的所有學生資訊 id 班級編號 所屬這個班級的學生
public List findStuByClassId(int id);
//根據班級編號查詢班級資訊 id 班級資訊 班級資訊
public ClassInfo findClassByClassId(int id);
//根據班級編號查詢所屬姓名的學生
public List findStudNameByClassId(@Param("stuclassid") int stuclassid, @Param("studentName") String studentName);
//根據ID修改學生資訊
public int update (StudentInfo si);
public StudentInfo findStudentById(String id);
//根據陣列查詢所有學生資訊 定義陣列 int [] array
public List findStudentByArray(int [] array);
//根據集合查學生資訊
public List findStudentByList(List list);
//根據Map查詢
public List findStudentByMap(Map map);
//Choose
public List findStudentByChoose(@Param("studentName")String studentName,@Param("studentAge")int studentAge,@Param("stuclassid")int stuclassid);
//分頁
public List findStudentByPage(@Param("pageSize")int pageSize,@Param("pageCode")int pageCode);
}
mapper.xml
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"
select s.*,c.className from student s,classinfo c where s.stuclassid=c.classid and s.stuclassid=#{stuclassid}
select s.*,c.className from student s,classinfo c where s.stuclassid=c.classid and c.classid=#{classid}
SELECT * FROM student stuclassid=#{stuclassid} and studentName LIKE concat(concat('%',#{studentName}),'%')
SELECT * FROM student WHERE studentid=#{studentid}
UPDATE student
/**/
studentName=#{studentName},
studentSex=#{studentSex},
studentPhone=#{studentPhone},
studentAddress=#{studentAddress},
studentAge=#{studentAge},
stuclassid=#{stuclassid},
SELECT * from student WHERE stuclassid IN #{stuclassid}
SELECT * from student WHERE stuclassid IN #{stuclassid}
SELECT * FROM student where studentName LIKE concat(concat('%',#{studentName}),'%') and stuclassid in #{map}
SELECT * FROM student where 1=1 AND studentName LIKE concat(concat('%',#{studentName}),'%') AND studentAge>#{studentAge} and stuclassid=#{stuclassid}
SELECT * FROM student limit #{pageSize},#{pageCode}
建立工具類:
package cn.yyj1.util;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import java.io.IOException;
import java.io.InputStream;
public class MybatisUtil {
//載入mybatis配置檔案
//建立sqlsessionfactory物件
//建立sqlsession連線物件
//建立關閉sqlsession連線物件
//mybatis 資料庫查詢
private static SqlSessionFactory sessionFactory;
static{
String resource="mybatis1.xml";
try {
InputStream is= Resources.getResourceAsStream(resource);
sessionFactory=new SqlSessionFactoryBuilder().build(is);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static SqlSession getSession(){
return sessionFactory.openSession();
}
public static void closeSession(SqlSession session){
if(session!=null){
session.close();
}
}
}
連線資料庫的xml
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"
測試類:
package cn.yyj1.test;
import cn.yyj1.entity.ClassInfo;
import cn.yyj1.entity.StudentInfo;
import cn.yyj1.mapper.StudentInfoMapper;
import cn.yyj1.util.MybatisUtil;
import com.sun.scenario.effect.impl.sw.sse.SSEBlend_SRC_OUTPeer;
import org.apache.ibatis.session.SqlSession;
import java.io.ObjectStreamClass;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class Test {
public static void main(String[] args) {
// test1();
// test2();
// test3();
// test4();
// test5();
// test6();
// test7();
// test8();
test9();
}
private static void test9() {
SqlSession session = MybatisUtil.getSession();
int pageSize=2;int pageCode=2;
int before=(pageCode-1)*pageSize;
int after=pageSize;
List LIST=session.getMapper(StudentInfoMapper.class).findStudentByPage(before,after);
System.out.println(LIST);
for (StudentInfo s:LIST){
System.out.println(s.getStudentName()+"\t"+s.getStuclassid());
}
}
private static void test8() {
//Choose 等於java中的 Switch 語句 第一次直接跳入名字中含有 “趙” 的
// SqlSession session = MybatisUtil.getSession();
// List list=session.getMapper(StudentInfoMapper.class).findStudentByChoose("趙",20,1);
// for (StudentInfo l:list){
// System.out.println(l.getStudentName()+"\t"+l.getStuclassid()+"\t"+l.getStudentAge());
// }
//第二次跳入年齡大於20歲的
SqlSession session = MybatisUtil.getSession();
List list=session.getMapper(StudentInfoMapper.class).findStudentByChoose(null,20,1);
System.out.println(list);
for (StudentInfo l:list){
System.out.println(l.getStudentName()+"\t"+l.getStuclassid()+"\t"+l.getStudentAge());
}
//第三次進入 班級 id 為 1 的
// SqlSession session = MybatisUtil.getSession();
// List list=session.getMapper(StudentInfoMapper.class).findStudentByChoose(null,0,1);
// System.out.println(list);
// for (StudentInfo l:list){ 大連人流醫院價格
// System.out.println(l.getStudentName()+"\t"+l.getStuclassid()+"\t"+l.getStudentAge());
// }
}
private static void test7() {
SqlSession session = MybatisUtil.getSession();
Map map = new HashMap();
List list1 = new ArrayList();
list1.add(1);
list1.add(2);
map.put("studentName","趙");
map.put("list",list1);
List li=session.getMapper(StudentInfoMapper.class).findStudentByMap(map);
for (StudentInfo a:li){
System.out.println(a.getStudentName()+"\t"+a.getStuclassid());
}
}
private static void test6() {
SqlSession session = MybatisUtil.getSession();
//新建一個list集合 命名為list1
ArrayList list1 = new ArrayList();
//向list1 集合中新增資料
list1.add(2);
list1.add(3);
//遍歷獲取 列印輸出
List list=session.getMapper(StudentInfoMapper.class).findStudentByList(list1);
for (StudentInfo i:list){
System.out.println(i.getStudentName()+"\t"+i.getStuclassid());
}
}
private static void test5() {
SqlSession session = MybatisUtil.getSession();
int[] array={1,2};
List list=session.getMapper(StudentInfoMapper.class).findStudentByArray(array);
for (StudentInfo i:list){
System.out.println(i.getStudentName()+"\t"+i.getStuclassid());
}
}
private static void test4() {
SqlSession session = MybatisUtil.getSession();
//先查詢ID 再給Id更改
StudentInfo a=session.getMapper(StudentInfoMapper.class).findStudentById("s123452");
a.setStudentName("張大東");
int b=session.getMapper(StudentInfoMapper.class).update(a);
if (b>0){
System.out.println("ok");
}
session.commit();
}
private static void test3() {
SqlSession session = MybatisUtil.getSession();
List list=session.getMapper(StudentInfoMapper.class).findStudNameByClassId(1,"趙");
for (StudentInfo i:list){
System.out.println(i.getStudentName());
}
}
private static void test2() {
SqlSession session = MybatisUtil.getSession();
ClassInfo list=session.getMapper(StudentInfoMapper.class).findClassByClassId(2);
System.out.println(list.getClassName());
List lists=list.getStudentInfoList();
for (StudentInfo u:lists){
System.out.println(u.getStudentName());
}
}
private static void test1() {
SqlSession session = MybatisUtil.getSession();
//遍歷集合 輸出
List list=session.getMapper(StudentInfoMapper.class).findStuByClassId(1);
System.out.println(list.size());
for (StudentInfo u:list){
System.out.println(u.getStudentName()+"\t"+u.getClassInfo().getClassName());
}
}
}
其中:
when
when元素表示當when中的條件滿足的時候就輸出其中的內容,跟JAVA中的switch效果差不多的是按照條件的順序,當when中有條件滿足的時候,就會跳出choose,即所有的when和otherwise條件中,只有一個會輸出,當所有的條件都不滿足的時候就輸出otherwise中的內容
set
set元素主要是用在更新操作的時候,它的主要功能和where元素其實是差不多的,主要是在包含的語句前輸出一個set,然後如果包含的語句是以逗號結束的話將會把該逗號忽略,如果set包含的內容為空的話則會出錯。有了set元素就可以動態的更新那些修改了的欄位。
foreach
foreach的主要用在構建in條件中,它可以在SQL語句中進行迭代一個集合。foreach元素的屬性主要有item,index,collection,open,separator,close。item表示集合中每一個元素進行迭代時的別名,index指定一個名字,用於表示在迭代過程中,每次迭代到的位置,open表示該語句以什麼開始,separator表示在每次進行迭代之間以什麼符號作為分隔符,close表示以什麼結束,在使用foreach的時候最關鍵的也是最容易出錯的就是collection屬性,該屬性是必須指定的,但是在不同情況下,該屬性的值是不一樣的,主要有一下3種情況:
1、如果傳入的是單引數且引數型別是一個List的時候,collection屬性值為list
2、如果傳入的是單引數且引數型別是一個Array陣列的時候,collection的屬性值為array
3、如果傳入的引數是多個的時候,就需要把它們封裝成一個Map,當然單引數也可以封裝成Map,實際上如果在傳入引數的時候,在MyBatis裡面也是會把它封裝成一個Map的,Map的key就是引數名,所以這個時候collection屬性值就是傳入的List或Array物件在自己封裝的Map裡面的key
trim
trim元素的主要功能是可以在自己包含的內容前加上某些字首,也可以在其後加上某些字尾,與之對應的屬性是prefix和suffix;可以把包含內容的首部某些內容覆蓋,即忽略,也可以把尾部的某些內容覆蓋,對應的屬性是prefixOverrides和suffixOverrides;正因為trim有這樣的功能,所以也可以非常簡單的利用trim來代替where元素的功能。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69945560/viewspace-2763362/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- MyBatis框架之SQL對映和動態SQLMyBatis框架SQL
- MyBatis 動態 SQLMyBatisSQL
- mybatis動態SQLMyBatisSQL
- 1 Mybatis動態SQLMyBatisSQL
- Mybatis--動態SQLMyBatisSQL
- MyBatis(七) 動態SQLMyBatisSQL
- MyBatis學習 之 三、動態SQL語句MyBatisSQL
- MyBatis基礎:MyBatis動態SQL(3)MyBatisSQL
- mybatis動態sql總結MyBatisSQL
- Mybatis-06 動態SqlMyBatisSQL
- Mybatis 動態 SQL 詳解MyBatisSQL
- MyBatis4:動態SQLMyBatisSQL
- MyBatis系列(七):MyBatis動態Sql之choose,where,set標籤的用法MyBatisSQL
- 動態VLAN介紹
- Java-Mybatis動態SQL整理JavaMyBatisSQL
- MyBatis對動態SQL的支援MyBatisSQL
- mybatis動態sql與分頁MyBatisSQL
- MyBatis引數傳入集合之foreach動態sqlMyBatisSQL
- MyBatis從入門到精通(六):MyBatis動態Sql之if標籤的用法MyBatisSQL
- 好程式設計師分享MyBatis之動態SQL語句程式設計師MyBatisSQL
- Mybatis 動態執行SQL語句MyBatisSQL
- Mybatis深入瞭解(五)----動態SQLMyBatisSQL
- Oracle PL/SQL之 Package介紹OracleSQLPackage
- MyBatis從入門到精通(八):MyBatis動態Sql之foreach標籤的用法MyBatisSQL
- 【MyBatis學習總結 (五),動態SQL】MyBatisSQL
- Mybatis where 1=1 動態sql問題MyBatisSQL
- Mybatis學習筆記(6)-動態SQLMyBatis筆記SQL
- mybatis入門基礎(五)----動態SQLMyBatisSQL
- Mybatis 入門介紹MyBatis
- MyBatis從入門到精通(七):MyBatis動態Sql之choose,where,set標籤的用法MyBatisSQL
- 八、路由詳細介紹之動態路由OSPF(重點)路由
- 動態陣列介紹----Delphi (轉)陣列
- 深入淺出MyBatis:JDBC和MyBatis介紹MyBatisJDBC
- Quick-Task 動態指令碼支援框架之使用介紹篇UI指令碼框架
- Mybatis(一)Porxy動態代理和sql解析替換MyBatisSQL
- MyBatis標籤實現的動態SQL語句MyBatisSQL
- CGlib動態代理-簡單介紹CGLib
- MyBatis 動態 SQL 最全教程,這樣寫 SQL 太優雅了!MyBatisSQL