mybatis :一对一
在mapper接口声明:
//一对一关联查询
public List<Orders> selectOrders();
//一对多关联订单
public List<User> selectUsers();
//映射的配置文件:
用的是动态代理mapper
<mapper namespace="com.leo.mapper.OrderMapper">
<!-- 一对一 -->
<!-- 使用Map 一对一映射 你要查出来的语句要都有指定的属性 -->
<resultMap type="com.leo.domain.Orders" id="orderMap">
<!-- 指定查出这个字段映射到哪个类型-->
<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:order里面的User属性名 -->
<!-- javaType:属性类型-->
<association property="user" javaType="com.leo.domain.User">
<id property="id" column="user_id"/>
<result column="username" property="username"/>
</association>
</resultMap>
<select id="selectOrders" resultMap="orderMap">
select
o.id,
o.user_id,
o.number,
o.createtime,
o.note,
u.username
from orders o
left join user u
on o.user_id = u.id
</select>
测试:
/**
* 一对一
* @throws IOException
*/
@Test
public void test3() throws IOException {
// TODO Auto-generated method stub
//加载核心配置文件
String resource="sqlMapConfig2.xml";
InputStream in= Resources.getResourceAsStream(resource);
//创建SqlSessionFactory工厂
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(in);
//创建sqlSession
SqlSession sqlSession = sqlSessionFactory.openSession();
//sqlSession生成实现类
OrderMapper mapper = sqlSession.getMapper(OrderMapper.class);
List<Orders> selectOrders = mapper.selectOrders();
for (Orders orders : selectOrders) {
System.out.println(orders);
}
}
<!-- 一对多 -->
<!-- 使用Map 一对多映射 你要查出来的语句要都有指定的属性 -->
<resultMap type="com.leo.domain.User" id="userMap">
<!-- 指定查出这个字段映射到哪个类型-->
<id column="id" property="id"/>
<id column="username" property="username"/>
<id column="sex" property="sex"/>
<id column="birthday" property="birthday"/>
<id column="address" property="address"/>
<!-- 一对多 -->
<collection property="orders" javaType="list" ofType="com.leo.domain.Orders">
</collection>
</resultMap>
<select id="selectUsers" resultMap="userMap">
select
o.id,
o.user_id,
o.number,
o.createtime,
o.note,
u.username
from user u
left join orders o
on o.user_id = u.id
</select>
测试类:
package com.leo.mybatis;
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.Test;
import com.leo.domain.Orders;
import com.leo.domain.User;
import com.leo.mapper.OrderMapper;
/**
* order输入类型的测试
* @author leoi555
*
*/
public class OrderMapperTest {
/**
* 自动封装成pojo类型的
* @throws IOException
*/
public void test1() throws IOException {
// TODO Auto-generated method stub
//加载核心配置文件
String resource="sqlMapConfig2.xml";
InputStream in= Resources.getResourceAsStream(resource);
//创建SqlSessionFactory工厂
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(in);
//创建sqlSession
SqlSession sqlSession = sqlSessionFactory.openSession();
//sqlSession生成实现类
OrderMapper mapper = sqlSession.getMapper(OrderMapper.class);
List<Orders> orders=mapper.listOrder();
for(Orders orders2:orders) {
System.out.println(orders2);
}
}
/**
* 手动封装成pojo类型的
* @throws IOException
*/
public void test2() throws IOException {
// TODO Auto-generated method stub
//加载核心配置文件
String resource="sqlMapConfig2.xml";
InputStream in= Resources.getResourceAsStream(resource);
//创建SqlSessionFactory工厂
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(in);
//创建sqlSession
SqlSession sqlSession = sqlSessionFactory.openSession();
//sqlSession生成实现类
OrderMapper mapper = sqlSession.getMapper(OrderMapper.class);
List<Orders> orders=mapper.listOrderByMap();
for(Orders orders2:orders) {
System.out.println(orders2);
}
}
/**
* 一对一
* @throws IOException
*/
@Test
public void test3() throws IOException {
// TODO Auto-generated method stub
//加载核心配置文件
String resource="sqlMapConfig2.xml";
InputStream in= Resources.getResourceAsStream(resource);
//创建SqlSessionFactory工厂
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(in);
//创建sqlSession
SqlSession sqlSession = sqlSessionFactory.openSession();
//sqlSession生成实现类
OrderMapper mapper = sqlSession.getMapper(OrderMapper.class);
List<Orders> selectOrders = mapper.selectOrders();
for (Orders orders : selectOrders) {
System.out.println(orders);
}
}
/**
* 一对多
* @throws IOException
*/
@Test
public void test3_1() throws IOException {
// TODO Auto-generated method stub
//加载核心配置文件
String resource="sqlMapConfig2.xml";
InputStream in= Resources.getResourceAsStream(resource);
//创建SqlSessionFactory工厂
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(in);
//创建sqlSession
SqlSession sqlSession = sqlSessionFactory.openSession();
//sqlSession生成实现类
OrderMapper mapper = sqlSession.getMapper(OrderMapper.class);
List<User> user = mapper.selectUsers();
for (User user2s : user) {
System.out.println(user2s);
}
}
}
主要使用的一对一关系和一对多关系,在使用的过程中通过做连接查询的形式把最终的查询结果给显示出来,这时候要使用结果集为map需要自己手动的映射结果到哪个属性上
<!-- 一对一 -->
<!-- association :配置一对一属性 -->
<!-- property:order里面的User属性名 -->
<!-- javaType:属性类型-->
由于是映射的map在使用一对多或者一对一时就是对数据库的左外连接查询,这些查询出来的必须为map接受因为在查询的时候不可能有哪个类的属性与之相对应,所以在封装返回值得时候只能使用resultmap接收并且要指定把查询出来的数据封装到哪个属性中,只有手动的封装到属性所对应的对象中,最终才会达到想要的数据的结果