转载

MyBatis中的动态SQL以及@ResultMap,@MapKey和@Options的使用

动态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的使用就到这里了,重要的是理解掌握。有问题的小伙伴欢迎留言!!!

正文到此结束
本文目录