MyBatis的@ResultMap,@MapKey,@Options以及@ResultMap,@Many和动态SQL等具体用法
要求:Postman测试工具,阿里云数据库,以及SpringToolSuite4等工具方法的定义:@ResultMap:对@Result的命名,是可复用@Results:映射表和类@Result:具体的列和属性@MapKey:返回Map时指定key对应的属性@Options:其他选项,如获得自动生成的key阿里云数据库(hr库),下面有staff,de...
要求: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等具体用法就到这里了,有问题的小伙伴欢迎留言!!!
更多推荐
所有评论(0)