在昨天总结完java反射和注解后突然对ORM有了新的认知,希望可以帮助自己和有缘人更深刻的理解MyBatis。
MyBatis对象关系映射
- 名:Object Relational Mapping,简称ORM
- 通俗解释:使用Java语言操作数据库CRUD(增删改查)数据时,需要将数据库查询出来的表中数据(也称做元数据)存放在”List<复杂对象>“这样的一个集合中,而这个自定义的复杂java对象被称为 实体类POJO、Entity、JavaBean等等。
- 作用:对象关系映射就是解决了实体类和数据库表的对应关系。
- 具体体现:
- MyBatis:
在mapper文件的resultMap标签中解决pojo类属性和查询字段对应关系,resultType属性解决了查询结果对应的pojo类。 - MyBatisPlus:
注解@TableName(“TableName”)解决了pojo和java表的对应,注解@TableId(“PrimaryKey”)解决了主键指定,注解@TableField(“ColumnName”)解决了pojo属性和表字段的对应
ORM实现:🐖当查询的字段名称和实体类属e性名称一致时可以自动映射。
不一致时使用< ResultMap >来进行指定,更多的场景应用于复杂查询。如一对一assocation、一对多collection、多对多collection。
步骤
一对一:一个A对应一个B
- 数据库中A的一条数据中存有B数据的主键
- pojoA类中添加类B属性
- A的Mapper文件中编写sql语句
- 编写resultMap标签将sql中要查询的字段和类中的字段进行对应,对于对象B的对应使用assocation标签
一对多和多对多步骤一致
具体案例
一对多
背景:
项目表:一个项目可以有不同年限,不同年限的计划值不同。
计划值表:一个计划值对应一个项目
关系:一对多关系。
- 表字段展示:
tb_project
tb_message:projectid为tb_project表的id外键(应当命名为projectId)
- pojo展示
package yh.com.pojo;
//一
public class Project {
private Integer id;
private String company;
private String name;
private String properties;
private List<Message> mLists;
//get、set、toString方法
}
//多
public class Message {
private int id;
private String year;
private double value;
private int projectid;
//get、set、toString方法
}
- Project类的Mapper文件展示
//mapper文件头文件,复制即可
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
//mapper标签,指定命名空间,即对应哪个dao接口。crud标签的id和dao接口中的抽象方法的名称一致即可。
<mapper namespace="yh.com.dao.ProjectMapper">
<resultMap id="oneToMany" type="yh.com.pojo.Project">
//普通字段的映射
<id column="id" property="id