• MyBatis练习3


    创建好数据库

    1. DROP TABLE IF EXISTS `orders`;
    2. CREATE TABLE `orders` (
    3. `id` int(11) NOT NULL AUTO_INCREMENT,
    4. `ordertime` varchar(255) DEFAULT NULL,
    5. `total` DOUBLE DEFAULT NULL,
    6. `uid` INT(11) DEFAULT NULL,
    7. PRIMARY KEY (`id`),
    8. KEY `uid` (`uid`),
    9. CONSTRAINT `orders_ibfk_1` FOREIGN KEY (`uid`) REFERENCES `user` (`id`)
    10. ) ENGINE=INNODB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;
    11. -- ----------------------------
    12. -- Records of orders
    13. -- ----------------------------
    14. INSERT INTO `orders` VALUES ('1', '2022-12-12', '3000', '1');
    15. INSERT INTO `orders` VALUES ('2', '2022-12-12', '4000', '1');
    16. INSERT INTO `orders` VALUES ('3', '2022-12-12', '5000', '2');
    17. -- ----------------------------
    18. -- Table structure for sys_role
    19. -- ----------------------------
    20. DROP TABLE IF EXISTS `sys_role`;
    21. CREATE TABLE `sys_role` (
    22. `id` INT(11) NOT NULL AUTO_INCREMENT,
    23. `rolename` VARCHAR(255) DEFAULT NULL,
    24. `roleDesc` VARCHAR(255) DEFAULT NULL,
    25. PRIMARY KEY (`id`)
    26. ) ENGINE=INNODB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;
    27. -- ----------------------------
    28. -- Records of sys_role
    29. -- ----------------------------
    30. INSERT INTO `sys_role` VALUES ('1', 'CTO', 'CTO');
    31. INSERT INTO `sys_role` VALUES ('2', 'CEO', 'CEO');
    32. -- ----------------------------
    33. -- Table structure for sys_user_role
    34. -- ----------------------------
    35. DROP TABLE IF EXISTS `sys_user_role`;
    36. CREATE TABLE `sys_user_role` (
    37. `userid` INT(11) NOT NULL,
    38. `roleid` INT(11) NOT NULL,
    39. PRIMARY KEY (`userid`,`roleid`),
    40. KEY `roleid` (`roleid`),
    41. CONSTRAINT `sys_user_role_ibfk_1` FOREIGN KEY (`userid`) REFERENCES `user` (`id`),
    42. CONSTRAINT `sys_user_role_ibfk_2` FOREIGN KEY (`roleid`) REFERENCES `sys_role` (`id`)
    43. ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    44. -- ----------------------------
    45. -- Records of sys_user_role
    46. -- ----------------------------
    47. INSERT INTO `sys_user_role` VALUES ('1', '1');
    48. INSERT INTO `sys_user_role` VALUES ('2', '1');
    49. INSERT INTO `sys_user_role` VALUES ('1', '2');
    50. INSERT INTO `sys_user_role` VALUES ('2', '2');

    1.一对一

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

    OrderMapper.java

    1. public interface OrderMapper {
    2. // 一对一: 查询所有订单 及 订单的用户信息
    3. public List<Order> findAllOrderWithUser();
    4. }

    OrderMapper.xml

    1. <?xml version="1.0" encoding="UTF-8" ?>
    2. <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
    3. <mapper namespace="com.qiku.mapper.OrderMapper">
    4. <!-- 配置映射规则-->
    5. <resultMap id="orderMap" type="com.qiku.popo.Order">
    6. <id column="id" property="id"/>
    7. <result column="ordertime" property="orderTime"/>
    8. <result column="total" property="money"/>
    9. <!-- 根据订单的外键uid 查询用户信息
    10. property="user" : 实体类Order中的属性名
    11. javaType="com.qiku.popo.User" : 属性的类型
    12. column="uid" : 根据哪个字段 去查询用户信息
    13. select="com.qiku.mapper.UserMapper.findUserById" : 将column指定的字段作为参数
    14. -->
    15. <association property="user" javaType="com.qiku.popo.User" column="uid" select="com.qiku.mapper.UserMapper.findUserById">
    16. </association>
    17. </resultMap>
    18. <select id="findAllOrderWithUser" resultType="com.qiku.popo.Order" resultMap="orderMap">
    19. select * from orders
    20. </select>
    21. </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
    
    
    1. <?xml version="1.0" encoding="UTF-8" ?>
    2. <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
    3. <mapper namespace="com.qiku.mapper.UserMapper">
    4. <select id="findUserById" parameterType="int" resultType="com.qiku.popo.User">
    5. select * from user where id = #{id}
    6. </select>
    7. </mapper>

    OrderMapperTest.java

    1. public class OrderMapperTest {
    2. @Test
    3. public void findAllOrderWithUserTest() throws IOException {
    4. InputStream resource = Resources.getResourceAsStream("SqlMapConfig.xml");
    5. SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(resource);
    6. SqlSession sqlSession = factory.openSession();
    7. OrderMapper mapper = sqlSession.getMapper(OrderMapper.class);
    8. List<Order> allOrderWithUser = mapper.findAllOrderWithUser();
    9. for (Order o : allOrderWithUser){
    10. System.out.println(o);
    11. }
    12. }
    13. }

    2.一对多

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

    UserMapper.java

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

    UserMapper.xml

    1. <resultMap id="userResultMap" type="com.qiku.popo.User">
    2. <id column="id" property="id"/>
    3. <result column="username" property="username"/>
    4. <result column="birthday" property="birthday"/>
    5. <result column="sex" property="sex"/>
    6. <result column="address" property="address"/>
    7. <!-- 给用户的订单属性赋值 一对多
    8. fetchType="lazy":懒加载
    9. -->
    10. <collection property="orderList" ofType="com.qiku.popo.Order" column="id" select="com.qiku.mapper.OrderMapper.findOrderByUid" >
    11. </collection>
    12. </resultMap>
    13. <select id="findAllUserWithOrder" resultType="com.qiku.popo.User">
    14. select * from user
    15. </select>

    +

    一对多、多对多用collection 

    OrderMapper.java

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

    OrderMapper.xml

    1. <resultMap id="findOrderByUidResultMap" type="com.qiku.popo.Order">
    2. <id column="id" property="id"/>
    3. <result column="ordertime" property="orderTime"/>
    4. <result column="total" property="money"/>
    5. </resultMap>
    6. <select id="findOrderByUid" resultType="com.qiku.popo.Order" parameterType="int" resultMap="findOrderByUidResultMap">
    7. select * from orders where uid =#{uid}
    8. </select>

    UserMapperTest.java

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

    3.多对多

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

    UserMapper.java

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

    UserMapper.xml

    1. <resultMap id="findAllUserWithRoleResultMap" type="com.qiku.popo.User">
    2. <id column="id" property="id"/>
    3. <result column="username" property="username"/>
    4. <result column="birthday" property="birthday"/>
    5. <result column="sex" property="sex"/>
    6. <result column="address" property="address"/>
    7. <!-- 给用户的角色属性赋值 一对多-->
    8. <collection property="roleList" ofType="com.qiku.popo.Role" column="id" select="com.qiku.mapper.RoleMapper.findRoleByUid">
    9. </collection>
    10. </resultMap>
    11. <!-- 查询所有用户及其角色-->
    12. <select id="findAllUserWithRole" resultType="com.qiku.popo.User" resultMap="findAllUserWithRoleResultMap">
    13. select * from user
    14. </select>

    RoleMapper.java

    1. public interface RoleMapper {
    2. public List<Role> findRoleByUid(Integer userId);
    3. }

    RoleMapper.xml

    1. <?xml version="1.0" encoding="UTF-8" ?>
    2. <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
    3. <mapper namespace="com.qiku.mapper.RoleMapper">
    4. <resultMap id="findRoleByUidResultMap" type="com.qiku.popo.Role">
    5. <id column="id" property="id"/>
    6. <result column="rolename" property="roleNmae"/>
    7. <result column="roledesc" property="roleDesc"/>
    8. </resultMap>
    9. <select id="findRoleByUid" resultType="com.qiku.popo.Role" resultMap="findRoleByUidResultMap">
    10. select * from sys_role r
    11. join sys_user_role ur
    12. on r.id = ur.roleid
    13. WHERE ur.userid = #{uid}
    14. </select>
    15. </mapper>

    UserMapperTest.java

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

  • 相关阅读:
    Go-Excelize API源码阅读(二十)——SetDefinedName
    K8S基础服务(apiserver、controller、scheduler、etcd)时区设置
    XML概念
    Redis持久化之RDB
    机器学习---CNN(创建和训练一个卷积神经网络并评估其性能)下
    大厂秋招真题【DP】米哈游20230924秋招T2-米小游与魔法少女-奇运
    5G将如何改变我们的生活和工作方式?
    数据库批处理
    新一代网络请求库:python-httpx库
    Dubbo入门案例
  • 原文地址:https://blog.csdn.net/chaochaodayizhi/article/details/125415822