https://www.cnblogs.com/l-y-h/p/12859477.html#_label0_0
(1)按装插件:mybatisx(可安可不安)
(2)导入依赖
【mybatis-plus】
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.4.3.1</version>
</dependency>
【mysql-connector】
注意:
导入了mybatis-spring就不需要单独导入jdbc了,其中包含有。
【多个属性要分开配置注入注解】
@Autowired
private EmployeeMapper employeeMapper;
@Autowired
private DepartmentMapper departmentMapper;
(3)编写实体类,注意实体类与数据库表的名称映射关系
Mybatis-plus处理实体类及其属性 & 数据库表及其列名的映射关系
【自动映射】
实体类的驼峰命名 <------自动映射------> 数据库表的下划线命名
MyTable --------- my_table
DePartment ---------- de_partment
Name ---- name
MyName --------- my_name
注意:数据库表里只有小写,没有大写。
【手动配置方式】
注解@TableName 在类名上方添加@TableName("my_user_table")
(4)编写mapper继承BaseMapper<Department>
配置注解:@mapper
@repository
默认获取常见单表的CRUD操作;
也可以自定义数据库操作;
【缺点】默认操作只有单表操作,多表查询必须自己写方法。
(5)mybatis-plus执行联表操作
mybatis-plus默认操作只有单表操作,多表操作必须自己写方法。
【自定义mapper方法】
(1)mapper接口不继承默认父类
public interface EmployeeMapper{...}
(2)配置文件中指定包的别名以及mapper.xml文件的位置
mybatis-plus:
type-aliases-package: com.wwb.pojo
mapper-locations: classpath*:/mapper/*.xml
(3)在mapper.xml文件中写自定义数据库操作方法
【关联一个实体类】(多对一)
- 查询
//先查出所有结果
<select id="queryALL" resultMap="employMap">
select * from mybatis.employee e,mybatis.department d WHERE e_d_id=d_id;
</select>
//再将结果在resultMap中映射,关键词association
<resultMap id="employMap" type="employee">
<result column="e_id" property="eId"/>
<result column="e_name" property="eName"/>
<result column="e_email" property="eEmail"/>
<result column="e_gender" property="eGender"/>
<result column="e_birth" property="eBirth"/>
<association property="department" javaType="department">
<result column="d_id" property="dId"/>
<result column="d_name" property="dName"/>
</association>
</resultMap>
- 插入或更新
【问题】
多表级联时,java实体类的属性中有对象,而数据库表中对应的列名往往是外键id。
因此实体类中关联有其他对象时,进行更新或插入时就需要考虑将一个对象映射为一个基本属性值(外键id)。
public class Employee {
private Integer eId;
private String eName;
private String eEmail;
private Integer eGender;
private Department department; //关联了另外一个对象
private Date eBirth;
}
//而数据库表的对应列名是一个int值
【解决】
暂未找到级联插入的mapper实现
妥协办法:在service层将前端传来的对象转换为map,将map作为参数类型传入mapper.xml进行操作
public class EmployeeServiceImpl implements EmployeeService {
@Resource
private EmployeeMapper mapper;
private Map<String, Object> map;
//将employee对象转换为map类型对象
private void setMap(Employee employee) {
Map<String, Object> map = new HashMap<>();
map.put("eId",employee.getEId());
map.put("eName",employee.getEName());
map.put("eDId",employee.getDepartment().getDId());
map.put("eBirth",employee.getEBirth());
map.put("eEmail",employee.getEEmail());
map.put("eGender",employee.getEGender());
this.map = map;
}
//service接收前端的对象,转换后进行插入/更新操作
@Override
public int add(Employee employee) {
setMap(employee);
return mapper.add(map);
}
【关联多个实体类】(一对多)
- 查询
//首先查询出全部结果
//将查询结果进行映射,对应集合属性,使用<colletion>标签进行对应,注意使用的类型为ofType
- 插入或更新
同关联一个对象
【注意】
①为了写mapper.xml方便,数据库不同表的列名完全不同;
s_id;
t_di;
②service层Impl必须要注册bean
(6)service层
mybatis-plus帮助我们在service层接话接口和实现类;
【service层接口】
继承 IService<pojo>
public interface DepartmentService extends IService<Department>{
}
【service层实现类】
继承 ServiceImpl<mapper,pojo>
实现 service层接口
public class DepartmentServiceImpl extends ServiceImpl<DepartmentMapper,Department> implements DepartmentService { }