您的位置:首页 > 其它

Mybatis学习之一对多关联查询

2015-09-28 19:24 344 查看
消费者和订单是典型的一对多关系,以此模型来学习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>
<typeAliases>
<typeAlias alias="Customer" type="com.mybatis.bean.Customer"/>
<typeAlias alias="Order" type="com.mybatis.bean.Order"/>
</typeAliases>
<!--数据库参数配置 -->
<environments default="development">
<environment id="development">
<transactionManager type="JDBC" />
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost:3306/test" />
<property name="username" value="root" />
<property name="password" value="root" />
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="com/mybatis/bean/Customer.xml" />
<mapper resource="com/mybatis/bean/Order.xml" />
</mappers>
</configuration>


  简单封装sqlSessionFactory

package com.mybatis.util;

import java.io.IOException;
import java.io.Reader;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

public class MybatisUtil {
private static SqlSessionFactory sqlSessionFactory;

public static SqlSessionFactory getSqlSessionFactory() throws IOException {
if (sqlSessionFactory == null) {
String resource = "mybatis-config.xml";
Reader reader = Resources.getResourceAsReader(resource);
sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
}
return sqlSessionFactory;
}
}


  消费者bean对象定义:

package com.mybatis.bean;

import java.util.List;

public class Customer {

private int id;

private String name;

private List<Order> orderList;

public int getId() {
return id;
}

public void setId(int id) {
this.id = id;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public List<Order> getOrderList() {
return orderList;
}

public void setOrderList(List<Order> orderList) {
this.orderList = orderList;
}

}


  订单bean对象定义:

package com.mybatis.bean;

public class Order {

private int id;

private int price;

private String name;

private Customer customer;

public int getId() {
return id;
}

public void setId(int id) {
this.id = id;
}

public int getPrice() {
return price;
}

public void setPrice(int price) {
this.price = price;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public Customer getCustomer() {
return customer;
}

public void setCustomer(Customer customer) {
this.customer = customer;
}

}


  消费者SQL映射文件定义,一个消费者者可以对应多个订单,所以在定义resultMap时,要用到collection

<?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.mybatis.inter.ICustomerDAO">

<resultMap type="Customer" id="cumtomerResMap">
<id property="id" column="c_id" />
<result property="name" column="c_name" />
<collection property="orderList" ofType="Order" column="cid">
<id property="id" column="o_id" />
<result property="name" column="o_name" />
<result property="price" column="o_price" />
</collection>
</resultMap>

<select id="selectCustomer" resultMap="cumtomerResMap">
select * from customer
c,orders o where o.cid=c.c_id and c.c_id=#{id}
</select>
</mapper>


  订单SQL映射文件定义,一个订单只能对应一个消费者,所以在定义resultMap时,要用到association

<?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.mybatis.inter.IOrderDAO">
<resultMap type="Order" id="orderResMap">
<id property="id" column="o_id" />
<result property="name" column="o_name" />
<result property="price" column="o_price" />
<association property="customer" javaType="Customer">
<id property="id" column="c_id" />
<result property="name" column="c_name" />
</association>
</resultMap>

<select id="selectOrder" resultMap="orderResMap">
select * from customer
c,orders o where o.cid=c.c_id and o.o_id=#{id}
</select>
</mapper>


  消费者mapper接口定义:

package com.mybatis.inter;

import com.mybatis.bean.Customer;

public interface ICustomerDAO {

public Customer selectCustomer(int id);

}


  订单mapper接口定义:

package com.mybatis.inter;

import com.mybatis.bean.Order;

public interface IOrderDAO {

public Order selectOrder(int id);
}


  测试:

package com.mybatis.test;

import java.io.IOException;

import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;

import com.mybatis.bean.Customer;
import com.mybatis.bean.Order;
import com.mybatis.inter.ICustomerDAO;
import com.mybatis.inter.IOrderDAO;
import com.mybatis.util.MybatisUtil;

public class Test {
public static void main(String[] args) {
SqlSessionFactory factory = null;
SqlSession session=null;
try {
factory=MybatisUtil.getSqlSessionFactory();
session=factory.openSession();
ICustomerDAO customerDAO = session.getMapper(ICustomerDAO.class);
Customer customer = customerDAO.selectCustomer(2);
System.err.println(customer.getName()+" 买了:");
for(Order order :customer.getOrderList()){
System.err.println(order.getName() +" "+order.getPrice());
}
System.err.println("=========================================");
IOrderDAO orderDAO = session.getMapper(IOrderDAO.class);
Order order = orderDAO.selectOrder(2);
System.err.println(order.getName()+" "+order.getPrice());
System.err.println(order.getCustomer().getName());
} catch (IOException e) {
e.printStackTrace();
}finally{
if(session != null)
session.close();
}

}
}


  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: