Java基础-SSM之mybatis一对多和多对一关系映射

                                      作者:尹正杰

版权声明:原创作品,谢绝转载!否则将追究法律责任。

一.准备测试环境(创建数据库表)

 1>.创建customers表;

use yinzhengjie;

create table if not exists customers(id int primary key auto_increment,name varchar(20) , age int) ;

2>.创建orders表

use yinzhengjie;

create table orders(id int primary key auto_increment , orderno varchar(20) , price float , cid int) ;

 3>.创建指定的包名和文件,具体结构如下:

4>.添加Maven依赖

 <?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>cn.org.yinzhengjie</groupId>
<artifactId>Mybatis</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.17</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.2.1</version>
</dependency>
</dependencies>
</project>

二.编写自定义类

1>.编写Customer类

 /*
@author :yinzhengjie
Blog:http://www.cnblogs.com/yinzhengjie/tag/Java%E5%9F%BA%E7%A1%80/
EMAIL:y1053419035@qq.com
*/
package cn.org.yinzhengjie.mybatis.domain.one2many; import java.util.ArrayList;
import java.util.List; /**
* 客户
*/
public class Customer {
private Integer id ;
private String name ;
private int age ; //建立从Customer到Order之间一对多关系,因为一个客户可能会有多个订单。我们将多个订单放在一个list中。
private List<Order> orders = new ArrayList<Order>() ; public List<Order> getOrders() {
return orders;
} public void setOrders(List<Order> orders) {
this.orders = orders;
} 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 int getAge() {
return age;
} public void setAge(int age) {
this.age = age;
}
}

2>.编写Order类

 /*
@author :yinzhengjie
Blog:http://www.cnblogs.com/yinzhengjie/tag/Java%E5%9F%BA%E7%A1%80/
EMAIL:y1053419035@qq.com
*/
package cn.org.yinzhengjie.mybatis.domain.one2many; /**
* 订单
*/
public class Order {
private Integer id ;
private String orderno ;
private float price ;
//建立从Order到Customer之间多对一关联关系
private Customer customer ; public Integer getId() {
return id;
} public void setId(Integer id) {
this.id = id;
} public String getOrderno() {
return orderno;
} public void setOrderno(String orderno) {
this.orderno = orderno;
} public float getPrice() {
return price;
} public void setPrice(float price) {
this.price = price;
} public Customer getCustomer() {
return customer;
} public void setCustomer(Customer customer) {
this.customer = customer;
}
}

三.编写配置文件

1>.mybatis-config.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>
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:5200/yinzhengjie"/>
<property name="username" value="root"/>
<property name="password" value="yinzhengjie"/>
</properties> <!-- 我们使用typeAliases标签给我们自定义类起个别名。-->
<typeAliases>
<typeAlias type="cn.org.yinzhengjie.mybatis.domain.one2many.Customer" alias="_Customer" />
<typeAlias type="cn.org.yinzhengjie.mybatis.domain.one2many.Order" alias="_Order" />
</typeAliases> <environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
</dataSource>
</environment>
</environments>
<mappers>
<!-- 我们使用mapper标签指定映射文件,使用resource指定具体的路径,如果没有写绝对路径,默认的根路径就在resources目录中-->
<mapper resource="CustomerMapper.xml"/>
<mapper resource="OrderMapper.xml"/>
</mappers>
</configuration>

2>.OrderMapper.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="orders">
<insert id="insert">
<!-- 注意,我们传递的参数 #{customer.id}是对象的属性,因此,这里千万别写cid,尽管我们在创建数据库中定义的有这个字段,但是我们在定义类的时候是把它定义为对象的一个属性! -->
insert into orders(orderno, price , cid) values(#{orderno}, #{price} , #{customer.id}) ;
</insert> <!--用resultMap标签定义数据库的查询结果映射,这个结果不能直接和我们自定义的类进行交互,需要通过resultMap标签定义结果映射才能使用我们自定义的类接收数据。-->
<select id="selectOne" resultMap="rm_Order">
SELECT
<!-- 定义需要查询的别名 -->
o.id oid ,
o.orderno oorderno ,
o.price oprice ,
o.cid ocid ,
c.id cid ,
c.name cname ,
c.age cage
FROM
<!-- 定义需要查询的字段 -->
orders o
<!-- 使用左外连接查询 -->
LEFT OUTER JOIN customers c on o.cid = c.id
where
o.id = #{id}
</select>
<select id="selectAll" resultMap="rm_Order">
SELECT
o.id oid ,
o.orderno oorderno ,
o.price oprice ,
o.cid ocid ,
c.id cid ,
c.name cname ,
c.age cage
FROM
orders o
LEFT OUTER JOIN customers c on o.cid = c.id
</select> <!-- 使用resultMap标签定义结果映射,即将id为"rm_Order"的查询结果和我们自定义的类做一个关联关系,否则直接拿查询出来的结果字段和我们自定义的字段是对应不上的!-->
<resultMap id="rm_Order" type="_Order">
<!--将查询结果“oid”字段对应为我们自定义别名类“_Order”的“id"字段-->
<id column="oid" property="id" />
<result column="oorderno" property="orderno"/>
<result column="oprice" property="price"/> <!-- 多对一关联关系 -->
<!-- 使用association这个标签可以建立关联属性, property表示"_Order"的属性,column是通过上面定义的"ocid"别名来查询的,而javaType表示指定"customer"岁对应的属性为"_Customer" -->
<association property="customer" column="ocid" javaType="_Customer">
<!--下面就是具体的对应关系。-->
<id column="cid" property="id" />
<result column="cname" property="name" />
<result column="cage" property="age" />
</association>
</resultMap>
</mapper>

3>.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">
<!-- 定义名字空间 -->
<mapper namespace="customers">
<!-- useGeneratedKeys的值为true时,表示需要使用数据库深层的keys,同时我们需要指定使用哪个深层的key。而指定具体使用哪个key我们使用keyProperty来定义! -->
<insert id="insert" useGeneratedKeys="true" keyProperty="id">
<!-- 注意,#{name}, #{age}中的name和age字样必须和我们自定义类要一致哟! -->
insert into customers(name, age) values(#{name}, #{age}) ;
</insert> <!--用resultMap标签定义数据库的查询结果映射,这个结果不能直接和我们自定义的类进行交互,需要通过resultMap标签定义结果映射才能使用我们自定义的类接收数据。-->
<select id="selectOne" resultMap="rm_Customer">
select
c.id cid ,
c.name cname ,
c.age cage ,
o.id oid ,
o.orderno oorderno ,
o.price oprice ,
o.cid ocid
from
customers c left outer join orders o on o.cid = c.id
where
c.id = #{id} ;
</select> <resultMap id="rm_Customer" type="_Customer">
<id column="cid" property="id"/>
<result column="cname" property="name"/>
<result column="cage" property="age"/>
<!--使用collection这个标签可以建立关联属性。多对一关系映射-->
<collection property="orders" ofType="_Order" column="ocid">
<id column="oid" property="id"/>
<result column="oorderno" property="orderno" />
<result column="oprice" property="price"/>
</collection>
</resultMap> </mapper>

四.编写测试代码

1>.编写测试代码如下:

 /*
@author :yinzhengjie
Blog:http://www.cnblogs.com/yinzhengjie/tag/Java%E5%9F%BA%E7%A1%80/
EMAIL:y1053419035@qq.com
*/
package cn.org.yinzhengjie.mybatis.test; import cn.org.yinzhengjie.mybatis.domain.one2many.Customer;
import cn.org.yinzhengjie.mybatis.domain.one2many.Order;
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 java.io.InputStream;
import java.util.List; public class TestOne2Many {
/**
* 测试往Customer插入指定的数据
*/
@Test
public void testInsertCustomer() throws Exception {
InputStream in = Resources.getResourceAsStream("mybatis-config.xml");
SqlSessionFactory sf = new SqlSessionFactoryBuilder().build(in);
SqlSession sess = sf.openSession();
Customer c = new Customer();
c.setName("yinzhengjie");
c.setAge(18);
sess.insert("customers.insert", c); Order o = new Order();
o.setOrderno("no001");
o.setPrice(100);
//设置关联关系
o.setCustomer(c); sess.insert("orders.insert" , o) ;
sess.commit();
sess.close();
} /**
* 测试查询指定的order
*/
@Test
public void testSelectOneOrder() throws Exception {
InputStream in = Resources.getResourceAsStream("mybatis-config.xml");
SqlSessionFactory sf = new SqlSessionFactoryBuilder().build(in);
SqlSession sess = sf.openSession();
Order o = sess.selectOne("orders.selectOne" , 1);
System.out.println(o.getOrderno());
List<Order> orders = sess.selectList("orders.selectAll");
for(Order obj : orders){
System.out.print(obj.getOrderno());
Customer c = obj.getCustomer() ;
if(c != null){
System.out.println(c.getName());
}
else{
System.out.println();
}
}
sess.commit();
sess.close();
} /**
* 测试查询指定的Customer
*/
@Test
public void testSelectCustomer() throws Exception {
InputStream in = Resources.getResourceAsStream("mybatis-config.xml");
SqlSessionFactory sf = new SqlSessionFactoryBuilder().build(in);
SqlSession sess = sf.openSession();
Customer c = sess.selectOne("customers.selectOne" , 1);
for(Order o : c.getOrders()){
System.out.println(o.getId() + " " + o.getOrderno());
}
sess.commit();
sess.close();
}
}

2>.查询数据库执行结果如下:

Java基础-SSM之mybatis一对多和多对一关系映射的更多相关文章

  1. Java基础-SSM之mybatis多对多关联

    Java基础-SSM之mybatis多对多关联 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.准备测试环境(创建数据库表) 1>.创建teas,stus,links表 u ...

  2. Java基础-SSM之mybatis的统计函数和分页查询

    Java基础-SSM之mybatis的统计函数和分页查询 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任.

  3. Java基础-SSM之mybatis一对一关联

    Java基础-SSM之mybatis一对一关联 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.准备测试环境(创建数据库表)  1>.创建husbands和wifes表并建 ...

  4. Java基础-SSM之mybatis的树形控件(自关联)

    Java基础-SSM之mybatis的树形控件(自关联) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.准备测试环境(创建数据库表) 1>.创建areas表: use y ...

  5. Java基础-SSM之mybatis一对一外键关联

    Java基础-SSM之mybatis一对一外键关联 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.准备测试环境(创建数据库表)  1>.创建husbandsfk和wife ...

  6. Java基础-SSM之mybatis快速入门篇

    Java基础-SSM之mybatis快速入门篇 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 其实你可能会问什么是SSM,简单的说就是spring mvc + Spring + m ...

  7. Hibernate自身一对多和多对多关系映射

    一对多关系映射大家都明白,关系双方都一个含有对方多个引用,但自身一对多很多同学都不明白什么意思,那么首先我就说明一下什么是自身一对多,其实也很好理解,自身一对多就是自身含有本身的多个引用,例如新闻类别 ...

  8. java框架之Hibernate(3)-一对多和多对多关系操作

    一对多 例:一个班级可以有多个学生,而一个学生只能属于一个班级. 模型 package com.zze.bean; import java.util.HashSet; import java.util ...

  9. [Z]Spring Data JPA 之 一对一,一对多,多对多 关系映射

    一.@OneToOne关系映射 JPA使用@OneToOne来标注一对一的关系. 实体 People :用户. 实体 Address:家庭住址. People 和 Address 是一对一的关系. 这 ...

随机推荐

  1. python删除文件与目录的方法

    python内置方法删除目录(空目录与非空目录)及文件 1.os.remove(file_path):删除文件 #PPTV是文件夹,xen.txt是文件 >>> os.remove( ...

  2. 百度地图API的网页使用

    请看图示(以及参考官方文档): 图片尺寸:1710x822

  3. mgo like的两种写法

    实际上都是围绕正则来写的,看大家喜欢那种写法 package main import ( "fmt" "labix.org/v2/mgo" "labi ...

  4. 哥java学识有大进 干回之前的小学生系统像切菜一样简单 不说了 来代码

    package runok; import java.util.*; import java.awt.*; import java.awt.event.ActionEvent; import java ...

  5. Alpha 冲刺报告模板

    Alpha 冲刺报告模板 Deadline: 十分钟左右站立会议,控制好时间,不要在此会议上讨论细节问题. 每组一份博客,组内共享,每人都需提交. 模板 队名:xxx 组员1(组长) 今天完成了哪些任 ...

  6. [转帖].NET Framework各版本操作系统支持

    .NET Framework .NET版本 1.0 1.1 2.0 3.0 3.5 4.0 4.5 完整版本 1.0.3705.0 1.1.4322.573 2.0.50727.42 3.0.4506 ...

  7. SQLSERVER 设置自动备份数据库

    1. SQLSERVER 简单的设置 计划任务 进行 备份数据库的操作. 首先需要打开 一些设置 执行 命令如下: sp_configure ; GO RECONFIGURE; GO sp_confi ...

  8. Django-基本概念

    目录 Django 项目创建 项目结构 应用目录 Django Django是一个开放源代码的Web应用框架, 由Python写成. 采用了MVC的软件设计模式, 即模型M, 视图V和控制器C. 这套 ...

  9. LVS(Linus Virtual Server):三种负载均衡方式比较+另三种负载均衡方式

    还有个姊妹篇也可以参考这个文章:六大Web负载均衡原理与实现 什么是LVS (Linux Virtual Server)?   首先简单介绍一下LVS (Linux Virtual Server)到底 ...

  10. Java 工厂方法模式

    在工厂对象上调用创建方法,生成接口的某个实现的对象 通过这种方式,接口与实现分离 方法接口 /** * 方法接口 */ public interface Service { void method1( ...