MyBatis的一对一和多对一

关系说明:一个用户对应多个订单, 一个订单对应一个商品

实现步骤:

        ①导入相关jar包

        ②创建数据库以及对应的表

        ③编写各个类、接口、配置文件

        ④测试

①导入相关jar包  主要的:mybatis 、 mysql-connector-java 、junit 、log4j(可选)

        相关坐标:

        <!--用于测试-->
        <dependency>
			<groupId>junit</groupId>
			<artifactId>junit</artifactId>
			<version>4.11</version>
			<scope>test</scope>
		</dependency>
        <!--mybatis坐标-->
		<dependency>
			<groupId>org.mybatis</groupId>
			<artifactId>mybatis</artifactId>
			<version>3.5.2</version>
		</dependency>
        <!--mysql驱动坐标 注意:建议和自己安装的版本一致-->
		<dependency>
			<groupId>mysql</groupId>
			<artifactId>mysql-connector-java</artifactId>
			<version>8.0.30</version>
		</dependency>
        <!--日志记录-->
		<dependency>
			<groupId>log4j</groupId>
			<artifactId>log4j</artifactId>
			<version>1.2.17</version>
		</dependency>
	</dependencies>

②创建数据库以及对应的表

--创建数据库orders
CREATE DATABASE orders;
--使用数据库
USE Orders;

--创建订单表order2
CREATE TABLE order2 (
  id INT PRIMARY KEY NOT NULL, --订单编号 主键非空
  o_name VARCHAR(20), --订单物品名
  o_date DATE DEFAULT NULL, --订单日期 默认为空
  o_total INT DEFAULT NULL, --订单数量
  u_id INT NOT NULL, --关联外键
  FOREIGN KEY (u_id) REFERENCES user (id) ON UPDATE CASCADE --设置外键 并同步更新
) ENGINE=INNODB

--创建用户表user
CREATE TABLE USER(
	id INT PRIMARY KEY AUTO_INCREMENT, --用户编号 主键 编号自增
	NAME VARCHAR(20) NOT NULL, --用户名 非空
	gender VARCHAR(2) NOT NULL, --用户性别 非空
	age INT, --用户年龄
	address VARCHAR(20) --用户地址
);

        数据就用可视化按钮以及输入框自行添加吧!

        order2:

        

        user:

        

③编写各个类、接口、配置文件

创建:

        实体类:

        main.java.com.xxx.domain.User.java   

package com.xjf.domain;

import java.util.List;

public class User {

	private int id;  //编号
	private String name;  //姓名
	private String gender; //性别
	private int age;  //年龄
	private String address;  //地址
	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 String getGender() {
		return gender;
	}

	public void setGender(String gender) {
		this.gender = gender;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}

	public String getAddress() {
		return address;
	}

	public void setAddress(String address) {
		this.address = address;
	}

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

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

	public User() {
	}

	@Override
	public String toString() {
		return "User{" +
				"id=" + id +
				", name='" + name + '\'' +
				", gender='" + gender + '\'' +
				", age=" + age +
				", address='" + address + '\'' +
				", orderList=" + orderList +
				'}';
	}
}

        main.java.com.xxx.domain.Order.java

package com.xjf.domain;

import java.util.Date;

public class Order {

	private int id;  //订单id
	private String name;  //订单物品
	private Date date;  //订单日期
	private int total;  //订单总数量

	//当前订单属于哪一个用户
	private User user;  //一个订单对应一个用户

	public Order() {
	}

	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 Date getDate() {
		return date;
	}

	public void setDate(Date date) {
		this.date = date;
	}

	public int getTotal() {
		return total;
	}

	public void setTotal(int total) {
		this.total = total;
	}

	public User getUser() {
		return user;
	}

	public void setUser(User user) {
		this.user = user;
	}

	@Override
	public String toString() {
		return "Order{" +
				"id=" + id +
				", name='" + name + '\'' +
				", date=" + date +
				", total=" + total +
				", user=" + user +
				'}';
	}
}

        接口编写:

        main.java.com.xxx.mapper.UserMapper.interface

package com.xjf.mapper;

import com.xjf.domain.User;

import java.util.List;

public interface UserMapper {
	public List<User> findAll();
}

        main.java.com.xxx.mapper.OrderMapper.interface

package com.xjf.mapper;


import com.xjf.domain.Order;

import java.util.List;

public interface OrderMapper {
	public List<Order> findAll();
}

       映射配置

        recources/com.xxx.domain.UserMapper.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="com.xjf.mapper.UserMapper">
	<!--一个用户对应多个订单(一对多)-->
	<resultMap id="userMap" type="user">
		<id column="id" property="id"></id>
		<result column="u_name" property="name"></result>
		<result column="u_gender" property="gender"></result>
		<result column="u_age" property="age"></result>
		<result column="u_address" property="address"></result>

		<!--
			property="orderList" ofType="order"
			property;实体对象中的属性名(private List<Order> orderList)
			ofType:实体对象中的属性类型(Order)
		-->
		<collection property="orderList" ofType="order">
			<id column="id" property="id"></id>
			<result column="o_name" property="name"></result>
			<result column="o_date" property="date"></result>
			<result column="o_total" property="total"></result>
		</collection>


	</resultMap>

	<select id="findAll" resultMap="userMap">
		SELECT *,u.id uid, o.id oid FROM USER u, order2 o WHERE u.id = o.u_id;
	</select>
</mapper>

         recources/com.xxx.domain.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="com.xjf.mapper.OrderMapper">
	<!--一个订单对应一个用户(一对一)-->
	<resultMap id="orderMap" type="order">
		<!--手动指定字段与实体属性的映射关系-->
		<!--column(字段名)  property(实体属性名)-->
		<id column="oid" property="id"></id>
		<result column="o_name" property="name"></result>
		<result column="o_date" property="date"></result>
		<result column="o_total" property="total"></result>

		<result column="uid" property="user.id"></result>
		<result column="u_name" property="user.name"></result>
		<result column="u_gender" property="user.gender"></result>
		<result column="u_age" property="user.age"></result>
		<result column="u_address" property="user.address"></result>

		<!--
				property="user" javaType="user"
				property;当前实体Order中的属性名称(private User user)
				javaType:当前实体Order中的属性的类型(User)
		-->
		<!--<association property="user" javaType="user">-->
		<!--	<id column="id" property="id"></id>-->
		<!--	<result column="u_name" property="name"></result>-->
		<!--	<result column="u_gender" property="gender"></result>-->
		<!--	<result column="u_age" property="age"></result>-->
		<!--	<result column="u_address" property="address"></result>-->
		<!--</association>-->

	</resultMap>

	<select id="findAll" resultMap="orderMap">
		SELECT *, o.id oid, u.id uid FROM order2 o, USER u WHERE o.u_id = u.id;
	</select>
</mapper>

       数据源配置抽取文件

        recources/jdbc.properties

driver=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/orders
username=root
password=123456

注意:版本是8以下的把driver=com.mysql.cj.jdbc.Driver 改为 driver=com.mysql.jdbc.Driver

       日志记录配置文件配置

        resources/log4j.properties

#
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n

log4j.appender.file = org.apache.log4j.RollingFileAppender
log4j.appender.file.File=./log/logFile.log
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n

log4j.logger.org.mybatis=DEBUG
log4j.logger.java.sql=DEBUG
log4j.logger.java.sql.Statement=DEBUG
log4j.logger.java.sql.ResultSet=DEBUG
log4j.logger.java.sql.PreparedStatement=DEBUG

log4j.rootLogger=debug, stdout

       核心配置文件

         recources/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="jdbc.properties" />

	<!--自定义别名-->
	<typeAliases>
		<typeAlias type="com.xjf.domain.User" alias="user"></typeAlias>
		<typeAlias type="com.xjf.domain.Order" alias="order"></typeAlias>
	</typeAliases>

	<!--数据源环境配置-->
	<environments default="development">
		<environment id="development">
			<!--配置事务管理为 jdbc-->
			<transactionManager type="JDBC"></transactionManager>
			<!--配置连接池-->
			<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="com/xjf/mapper/UserMapper.xml"></mapper>
		<mapper resource="com/xjf/mapper/OrderMapper.xml"></mapper>
	</mappers>

</configuration>

④测试

       测试类

        test.java.com.xxx.test.MyBatisTest.java

package com.xjf.mapper;

import com.xjf.domain.Order;
import com.xjf.domain.User;
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.IOException;
import java.io.InputStream;
import java.util.List;

public class OrderTest {
	/**
	 * 测试一对一 (多级对一级)
	 * @throws IOException
	 */
	@Test
	public void test1() throws IOException {
		//加载核心配置文件
		InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml");
		//获取sqlSession对象
		SqlSessionFactory sqlSessionFactory= new SqlSessionFactoryBuilder().build(resourceAsStream);
		//获取sqlSession对象
		SqlSession sqlSession = sqlSessionFactory.openSession();
		OrderMapper mapper = sqlSession.getMapper(OrderMapper.class);
		List<Order> orderList = mapper.findAll();

		for (Order order : orderList) {
			System.out.println(order);
		}

		//释放资源
		sqlSession.close();
	}

	/**
	 * 测试一对多 (一级对多级)
	 * @throws IOException
	 */
	@Test
	public void test2() throws IOException {
		//加载核心配置文件
		InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml");
		//获取sqlSession对象
		SqlSessionFactory sqlSessionFactory= new SqlSessionFactoryBuilder().build(resourceAsStream);
		//获取sqlSession对象
		SqlSession sqlSession = sqlSessionFactory.openSession();
		UserMapper mapper = sqlSession.getMapper(UserMapper.class);
		List<User> userList = mapper.findAll();
		for (User user : userList) {
			System.out.println(user);
		}
		//释放资源
		sqlSession.close();
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xiaoxu9

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值