choose标签是按顺序判断其内部when标签中的test条件是否成立,如果有一个成立,则执行该when标签中定义的SQL语句片段,并且choose标签提前结束。当choose标签中所有when标签的test条件都不满足时,则执行otherwise中的SQL。
类似于Java中的switch语句,choose为switch,when为case,otherwise则为default。
以下是choose标签中的各个子标签和属性:
when:这是choose标签中的子标签,用于定义一个条件分支。我们可以在when标签中使用test属性来指定一个条件表达式,如果该表达式的值为真,则会执行when标签中定义的SQL语句片段。
test:这是when标签中的属性,我们可以使用test属性来定义条件表达式,用于判断条件是否满足。如果条件满足,被when标签包裹的SQL语句片段将会被执行。
otherwise:这是choose标签中的可选子标签,用于定义一个默认的条件分支。如果前面的条件都不满足,将会执行otherwise标签中定义的SQL语句片段。
在数据库中构建下述表结构:
CREATE TABLE `user` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`user_name` varchar(10) NOT NULL,
`sex` tinyint(4) NOT NULL,
`birthday` date NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
并且执行下述SQL脚本初始化数据:
insert into `user` (`id`, `user_name`, `sex`, `birthday`) values('1','张伟','1','2022-02-02');
insert into `user` (`id`, `user_name`, `sex`, `birthday`) values('2','张伟','1','2022-02-03');
insert into `user` (`id`, `user_name`, `sex`, `birthday`) values('3','胡一菲','0','2022-02-03');
insert into `user` (`id`, `user_name`, `sex`, `birthday`) values('4','陈美嘉','0','2022-02-04');
insert into `user` (`id`, `user_name`, `sex`, `birthday`) values('5','吕子乔','1','2022-02-05');
构建实体类:
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import java.util.Date;
@Data
@TableName("user")
public class User {
@TableId(type = IdType.AUTO)
private Integer id;
@TableField(value = "user_name")
private String userName;
@TableField(value = "sex")
private Integer sex;
@TableField(value = "birthday")
private Date birthday;
}
构建mapper持久化接口和mapper.xml文件:
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.example.demo.entity.User;
import org.springframework.stereotype.Repository;
import java.util.List;
@Repository
public interface UserMapper extends BaseMapper {
List getUserList(User user);
}
例如当前以userName作为条件查询数据:
import com.example.demo.entity.User;
import com.example.demo.mapper.UserMapper;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import java.util.List;
@SpringBootTest
public class DemoApplicationTests {
@Autowired
private UserMapper userMapper;
@Test
void test(){
User user = new User();
user.setUserName("张伟");
List userList = userMapper.getUserList(user);
userList.forEach(System.out::println);
}
}
执行上述代码,其执行的SQL语句为“select * from user u WHERE u.user_name ='张伟';”,控制台的输出结果为:
User(id=1, userName=张伟, sex=1, birthday=Wed Feb 02 00:00:00 CST 2022)
User(id=2, userName=张伟, sex=1, birthday=Thu Feb 03 00:00:00 CST 2022)
例如当前以sex作为条件查询数据:
import com.example.demo.entity.User;
import com.example.demo.mapper.UserMapper;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import java.util.List;
@SpringBootTest
public class DemoApplicationTests {
@Autowired
private UserMapper userMapper;
@Test
void test(){
User user = new User();
user.setSex(0);
List userList = userMapper.getUserList(user);
userList.forEach(System.out::println);
}
}
执行上述代码,其执行的SQL语句为“SELECT * FROM USER u WHERE u.sex =0;”,控制台的输出结果为:
User(id=3, userName=胡一菲, sex=0, birthday=Thu Feb 03 00:00:00 CST 2022)
User(id=4, userName=陈美嘉, sex=0, birthday=Fri Feb 04 00:00:00 CST 2022)
例如当前以birthday作为条件查询数据:
import cn.hutool.core.date.DatePattern;
import cn.hutool.core.date.DateUtil;
import com.example.demo.entity.User;
import com.example.demo.mapper.UserMapper;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import java.util.Date;
import java.util.List;
@SpringBootTest
public class DemoApplicationTests {
@Autowired
private UserMapper userMapper;
@Test
void test(){
Date date =DateUtil.parse("2022-02-03 08:08:08",DatePattern.NORM_DATETIME_PATTERN);
User user = new User();
user.setBirthday(date);
List userList = userMapper.getUserList(user);
userList.forEach(System.out::println);
}
}
执行上述代码,其执行的SQL语句为“SELECT * FROM USER u WHERE u.birthday ='2022-02-03';”,控制台的输出结果为:
User(id=2, userName=张伟, sex=1, birthday=Thu Feb 03 00:00:00 CST 2022)
User(id=3, userName=胡一菲, sex=0, birthday=Thu Feb 03 00:00:00 CST 2022)
特别说明:MyBatis处理日期有两种jdbcType,即DATE和TIMESTAMP。当我们使用java.util.Date作为实体的日期类型时,java.util.Date实际上是能够表示MYSQL的三种字段类型:date、datetime和timestamp。实际将java.util.Date当做参数传递给Mapper的时候,如果我们不指定jdbcType,那么这个日期会自动转化会MySQL的timestamp。如果指定jdbcType=DATE,那么MyBatis会将传入参数截取为yyyy-MM-dd。MyBatis在做出日期类型转换后,可以直接使用 =、>、<、>=、<=符号来进行筛选。
例如当前不以任何字段作为条件查询数据:
import com.example.demo.entity.User;
import com.example.demo.mapper.UserMapper;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import java.util.List;
@SpringBootTest
public class DemoApplicationTests {
@Autowired
private UserMapper userMapper;
@Test
void test(){
User user = new User();
List userList = userMapper.getUserList(user);
userList.forEach(System.out::println);
}
}
执行上述代码,其执行的SQL语句为“select * from user u WHERE u.user_name = '吕子乔';”,控制台的输出结果为:
User(id=5, userName=吕子乔, sex=1, birthday=Sat Feb 05 00:00:00 CST 2022)