zoukankan      html  css  js  c++  java
  • 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);
        }
    }
  • 相关阅读:
    ruby 二进制转十进制 Integer("0b101") = 5
    开始菜单和我的文档的我的图片及我的音乐变成 my pictrues 正常图标了
    ruby watir 莫名其妙的错误
    Excel SaveAS是去掉提示框
    apache && jboss安装
    ruby require include的区别
    ruby控制鼠标
    This error is raised because the column 'type' is reserved for storing the class in case of inheritance
    用正则表达式限制文本框只能输入数字,小数点,英文字母,汉字等各类代码
    ASP.NET 如何动态修改 Header 属性如添加 Meta 标签 keywords description!
  • 原文地址:https://www.cnblogs.com/hlhdidi/p/6258155.html
Copyright © 2011-2022 走看看