一、双向关联,以多对多为例,假定一个父母只有一个孩子,那父母和孩子对应关系为1对1,既可以通过父母查询到孩子,也可以通过孩子查询到父母。
二、
1、添加依赖包,参考上篇文章 Mybatis+mysql入门使用
2、初始化数据库和初始数据,以mysql为例
DROP DATABASE IF EXISTS moy_mybatis; CREATE DATABASE moy_mybatis CHARACTER SET UTF8; USE moy_mybatis; DROP TABLE IF EXISTS t_children; CREATE TABLE t_children( children_id INT(11), children_name VARCHAR(50) DEFAULT NULL, children_birthday DATE DEFAULT NULL, parent_id INT(11) NOT NULL, PRIMARY KEY (`children_id`) ); DROP TABLE IF EXISTS t_parent; CREATE TABLE t_parent( id INT(11) , name VARCHAR(50) DEFAULT NULL, birthday DATE DEFAULT NULL, PRIMARY KEY (id) ); INSERT INTO t_children(children_id,children_name,children_birthday,parent_id) VALUES (1,‘一号熊孩子‘,now(),1); INSERT INTO t_children(children_id,children_name,children_birthday,parent_id) VALUES (2,‘二号熊孩子‘,now(),1); INSERT INTO t_children(children_id,children_name,children_birthday,parent_id) VALUES (3,‘三号熊孩子‘,now(),2); INSERT INTO t_parent(id,name,birthday) VALUES (1,‘一号父母‘,now()); INSERT INTO t_parent(id,name,birthday) VALUES (2,‘二号父母‘,now());
3、新建实体类Children和Parent
package com.moy.mybatis3.entity; import java.util.Date; import java.util.List; /** * [Project]:moy-gradle-project <br/> * [Email]:moy25@foxmail.com <br/> * [Date]:2018/2/19 <br/> * [Description]: <br/> * * @author YeXiangYang */ public class Parent { private int id; private String name; private Date birthday; private List<Children> children; 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 getBirthday() { return birthday; } public void setBirthday(Date birthday) { this.birthday = birthday; } public List<Children> getChildren() { return children; } public void setChildren(List<Children> children) { this.children = children; } @Override public String toString() { return "Parent{" + "id=" + id + ", name=‘" + name + ‘\‘‘ + ", birthday=" + birthday + ", children=" + children + ‘}‘; } }
package com.moy.mybatis3.entity; import java.util.Date; /** * [Project]:moy-gradle-project <br/> * [Email]:moy25@foxmail.com <br/> * [Date]:2018/2/19 <br/> * [Description]: <br/> * * @author YeXiangYang */ public class Children { private int childrenId; private String childrenName; private Parent parent; private Date childrenBirthday; public int getChildrenId() { return childrenId; } public void setChildrenId(int childrenId) { this.childrenId = childrenId; } public String getChildrenName() { return childrenName; } public void setChildrenName(String childrenName) { this.childrenName = childrenName; } public Date getChildrenBirthday() { return childrenBirthday; } public void setChildrenBirthday(Date childrenBirthday) { this.childrenBirthday = childrenBirthday; } public Parent getParent() { return parent; } public void setParent(Parent parent) { this.parent = parent; } @Override public String toString() { return "Children{" + "childrenId=" + childrenId + ", childrenName=‘" + childrenName + ‘\‘‘ + ", parent=" + parent + ", childrenBirthday=" + childrenBirthday + ‘}‘; } }
4、新建实体对应配置文件Children.xml和Parent.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.moy.mybatis3.mapper.ChildrenMapper"> <!--双向多对1 配置方法一 开始--> <!--<resultMap id="ChildrenResultMap" type="Children">--> <!--<id property="childrenId" column="children_id"/>--> <!--<result property="childrenName" column="children_name"/>--> <!--<result property="childrenBirthday" column="children_birthday"/>--> <!--</resultMap>--> <!--<resultMap id="ChildrenExtResultMap" type="Children" extends="ChildrenResultMap">--> <!--<association property="parent" column="parent_id"--> <!--resultMap="com.moy.mybatis3.mapper.ParentMapper.ParentResultMap"/>--> <!--</resultMap>--> <!--双向多对1 配置方法一 结束--> <!--双向多对1 配置方法二 开始--> <resultMap id="ChildrenExtResultMap" type="Children" > <id property="childrenId" column="children_id"/> <result property="childrenName" column="children_name"/> <result property="childrenBirthday" column="children_birthday"/> <association property="parent" column="parent_id" javaType="Parent"> <id property="id" column="id"/> <result property="name" column="name"/> <result property="birthday" column="birthday"/> </association> </resultMap> <!--双向多对1 配置方法二 结束--> <select id="queryChildrenAndParent" parameterType="int" resultMap="ChildrenExtResultMap"> SELECT p.*,c.* FROM t_Parent p , t_Children c WHERE p.id = c.parent_id and c.children_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.moy.mybatis3.mapper.ParentMapper"> <!--双向多对1 配置方法一 开始--> <!--<resultMap id="ParentResultMap" type="Parent">--> <!--<id property="id" column="id"/>--> <!--<result property="name" column="name"/>--> <!--<result property="birthday" column="birthday"/>--> <!--</resultMap>--> <!--<resultMap id="ParentExtResultMap" type="Parent" extends="ParentResultMap">--> <!--<collection property="children" resultMap="com.moy.mybatis3.mapper.ChildrenMapper.ChildrenResultMap"/>--> <!--</resultMap>--> <!--双向多对1 配置方法一 结束--> <!--双向多对1 配置方法二 开始--> <resultMap id="ParentExtResultMap" type="Parent"> <id property="id" column="id"/> <result property="name" column="name"/> <result property="birthday" column="birthday"/> <collection property="children" ofType="Children"> <id property="childrenId" column="children_id"/> <result property="childrenName" column="children_name"/> <result property="childrenBirthday" column="children_birthday"/> </collection> </resultMap> <!--双向多对1 配置方法二 结束--> <select id="queryParentAndChildren" parameterType="int" resultMap="ParentExtResultMap"> SELECT * FROM t_Parent p LEFT JOIN t_Children c ON p.id = c.parent_id WHERE 1=1 AND p.id = #{id} </select> </mapper>
5、编写接口ChildrenMapper和ParentMapper
package com.moy.mybatis3.mapper; import com.moy.mybatis3.entity.Children; /** * [Project]:moy-gradle-project <br/> * [Email]:moy25@foxmail.com <br/> * [Date]:2018/2/19 <br/> * [Description]: <br/> * * @author YeXiangYang */ public interface ChildrenMapper extends BaseMapper<Children> { Children queryChildrenAndParent(int id); }
package com.moy.mybatis3.mapper; import com.moy.mybatis3.entity.Parent; /** * [Project]:moy-gradle-project <br/> * [Email]:moy25@foxmail.com <br/> * [Date]:2018/2/19 <br/> * [Description]: <br/> * * @author YeXiangYang */ public interface ParentMapper extends BaseMapper<Parent> { Parent queryParentAndChildren(int id); }
6、为了方便测试,编写一个获取SqlSession的工具类Mybatis3Utils
package com.moy.mybatis3.utils; 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 java.io.IOException; import java.io.Reader; import java.util.Objects; /** * [Project]:moy-gradle-project <br/> * [Email]:moy25@foxmail.com <br/> * [Date]:2018/2/19 <br/> * [Description]: <br/> * * @author YeXiangYang */ public abstract class Mybatis3Utils { public static final SqlSessionFactory sqlSessionFactory; public static final ThreadLocal<SqlSession> sessionThread = new ThreadLocal<>(); static { try { Reader reader = Resources.getResourceAsReader("mybatis-config.xml"); sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader); } catch (IOException e) { throw new RuntimeException(e); } } public static SqlSession getCurrentSqlSession() { SqlSession sqlSession = sessionThread.get(); if (Objects.isNull(sqlSession)) { sqlSession = sqlSessionFactory.openSession(); sessionThread.set(sqlSession); } return sqlSession; } public static void closeCurrentSession() { SqlSession sqlSession = sessionThread.get(); if (Objects.nonNull(sqlSession)) { sqlSession.close(); } sessionThread.set(null); } }
7、新建mybatis配置信息文件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> <typeAliases> <package name="com.moy.mybatis3.entity"/> </typeAliases> <environments default="development"> <environment id="development"> <transactionManager type="JDBC"/> <dataSource type="POOLED"> <property name="driver" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql://127.0.0.1:3306/moy_mybatis?useSSL=false"/> <property name="username" value="root"/> <property name="password" value="123"/> </dataSource> </environment> </environments> <mappers> <mapper resource="mapper/Parent.xml"></mapper> <mapper resource="mapper/Children.xml"></mapper> </mappers> </configuration>
8、 编写测试类ChildrenMapperTest和ParentMapperTest
package com.moy.mybatis3.mapper; import com.moy.mybatis3.entity.Children; import com.moy.mybatis3.utils.Mybatis3Utils; import org.apache.ibatis.session.SqlSession; import org.junit.After; import org.junit.Before; import org.junit.Test; import static org.junit.Assert.*; /** * [Project]:moy-gradle-project <br/> * [Email]:moy25@foxmail.com <br/> * [Date]:2018/2/20 <br/> * [Description]: <br/> * * @author YeXiangYang */ public class ChildrenMapperTest { SqlSession sqlSession; ChildrenMapper childrenMapper; @Before public void before() { sqlSession = Mybatis3Utils.getCurrentSqlSession(); childrenMapper = sqlSession.getMapper(ChildrenMapper.class); } @After public void after() { Mybatis3Utils.closeCurrentSession(); } @Test public void queryChildrenAndParent() { Children children = childrenMapper.queryChildrenAndParent(2); System.out.println(children); } }
package com.moy.mybatis3.mapper; import com.moy.mybatis3.entity.Children; import com.moy.mybatis3.entity.Parent; import com.moy.mybatis3.utils.Mybatis3Utils; import org.apache.ibatis.session.SqlSession; import org.junit.After; import org.junit.Before; import org.junit.Test; import java.util.List; import static org.junit.Assert.*; /** * [Project]:moy-gradle-project <br/> * [Email]:moy25@foxmail.com <br/> * [Date]:2018/2/20 <br/> * [Description]: <br/> * * @author YeXiangYang */ public class ParentMapperTest { SqlSession sqlSession; ParentMapper parentMapper; @Before public void before() { sqlSession = Mybatis3Utils.getCurrentSqlSession(); parentMapper = sqlSession.getMapper(ParentMapper.class); } @After public void after() { Mybatis3Utils.closeCurrentSession(); } @Test public void queryParentAndChildren() { Parent parent = parentMapper.queryParentAndChildren(1); System.out.println(parent); } }
yexiangyang
moyyexy@gmail.com