javaEE Mybatis,一对一、一对多关联查询,resultMap配置关联属性的映射

Mybatis的Jar包下载:https://pan.baidu.com/s/16P-MGgn53e1EtCL6wQ9VWA  密码:1azq

OrderMapper.xml(实体类的Sql配置文件,resultMap配置一对一、一对多关联属性的映射):

<?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">

<!-- 配置原生Sql语句   -->
<mapper namespace="com.xxx.mybatis.mapper.OrderMapper">
	
	<!-- 一对一关联查询  (一个订单关联一个用户) -->
	<!-- 手动配置数据库表的列名与返回对象属性的映射关系 (有关联属性) -->
	<resultMap type="Order" id="order">
		<result column="id" property="id"/>  <!-- order对象的属性 -->
		<result column="user_id" property="userId"/>
		<result column="number" property="number"/>  <!-- 关联查询时(多表查询),列名和属性名相同时,不可以省略不写。 单表查询时(没有关联属性)列名和属性名相同时,可以省略 -->
		<!-- 关联属性的映射(一对一) -->
		<association property="user" javaType="User" >  <!-- user是Order类中的关联属性。  javaType:必须指定user属性的类型 -->
			<id column="user_id" property="id"/>  <!-- User对象的属性 -->
			<result column="username" property="username"/>
		</association>
	</resultMap>
	
	<select id="selectOrders" resultMap="order">  <!-- 返回对象有关联属性时,必须用resultMap手动配置映射关系 -->
		SELECT 
		o.id,
		o.user_id, 
		o.number,
		o.createtime,
		u.username 
		FROM orders o 
		left join user u 
		on o.user_id = u.id
	</select>
	
	<!-- 一对多关联查询 (一个用户关联多个订单)-->
	<resultMap type="User" id="user">
		<id column="user_id" property="id"/>  <!-- User对象的属性 -->
		<result column="username" property="username"/>  <!-- id标签表示主键属性;result表示非主键属性 -->
		<!-- 关联属性的映射(一对多) -->
		<collection property="orderList" ofType="Order" >  <!-- orderList是User类中的关联属性。 ofType:必须指定orderList属性是什么类型的集合 -->
			<id column="id" property="id"/>    <!-- order对象的属性 -->
			<result column="number" property="number"/>
		</collection>
	</resultMap>
	
	<select id="selectUserList" resultMap="user">
		SELECT 
		o.id,
		o.user_id, 
		o.number,
		o.createtime,
		u.username 
		FROM user u
		left join orders o 
		on o.user_id = u.id
	</select>

</mapper>

OrderMapper.java(遵循四个原则的Dao层接口):

package com.xxx.mybatis.mapper;

import java.util.List;

import com.xxx.mybatis.pojo.Order;
import com.xxx.mybatis.pojo.User;

public interface OrderMapper {
	
	//遵循四个原则:
	//OrderMapper.xml中配置的命名空间要与该接口的全类名保持一致(com.xxx.mybatis.mapper.OrderMapper) 
	//接口中的方法名  == OrderMapper.xml中配置的sql语句的id名
	//返回值类型  与  OrderMapper.xml文件中配置的返回值类型(resultType)要一致
	//方法的输入参数类型 与OrderMapper.xml中配置的输入参数的类型(parameterType)要一致
	
	//一对一关联 查询  以订单为中心 关联用户
	public List<Order> selectOrders();
	
	//一对多关联
	public List<User> selectUserList();
	
}

Test.java(测试类):

package com.xxx.mybatis.junit;

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.xxx.mybatis.mapper.OrderMapper;
import com.xxx.mybatis.pojo.Order;
import com.xxx.mybatis.pojo.User;

public class Test {

	@Test
	//一对一
	public void testOrderList() throws Exception {
		String resource = "sqlMapConfig.xml";
		InputStream in = Resources.getResourceAsStream(resource);
		SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(in);
		SqlSession sqlSession = sqlSessionFactory.openSession();
		//---------------------------------------------------------------------
		
		//SqlSession会根据接口自动生成这个接口的实现类  (动态代理)。
		OrderMapper orderMapper = sqlSession.getMapper(OrderMapper.class);
		List<Order> selectOrdersList = orderMapper.selectOrders();
		
		for (Order order : selectOrdersList) {
			System.out.println(order);
		}
	}
	
	@Test
	//一对多
	public void testUserList() throws Exception {
		String resource = "sqlMapConfig.xml";
		InputStream in = Resources.getResourceAsStream(resource);
		SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(in);
		SqlSession sqlSession = sqlSessionFactory.openSession();
		//---------------------------------------------------------------------
		
		//SqlSession会根据接口自动生成这个接口的实现类  (动态代理)。
		OrderMapper orderMapper = sqlSession.getMapper(OrderMapper.class);
		List<User> users = orderMapper.selectUserList();
		for (User user : users) {
			System.out.println(user);
		}
	}
	
}

Order.java(实体类):

package com.xxx.mybatis.pojo;

import java.io.Serializable;
import java.util.Date;

public class Order  implements Serializable{
    
	private static final long serialVersionUID = 1L;
	private Integer id;
    private Integer userId;
    private String number;
    private Date createtime;
    private String note;
    
    //关联用户对象User
    private User user;
    
    
    //.....getter和setter方法..........
    
}

User.java(实体类):

package com.xxx.mybatis.pojo;

import java.io.Serializable;
import java.util.Date;
import java.util.List;

public class User implements Serializable {
	
	private static final long serialVersionUID = 1L;
	private Integer id;
	private String username; //用户姓名
	private String sex;   //性别
	private Date birthday; //生日
	private String address; //地址
	
	//关联订单 (List)
	private List<Order> orderList;
	
	
	//.....getter和setter方法..........
	
}

src/sqlMapConfig.xml(Mybatis的核心配置文件):

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">

<configuration>
 
	<properties resource="jdbc.properties"/>
	
	<!-- 为类型配置别名 -->
	<typeAliases>
		<!-- 该包及其子包下的所有类都会自动取简单类名为别名,且别名首字母大小写都可以 -->
		<package name="com.xxx.mybatis.pojo"/>
	</typeAliases>
	
	<!-- 连接数据库的参数配置。和spring整合后 environments配置将废除    -->
	<environments default="development">
		<environment id="development">
			<!-- 使用jdbc事务管理 -->
			<transactionManager type="JDBC" />
			<!-- 数据库连接池 -->
			<dataSource type="POOLED">
				<property name="driver" value="${jdbc.driver}" />
				<property name="url" value="jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf-8" />
				<property name="username" value="root" />
				<property name="password" value="123" />
			</dataSource>
		</environment>
	</environments>
	
	<!-- 加载外部实体类的Sql映射文件 -->
	<mappers>
		<package name="com.xxx.mybatis.mapper" />  <!-- 该包下的所有类对应的xml映射文件都会包含进来(推荐)。必须满足该包下的xml文件的名字和位置与对应类相同 -->
	</mappers>
	
</configuration>

猜你喜欢

转载自blog.csdn.net/houyanhua1/article/details/82782192