Mybatis介紹之 動態SQL

ckxllf發表於2021-03-17

  動態 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/,如需轉載,請註明出處,否則將追究法律責任。

相關文章