“一对一”可以使用于一个订单对应一个用户,而“一对多”可以使用于一个用户对应多个订单。使用的基本方法都是基于sql的增删改查,也就是在xml文件里面使用下面几个标签:
1、insert标签:在某个字段下插入一个值
2、delete标签:删除某个id的数据
3、select标签:根据某个id查询一个数据,也可以查询所有数据(这样返回一个list)、还可以进行模糊查询、多条件查询
4、update标签:更新某个id的数据
普通的增删改查只是针对于一个表里面的数据进行修改。但是如果有两个表,他们之间是有关连的,比如一个订单表,一个用户表,一个订单只能对应一个用户,(利用之前的增删查改可以将每个订单封装到一个对象中),现在想利用这两个表的联系,将每个订单对应的用户信息封装到用户类里面(也就是订单类里面有一个属性是用户类)。这就用到一对一,最后我们返回一个订单list,类型为Order,这个类里面有个User类型的属性。
主要要注意的是xml文件的使用(因为测试类都是固定的套路),里面用到
- <resultMap type="Order" id="orderUserResultMap">
- <id property="id" column="id" />
- <result property="userId" column="user_id" />
- <result property="number" column="number" />
- <result property="createtime" column="createtime" />
- <result property="note" column="note" />
-
-
-
-
- <association property="user" javaType="User">
-
- <id property="id" column="user_id" />
- <result property="username" column="username" />
- <result property="address" column="address" />
- association>
-
- resultMap>
这里的xml文件下面还需要添加sql的语句,用于引导数据库如何将两个表联系到一起,标准是user表里面的id等于order表里面的user_id:
- <select id="queryOrderUserResultMap" resultMap="orderUserResultMap">
- SELECT
- o.id,
- o.user_id,
- o.number,
- o.createtime,
- o.note,
- u.username,
- u.address
- FROM
- `order` o
- LEFT JOIN `user` u ON o.user_id = u.id
- select>
上面出现了一个列名后面跟着一个字母,比如:'order' o,这表示给这个表起一个别名叫o,这样前面的SELECT就可以使用别名了。还可以在SELECT里面给每个变量起一个别名,然后在resultmap标签里面使用别名,也可以,这个可以用来放置数据库里面的某两列重名(很有用)。
一个用户对应多个订单,因此在User类里面有一个List属性,用于存放不同的订单(而订单类里面只有一个User属性)。这里的一对多需要使用collection标签。
- <resultMap type="User" id="userOrderResultMap">
- <id property="id" column="id" />
- <result property="username" column="username" />
- <result property="birthday" column="birthday" />
- <result property="sex" column="sex" />
- <result property="address" column="address" />
-
-
- <collection property="orders" javaType="list" ofType="Order">
-
- <id property="id" column="oid" />
- <result property="number" column="number" />
- <result property="createtime" column="createtime" />
- <result property="note" column="note" />
- collection>
- resultMap>
下面也是需要使用sql语句进行查询的,这里就不重复了。