上一篇MyBatis極簡入門
本篇主要簡單介紹Mybatis級聯查詢的使用
- 一對多
- 多對多
常見的一對多模型,一個班有多個學生,一個學生只屬於一個班。
我們首先在數據庫中建立student
,classes
兩張表
student表,其中cid是外鍵,關聯classed的id屬性
classes表
現在我們有如下需求,根據一個學生id,查詢出學生的姓名班級和班級id。
我們新建兩個實體類。student和classes
,代碼如下:
package com.ibuyi.mybatis.entity;
import lombok.Data;
@Data
public class Student {
private long id;
private String name;
private Classes classes;
}
package com.ibuyi.mybatis.entity;
import lombok.Data;
import java.util.List;
@Data
public class Classes {
private long id;
private String name;
private List<Student> students;
}
緊接着我們使用mapper代理的方式創建接口類,如下:
package com.ibuyi.mybatis.repository;
import com.ibuyi.mybatis.entity.Student;
public interface StudentDAO {
//根據student ID查詢學生姓名班級
Student findStudentByID(long id);
}
創建了接口以後我們需要配置student.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.ibuyi.mybatis.repository.StudentDAO">
<!--namespace指的是接口類-->
<select id="findStudentByID" parameterType="int" resultMap="student">
<!--resultMap也是一種返回類型,是我們自定義的-->
<!--查詢語句,因爲mybatis是根據查找結果的列名和我們的實體類進行映射的,我們student和clsses中id,name重複,所以在查詢時用as改名。方便進行映射-->
select s.id as id,s.`name`as name, c.id as cid,c.`name`as cname from student as s,classes as c where s.id=1 and s.cid=c.id
</select>
<resultMap id="student" type="com.ibuyi.mybatis.entity.Student">
<!--需要指定對應的實體類即type-->
<!--指定id屬性對應查詢語句查詢出來的結果的id列-->
<id property="id" column="id"></id>
<!--指定name屬性對應查詢語句查詢出來的結果的name列-->
<result property="name" column="name"></result>
<!--對象屬性需要用association指定javatype,property指的是student類中的屬性,javatype指明類型-->
<association property="classes" javaType="com.ibuyi.mybatis.entity.Classes">
<!--指定classes對象的id屬性對應查詢語句查詢出來的結果的cid列-->
<id property="id" column="cid"></id>
<!--指定classes對象的name屬性對應查詢語句查詢出來的結果的cname列-->
<result property="name" column="cname"></result>
</association>
</resultMap>
</mapper>
執行測試代碼:
package com.ibuyi.mybatis.test;
import com.ibuyi.mybatis.entity.Student;
import com.ibuyi.mybatis.repository.StudentDAO;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import java.io.InputStream;
public class Test {
public static void main(String[] args) {
InputStream inputStream = Test.class.getClassLoader().getResourceAsStream("config.xml");
SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(inputStream);
SqlSession sqlSession = sqlSessionFactory.openSession();
StudentDAO studentDAO=sqlSession.getMapper(StudentDAO.class);
Student student=studentDAO.findStudentByID(1L);
System.out.println(student);
}
}
現在我們要根據Classes的id查詢班級裏面的所有學生怎麼做呢?
首先還是要先定義接口,如下:
在這裏插入代碼片package com.ibuyi.mybatis.repository;
import com.ibuyi.mybatis.entity.Classes;
import java.util.List;
public interface ClassDAO {
//根據cid查詢班級全部學生
List<Classes> findStudentByID(long id);
}
第二步:創建mapper.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.ibuyi.mybatis.repository.ClassDAO">
<select id="findStudentByID" parameterType="long" resultMap="studentlist">
select c.id as id,c.name as name,s.name as student,s.id as sid from student as s, classes as c where c.id=2 and s.cid=c.id </select>
<resultMap id="studentlist" type="com.ibuyi.mybatis.entity.Classes">
<id property="id" column="id" ></id>
<result property="name" column="name"></result>
<!--這裏不能使用association,因爲是List<Student>,所以要用collection-->
<collection property="students" ofType="com.ibuyi.mybatis.entity.Student">
<id property="id" column="sid"></id>
<result property="name" column="student"></result>
</collection>
</resultMap>
</mapper>
最後別忘了在config.xml中的配置mapper
<mappers>
<mapper resource="com/ibuyi/mybatis/repository/student.xml"/>
<mapper resource="com/ibuyi/mybatis/repository/class.xml"/>
</mappers>
看一下實驗結果如下:
下面我們學習一下多對多關係
常見的多對多關係如顧客購買商品,一個顧客可以購買多個商品,一個商品可以被多個顧客購買。
我們先建立三張表,一張顧客表(id,name)一張商品表(id,name)一張中間表c_goods(id,cid,gid)
其中cid,gid分別時顧客表和商品表的id對應。 隨便插入幾條數據。
1.現在我們想要某個人購買的全部商品,請看代碼:
第一步,先定義兩個實體對象,good和customer
package com.ibuyi.mybatis.entity;
import lombok.Data;
import java.util.List;
@Data
public class Customer {
private long id;
private String name;
private List<Good> goods;
}
package com.ibuyi.mybatis.entity;
import lombok.Data;
import java.util.List;
@Data
public class Good {
private long id;
private String name;
private List<Customer> customers;
}
緊接着,寫查詢某人購買商品的接口:
package com.ibuyi.mybatis.repository;
import com.ibuyi.mybatis.entity.Customer;
import com.ibuyi.mybatis.entity.Good;
import java.util.List;
public interface CustomerDAO {
//根據客戶id查詢客戶購買的商品
Customer findGoodsByID(long id);
}
再接着,寫mapper.xml文件,定義sql查詢。
<?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.ibuyi.mybatis.repository.CustomerDAO">
<select id="findGoodsByID" parameterType="long" resultMap="customer">
select c.id as cid ,c.name as cname,g.id as gid,g.name as gname from customers c,goods g ,c_goods cg where c.id=#{id} and c.id=cg.cid and g.id=cg.gid;
</select>
<resultMap id="customer" type="com.ibuyi.mybatis.entity.Customer">
<id property="id" column="cid"></id>
<result property="name" column="cname"></result>
<collection property="goods" ofType="com.ibuyi.mybatis.entity.Good">
<id property="id" column="gid"></id>
<result property="name" column="gname"></result>
</collection>
</resultMap>
</mapper>
最後註冊到config.xml中
<mappers>
<mapper resource="com/ibuyi/mybatis/repository/student.xml"/>
<mapper resource="com/ibuyi/mybatis/repository/class.xml"/>
<mapper resource="com/ibuyi/mybatis/repository/customer.xml"/>
<mapper resource="com/ibuyi/mybatis/repository/good.xml"/>
</mappers>
現在,我們來看一下測試代碼:
package com.ibuyi.mybatis.test;
import com.ibuyi.mybatis.entity.Customer;
import com.ibuyi.mybatis.entity.Good;
import com.ibuyi.mybatis.repository.CustomerDAO;
import com.ibuyi.mybatis.repository.GoodDAO;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import java.io.InputStream;
public class Test {
public static void main(String[] args) {
InputStream inputStream = Test.class.getClassLoader().getResourceAsStream("config.xml");
SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(inputStream);
SqlSession sqlSession = sqlSessionFactory.openSession();
CustomerDAO customerDAO=sqlSession.getMapper(CustomerDAO.class);
Customer customer=customerDAO.findGoodsByID(3L);
System.out.println(customer);
}
}
結果如下
2.根據商品id查詢所有購買了該商品的人。
還是同樣的操作步驟,這裏把代碼貼上:
package com.ibuyi.mybatis.repository;
import com.ibuyi.mybatis.entity.Good;
public interface GoodDAO {
Good findGoodByID(long id);
}
<?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.ibuyi.mybatis.repository.GoodDAO">
<select id="findGoodByID" parameterType="long" resultMap="good">
select g.id as gid ,g.name as gname,c.id as cid,c.name as cname from customers c,goods g ,c_goods cg where g.id=#{id} and g.id=cg.gid and cg.cid=c.id;
</select>
<resultMap id="good" type="com.ibuyi.mybatis.entity.Good">
<id property="id" column="gid"></id>
<result property="name" column="gname"></result>
<collection property="customers" ofType="com.ibuyi.mybatis.entity.Customer">
<id property="id" column="cid"></id>
<result property="name" column="cname"></result>
</collection>
</resultMap>
</mapper>
package com.ibuyi.mybatis.test;
import com.ibuyi.mybatis.entity.Customer;
import com.ibuyi.mybatis.entity.Good;
import com.ibuyi.mybatis.repository.CustomerDAO;
import com.ibuyi.mybatis.repository.GoodDAO;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import java.io.InputStream;
public class Test {
public static void main(String[] args) {
InputStream inputStream = Test.class.getClassLoader().getResourceAsStream("config.xml");
SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(inputStream);
SqlSession sqlSession = sqlSessionFactory.openSession();
GoodDAO goodDAO=sqlSession.getMapper(GoodDAO.class);
Good good=goodDAO.findGoodByID(1);
System.out.println(good);
sqlsession.close();
}
}