Mybatis笔记 (5)

增删改,没有任何特别需要改动的,正常定义<insert> <update> <delete> 即可

2. 一对多 2.1 建表 drop table IF EXISTS t_order; drop table IF EXISTS t_user; create table t_user( # 用户表 id int primary key AUTO_INCREMENT, name VARCHAR(50), gender char(1), regist_time DATE )DEFAULT CHARSET = utf8 ENGINE =innodb; create table t_order( # 订单表 id int primary key AUTO_INCREMENT, price VARCHAR(50), note VARCHAR(50), create_time DATE, user_id int, FOREIGN KEY(user_id) REFERENCES t_user(id) )DEFAULT CHARSET = utf8 ENGINE =innodb; insert into t_user(name,gender,regist_time) values('zhangsan','1','2019-12-12'); insert into t_user(name,gender,regist_time) values('lisi','0','2019-12-11'); insert into t_order(price,note,create_time,user_id) values(3000.55,'哈哈','2019-12-12',1); insert into t_order(price,note,create_time,user_id) values(600.55,'哈哈2','2019-12-12',1); insert into t_order(price,note,create_time,user_id) values(900.55,'呵呵2','2019-12-12',2); insert into t_order(price,note,create_time,user_id) values(4000.55,'呵呵2','2019-12-12',2); 2.2 建类 public class User { private Integer id; private String name; private Boolean gender; private Date registTime; //关系属性,存储用户的多个订单 private List<Order> orders; //set/get } public class Order { private Integer id; private BigDecimal price; private String note; private Date createTime; //关系属性 private User user; //set/get } 2.3 查询 //DAO public queryOneUserAndOrders(Integer id);//根据用户id查询用户及其所有订单 <!-- 按照之前的思路,映射如此定义,但此时,resultType为User,所以只能接收User本身的信息! 那如何将查询中得到的Order信息也保存到User中呢? User中保存Order信息的属性名为“orders”,则此属性需要有一个和它同名的列才可以接收值! 但是该属性的值又不可能来自某一个列,而是多个列的值! 我们该如何配置,才可以将多列的值对应到一个属性上呢? --> <select parameterType="int" resultType="User"> select t_user.id as uid, name, gender, regist_time as registTime, t_order.id as oid, note,price, create_time as createTime from t_user join t_order ON t_user.id = t_order.user_id where t_user.id=#{id} </select> 如上映射文件,存在问题 ==> 关系属性:orders,需要多个列映射到这一个属性上,但并没有映射清楚

Mybatis笔记

 

若要完成上图中的映射,不能再使用默认的同名映射规则,需要定制映射规则。

resultMap-- 映射规则定制利器 <!-- 定义查询中的各个列 与 属性的映射规则 --> <!-- id=标识 type=最终返回类型(将列映射到User的属性上) --> <resultMap type="User"> <!-- 主键列单独用id标签标识 property=类中属性名 column=查询中的列名--> <id property="id" column="uid"/> <!-- 常规属性都用result标签 --> <result property="name" column="name"/> <result property="gender" column="gender"/> <result property="registTime" column="registTime"/> <!-- 重点:关系属性【List<Order> orders】,非主键也非常规属性,而是一个List 用collection标签配置,用于完成上图中未完成之映射。 property=属性名 ofType=集合中的泛型类型--> <collection property="orders" ofType="Order"> <!-- Order的主键列 --> <id property="id" column="oid"/> <!-- 常规属性用result标签 --> <result property="note" column="note"/> <result property="price" column="price"/> <result property="createTime" column="createTime"/> </collection> </resultMap> <!-- 此处是resultType换为resultMap,进而引用了如上定义的“user_orders” --> <select parameterType="int" resultMap="user_orders"> select t_user.id as uid, name, gender, regist_time as registTime, t_order.id as oid, note,price, create_time as createTime from t_user join t_order ON t_user.id = t_order.user_id where t_user.id=#{id} </select> 2.4 测试 //查询用户1,及其订单信息 User user = userDAO.queryOneUserAndOrders(1); //获取用户1的订单信息 List<Order> orders = user.getOrders();

**思考题 ==> 请自主设计,完成以下: **

查询所有User及其Order:public List<User> queryAll();

查询某个Order及其User:public Order queryOrderAndUser(Integer orderid)

细节:

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpyywd.html