• mybatis入门_一对多,多对多映射以及整合spring框架


    一.一对多映射.

    1.1 一对多映射之根据多的一方关联查询一的一方

    示例:查询出具体的订单信息,同时也查询出来订单的用户信息.

    引入的订单表如下所示:

    框选出来的为具体的外键.

    订单的Pojo类如下所示:

     

    创建OrdersMapper接口.

    书写ordersMapper.xml.先书写SQL语句:

    SELECT o.id,o.user_id,o.number,u.username,u.sex

    FROM ORDERS o,

    USER u WHERE o.user_id=u.id;

    我们发现,由于查询出来的一些column无法映射到对应的属性里面去.因此我们采用resultMap的形式.

    查询出来的u.username,u.sex这些属性无法直接赋值到column对应的属性中去.因此,采用<association>标签去赋值.<association>的<id>属性标识了关联对象的id.<result>属性标识了关联对象的其他属性.具体做

    法参见注释.

    Mapper的配置如下:

    <mapper namespace="com.xyy.mapper.OrdersMapper">
        <resultMap type="com.xyy.po.Orders" id="orderResultMap">
            <id column="id" property="id"/>
            <result column="number" property="number"/>
            <!-- association标识了关联对象的属性.property表示属性名.javaType表示具体的类 -->
            <association property="user" javaType="com.xyy.po.User">
                <!-- 和resultMap的配置方法一样,property为具体映射的属性名,column为查询出来的结果名 -->
                <id property="id" column="user_id"/>
                <result property="username" column="username"/>
                <result property="sex" column="sex"/>
            </association>
        </resultMap>
        <select id="findOrders" resultMap="orderResultMap">
            SELECT o.id,o.user_id,o.number,u.username,u.sex  
            FROM ORDERS o,
            USER u WHERE o.user_id=u.id;
        </select>
    </mapper>

    测试:

    1.2 一对多映射之根据一的一方关联查询多的一方

    订单明细是指在商城中下单的时候,可能会购买不同的物品,一个物品可能购买不止一个,那么一个物品项对应的就是一个订单明细

    订单类和订单明细类,对应一对多.一个订单可以有不止一个订单明细,而一个订单明细必然属于一个订单.

    引入订单明细的表:

    引入订单明细的Pojo类:

    需求分析:

    查询所有的订单,同时关联查询出所有的订单明细.

    OrdersMapper类中的对应方法已经有了,我们需要做的就是在Orders类中添加订单明细的字段:

    书写SQL:

    SELECT o.id,o.user_id,o.number,u.username,u.sex,od.id,od.items_num 
    FROM ORDERS o,
    USER u,orderdetail od WHERE o.user_id=u.id and od.orders_id=o.id;

    执行后的查询结果如下所示:

    可以看出orderdetail的id的列名以id1的形式列了出来,这是因为在书写sql的时候,查询的id列名与orders表的id列名重复了.解决方法是给orderdetail查询id的查询结果起一个别名:detailId

    改写OrdersMapper对应的配置文件..同样需要配置resultMap.这里用到了新的标签,<collections>.<collections>可以完成对于集合类型的属性的映射.具体操作方法如下:

    <resultMap type="com.xyy.po.Orders" id="orderResultMap">
            <id column="id" property="id"/>
            <result column="number" property="number"/>
            <!-- 配置user相关的映射信息 -->
            <association property="user" javaType="com.xyy.po.User">
                <id property="id" column="user_id"/>
                <result property="username" column="username"/>
                <result property="sex" column="sex"/>
            </association>
            <!-- 配置orderdetails相关的信息 -->
            <!--collection用于指定集合类型的映射.property指定对应的集合名称.ofType指定集合中存放的数据的类型  -->
            <collection property="detailList" ofType="com.xyy.po.Orderdetail">
                <!-- id和result指定了需要配置的列和属性名和映射 -->
                <id column="detailId" property="id"/>
                <result column="items_num" property="itemsNum"/>
            </collection>
        </resultMap>

    这样就完成了一对多的映射.接下来就可以直接调用指定的方法查询出对应的结果了:

    二.多对多映射

    物品(items)和订单(orders)是多对多映射.两者实际上是通过OrderDetails中间表完成了关联.

    需求:查询用户.同时查询出用户所关联的所有的订单,同时查询出订单所对应的所有的订单项以及订单项所对应的物品.

    分析表之间的关系:

    用户与订单是一对多关系.订单和订单项是一对多关系.订单项和物品是一对一的关系.

    理清表之间的关系后,就可以去写Pojo类了:
    User类:

    Orders类:

    OrderDetail类:

    Items类:

    书写SQL语句如下.为了方便,为每一个表的主键都起了别名:

    SELECT u.id uid,u.username,
    o.id oid,o.number,od.id odid,od.items_num,
    i.id iid,i.name,i.price
    FROM user u,orders o,orderdetail od,items i
    WHERE u.id=o.user_id AND o.id=od.orders_id
    AND od.items_id=i.id;

    书写Mapper配置文件.根据表与表之间的对应关系,书写映射关系:

    <resultMap type="com.xyy.po.User" id="userManyToManyMap">
            <!--配置user -->
            <id column="uid" property="id"/>
            <result column="username" property="username"/>
            <!-- 配置user对应的Orders 一对多 -->
            <collection property="orders" ofType="com.xyy.po.Orders">
                <id column="oid" property="id"/>
                <result column="number" property="number"/>
                <!-- 配置orders对应的orderdetail一对多 -->
                <collection property="detailList" ofType="com.xyy.po.Orderdetail">
                    <id column="odid" property="id"/>
                    <result column="items_num" property="itemsNum"/>
                    <!-- 配置orderdetail对应的items 一对一-->
                    <association property="items" javaType="com.xyy.po.Items">
                        <id column="iid" property="id"/>
                        <result column="name" property="name"/>
                        <result column="price" property="price"/>
                    </association>
                </collection>
            </collection>
        </resultMap>
        <select id="findAllUsers" resultMap="userManyToManyMap">
            SELECT u.id uid,u.username,
            o.id oid,o.number,od.id odid,od.items_num,
            i.id iid,i.name,i.price
            FROM user u,orders o,orderdetail od,items i
            WHERE u.id=o.user_id and o.id=od.orders_id
            AND od.items_id=i.id;
        </select>

    测试:

    三.mybatis整合spring

    3.1.搭建环境.
    导入jar包,pojo类,导入db.properties配置文件
    db.properties如下:

    db.driverClass=com.mysql.jdbc.Driver
    db.url=jdbc:mysql://localhost:3306/mybatis?useUnicode=true&characterEncoding=utf8
    db.username=root
    db.password=root

    3.2.建立SqlMapConfig.xml.

    在刚开始SqlMapConfig.xml中不需要书写任何信息.(因为数据库连接信息交给spring去管理了.)

    3.3.采用传统Dao方式开发

    3.3.1 建立User.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="test1">
        <select id="findUserById" parameterType="int" resultType="com.xyy.po.User">
            SELECT * FROM USER WHERE
            id=#{id}
        </select> 
    </mapper>

    在SqlMapConfig.xml中引入User.xml

    3.3.2 .书写Dao

    注意,SqlSessionDaoSupport是由spring提供的便捷操作的类.

    3.3.3 建立spring配置文件.

    需要配置的包括datasource,sqlSessionFactory和dao

    <!-- 引入配置文件 -->
    <context:property-placeholder location="classpath:db.properties"/>
    <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
        <property name="driverClass" value="${db.driverClass}"></property>
        <property name="jdbcUrl" value="${db.url}"></property>
        <property name="user" value="${db.username}"></property>
        <property name="password" value="${db.password}"></property>
    </bean>
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <!-- 引入mybatis全局的配置文件 -->
        <property name="configLocation" value="classpath:mybatis/SqlMapConfig.xml"></property>
        <property name="dataSource" ref="dataSource"></property>
    </bean>
    <bean id="userDao" class="com.xyy.dao.impl.UserDaoImpl">
        <property name="sqlSessionFactory" ref="sqlSessionFactory"></property>
    </bean>

    3.3.4 测试

    @ContextConfiguration("classpath:spring/applicationContext.xml")
    @RunWith(SpringJUnit4ClassRunner.class)
    public class testMybatis {
        @Autowired
        private UserDao udao;
        
        @Test
        public void testMyBatis() {
            User user = udao.findUserById(1);
            System.out.println(user);
        }
    }

    3.4. 采用mapper代理的方式开发

    3.4.1 建立UserMapper接口

    3.4.2 建立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">
    <!--namespace需要和mapper的全限定名保持一致-->
    <mapper namespace="com.xyy.mapper.UserMapper">
        <select id="findUserById" parameterType="int" resultType="user">
            SELECT * FROM USER WHERE
            id=#{id}
        </select> 
    </mapper>

    3.4.3 书写applicationContext.xml

    配置datasource,sqlsessionfactory与传统dao几乎完全一致.需要注意的是,mapper代理开发可以不去书写mybatis全局配置文件!

    此外,我们需要在applicationContext.xml中,去批量生成代理的mapper对象.具体做法如下所示:

    3.4.4 测试

    @ContextConfiguration("classpath:spring/applicationContext.xml")
    @RunWith(SpringJUnit4ClassRunner.class)
    public class testMybatis {
        @Autowired
        private UserMapper mapper;
        
        @Test
        public void testMyBatis2() {
            User user=mapper.findUserById(1);
            System.out.println(user);
        }
    }
  • 相关阅读:
    Ubuntu20.04安装Docker
    开启企业微信H5页面调试功能
    Python实现图遍历
    Linux命令整理
    BDP数据分析之高级计算
    PowerBI之DAX
    Dundas BI 简介
    tableau的高级计算
    k8s集群创建之后coredns一直处于pending状态
    Gradle打包工具入门
  • 原文地址:https://www.cnblogs.com/hlhdidi/p/6258155.html
Copyright © 2020-2023  润新知