--创建数据库和表CREATEDATABASE`mybatis_db`;USE`mybatis_db`;CREATETABLE`user`(`id`int(11)NOTNULLauto_increment,`username`varchar(32)NOTNULLCOMMENT'用户名称',`birthday`datetimedefaultNULLCOMMENT'生日',`sex`char(1)defaultNULLCOMMENT'性别',`address`varchar(256)defaultNULLCOMMENT'地址',PRIMARYKEY(`id`))ENGINE=InnoDBDEFAULTCHARSET=utf8;-- insert....insertinto`user`(`id`,`username`,`birthday`,`sex`,`address`)values(1,'子
慕','2020-11-11 00:00:00','男','北京海淀'),(2,'应颠','2020-12-12 00:00:00','男','北
京海淀');DROPTABLEIFEXISTS`orders`;CREATETABLE`orders`(`id`INT(11)NOTNULLAUTO_INCREMENT,`ordertime`VARCHAR(255)DEFAULTNULL,`total`DOUBLEDEFAULTNULL,`uid`INT(11)DEFAULTNULL,PRIMARYKEY(`id`),KEY`uid`(`uid`),CONSTRAINT`orders_ibfk_1`FOREIGNKEY(`uid`)REFERENCES`user`(`id`))ENGINE=INNODBAUTO_INCREMENT=4DEFAULTCHARSET=utf8;-- ------------------------------ Records of orders-- ----------------------------INSERTINTO`orders`VALUES('1','2020-12-12','3000','1');INSERTINTO`orders`VALUES('2','2020-12-12','4000','1');INSERTINTO`orders`VALUES('3','2020-12-12','5000','2');-- ------------------------------ Table structure for sys_role-- ----------------------------DROPTABLEIFEXISTS`sys_role`;CREATETABLE`sys_role`(`id`INT(11)NOTNULLAUTO_INCREMENT,`rolename`VARCHAR(255)DEFAULTNULL,`roleDesc`VARCHAR(255)DEFAULTNULL,PRIMARYKEY(`id`))ENGINE=INNODBAUTO_INCREMENT=3DEFAULTCHARSET=utf8;-- ------------------------------ Records of sys_role-- ----------------------------INSERTINTO`sys_role`VALUES('1','CTO','CTO');INSERTINTO`sys_role`VALUES('2','CEO','CEO');-- ------------------------------ Table structure for sys_user_role-- ----------------------------DROPTABLEIFEXISTS`sys_user_role`;CREATETABLE`sys_user_role`(`userid`INT(11)NOTNULL,`roleid`INT(11)NOTNULL,PRIMARYKEY(`userid`,`roleid`),KEY`roleid`(`roleid`),CONSTRAINT`sys_user_role_ibfk_1`FOREIGNKEY(`userid`)REFERENCES`sys_role`(`id`),CONSTRAINT`sys_user_role_ibfk_2`FOREIGNKEY(`roleid`)REFERENCES`user`(`id`))ENGINE=INNODBDEFAULTCHARSET=utf8;-- ------------------------------ Records of sys_user_role-- ----------------------------INSERTINTO`sys_user_role`VALUES('1','1');INSERTINTO`sys_user_role`VALUES('2','1');INSERTINTO`sys_user_role`VALUES('1','2');INSERTINTO`sys_user_role`VALUES('2','2');
<mappernamespace="com.zhoufengbin.mapper.OrderMapper"><!--配置映射信息--><resultMapid="ordersMap"type="com.zhoufengbin.domain.Orders"><idproperty="id"column="id"/><resultproperty="ordertime"column="ordertime"/><resultproperty="total"column="total"/><resultproperty="uid"column="uid"/><!--
在一对一(多对一)使用association标签关联
property="user" 封装实体的属性名
javaType="user" 封装实体的属性类型
--><associationproperty="user"javaType="com.zhoufengbin.domain.User"><idproperty="id"column="uid"/><resultproperty="username"column="username"/><resultproperty="birthday"column="birthday"/><resultproperty="sex"column="sex"/><resultproperty="address"column="address"/></association></resultMap><!--多表查询之一对一查询:查询所有订单,与此同时查询出每个订单所属的用户
由于订单表中没有用户表中的信息 ,需要进行关联查询,且还需要将查询到的所有字段封装到具体的实体类中,因此需要使用
resultMap和association 属性配置映射关系
--><selectid="findAllOrderUser"resultMap="ordersMap">
SELECT * FROM orders o LEFT OUTER JOIN USER u ON o.`uid` = u.`id`;
</select></mapper>
步骤三:进行单元测试
1.2 一对多查询
一对多查询的需求:查询所有用户,与此同时查询出该用户具有的订单
public List<User>findAllWithUserOrder();
步骤一:在对应的UserMapper接口中创建方法
//查询所有用户信息和用户拥有的订单信息 1:n public List<User>findAllWithUserOrder();
步骤二:配置UserMapper.xml文件
<resultMapid="userOrderMap"type="com.zhoufengbin.domain.User"><idproperty="id"column="id"/><resultproperty="username"column="username"/><resultproperty="birthday"column="birthday"/><resultproperty="sex"column="sex"/><resultproperty="address"column="address"/><!--
一对多使用collection标签关联,当实体类中由集合时使用。
property="orderList" 封装到集合的属性名
ofType="order" 封装集合的泛型类型
--><collectionproperty="ordersList"ofType="com.zhoufengbin.domain.Orders"><idproperty="id"column="oid"/><resultproperty="ordertime"column="ordertime"/><resultproperty="total"column="total"/><resultproperty="uid"column="uid"/></collection></resultMap><!--一对多查询的需求:查询所有用户,与此同时查询出该用户具有的订单
resultMap和collection 属性配置映射关系
--><selectid="findAllWithUserOrder"resultMap="userOrderMap">
SELECT *,o.id oid, ordertime, total, uid FROM USER u LEFT JOIN orders o ON u.`id` = o.`uid`;
</select>
<resultMapid="userRoleMap"type="com.zhoufengbin.domain.User"><idproperty="id"column="id"/><resultproperty="username"column="username"/><resultproperty="birthday"column="birthday"/><resultproperty="sex"column="sex"/><resultproperty="address"column="address"/><collectionproperty="roleList"ofType="com.zhoufengbin.domain.Role"><idproperty="id"column="rid"/><resultproperty="rolename"column="rolename"/><resultproperty="roleDesc"column="roleDesc"/></collection></resultMap><selectid="findAllWithRole"resultMap="userRoleMap">
SELECT u.*,r.`id` rid, r.`rolename`, r.`roleDesc`
FROM USER u LEFT OUTER JOIN sys_user_role ur ON u.`id`=ur.`userid`
LEFT OUTER JOIN sys_role r ON r.`id`=ur.`roleid`
</select>
<!--根据订单表中查询出的uid查询订单的用户信息--><selectid="findOneUserById"parameterType="int"resultType="com.zhoufengbin.domain.User">
select * from user where id = #{uid}
</select>
<!--查询所有用户,与此同时查询出该用户具有的订单 1:n--><resultMapid="userOrderMap1"type="com.zhoufengbin.domain.User"><idproperty="id"column="id"/><resultproperty="username"column="username"/><resultproperty="birthday"column="birthday"/><resultproperty="sex"column="sex"/><resultproperty="address"column="address"/><collectionproperty="ordersList"ofType="com.zhoufengbin.domain.Orders"column="id"select="com.zhoufengbin.mapper.OrderMapper.findOneOrdersById"/></resultMap><selectid="findAllUser"resultMap="userOrderMap1">
select * from USER
</select>
步骤四:在OrderMapper.xml配置相应的信息
<selectid="findOneOrdersById"parameterType="int"resultType="com.zhoufengbin.domain.Orders">
SELECT * FROM orders WHERE uid = #{id};
</select>
2.3 多对多嵌套查询
需求:查询用户 同时查询出该用户的所有角色
-- 需求:查询用户 同时查询出该用户的所有角色-- 查询用户信息SELECT*FROMUSER;-- 查询用户对应的角色信息SELECT r.id,r.`rolename` rolename,r.`roleDesc` roleDesc
FROM sys_role r LEFTOUTERJOIN sys_user_role ur ON r.id = ur.roleid
LEFTOUTERJOINUSER u ON u.id = ur.`userid`WHERE u.`id`=1SELECT r.id,r.`rolename`,r.`roleDesc`FROM sys_role r
INNERJOIN sys_user_role ur ON r.`id`= ur.`roleid`WHERE ur.`userid`=1
<!--嵌套查询多对多:查询所用用户信息--><resultMapid="userRoleMap2"type="com.zhoufengbin.domain.User"><idproperty="id"column="id"/><resultproperty="username"column="username"/><resultproperty="birthday"column="birthday"/><resultproperty="sex"column="sex"/><resultproperty="address"column="address"/><collectionproperty="roleList"ofType="com.zhoufengbin.domain.Role"column="id"select="com.zhoufengbin.mapper.RoleMapper.findAllRole"/></resultMap><selectid="findAllUser2"resultMap="userRoleMap2"resultType="com.zhoufengbin.domain.User">
select * from user
</select>
步骤三:在RoleMapper.xml中配置相应的信息
//带引入的sql
<selectid="findAllRole"parameterType="int"resultType="com.zhoufengbin.domain.Role">
SELECT r.id,r.`rolename` ,r.`roleDesc` FROM sys_role r
INNER JOIN sys_user_role ur ON r.`id` = ur.`roleid` WHERE ur.`userid` = #{userId}
</select>