MyBatis练习3

创建好数据库

DROP TABLE IF EXISTS `orders`;
CREATE TABLE `orders` (
 `id` int(11) NOT NULL AUTO_INCREMENT,
 `ordertime` varchar(255) DEFAULT NULL,
 `total` DOUBLE DEFAULT NULL,
 `uid` INT(11) DEFAULT NULL,
 PRIMARY KEY (`id`),
 KEY `uid` (`uid`),
 CONSTRAINT `orders_ibfk_1` FOREIGN KEY (`uid`) REFERENCES `user` (`id`)
) ENGINE=INNODB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;
-- ----------------------------
-- Records of orders
-- ----------------------------
INSERT INTO `orders` VALUES ('1', '2022-12-12', '3000', '1');
INSERT INTO `orders` VALUES ('2', '2022-12-12', '4000', '1');
INSERT INTO `orders` VALUES ('3', '2022-12-12', '5000', '2');
-- ----------------------------
-- Table structure for sys_role
-- ----------------------------
DROP TABLE IF EXISTS `sys_role`;
CREATE TABLE `sys_role` (
 `id` INT(11) NOT NULL AUTO_INCREMENT,
 `rolename` VARCHAR(255) DEFAULT NULL,
 `roleDesc` VARCHAR(255) DEFAULT NULL,
 PRIMARY KEY (`id`)
) ENGINE=INNODB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;
-- ----------------------------
-- Records of sys_role
-- ----------------------------
INSERT INTO `sys_role` VALUES ('1', 'CTO', 'CTO');
INSERT INTO `sys_role` VALUES ('2', 'CEO', 'CEO');
-- ----------------------------
-- Table structure for sys_user_role
-- ----------------------------
DROP TABLE IF EXISTS `sys_user_role`;
CREATE TABLE `sys_user_role` (
 `userid` INT(11) NOT NULL,
 `roleid` INT(11) NOT NULL,
 PRIMARY KEY (`userid`,`roleid`),
 KEY `roleid` (`roleid`),
 CONSTRAINT `sys_user_role_ibfk_1` FOREIGN KEY (`userid`) REFERENCES `user` (`id`),
 CONSTRAINT `sys_user_role_ibfk_2` FOREIGN KEY (`roleid`) REFERENCES `sys_role` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- ----------------------------
-- Records of sys_user_role
-- ----------------------------
INSERT INTO `sys_user_role` VALUES ('1', '1');
INSERT INTO `sys_user_role` VALUES ('2', '1');
INSERT INTO `sys_user_role` VALUES ('1', '2');
INSERT INTO `sys_user_role` VALUES ('2', '2');

1.一对一

一对一查询模型
用户表和订单表的关系为,一个用户有多个订单,一个订单只从属于一个用户
一对一查询的需求:查询一个订单,与此同时查询出该订单所属的用户

OrderMapper.java

public interface OrderMapper {

//  一对一:  查询所有订单 及 订单的用户信息
    public List<Order> findAllOrderWithUser();

}

OrderMapper.xml

<?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 namespace="com.qiku.mapper.OrderMapper">

    <!--    配置映射规则-->
    <resultMap id="orderMap" type="com.qiku.popo.Order">
        <id column="id" property="id"/>
        <result column="ordertime" property="orderTime"/>
        <result column="total" property="money"/>

<!--        根据订单的外键uid 查询用户信息
            property="user" : 实体类Order中的属性名
            javaType="com.qiku.popo.User" : 属性的类型
            column="uid" : 根据哪个字段 去查询用户信息
            select="com.qiku.mapper.UserMapper.findUserById" : 将column指定的字段作为参数
-->
        <association property="user" javaType="com.qiku.popo.User" column="uid" select="com.qiku.mapper.UserMapper.findUserById">

        </association>
    </resultMap>

    <select id="findAllOrderWithUser" resultType="com.qiku.popo.Order" resultMap="orderMap">
        select * from orders
    </select>


</mapper>
<association property="user" javaType="com.qiku.popo.User" column="uid"         select="com.qiku.mapper.UserMapper.findUserById"> 
</association>            
            根据订单的外键uid 查询用户信息
            property="user" : 实体类Order中的属性名
            javaType="com.qiku.popo.User" : 属性的类型
            column="uid" : 根据哪个字段 去查询用户信息
            select="com.qiku.mapper.UserMapper.findUserById" : 将column指定的字段作为参数

一对一,多对一用association

UserMapper.xml

<?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 namespace="com.qiku.mapper.UserMapper">


    <select id="findUserById"  parameterType="int" resultType="com.qiku.popo.User">
        select * from  user where id = #{id}
    </select>
</mapper>

OrderMapperTest.java

public class OrderMapperTest {

    @Test
    public void findAllOrderWithUserTest() throws IOException {
        InputStream resource = Resources.getResourceAsStream("SqlMapConfig.xml");
        SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(resource);
        SqlSession sqlSession = factory.openSession();
        OrderMapper mapper = sqlSession.getMapper(OrderMapper.class);
        List<Order> allOrderWithUser = mapper.findAllOrderWithUser();
        for (Order o : allOrderWithUser){
            System.out.println(o);
        }
    }


}

2.一对多

一对多查询模型
用户表和订单表的关系为,一个用户有多个订单,一个订单只从属于一个用户
一对多查询的需求:查询一个用户,与此同时查询出该用户具有的订单

UserMapper.java

    // 查询所有用户 及其 订单信息
    public List<User> findAllUserWithOrder();

UserMapper.xml

<resultMap id="userResultMap" type="com.qiku.popo.User">
        <id column="id" property="id"/>
        <result column="username" property="username"/>
        <result column="birthday" property="birthday"/>
        <result column="sex" property="sex"/>
        <result column="address" property="address"/>
        <!--        给用户的订单属性赋值 一对多
                    fetchType="lazy":懒加载
        -->
        <collection property="orderList" ofType="com.qiku.popo.Order" column="id" select="com.qiku.mapper.OrderMapper.findOrderByUid" >

        </collection>
    </resultMap>

    <select id="findAllUserWithOrder" resultType="com.qiku.popo.User">
        select * from user
    </select>

+

一对多、多对多用collection 

OrderMapper.java

//    根据用户id(uid)查询订单信息
    public List<Order> findOrderByUid(Integer uid);

OrderMapper.xml

<resultMap id="findOrderByUidResultMap" type="com.qiku.popo.Order">
        <id column="id" property="id"/>
        <result column="ordertime" property="orderTime"/>
        <result column="total" property="money"/>
    </resultMap>

    <select id="findOrderByUid" resultType="com.qiku.popo.Order" parameterType="int" resultMap="findOrderByUidResultMap">
        select * from orders where uid =#{uid}
    </select>

UserMapperTest.java

@Test
    public void findAllUserWithOrderTest() throws IOException {
        InputStream resource = Resources.getResourceAsStream("SqlMapConfig.xml");
        SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(resource);
        SqlSession sqlSession = factory.openSession();
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        List<User> allUserWithOrder = mapper.findAllUserWithOrder();
        for (User u : allUserWithOrder){
            System.out.println(u);
        }
    }

3.多对多

多对多查询的模型
用户表和角色表的关系为,一个用户有多个角色,一个角色被多个用户使用
多对多查询的需求:查询用户同时查询出该用户的所有角色

UserMapper.java

    //    查询所有用户及其角色信息
    public List<User> findAllUserWithRole();

UserMapper.xml

<resultMap id="findAllUserWithRoleResultMap" type="com.qiku.popo.User">
        <id column="id" property="id"/>
        <result column="username" property="username"/>
        <result column="birthday" property="birthday"/>
        <result column="sex" property="sex"/>
        <result column="address" property="address"/>
        <!--        给用户的角色属性赋值 一对多-->
        <collection property="roleList" ofType="com.qiku.popo.Role" column="id" select="com.qiku.mapper.RoleMapper.findRoleByUid">

        </collection>
    </resultMap>
    <!--    查询所有用户及其角色-->
    <select id="findAllUserWithRole" resultType="com.qiku.popo.User" resultMap="findAllUserWithRoleResultMap">
        select * from user
    </select>

RoleMapper.java

public interface RoleMapper {

    public List<Role> findRoleByUid(Integer userId);

}

RoleMapper.xml

<?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 namespace="com.qiku.mapper.RoleMapper">


    <resultMap id="findRoleByUidResultMap" type="com.qiku.popo.Role">
        <id column="id" property="id"/>
        <result column="rolename" property="roleNmae"/>
        <result column="roledesc" property="roleDesc"/>
    </resultMap>
    <select id="findRoleByUid" resultType="com.qiku.popo.Role" resultMap="findRoleByUidResultMap">
        select * from sys_role r
                          join sys_user_role ur
                               on r.id = ur.roleid
        WHERE ur.userid = #{uid}
    </select>


</mapper>

UserMapperTest.java

@Test
    public void findAllUserWithRoleTest() throws IOException {
        InputStream resource = Resources.getResourceAsStream("SqlMapConfig.xml");
        SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(resource);
        SqlSession sqlSession = factory.openSession();
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        List<User> userList = mapper.findAllUserWithRole();
        for (User u : userList){
            System.out.println(u);
        }
    }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值