association标签应用
- 创建数据库one2many两张表,客户表和订单表,进行主外键关联
CREATE DATABASE one2many DEFAULT CHARSET utf8;
use one2many;
Create table customer(
id int primary key auto_increment,
name varchar(32),
age int
);
insert into customer values(1,'张三',22);
insert into customer values(2,'李四',23);
insert into customer values(3,'王五',24);
Create table orders(
id int primary key auto_increment,
orderNumber varchar(16),orderPrice double,
customer_id int ,
foreign key (customer_id) references customer(id)
);
insert into orders values(11,20,22.22,1);
insert into orders values(12,60,16.66,1);
insert into orders values(13,90,19.99,2);
- 创建项目CustomerOrders,当查询订单表时也将其所属的客户信息(一个订单只有一个客户)一并查出(添加JAR包,编写配置文件)。
- 创建实体类Orders.java(Orders是外键表对应的类,在此类中有一个主键表对应的对象)和Customer.java(Customer是主键表对应的类)
package com.oracle.mybatis.pojo;
public class Orders {
private Integer id;
private String orderNumber;
private Double orderPrice;
private Customer customer;
public Orders(Integer id, String orderNumber, Double orderPrice, Customer customer) {
this.id = id;
this.orderNumber = orderNumber;
this.orderPrice = orderPrice;
this.customer = customer;
}
public Orders() {
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getOrderNumber() {
return orderNumber;
}
public void setOrderNumber(String orderNumber) {
this.orderNumber = orderNumber;
}
public Double getOrderPrice() {
return orderPrice;
}
public void setOrderPrice(Double orderPrice) {
this.orderPrice = orderPrice;
}
public Customer getCustomer() {
return customer;
}
public void setCustomer(Customer customer) {
this.customer = customer;
}
@Override
public String toString() {
return "Orders{" +
"id=" + id +
", orderNumber='" + orderNumber + '\'' +
", orderPrice=" + orderPrice +
", customer=" + customer +
'}';
}
}
Customer.java
package mybatis.pojo;
import java.util.List;
public class Customer {
private Integer id;
private String name;
private Integer age;
public Customer(Integer id, String name, Integer age) {
this.id = id;
this.name = name;
this.age = age;
}
public Customer() {
}
public Customer(String name, Integer age) {
this.name = name;
this.age = age;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
@Override
public String toString() {
return "Customer{" +
"id=" + id +
", name='" + name + '\'' +
", age=" + age +
'}';
}
}
- 创建编写OrdersMapper接口和OrdersMapper.xml文件(在配置文件中完成别名,和Mapper文件的注册)
OrdersMapper接口
package com.oracle.mybatis.mapper;
import com.oracle.mybatis.pojo.Orders;
public interface OrdersMapper {
//根据订单号查询订单全部信息,并且查询改订单的用户的所有信息
public Orders getById(Integer id);
}
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">
<!--
1、Mapper.xml文件中的namespace与mapper接口的类路径相同。
2、Mapper接口方法名和Mapper.xml中定义的每个statement的id相同
3、Mapper接口方法的输入参数类型和mapper.xml中定义的每个sql 的parameterType的类型相同
4、Mapper接口方法的输出参数类型和mapper.xml中定义的每个sql的resultType的类型相同
5、接口与xml文件必同名,而且在同一个路径下
-->
<mapper namespace="com.oracle.mybatis.mapper.OrdersMapper">
<resultMap id="ordermap" type="orders">
<id property="id" column="oid"></id>
<result property="orderNumber" column="orderNumber"></result>
<result property="orderPrice" column="orderPrice"></result>
<!--在此要绑定订单类中的成员变量客户类的具体的每一个成员变量与客户表中的每一个字段进行绑定-->
<association property="customer" javaType="customer">
<id property="id" column="cid"></id>
<result property="name" column="name"></result>
<result property="age" column="age"></result>
</association>
</resultMap>
<select id="getById" parameterType="int" resultMap="ordermap">
select o.*,o.id oid, c.*,c.id cid from orders o inner join customer c on o.customer_id = c.id where o.id=#{id}
</select>
</mapper>
SqlMapConfig.xml
<?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="db.properties"></properties>
<!--为对象设置别名-->
<typeAliases>
<typeAlias type="com.oracle.mybatis.pojo.Orders" alias="orders"></typeAlias>
<typeAlias type="com.oracle.mybatis.pojo.Customer" alias="customer"></typeAlias>
</typeAliases>
<!--数据库环境配置-->
<environments default="development">
<environment id="development">
<!--事务处理方式-->
<transactionManager type="JDBC"></transactionManager>
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driver}"></property>
<property name="url" value="${jdbc.url}"></property>
<property name="username" value="${jdbc.username}"></property>
<property name="password" value="${jdbc.password}"></property>
</dataSource>
<!--数据库配置-->
</environment>
</environments>
<!--注册Mapper文件-->
<mappers>
<package name="com.oracle.mybatis.mapper"></package>
</mappers>
</configuration>
- 创建编写测试类MyTest.java
package com.oracle.mybatis.test;
import com.oracle.mybatis.mapper.OrdersMapper;
import com.oracle.mybatis.pojo.Orders;
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 java.io.InputStream;
public class MyTest {
SqlSession sqlSession;
//创建OrdersMapper对象
OrdersMapper ordersMapper;
@Before
public void setSession() throws Exception{
InputStream inputStream = Resources.getResourceAsStream("SqlMapConfig.xml");
SqlSessionFactory factory=new SqlSessionFactoryBuilder().build(inputStream);
sqlSession=factory.openSession();
}
@Test
public void testfindordersById(){
ordersMapper = sqlSession.getMapper(OrdersMapper.class);
Orders orders=ordersMapper.getById(1);
//sout+回车是System.out.println()快捷键
System.out.println(orders);
}
}
运行结果
collection标签
- 实现查询客户表时将客户所属的所有订单信息(一个用户可以有多个订单,所以是一个集合)一并查出。
- 修改Customer类,Customer对应数据库中的主键表,需要加入外键表对应类的集合,
package com.oracle.mybatis.pojo;
import java.util.Date;
import java.util.List;
public class Customer {
private Integer id;
private String name;
private Integer age;
//查询出来指定ID的用户,并且同时查出此用户的所有订单
private List<Orders> ordersList;
public Customer(Integer id, String name, Integer age, List<Orders> ordersList) {
this.id = id;
this.name = name;
this.age = age;
this.ordersList = ordersList;
}
public Customer() {
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public List<Orders> getOrdersList() {
return ordersList;
}
public void setOrdersList(List<Orders> ordersList) {
this.ordersList = ordersList;
}
@Override
public String toString() {
return "Customer{" +
"id=" + id +
", name='" + name + '\'' +
", age=" + age +
", ordersList=" + ordersList +
'}';
}
}
- 创建编写CustomerMapper接口和CustomerMapper.xml文件
CustomerMapper接口(在配置文件中注册Mapper文件和起别名)
package com.oracle.mybatis.mapper;
import com.oracle.mybatis.pojo.Customer;
public interface CustomerMapper {
//根据主键ID查询用户信息,同时包含该用户名下的所有订单
public Customer getById(Integer id);
}
CustomerMapper.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">
<!--
1、Mapper.xml文件中的namespace与mapper接口的类路径相同。
2、Mapper接口方法名和Mapper.xml中定义的每个statement的id相同
3、Mapper接口方法的输入参数类型和mapper.xml中定义的每个sql 的parameterType的类型相同
4、Mapper接口方法的输出参数类型和mapper.xml中定义的每个sql的resultType的类型相同
5、接口与xml文件必同名,而且在同一个路径下
-->
<mapper namespace="com.oracle.mybatis.mapper.CustomerMapper">
<resultMap id="customermap" type="customer">
<id property="id" column="cid"></id>
<result property="name" column="name"></result>
<result property="age" column="age"></result>
<!--对应多方集合的绑定,使用collection标签-->
<collection property="ordersList" ofType="orders">
<id property="id" column="oid"></id>
<result property="orderNumber" column="orderNumber"></result>
<result property="orderPrice" column="orderPrice"></result>
</collection>
</resultMap>
<select id="getById" parameterType="int" resultMap="customermap">
select c.*,c.id cid,o.*,o.id oid from customer c left join orders o on c.id = o.customer_id where c.id=#{id}
</select>
</mapper>
- 在原来MyTest基础上编写新的测试代码
package com.oracle.mybatis.test;
import com.oracle.mybatis.mapper.CustomerMapper;
import com.oracle.mybatis.mapper.OrdersMapper;
import com.oracle.mybatis.pojo.Customer;
import com.oracle.mybatis.pojo.Orders;
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 java.io.InputStream;
public class MyTest {
SqlSession sqlSession;
//创建OrdersMapper对象
OrdersMapper ordersMapper;
CustomerMapper customerMapper;
@Before
public void setSession() throws Exception{
InputStream inputStream = Resources.getResourceAsStream("SqlMapConfig.xml");
SqlSessionFactory factory=new SqlSessionFactoryBuilder().build(inputStream);
sqlSession=factory.openSession();
}
@Test
public void testfindordersById(){
ordersMapper = sqlSession.getMapper(OrdersMapper.class);
Orders orders=ordersMapper.getById(1);
//sout+回车是System.out.println()快捷键
System.out.println(orders);
}
@Test
public void testfindcustomerById(){
customerMapper = sqlSession.getMapper(CustomerMapper.class);
Customer customer =customerMapper.getById(1);
//sout+回车是System.out.println()快捷键
System.out.println(customer);
}
}
运行结果