mybatis关联映射
1.1mybatis中使用一对一映射
在每个公司中,公司里面的员工和员工编号属于一对一关系,用mybatis实现如下:
Card.java
package com.rookie.bigdata.domain; import lombok.Data; import java.io.Serializable; /** * @author * @date 2018/10/21 */ @Data public class Card implements Serializable { private Integer id; private String code; }
Staff.java
package com.rookie.bigdata.domain; import lombok.Data; import java.io.Serializable; /** * @author * @date 2018/10/21 */ @Data public class Staff implements Serializable { private Integer id; private String name; private String sex; private Integer age; //职工和公司卡是一一对应的 private Card card; }
StaffMapper.java
package com.rookie.bigdata.mapper; import com.rookie.bigdata.domain.Staff; import java.util.List; /** * @author * @date 2018/10/21 */ public interface StaffMapper { //一对一映射查询 Staff selectStaffById(Integer id); }
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"> <!-- XML 配置文件包含对 MyBatis 系统的核心设置 --> <configuration> <!-- <typeAliases> <typeAlias alias="user" type="com.rookie.bigdata.domain.User"/> </typeAliases>--> <environments default="mysql"> <!-- 环境配置,即连接的数据库。 --> <environment id="mysql"> <!-- 指定事务管理类型,type="JDBC"指直接简单使用了JDBC的提交和回滚设置 --> <transactionManager type="JDBC"/> <!-- dataSource指数据源配置,POOLED是JDBC连接对象的数据源连接池的实现。 --> <dataSource type="POOLED"> <property name="driver" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql://127.0.0.1:3306/mybatis"/> <property name="username" value="root"/> <property name="password" value="root"/> </dataSource> </environment> </environments> <!-- mappers告诉了MyBatis去哪里找持久化类的映射文件 --> <mappers> <mapper resource="mapper/StaffMapper.xml"/> </mappers> </configuration>
StaffMapper.xml
扫描二维码关注公众号,回复:
3665174 查看本文章
<?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.rookie.bigdata.mapper.StaffMapper"> <select id="selectStaffById" parameterType="int" resultMap="staffMapper"> SELECT * from bs_staff where id = #{id} </select> <select id="selectCardById" parameterType="int" resultType="com.rookie.bigdata.domain.Card"> SELECT * from bs_card where id = #{id} </select> <resultMap type="com.rookie.bigdata.domain.Staff" id="staffMapper"> <id property="id" column="id"/> <result property="name" column="name"/> <result property="sex" column="sex"/> <result property="age" column="age"/> <!-- 一对一关联映射:association --> <association property="card" column="card_id" select="com.rookie.bigdata.mapper.StaffMapper.selectCardById" javaType="com.rookie.bigdata.domain.Card"/> </resultMap> </mapper>
测试代码StaffMapperTest.java
package com.rookie.bigdata.mapper; import com.rookie.bigdata.domain.Staff; 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.IOException; import java.io.InputStream; import java.util.List; import static org.junit.Assert.*; /** * @author * @date 2018/10/21 */ public class StaffMapperTest { public SqlSession session; @Before public void before() throws IOException { // 读取mybatis-config.xml文件 InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml"); // 初始化mybatis,创建SqlSessionFactory类的实例 SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder() .build(inputStream); // 创建Session实例 session = sqlSessionFactory.openSession(); } @Test public void selectStaffById() throws Exception { StaffMapper mapper = session.getMapper(StaffMapper.class); Staff staff = mapper.selectStaffById(1); System.out.println(staff); } }
1.2mybatis中的一对多或者多对一可以参考最初的简单的应用实例
1.3mybatis中的多对多关系映射
例如在一个购物系统中,实际会存在如下的情况,即订单和商品是存在多对多的关系,如下代码
表结构的sql语句如下:
CREATE TABLE bs_user( id INT PRIMARY KEY AUTO_INCREMENT, username VARCHAR(18), loginname VARCHAR(18), PASSWORD VARCHAR(18), phone VARCHAR(18), address VARCHAR(18) ); INSERT INTO bs_user(username,loginname,PASSWORD,phone,address) VALUES('zhangsan','zhangsan','123456','12345678912','上海'); CREATE TABLE bs_goods( id INT PRIMARY KEY AUTO_INCREMENT, NAME VARCHAR(18), price DOUBLE, remark VARCHAR(18) ); INSERT INTO bs_goods(NAME,price,remark) VALUES('T恤',108.9,'2018经典款'); INSERT INTO bs_goods(NAME,price,remark) VALUES('牛仔裤',99.9,'2018经典款'); INSERT INTO bs_goods(NAME,price,remark) VALUES('连衣裙',89.9,'2018经典款'); INSERT INTO bs_goods(NAME,price,remark) VALUES('上衣外套',69.9,'海贼王图案'); CREATE TABLE bs_order( id INT PRIMARY KEY AUTO_INCREMENT, CODE VARCHAR(32), total DOUBLE, user_id INT, FOREIGN KEY (user_id) REFERENCES bs_user(id) ); INSERT INTO bs_order(CODE,total,user_id) VALUES('6aa3fa359ff14619b77fab5990940a2d',388.6,1); INSERT INTO bs_order(CODE,total,user_id) VALUES('6aa3fa359ff14619b77fab5990940b3c',217.8,1); CREATE TABLE bs_item( order_id INT, good_id INT, amount INT, PRIMARY KEY(order_id,good_id), FOREIGN KEY (order_id) REFERENCES bs_order(id), FOREIGN KEY (good_id) REFERENCES bs_goods(id) ); INSERT INTO bs_item(order_id,good_id,amount) VALUES(1,1,1); INSERT INTO bs_item(order_id,good_id,amount) VALUES(1,2,1); INSERT INTO bs_item(order_id,good_id,amount) VALUES(1,3,2); INSERT INTO bs_item(order_id,good_id,amount) VALUES(2,4,2); INSERT INTO bs_item(order_id,good_id,amount) VALUES(2,1,1);
实体类代码如下
package com.rookie.bigdata.domain; import lombok.Data; import java.io.Serializable; import java.util.List; /** * @author * @date 2018/10/21 */ @Data public class Good implements Serializable { private Integer id; // 商品id,主键 private String name; // 商品名称 private Double price; // 商品价格 private String remark; // 商品描述 //商品和订单属于多对多关系 private List<Order> orders; } package com.rookie.bigdata.domain; import lombok.Data; import java.io.Serializable; import java.util.List; /** * @author * @date 2018/10/21 */ @Data public class Order implements Serializable { private Integer id; // 订单id,主键 private String code; // 订单编号 private Double total; // 订单总金额 private User user; private List<Good> goods; } package com.rookie.bigdata.domain; import lombok.Data; import java.io.Serializable; import java.util.List; /** * @author * @date 2018/10/21 */ @Data public class User implements Serializable { private Integer id; // 用户id,主键 private String username; // 用户名 private String loginname; // 登录名 private String password; // 密码 private String phone; // 联系电话 private String address; // 收货地址 //用户和订单属于一对多关系 private List<Order> orders; }
mapper类如下:
package com.rookie.bigdata.mapper; import com.rookie.bigdata.domain.Order; /** * @author * @date 2018/10/21 */ public interface OrderMapper { Order selectOrderById(int id); } package com.rookie.bigdata.mapper; import com.rookie.bigdata.domain.User; /** * @author * @date 2018/10/21 */ public interface UserMapper { User selectUserById(int id); }
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.rookie.bigdata.mapper.GoodMapper"> <select id="selectGoodByOrderId" parameterType="int" resultType="com.rookie.bigdata.domain.Good"> SELECT * FROM bs_goods WHERE id IN ( SELECT good_id FROM bs_item WHERE order_id = #{id} ) </select> </mapper> ----------------------------------------------------------------------------- <?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.rookie.bigdata.mapper.OrderMapper"> <resultMap type="com.rookie.bigdata.domain.Order" id="orderResultMap"> <id property="id" column="oid"/> <result property="code" column="code"/> <result property="total" column="total"/> <!-- 多对一关联映射:association --> <association property="user" javaType="com.rookie.bigdata.domain.User"> <id property="id" column="id"/> <result property="username" column="username"/> <result property="loginname" column="loginname"/> <result property="password" column="password"/> <result property="phone" column="phone"/> <result property="address" column="address"/> </association> <!-- 多对多映射的关键:collection --> <collection property="goods" javaType="ArrayList" column="oid" ofType="com.rookie.bigdata.domain.User" select="com.rookie.bigdata.mapper.GoodMapper.selectGoodByOrderId" fetchType="lazy"> <id property="id" column="id"/> <result property="name" column="name"/> <result property="price" column="price"/> <result property="remark" column="remark"/> </collection> </resultMap> <select id="selectOrderById" parameterType="int" resultMap="orderResultMap"> SELECT u.*,o.id AS oid,CODE,total,user_id FROM bs_user u,bs_order o WHERE u.id = o.user_id AND o.id = #{id} </select> <!-- 根据userid查询订单 --> <select id="selectOrderByUserId" parameterType="int" resultType="com.rookie.bigdata.domain.Order"> SELECT * FROM bs_order WHERE user_id = #{id} </select> </mapper> ------------------------------------------------------------------------- <?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.rookie.bigdata.mapper.UserMapper"> <resultMap type="com.rookie.bigdata.domain.User" id="userResultMap"> <id property="id" column="id"/> <result property="username" column="username"/> <result property="loginname" column="loginname"/> <result property="password" column="password"/> <result property="phone" column="phone"/> <result property="address" column="address"/> <!-- 一对多关联映射:collection --> <collection property="orders" javaType="ArrayList" column="id" ofType="com.rookie.bigdata.domain.User" select="com.rookie.bigdata.mapper.OrderMapper.selectOrderByUserId" fetchType="lazy"> <id property="id" column="id"/> <result property="code" column="code"/> <result property="total" column="total"/> </collection> </resultMap> <select id="selectUserById" parameterType="int" resultMap="userResultMap"> SELECT * FROM bs_user WHERE id = #{id} </select> </mapper>
测试代码如下:
package com.rookie.bigdata.mapper; import com.rookie.bigdata.domain.Order; import com.rookie.bigdata.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.Before; import org.junit.Test; import java.io.IOException; import java.io.InputStream; import java.util.List; import static org.junit.Assert.*; /** * @author * @date 2018/10/21 */ public class OrderMapperTest { public SqlSession session; @Before public void before() throws IOException { // 读取mybatis-config.xml文件 InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml"); // 初始化mybatis,创建SqlSessionFactory类的实例 SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder() .build(inputStream); // 创建Session实例 session = sqlSessionFactory.openSession(); } @Test public void selectOrderById() throws Exception { OrderMapper mapper = session.getMapper(OrderMapper.class); Order order = mapper.selectOrderById(2); System.out.println(order); User user = order.getUser(); System.out.println(user); List<Order> orders = user.getOrders(); System.out.println(orders); } } ------------------------------------------------------------------------- package com.rookie.bigdata.mapper; import com.rookie.bigdata.domain.Order; import com.rookie.bigdata.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.Before; import org.junit.Test; import java.io.IOException; import java.io.InputStream; import java.util.List; import static org.junit.Assert.*; /** * @author * @date 2018/10/21 */ public class UserMapperTest { public SqlSession session; @Before public void before() throws IOException { // 读取mybatis-config.xml文件 InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml"); // 初始化mybatis,创建SqlSessionFactory类的实例 SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder() .build(inputStream); // 创建Session实例 session = sqlSessionFactory.openSession(); } @Test public void selectUserById() throws Exception { UserMapper mapper = session.getMapper(UserMapper.class); User user = mapper.selectUserById(1); System.out.println(user); List<Order> orders = user.getOrders(); for (Order order : orders) { System.out.println(order); } } }