关系说明:一个用户对应多个订单, 一个订单对应一个商品
实现步骤:
①导入相关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();
}
}