动态SQL
定义:SQL语句执行时,会根据传入的参数的个数及参数的内容而发生变化。
动态 SQL 基于条件查询。
StaffMapper.java(接口)
// @SelectProvider替代了@Select
@SelectProvider(type =SqlProvider.class, method = "findStaff")
List<Staff> find(Staff staff);
static class SqlProvider{
/**
* 动态sql
* @param staff
* @return
*/
public String findStaff(Staff staff) {
// 静态sql
// return "select * from staff where id=#{id}";
// return new SQL()
// .SELECT("*")
// .FROM("staff")
// .WHERE("id = #{id}")
// .toString();
return new SQL() {{
SELECT("*");
FROM("staff");
if(staff.getJob()!=null) {
WHERE("job like #{job}");
}
if(staff.getPhone()!=null) {
WHERE("phone like #{phone}");
}
}
}
.toString();
}
}
HomeController.java
@GetMapping("/staff/")
public List<Staff>cc(@RequestBody Staff staff){
return staffMapper.find(staff);
}
Staff.java
package com.newer.hr.pojo;
import java.util.List;
/**
* 实体类
* @author Admin
*
*/
public class Staff {
// PK
int id;
// 属性
String name;
String job;
String phone;
// @One 一个员工隶属一个部门
// 数据库列名: dept_id
Dept dept;
// 一个人有多个地址
// @Many
List<Address> addressList;
public List<Address> getAddressList() {
return addressList;
}
public void setAddressList(List<Address> addressList) {
this.addressList = addressList;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getJob() {
return job;
}
public void setJob(String job) {
this.job = job;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
public Dept getDept() {
return dept;
}
public void setDept(Dept dept) {
this.dept = dept;
}
@Override
public String toString() {
return "Staff [id=" + id + ", name=" + name + ", job=" + job + ", phone=" + phone + ", dept=" + dept + "]";
}
}
现在可以通过Postman测试数据
@ResultMap
定义:对@Result的命名,是可复用
@Results(
id="deptResultMap",
value = {
@Result(column = "id",property = "id"),
@Result(column = "title",property = "name"),
@Result(column = "loc",property = "city"),
}
)
其他地方可以用,不需要重复
@ResultMap("deptResultMap")
@MapKey
定义:返回Map时指定key对应的属性
// Map:key-value
// "dev":Dept
//
@Select("select * from dept")
@ResultMap("deptResultMap")
@MapKey("name")
Map<String,Dept>find();
@Select("select * from dept")
// 不需要重复编写列到属性的映射关系
@ResultMap("deptResultMap")
List<Dept>findAll();
@Select("select * from dept where id=#{id}")
@Results(
id="deptResultMap",
value = {
@Result(column = "id",property = "id"),
@Result(column = "title",property = "name"),
@Result(column = "loc",property = "city"),
}
)
Dept load(int id);
@Options
定义:其他选项,如获得自动生成的key。
// #:调用参数对象的getxxx 读取属性
// java 14
// 创建对象后,返回新创建的对象(有数据库存储是自动生成的id)
// mysql auto_increment 自动生成id
// useGeneratedKeys:获得自动生成的key
// keyProperty :赋值给对象的id属性
@Options(useGeneratedKeys = true,keyProperty ="id")
@Insert("insert into dept(title,loc) values(#{name},#{city})")
boolean save(Dept dept);
@PostMapping("/dept")
public Dept create(@RequestBody Dept dept) {
System.out.println(dept);
boolean isSuccess= deptMapper.save(dept);
System.out.println(isSuccess);
System.out.println(dept);
return dept;
}
关于MyBatis中的动态SQL以及@ResultMap,@MapKey和@Options的使用就到这里了,重要的是理解掌握。有问题的小伙伴欢迎留言!!!
扫描二维码关注公众号,回复:
10431626 查看本文章