将需要用到的表全部创建成java的实体类,导入lombok依赖(自动生成get、set等方法)
User 用户表 Order 订单表
@Data
public class User {private Integer ID;private String username;private String PASSWORD;private String sex;private Date brithday;private String address;
}
一个用户可以有多条订单,而一条订单只属于一个用户
所以;:用户对订单是1对多
的关系
在设计数据库时(黄色部分)
:在多的一方(tb_order)中添加一个外键,与tb_user的主键对应(图中为uid)
在设计java对象时(红色部分)
: 需要根据题目进行pojo类的编写(具体看步骤三)
先分析清楚题目 如:
①:根据id查询订单以及订单的所属用户信息
=>
返回的数据是tb_order表中的数据+tb_user表中的数据,需要修改的实体类是Order,因为是根据order的id查询的
//需要在Order的实体类中引入User对象
public class Order {private Integer id;private Integer userid;private Date createtime;private String state;// 多对一private User user = new User();
}
②:根据用户id查询她的各类订单
=>
返回的数据是tb_user+tb_order表中的数据,但是不同与上面的是:由于订单有多条所以订单需要用集合来装,而查询出的数据是要根据用户的id查询所有需要修改User类
// 需要在User表中的实体类中引入数据类型为Order的集合
public class User implements Serializable {private Integer ID;private String username;private String PASSWORD;private String sex;private Date brithday;private String address;// 一对多private List orders = new ArrayList<>();
}
public interface UserMapper {
// 通过订单id查询订单详情以及所属用户Order selectOrderAndInfoById(@Param("oid") int id);
// 通过用户id查询该用户的所有订单User selectByUserIdForOrder(@Param("uid") int id);
// 根据id查询用户User selectUserByid(@Param("uid") int id);
}
需要指定该映射文件是步骤四的Mapper,在namespace中指定
重点来了:
需要知道的是我们关联的是两张表
,如果直接用下面的sql语句则只能查出订单的信息而订单所属用户则为空
,这是因为在执行过程中Order会自动映射到tb_order的内容,但是在Order表中定义的User对象则无法自动映射
到tb_user表中的内容
SELECT u.ID ,u.username,u.PASSWORD,u.sex,u.brithday,u.address,o.id oid,o.userid,o.createtime,o.state
FROM tb_user u JOIN tb_order o
ON u.ID = o.userid
WHERE u.id= #{uid}
所以我们得手动映射User类
,需要使用到resultMap
总体代码如下:
u.ID ,u.username,u.PASSWORD,u.sex,u.brithday,u.address,o.id oid,o.userid,o.createtime,o.state
selectParent
为手动映射的Order类的Map,selectChildren
为手动映射的User类的Map,由于需要返回的订单类
的数据所有type
中填写Order类,children
继承了parent
那么children中也会有parent的映射,所有selectChildren
的map中就有了Order+User
的映射
这个时候再标签
resultMap
中只需要传入selectChildren
就可以了
association
:因为在Order类中的User对象是单
个,所以使用该关键字
property
:对应Order表中的创建的User对象名
javaType
:property对应的数据类型
select
:就是指映射user对象去改方法中找,刚刚selectUserByid
方法返回的就是一个User
对象,这样就免去了手动一 一映射的麻烦
column
:但是selectUserByid
需要传入一个参数,这里传入的userid是从Order
中查询得到的然后再传给该方法去查询对应的User
学会了上面的知识后,这里就只是发生了一点点的变化
同样也是,是根据用户的id查询所以需要在User类中进行操作,而一个用户有多条订单,所以需要在用户类User中定义一个Order类型的集合,mybatis也只能映射User类和tb_user表,无法映射Order类和tb_order表,所以我们也需要手动映射
总体代码如下:
与上面不同的是集合映射使用关键字collection
,并且返回类型不再使用type
而是使用ofType
来指定
前面题目一映射是使用的继承
,现在题目二映射是直接在父映射中
继续映射,并且没有使用方法
id | 唯一标识符 |
type | 写返回的类的类名 |
| 对非主键的映射 |
对主键的映射 | |
property | 关联属性名 也就是User类中定义的各属性 |
column | 关联属数据库的字段 |
javaType | 关联属性的数据类型 在集合属性时不要写,但是在题目一的情况下就需要使用 |
ofType | 关联属性的数据类型 在集合属性时写,但是在题目一的情况下就不要使用 |
上一篇:全新一代ldquo捷达王rdquo亮相,小钢炮外观设计,2.0T爆发228马力-...(捷达王20v) 2019款捷达王高配 捷达王新款什么时候上市
下一篇:【Python】解决CNN中训练权重参数不匹配size mismatch for fc.weight,size mismatch for fc.bias