mybatis-动态SQL


目录
  • 基本介绍
  • 环境
  • if
  • where
  • set
  • trim
  • choose
  • foreach
    • 批量查询
    • 批量保存
  • 内置参数
  • script
  • bind
  • 抽取可重用sql

基本介绍

环境


/*
 Navicat Premium Data Transfer

 Source Server         : localhost
 Source Server Type    : MySQL
 Source Server Version : 80022
 Source Host           : localhost:3306
 Source Schema         : school

 Target Server Type    : MySQL
 Target Server Version : 80022
 File Encoding         : 65001

 Date: 18/11/2021 12:20:05
*/

SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

-- ----------------------------
-- Table structure for teacher
-- ----------------------------
DROP TABLE IF EXISTS `teacher`;
CREATE TABLE `teacher`  (
  `id` int(0) NOT NULL AUTO_INCREMENT,
  `tea_name` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
  `tea_age` int(0) NULL DEFAULT NULL,
  `tea_email` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_bin ROW_FORMAT = Dynamic;

-- ----------------------------
-- Records of teacher
-- ----------------------------
INSERT INTO `teacher` VALUES (1, 'tom', 26, 'tom@qq.com');
INSERT INTO `teacher` VALUES (2, 'lili', 22, 'lili@qq.com');
INSERT INTO `teacher` VALUES (3, 'lucy', 22, 'lucy@qq.com');
INSERT INTO `teacher` VALUES (4, 'lisi', 22, 'lisi@qq.com');

SET FOREIGN_KEY_CHECKS = 1;

package com.fly.entity;

/**
 * @author 26414
 */
public class Teacher {
  
  private Integer id;
  private String teaName;
  private Integer teaAge;
  private String teaEmail;

  @Override
  public String toString() {
    return "Teacher{" +
            "id=" + id +
            ", teaName='" + teaName + '\'' +
            ", teaAge=" + teaAge +
            ", teaEmail='" + teaEmail + '\'' +
            '}';
  }

  public Integer getId() {
    return id;
  }

  public void setId(Integer id) {
    this.id = id;
  }

  public String getTeaName() {
    return teaName;
  }

  public void setTeaName(String teaName) {
    this.teaName = teaName;
  }

  public Integer getTeaAge() {
    return teaAge;
  }

  public void setTeaAge(Integer teaAge) {
    this.teaAge = teaAge;
  }

  public String getTeaEmail() {
    return teaEmail;
  }

  public void setTeaEmail(String teaEmail) {
    this.teaEmail = teaEmail;
  }
}

package com.fly.dao;

/**
 * @author 26414
 */
public interface TeacherMapper {
}

<?xml version="1.0" encoding="UTF-8" ?>



    
        
        
            
        
    
    
        
    
    
        
    
    
        
        
    

db.driver=com.mysql.cj.jdbc.Driver
db.url=jdbc:mysql://localhost:3306/school?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=GMT%2B8&allowPublicKeyRetrieval=true
db.username=root
db.password=123456
#dbconfig.properties
<?xml version="1.0" encoding="UTF-8" ?>


    
    


<?xml version="1.0" encoding="UTF-8" ?>



    
    
    
        
        
        
        
    

    
        
    

    
        
        
            
            
                
                
                
                
            
        
    

    
        
    



if

  /**
   * TeacherMapper
   * if标签
   * @param teacher  老师对象
   * @return  符合条件的数据
   */
  List getTeaIf(Teacher teacher);
 
    
    
 @Test
  public void test1() throws IOException {
    String resource = "mybatis-config.xml";
    InputStream inputStream = Resources.getResourceAsStream(resource);
    SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
    try (SqlSession sqlSession = sqlSessionFactory.openSession()) {
      TeacherMapper mapper = sqlSession.getMapper(TeacherMapper.class);
      Teacher teacher = new Teacher();
      teacher.setId(1);
      List teachers = mapper.getTeaIf(teacher);
      System.out.println("teachers = " + teachers);
    }
  }



where

刚才的查询语句还有点问题,如果id没有带,sql语句为:select * from teacher where and tea_age = ?,这样肯定就会报错

  
    
    


set

 /**
   * TeacherMapper
   * set标签
   * @param teacher 老师对象
   */
  void updateTeaSet(Teacher teacher);

    
        update teacher
        
            
                tea_name = #{teaName},
            
            
                tea_age = #{teaAge},
            
            
                tea_email = #{teaEmail}
            
        
        where id = #{id}
    



trim


如果and放在语句的后面,where标签解决不了,可以使用trim标签

 /**
   * TeacherMapper
   * trim标签
   * @param teacher 老师对象
   * @return 符合条件的数据
   */
  List getTeaTrim(Teacher teacher);
 
    


choose

 /**
   * TeacherMapper
   * choose标签
   * @param teacher 老师对象
   * @return 符合条件的数据
   */
  List getTeaChoose(Teacher teacher);

    



可以看到,id和age都有值,但是只会拼接id

foreach

批量查询

/**
   * TeacherMapper
   * 查询id在集合中的老师
   * @param list id集合
   * @return id在集合中的老师
   */
  List getTeachersForeach(List list);
 
    


批量保存

 /**
   * TeacherMapper
   * 批量添加
   * @param teachers 老师集合
   */
  void addTeachers(@Param("teachers") List teachers);
  
    
        insert into teacher(tea_name,tea_age,tea_email) values
        
            (#{teacher.teaName},#{teacher.teaAge},#{teacher.teaEmail})
        
    



内置参数

 
    
        
        
    

script

bind

抽取可重用sql

 
    
    
        tea_name,tea_age,tea_email