mybatis之一对一映射查询(十)
来源:互联网 发布:各种域名区别 编辑:程序博客网 时间:2024/05/29 15:15
需求:查询订单信息并关联查询用户信息
项目目录结构
首先分析需求
查询订单信息,关联查询用户信息,所以我们可以发现主信息为orders,从信息为user
sql语句为:
SELECT orders.*, user.username, user.sex , user.addressFROM orders LEFT JOIN USER ON orders.user_id = user.id
由于查询出来的信息中包含了orders中的所有信息,还包含了user中的sex、username、address信息,单独一个orders或者user类是接收不了这么多信息的,所以应该建立一个大的实体类来接收这些信息
1.resultType
建立扩展类(数据封装)
package com.test.domain;public class OrdersExt extends Orders { private String username; private String sex; private String address; public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } public String getAddress() { return address; } public void setAddress(String address) { this.address = address; }}
为什么这个类要继承Orders而不是继承User,因为根据orders.*,USER.username,USER.sex,USER.address,很明显,要映射的数据是order表中的全部数据以及user
表中的username,sex,address这些数据,直接继承Order类的话就可以少定义一些属性,只要定义username,sex,address就可以了。
新建OrdersMapper.java接口
package com.test.mapper;import java.util.List;import com.test.domain.OrdersExt;public interface OrdersMapper { List<OrdersExt> findOrdersAndUser();}
新建OrdersMapper.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.test.mapper.OrdersMapper"> <select id="findOrdersAndUser" resultType="com.test.domain.OrdersExt"> SELECT orders.*, user.username, user.sex , user.address FROM orders LEFT JOIN USER ON orders.user_id = user.id </select></mapper>
注意不要忘记在SqlMapConfig.xml全局配置文件中配置OrdersMapper.xml
<!-- 加载映射文件 --> <mappers> <mapper resource="mapper/UserMapper.xml" /> <mapper resource="mapper/OrdersMapper.xml" /> </mappers>
测试代码
package com.test.test;import java.io.IOException;import java.io.InputStream;import java.util.List;import org.apache.ibatis.io.Resources;import org.apache.ibatis.session.SqlSession;import org.apache.ibatis.session.SqlSessionFactory;import org.apache.ibatis.session.SqlSessionFactoryBuilder;import org.junit.Before;import org.junit.Test;import com.test.domain.OrdersExt;import com.test.mapper.OrdersMapper;public class OrdersTest { SqlSessionFactory sqlSessionFactory = null; @Before public void init() throws IOException{ //读取配置文件 //全局配置文件的路径 String resource = "SqlMapConfig.xml"; InputStream inputStream = Resources.getResourceAsStream(resource); //创建SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); } @Test public void test_01(){ SqlSession sqlSession = sqlSessionFactory.openSession(); OrdersMapper mapper = sqlSession.getMapper(OrdersMapper.class); List<OrdersExt> ordersExtList = mapper.findOrdersAndUser(); System.out.println(ordersExtList); }}
注:使用resultType来进行一对一结果映射,查询出的列的个数和映射的属性的个数要一致。而且映射的属性要存在与一个大的对象中,它是一种平铺式的映射,即数据库查询出多少条记录,则映射成多少个对象。
2.resultMap
使用resultMap来进行一对一结果映射,它是将关联对象添加到主信息的对象中,具体说是对象嵌套对象的一种映射方式。
修改扩展类
package com.test.domain;public class OrdersExt extends Orders { private User user; public User getUser() { return user; } public void setUser(User user) { this.user = user; }}
OrdersMapper.java接口
package com.test.mapper;import java.util.List;import com.test.domain.OrdersExt;public interface OrdersMapper { List<OrdersExt> findOrdersAndUser();}
OrdersMapper.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.test.mapper.OrdersMapper"> <resultMap type="com.test.domain.OrdersExt" id="ordersAndUserResultMap"> <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"/> <association property="user" javaType="com.test.domain.User"> <id column="user_id" property="id"/> <result column="username" property="username"/> <result column="sex" property="sex"/> <result column="address" property="address"/> </association> </resultMap> <select id="findOrdersAndUser" resultMap="ordersAndUserResultMap"> SELECT orders.*, user.username, user.sex , user.address FROM orders LEFT JOIN USER ON orders.user_id = user.id </select></mapper>
测试代码
@Test public void test_01(){ SqlSession sqlSession = sqlSessionFactory.openSession(); OrdersMapper mapper = sqlSession.getMapper(OrdersMapper.class); List<OrdersExt> ordersExtList = mapper.findOrdersAndUser(); System.out.println(ordersExtList); }
实现一对一查询:
resultType:使用resultType实现较为简单,如果pojo中没有包括查询出来的列名,需要增加列名对应的属性,即可完成映射。
如果没有查询结果的特殊要求建议使用resultType。
resultMap:需要单独定义resultMap,实现有点麻烦,如果对查询结果有特殊的要求,使用resultMap可以完成将关联查询映射pojo的属性中。
resultMap可以实现延迟加载,resultType无法实现延迟加载。
- mybatis之一对一映射查询(十)
- 【Mybatis】---高级映射之一对一查询
- mybatis教程--映射之一对一查询
- MyBatis高级映射之一对一查询
- Mybatis高级映射一对一查询
- MyBatis学习(一)之一对一关联映射查询
- 【MyBatis学习08】高级映射之一对一查询
- MyBatis学习(一)之一对一关联映射查询
- mybatis学习之高级映射中的一对一查询
- 【MyBatis学习08】高级映射之一对一查询
- 【MyBatis学习08】高级映射之一对一查询
- Mybatis学习(07)-高级映射之一对一查询
- 【MyBatis学习08】高级映射之一对一查询
- MyBatis 关联映射之一对一
- MyBatis关系映射之一对一
- MyBatis普通查询与一对一映射查询
- 【MyBatis框架】高级映射-一对一查询
- 【mybatis基础】高级映射:一对一查询
- 《Java并发编程的艺术》笔记四——Java如何实现原子操作.md
- 强化学习入门
- css元素定位与浮动
- @RequestMapping 用法详解之地址映射
- CodeForces 182E Wooden Fence
- mybatis之一对一映射查询(十)
- POJ
- Codeforces839C Journey
- HTML:表单
- 递归与动态规划---最长公共子序列问题
- 一个简单的web点名程序(基于javascript)
- Java菜鸟教程 面向对象初步(一)
- python 百度地图 经纬度转地址
- Pygame初试----Cells