Mybatis、ResultMap、sql的学习

本文介绍了Mybatis中的ResultMap元素,它用于处理复杂的数据映射,特别是当查询结果与Java POJO的属性名不一致时。通过ResultMap,可以手动配置字段与属性的对应关系,实现灵活的数据封装。文章中还提到了一些相关的Java Bean和XML配置文件,展示了一个实际的案例应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

ResultMap简介和用法

resultMap是Mybatis最强大的元素,它可以将查询到的复杂数据(比如查询到几个表中数据)映射到一个结果集当中。

<!--column不做限制,可以为任意表的字段,而property须为type 定义的pojo属性-->
<resultMap id="唯一的标识" type="映射的pojo对象">
  <id column="表的主键字段,或者可以为查询语句中的别名字段" jdbcType="字段类型" property="映射pojo对象的主键属性" />
  <result column="表的一个字段(可以为任意表的一个字段)" jdbcType="字段类型" property="映射到pojo对象的一个属性(须为type定义的pojo对象中的一个属性)"/>
  <association property="pojo的一个对象属性" javaType="pojo关联的pojo对象">
    <id column="关联pojo对象对应表的主键字段" jdbcType="字段类型" property="关联pojo对象的主席属性"/>
    <result  column="任意表的字段" jdbcType="字段类型" property="关联pojo对象的属性"/>
  </association>
  <!-- 集合中的property须为oftype定义的pojo对象的属性-->
  <collection property="pojo的集合属性" ofType="集合中的pojo对象">
    <id column="集合中pojo对象对应的表的主键字段" jdbcType="字段类型" property="集合中pojo对象的主键属性" />
    <result column="可以为任意表的字段" jdbcType="字段类型" property="集合中的pojo对象的属性" />  
  </collection>
</resultMap>

resultType可以把查询结果封装到pojo类型中,但必须pojo类的属性名和查询到的数据库表的字段名一致。如果sql查询到的字段与pojo的属性名不一致,则需要使用resultMap将字段名和属性名对应起来,进行手动配置封装,将结果映射到pojo中

  • 如果collection标签是使用嵌套查询,格式如下:
<collection column="传递给嵌套查询语句的字段参数" property="pojo对象中集合属性" ofType="集合属性中的pojo对象" select="嵌套的查询语句" > 
 </collection>

案例

src\main\java\com\lgl\bean\Order.java

public class Order {
    // 订单id
    private int id;
    // 用户id
    private Integer userId;
   // private Integer user_id;
    // 订单号
    private String number;
    // 订单创建时间
    private Date createtime;
    // 备注
    private String note;
    private User user;

src\main\java\com\lgl\bean\OrderUser.java

public class OrderUser {

    private int oid;
    private Integer user_id;
    private String number;
    private Date createtime;
    private String note;

    private int uid;
    private String username;
    private Date birthday;
    private String sex;
    private String address;

src\main\java\com\lgl\bean\User.java

public class User {
    private int id;
    private String username;
    private Date birthday;
    private String sex;
    private String address;

    private List<Order> orders;

src\main\java\com\lgl\dao\OrderDao.java

public interface OrderDao {
    public List<Order> findAll();
    List<OrderUser> findAllOrderUser();
    List<Order> findAllOrder2();
}

src\main\java\com\lgl\dao\UserDao.java

public interface UserDao {
    public List<User> findByUser(User user);
    List<User> findByIds(@Param("ids") List<Integer> list);
    List<User> findAllUsers();
}

src\main\resources\com\lgl\dao\OrderDao.xml

<mapper namespace="com.lgl.dao.OrderDao">
<!--  <select id="findAll" resultType="order">-->
<!--       select * from `order`;-->
<!--  </select>-->
    <resultMap id="OrderMap" type="com.lgl.bean.Order">

        <id column="id" property="id"/>
        <result column="user_id" property="userId"/>
        <result column="number" property="number"/>
        <result column="createtime" property="createtime"/>
        <result column="note" property="note"/>
    </resultMap>
     <select id="findAll" resultMap="OrderMap">
         select * from `order`;
     </select>

    <select id="findAllOrderUser" resultType="com.lgl.bean.OrderUser">
        select o.id as oid,
       o.user_id,
       o.number,
       o.createtime,
       o.note,
       u.id as uid,
       u.username,
       u.birthday,
       u.sex,
       u.address
       from `order` o left join `user` u
       on o.user_id=u.id;
    </select>

     <resultMap id="findAllOrder2Map" type="com.lgl.bean.Order" autoMapping="true">
         <id property="id" column="id"></id>
         <association  property="user" javaType="com.lgl.bean.User" autoMapping="true">
             <id column="uid" property="id"/>

         </association>
     </resultMap>
     <select id="findAllOrder2" resultMap="findAllOrder2Map">
       select o.id as id,
       o.user_id as userId,
       o.number,
       o.createtime,
       o.note,
       u.id as uid,
       u.username,
       u.birthday,
       u.sex,
       u.address
       from `order` o left join `user` u
       on o.user_id=u.id;
     </select>
</mapper>

src\main\resources\com\lgl\dao\UserDao.xml

<mapper namespace="com.lgl.dao.UserDao">
  <select id="findByUser" resultType="user">
       select * from user
       <where>
           <if test="username != null and username != '' ">
               and username like #{username}
           </if>
           <if test="address != null and address != ''">
               and address like #{address}
           </if>
           <if test="sex != null and sex != ''">
               and sex like #{sex}
           </if>
       </where>
  </select>

    <select id="findByIds" parameterType="list" resultType="user">
        select  * from user
        <where>
            <foreach collection="ids" item="id" open="id in(" close= ")" separator=",">
                #{id}
            </foreach>
        </where>
    </select>

    <resultMap id="findAllUsersMap" type="com.lgl.bean.User" autoMapping="true">
       <id property="id" column="uid"></id>
        <collection property="orders" ofType="com.lgl.bean.Order" autoMapping="true">
         <id property="id" column="oid"></id>
        </collection>
    </resultMap>

    <select id="findAllUsers" resultMap="findAllUsersMap">
         select u.id as uid,
        u.username,
        u.sex,
        u.address,
        o.id as oid,
        o.user_id as userId,
        o.number,
        o.createtime,
        o.note
        from `user` u left join `order` o
        on u.id=o.user_id;
    </select>
</mapper>

src\main\resources\SqlMapConfig.xml

 <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/mybatis02?characterEncoding=utf-8"/>
                <property name="username" value="root"/>
                <property name="password" value="root"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
<!--        <mapper resource="UserMapper.xml"/>-->
        <mapper resource="com/lgl/dao/OrderDao.xml"/>
        <mapper resource="com/lgl/dao/UserDao.xml"/>
    </mappers>

src\test\java\com\lgl\pack01\Test01.java

@Test
    public void test01(){
        SqlSession session = MySessionUtils.getSession();

        OrderDao dao = session.getMapper(OrderDao.class);
        List<Order> list = dao.findAll();

        System.out.println(list);
        session.commit();
        session.close();
    }
}

src\test\java\com\lgl\pack01\Test02.java

        User user= new User();
//        user.setUsername("张%");
//        user.setAddress("北京市");
        UserDao dao = session.getMapper(UserDao.class);
        List<User> list = dao.findByUser(user);

        System.out.println(list);

src\test\java\com\lgl\pack01\Test03.java

UserDao dao = session.getMapper(UserDao.class);
        List<Integer> list = new ArrayList<>();
        list.add(1);
        list.add(3);
        list.add(5);
        List<User> users = dao.findByIds(list);

        System.out.println(users);

src\test\java\com\lgl\pack01\Test04.java

OrderDao orderDao = session.getMapper(OrderDao.class);
        List<OrderUser> list = orderDao.findAllOrderUser();

        System.out.println(list);

src\test\java\com\lgl\pack01\Test05.java

OrderDao orderDao = session.getMapper(OrderDao.class);
        List<Order> list = orderDao.findAllOrder2();

        System.out.println(list);

src\test\java\com\lgl\pack01\Test06.java

UserDao userDao = session.getMapper(UserDao.class);
        List<User> list = userDao.findAllUsers();

        System.out.println(list);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值