转载

MyBatis的@ResultMap,@MapKey,@Options以及@ResultMap,@Many和动态SQL等具体用法

要求:Postman测试工具,阿里云数据库,以及SpringToolSuite4等工具


方法的定义: 

    @ResultMap:对@Result的命名,是可复用
	@Results:映射表和类
	@Result:具体的列和属性
	@MapKey:返回Map时指定key对应的属性
	@Options:其他选项,如获得自动生成的key

 


阿里云数据库(hr库),下面有staff,dept,address表的结构。


插入各个表的数据,方便测试:

insert into dept(title,loc) values('产品','北京'), 
('研发','长沙'),('测试','武汉'),('实施','广州');

insert into staff(name,dept_id) values('alice',1);
insert into staff(name,dept_id) values('bob',1);
insert into staff(name,dept_id) values('小王',2);
insert into staff(name,dept_id) values('小李',4);
insert into staff(name,dept_id) values('小张',4);

insert into address(city,street,staff_id,tel) values('长沙','五一路',4,'139');
insert into address(city,street,staff_id,tel) values('长沙','五一路',1,'139');
insert into address(city,street,staff_id,tel) values('长沙','五一路',2,'139');
insert into address(city,street,staff_id,tel) values('长沙','五一路',3,'139');
insert into address(city,street,staff_id,tel) values('永州','鼓楼大街',4,'139');
insert into address(city,street,staff_id,tel) values('湘潭','钟楼大街',1,'139');
insert into address(city,street,staff_id,tel) values('南京','北京西路',2,'139');

 


这样表中就有数据了,现在开始用SpringToolSuite4工具对数据进行CRUD的操作。 

SpringToolSuite4下的工程目录结构:


application.properties

#SQL数据源
spring.datasource.url=jdbc:mysql://阿里云ip:3306/hr
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver



 


Staff.java

package com.newer.hr1.pojo;

import java.util.List;

/**
 * 员工实体类
 * @author Admin
 *
 */
public class Staff {

	/**
	 * 员工的编号
	 */
	int id;
	
	/**
	 * 员工的名字
	 */
	String name;
	
	/**
	 * 员工的职位
	 */
	
	String job;
	
	/**
	 * 员工的联系方式
	 */
	String phone;
	
	/**
	 * 部门的编号
	 * 一个人只有一个部门
	 * @One
	 */
	
	Dept dept;
	
	/**
	 * 一个人有多个地址
	 * @Many
	 */
	List<Address> 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;
	}

	public List<Address> getAddressList() {
		return addressList;
	}

	public void setAddressList(List<Address> addressList) {
		this.addressList = addressList;
	}

	@Override
	public String toString() {
		return "Staff [id=" + id + ", name=" + name + ", job=" + job + ", phone=" + phone + ", dept=" + dept
				+ ", addressList=" + addressList + "]";
	}

	
	
	
	
}

Dept.java

package com.newer.hr1.pojo;
/**
 * 部门实体类
 * @author Admin
 *
 */
public class Dept {

	/**
	 * 部门编号
	 */
	int id;
	
	/**
	 * 部门名字
	 */
	String name;
	
	/**
	 * 部门地址
	 */
	String city;

	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 getCity() {
		return city;
	}

	public void setCity(String city) {
		this.city = city;
	}

	@Override
	public String toString() {
		return "Dept [id=" + id + ", name=" + name + ", city=" + city + "]";
	}
	
	

	
}

Address.java

package com.newer.hr1.pojo;
/**
 * 地址
 * @author Admin
 *
 */
public class Address {

	/**
	 * 地址的编号
	 */
	int id;
	
	/**
	 * 城市
	 */
	String city;
	
	/**
	 * 街道
	 */
	String street;
	
	/**
	 * 联系方式
	 */
	String tel;

	public int getId() {
		return id;
	}

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

	public String getCity() {
		return city;
	}

	public void setCity(String city) {
		this.city = city;
	}

	public String getStreet() {
		return street;
	}

	public void setStreet(String street) {
		this.street = street;
	}

	public String getTel() {
		return tel;
	}

	public void setTel(String tel) {
		this.tel = tel;
	}

	@Override
	public String toString() {
		return "Address [id=" + id + ", city=" + city + ", street=" + street + ", tel=" + tel + "]";
	}


	
	
}

StaffMapper.java(接口)-----重点

package com.newer.hr1.mapper;


import java.util.List;

import org.apache.ibatis.annotations.Many;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.One;
import org.apache.ibatis.annotations.Result;
import org.apache.ibatis.annotations.Results;
/**
 * 数据持久化存储
 * @author Admin
 *
 */
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.SelectProvider;
import org.apache.ibatis.jdbc.SQL;
import org.apache.ibatis.type.JdbcType;

import com.newer.hr1.pojo.Dept;
import com.newer.hr1.pojo.Staff;

@Mapper
public interface StaffMapper {

	/**
	 * 查询staff表中所有的数据
	 * @return
	 */
	@Select("select * from staff")
//	匹配数据库表的字段和类的属性名
	@Results({
		
		@Result(
				column = "dept_id",
//				可写可不写
				jdbcType =JdbcType.INTEGER,
				property = "dept",
				javaType = Dept.class,
				one=@One(select="com.newer.hr1.mapper.DeptMapper.findById")
				
				)
	})
	List<Staff> findAll();
	
	
	
	/**
	 * 根据id查询staff表
	 */
	
	@Select("select * from staff where id=#{id}")
//	匹配数据库表的字段和类的属性名	
	@Results({
		
		@Result(
				column = "id",
				property = "addressList",
				javaType = List.class,
				many=@Many(select="com.newer.hr1.mapper.AddressMapper.findById")
				)
		
		
	})
	Staff findById(int id);
	
	
	/**
	 * @SelectProvider条件查询
	 */
	@SelectProvider(type =SqlProvider.class,method = "findStaff" )
	List<Staff>findAllp(Staff staff);
	
	static class SqlProvider{
		/**
		 * 动态	SQL
		 */
		public String findStaff(Staff staff) {
			return new SQL() {{
				
				SELECT("*");
				FROM("staff");
				if(staff.getName()!=null) {
					WHERE("name like #{name}");
				}
				if(staff.getPhone()!=null) {
					WHERE("phone like #{phone}");
				}
				
			}
			}	
					.toString();
		}
	}
	
}

DeptMapper.java(接口)

package com.newer.hr1.mapper;

import java.util.List;
import java.util.Map;

import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.MapKey;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Options;
import org.apache.ibatis.annotations.Result;
import org.apache.ibatis.annotations.ResultMap;
import org.apache.ibatis.annotations.Results;
import org.apache.ibatis.annotations.Select;

import com.newer.hr1.pojo.Dept;

/**
 * 数据持久化存储
 * @author Admin
 *
 */
@Mapper
public interface DeptMapper {

	/**
	 * 查询dept表所有的数据
	 * @return
	 */
	@Select("select * from dept")
	@Results(
			id="deptResultMap",
			value = {
					@Result(column = "title",property = "name"),
					@Result(column = "loc",property = "city")
			}
			)
	List<Dept> findAll();
	
	/**
	 * 查询dept表所有的数据,返回Map时指定key对应的属性
	 */
	@Select("select * from dept")
	@ResultMap("deptResultMap")
	@MapKey("name")
	Map<String,Dept> findname();
	
	/**
	 * #:调用参数对象的getxxx 读取属性
		java 14 
		创建对象后,返回新创建的对象(有数据库存储是自动生成的id)
		mysql auto_increment 自动生成id
		useGeneratedKeys:获得自动生成的key
	    keyProperty :赋值给对象的id属性
	        向dept表插入一条数据
	 */
	
	@Insert("insert into dept(title,loc) values(#{name},#{city})")
	@Options(useGeneratedKeys = true,keyProperty ="id")
	boolean create (Dept dept);
	
	
	
	/**
	 * 根据id查询dept表
	 * @param id
	 * @return
	 */
	@Select("select * from dept where id=#{id} ")
	@ResultMap("deptResultMap")
	Dept findById(int id);
	
}

Address.java(接口)----重要理解

package com.newer.hr1.mapper;

import java.util.List;

import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;

import com.newer.hr1.pojo.Address;

/**
 * 持久化存储
 * @author Admin
 *
 */
@Mapper
public interface AddressMapper {
	
	/**
	 *根据id查询address表
	 */
	@Select("select * from address where staff_id=#{id}")
	List<Address> findById(int id);
}

StaffController.java

package com.newer.hr1.controller;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;

import com.newer.hr1.mapper.DeptMapper;
import com.newer.hr1.mapper.StaffMapper;
import com.newer.hr1.pojo.Staff;

/**
 * RESTful控制器
 * @author Admin
 *
 */

@RestController
public class StaffController {

	
	
	/**
	 * 自动依赖注入
	 * @return
	 */
	
	@Autowired
	StaffMapper staffMapper;
	
	
	
	/**
	 * 查询staff表的方法
	 */
	@GetMapping("/staff")
	public List<Staff> findAll(){
		return staffMapper.findAll();
	}
	
	
	/**
	 * 根据id查询staff表的方法
	 */
	@GetMapping("/staff/{id}")
	public Staff findById(@PathVariable int id) {
		return staffMapper.findById(id);
	}
	
	/**
	 * 调用动态SQL的方法
	 * 根据字段的名字获得数据
	 */
	@GetMapping("/staff/")
	public List<Staff> find(@RequestBody Staff staff){
		return staffMapper.findAllp(staff);
	}
}

DeptController.java

package com.newer.hr1.controller;

import java.util.List;
import java.util.Map;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;

import com.newer.hr1.mapper.DeptMapper;
import com.newer.hr1.pojo.Dept;

/**
 * RESTful控制器
 * @author Admin
 *
 */
@RestController
public class DeptController {

	/**
	 * 自动依赖注入
	 */
	@Autowired
	DeptMapper deptMapper;
	
	/**
	 * 查询dept表的方法
	 */
	
	@GetMapping("/dept")
	public List<Dept> findAll(){
		return deptMapper.findAll();
	}
	
	
	/**
	 * 
	 * 查询dept表,返回Map时指定key对应的属性
	 */
	
	@GetMapping("/deptname")
	public Map<String, Dept> findname(){
		return deptMapper.findname();
	}
	
	/**
	 * 根据id查询dept表的方法
	 * 
	 */
	
	@GetMapping("/dept/{id}")
	public Dept findById(@PathVariable int id) {
		return deptMapper.findById(id);
	}
	
	/**
	 * 向dept表插入一条数据
	 */
	@PostMapping("/dept")
	public Dept create(@RequestBody Dept dept) {
	    boolean is= deptMapper.create(dept);
	    System.out.println(is);
		return dept;
	}
}

后端对数据库的访问操作完成了,运行程序,接下来就可以通过Postman去测试。

@Options:其他选项,如获得自动生成的key,新建一条数据,id自动生成,返回新创建的对象


实现动态SQL(详细可以看代码),获取指定值的所有集合

 


同时浏览器也可以看到数据的变化

staff表的数据:

 


根据id查找staff表的数据:

 


dept表的数据:

 


根据id获得dept表中的数据


还有很多操作,比如更新和删除等,大概步骤是一样的,小伙伴们可以举一反三的应用,如果实在有问题,可以去看我前面的博客,关于 MyBatis的@ResultMap,@MapKey,@Options以及@ResultMap,@Many和动态SQL等具体用法就到这里了,有问题的小伙伴欢迎留言!!!

正文到此结束
本文目录