MyBatis学习笔记 关联关系
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MyBatis学习笔记 关联关系相关的知识,希望对你有一定的参考价值。
一、多对多关系。
一般我们在设置多对多关系的时候,都是建立第三张关系表。
例子:学生t_student与课程t_courses,一个学生可以对应学习多门课程,一门课程对应可以有多名学生学习。第三张关系表t_stu_cou。
1)关系整理好,接着建立数据库表,添加信息。
1 create table t_student( 2 id int primary key auto_increment, 3 student_name varchar(20) 4 ); 5 6 create table t_courses( 7 id int primary key auto_increment, 8 courses_name varchar(20) 9 ); 10 11 create table t_stu_cou( 12 id int primary key auto_increment, 13 fk_stu_id int, 14 fk_cou_id int 15 );
添加数据。
View Code
2)建立JavaBean。
CoursesBean.java
1 package com.cy.mybatis.beans; 2 3 import java.io.Serializable; 4 import java.util.List; 5 /** 6 * manyTOmany 7 * @author acer 8 * 9 */ 10 public class CoursesBean implements Serializable{ 11 12 13 private static final long serialVersionUID = 1L; 14 private Integer id; 15 private String name; 16 // 使用 List<StudentBean>集合,是说明学习这门课程的所有学生 17 private List<StudentBean> student; 18 public CoursesBean() { 19 super(); 20 } 21 public CoursesBean(Integer id, String name, List<StudentBean> student) { 22 super(); 23 this.id = id; 24 this.name = name; 25 this.student = student; 26 } 27 public Integer getId() { 28 return id; 29 } 30 public void setId(Integer id) { 31 this.id = id; 32 } 33 public String getName() { 34 return name; 35 } 36 public void setName(String name) { 37 this.name = name; 38 } 39 public List<StudentBean> getStudent() { 40 return student; 41 } 42 public void setStudent(List<StudentBean> student) { 43 this.student = student; 44 } 45 @Override 46 public String toString() { 47 return "CoursesBean [id=" + id + ", name=" + name + ", student=" 48 + student + "]"; 49 } 50 51 52 }
StudentBean.java
View Code
3) 定义接口
CoursesMapper.java
View Code
StudentMapper.java
View Code
4) 定义xml文件。CoursesMapper.xml StudentMapper.xml
mybatis实际是对XML进行操作,我们所有的方法都直接定义在XML中,写个接口只是为了更好的符合我们3层的思想.XML中只要有方法,就可以使用,而调用的方式就是:namespace+方法名;
CoursesMapper.xml
1 <?xml version="1.0" encoding="UTF-8"?> 2 <!DOCTYPE mapper PUBLIC "-//mybatis.org/DTD Mapper 3.0" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> 3 <mapper namespace="com.cy.mybatis.mapper.CoursesMapper"> 4 5 6 <resultMap type="CoursesBean" id="coursesMap"> 7 <!-- 在默认情况下,mybatis会自动在TypeAliasRegistry初始化的时候挂在很多jdk常用类, 8 所以javaType="java.lang.Integer"可以写成javaType="Integer"--> 9 10 <id property="id" column="id" javaType="java.lang.Integer"/> 11 <result property="name" column="courses_name" javaType="java.lang.String"/> 12 </resultMap> 13 14 <resultMap type="CoursesBean" id="couAndStu"> 15 <id property="id" column="id" javaType="java.lang.Integer"/> 16 <result property="name" column="courses_name" javaType="java.lang.String"/> 17 18 <!-- 对于一个属性的类型是一个集合,就使用collection 19 对于一个属性的类型是一个类,就使用association --> 20 <collection property="student" column="id" select="findStudentByCourses"></collection> 21 </resultMap> 22 23 24 25 <select id="findCouById" resultMap="coursesMap"> 26 select * from t_courses where id=#{id} 27 </select> 28 29 30 31 <!-- 有学生表,课程表这两张表都没有外键,我们就要使用第三张关联表。我们就要根据课程表的fk_cou_id,把学生的id值得到。 32 对于多对多那么这个学生的id值就不可能是一个值 。在数据库里就要使用in--> 33 <select id="findStudentByCourses" resultMap="com.cy.mybatis.mapper.StudentMapper.studentMap"> 34 select * from t_student where id in (select fk_stu_id from t_stu_cou where fk_cou_id=#{id}) 35 </select> 36 37 <select id="findCouAndStu" resultMap="couAndStu"> 38 select * from t_courses where id=#{id} 39 </select> 40 </mapper>
StudentMapper.xml
View Code
5) 测试
1 package com.cy.mybatis.service; 2 3 import org.apache.ibatis.session.SqlSession; 4 5 import com.cy.mybatis.beans.CoursesBean; 6 import com.cy.mybatis.beans.StudentBean; 7 import com.cy.mybatis.mapper.CoursesMapper; 8 import com.cy.mybatis.mapper.StudentMapper; 9 import com.cy.mybatis.tools.DBTools; 10 11 12 13 public class ManyToManyService { 14 15 public static void main(String[] args) { 16 17 findStudentByCourses(); 18 findCoursesByStudent(); 19 } 20 21 22 23 private static void findCoursesByStudent() { 24 SqlSession session = DBTools.getSession(); 25 StudentMapper sm=session.getMapper(StudentMapper.class); 26 StudentBean sb=sm.findStuAndCou(1); 27 System.out.println(sb); 28 29 } 30 31 32 33 private static void findStudentByCourses() { 34 SqlSession session = DBTools.getSession(); 35 CoursesMapper cm=session.getMapper(CoursesMapper.class); 36 CoursesBean cb=cm.findCouAndStu(2); 37 System.out.println(cb); 38 } 39 40 }
结果显示:
1 DEBUG 2016-02-27 09:56:53,852 org.apache.ibatis.transaction.jdbc.JdbcTransaction: Opening JDBC Connection 2 DEBUG 2016-02-27 09:56:54,070 org.apache.ibatis.datasource.pooled.PooledDataSource: Created connection 586269. 3 DEBUG 2016-02-27 09:56:54,070 org.apache.ibatis.transaction.jdbc.JdbcTransaction: Setting autocommit to false on JDBC Connection [[email protected]] 4 DEBUG 2016-02-27 09:56:54,070 org.apache.ibatis.logging.jdbc.BaseJdbcLogger: ==> Preparing: select * from t_courses where id=? 5 DEBUG 2016-02-27 09:56:54,105 org.apache.ibatis.logging.jdbc.BaseJdbcLogger: ==> Parameters: 2(Integer) 6 DEBUG 2016-02-27 09:56:54,136 org.apache.ibatis.logging.jdbc.BaseJdbcLogger: ====> Preparing: select * from t_student where id in (select fk_stu_id from t_stu_cou where fk_cou_id=?) 7 DEBUG 2016-02-27 09:56:54,136 org.apache.ibatis.logging.jdbc.BaseJdbcLogger: ====> Parameters: 2(Integer) 8 DEBUG 2016-02-27 09:56:54,136 org.apache.ibatis.logging.jdbc.BaseJdbcLogger: <==== Total: 2 9 DEBUG 2016-02-27 09:56:54,136 org.apache.ibatis.logging.jdbc.BaseJdbcLogger: <== Total: 1 10 CoursesBean [id=2, name=数学, student=[StudentBean [id=1, name=米兰, courses=null], StudentBean [id=4, name=睿懿, courses=null]]] 11 DEBUG 2016-02-27 09:56:54,136 org.apache.ibatis.transaction.jdbc.JdbcTransaction: Opening JDBC Connection 12 DEBUG 2016-02-27 09:56:54,136 org.apache.ibatis.datasource.pooled.PooledDataSource: Created connection 23881129. 13 DEBUG 2016-02-27 09:56:54,152 org.apache.ibatis.transaction.jdbc.JdbcTransaction: Setting autocommit to false on JDBC Connection [[email protected]] 14 DEBUG 2016-02-27 09:56:54,152 org.apache.ibatis.logging.jdbc.BaseJdbcLogger: ==> Preparing: select * from t_student where id = ? 15 DEBUG 2016-02-27 09:56:54,152 org.apache.ibatis.logging.jdbc.BaseJdbcLogger: ==> Parameters: 1(Integer) 16 DEBUG 2016-02-27 09:56:54,152 org.apache.ibatis.logging.jdbc.BaseJdbcLogger: ====> Preparing: select * from t_courses where id in (select fk_cou_id from t_stu_cou where fk_stu_id = ?) 17 DEBUG 2016-02-27 09:56:54,152 org.apache.ibatis.logging.jdbc.BaseJdbcLogger: ====> Parameters: 1(Integer) 18 DEBUG 2016-02-27 09:56:54,152 org.apache.ibatis.logging.jdbc.BaseJdbcLogger: <==== Total: 2 19 DEBUG 2016-02-27 09:56:54,152 org.apache.ibatis.logging.jdbc.BaseJdbcLogger: <== Total: 1 20 StudentBean [id=1, name=米兰, courses=[CoursesBean [id=1, name=语文, student=null], CoursesBean [id=2, name=数学, student=null]]]
二 、继承
最简单的例子,宠物。
数据库
1 create TABLE t_pet( 2 id int primary key auto_increment, 3 name varchar(20), 4 type varchar(20), 5 bone int, 6 fish int 7 );
JavaBean
PetBean:
View Code
CatBean:
View Code
DogBean:
View Code
接口
PetMapper.java
1 package com.cy.mybatis.mapper; 2 3 import java.util.List; 4 5 import org.apache.ibatis.annotations.Param; 6 7 import com.cy.mybatis.beans.CatBean; 8 import com.cy.mybatis.beans.DogBean; 9 import com.cy.mybatis.beans.PetBean; 10 11 public interface PetMapper { 12 /** 13 * 添加宠物猫 14 * @param cat 15 * @return 16 */ 17 public int saveCat(@Param("c")CatBean cat); 18 19 /** 20 * 添加宠物狗 21 * @param dog 22 * @return 23 */ 24 public int saveDog(@Param("d")DogBean dog); 25 26 /** 27 * 查询所有的宠物 28 * @return 29 */ 30 public List<PetBean> findAllPet(); 31 32 /** 33 * 查询所有的宠物猫 34 * @return 35 */ 36 public List<CatBean> findAllCat(); 37 38 39 }
XML
1 <?xml version="1.0" encoding="UTF-8"?> 2 <!DOCTYPE mapper PUBLIC "-//mybatis.org/DTD Mapper 3.0" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> 3 <mapper namespace="com.cy.mybatis.mapper.PetMapper"> 4 <resultMap id="petMap" type="PetBean"> 5 <id property="id" column="id" javaType="java.lang.Integer"/> 6 <result property="name" column="name" javaType="java.lang.String"/> 7 <!--discriminator:根据结果值决定使用哪个resultMap 8 case:判断条件 9 它的表现很像 Java 语言中的 switch 语句。 10 定义鉴别器指定了 column 和 javaType 属性 11 --> 12 <discriminator javaType="java.lang.String" column="type"> 13 <case value="cat" resultType="CatBean"> 14 <result property="fish" column="fish" javaType="java.lang.Integer"/> 15 </case> 16 <case value="dog" resultType="DogBean"> 17 <result property="bone" column="bone" javaType="java.lang.Integer"/> 18 </case> 19 </discriminator> 20 </resultMap> 21 22 <insert id="saveCat"> 23 insert into t_pet(name,type,fish) values (#{c.name},‘cat‘,#{c.fish}) 24 </insert> 25 <insert id="saveDog"> 26 insert into t_pet(name,type,bone) values (#{d.name},‘dog‘,#{d.bone}) 27 </insert> 28 29 <select id="findAllPet" resultMap="petMap"> 30 select * from t_pet 31 </select> 32 <select id="findAllCat" resultMap="petMap"> 33 select * from t_pet where type = ‘cat‘ 34 </select> 35 36 </mapper>
测试:
1 package com.cy.mybatis.service; 2 3 import java.util.List; 4 5 import org.apache.ibatis.session.SqlSession; 6 7 import com.cy.mybatis.beans.CatBean; 8 import com.cy.mybatis.beans.DogBean; 9 import com.cy.mybatis.beans.PetBean; 10 import com.cy.mybatis.mapper.PetMapper; 11 import com.cy.mybatis.tools.DBTools; 12 13 14 15 public class ExtendsService { 16 public static void main(String[] args) { 17 // saveCat(); 18 // saveDog(); 19 findAllCat(); 20 findAllPet(); 21 } 22 23 private static void findAllCat() { 24 // TODO Auto-generated method stub 25 SqlSession session = DBTools.getSession(); 26 PetMapper pm = session.getMapper(PetMapper.class); 27 List<CatBean> cats = pm.findAllCat(); 28 for (CatBean catBean : cats) { 29 System.out.println(catBean); 30 } 31 } 32 33 private static void findAllPet() { 34 // TODO Auto-generated method stub 35 SqlSession session = DBTools.getSession(); 36 PetMapper pm = session.getMapper(PetMapper.class); 37 List<PetBean> pets = pm.findAllPet(); 38 for (PetBean petBean : pets) { 39 System.out.println(petBean); 40 } 41 } 42 43 private static void saveDog() { 44 // TODO Auto-generated method stub 45 SqlSession session = DBTools.getSession(); 46 PetMapper pm = session.getMapper(PetMapper.class); 47 DogBean dog = new DogBean(null,"哈士奇"); 48 dog.setBone(10); 49 pm.saveDog(dog); 50 session.commit(); 51 } 52 53 private static void saveCat() { 54 // TODO Auto-generated method stub 55 SqlSession session = DBTools.getSession(); 56 PetMapper pm = session.getMapper(PetMapper.class); 57 CatBean cat = new CatBean(null,"大脸猫"); 58 cat.setFish(10); 59 pm.saveCat(cat); 60 session.commit(); 61 } 62 }
结果显示
1 DEBUG 2016-02-27 11:51:56,857 org.apache.ibatis.transaction.jdbc.JdbcTransaction: Opening JDBC Connection 2 DEBUG 2016-02-27 11:51:57,073 org.apache.ibatis.datasource.pooled.PooledDataSource: Created connection 8768896. 3 DEBUG 2016-02-27 11:51:57,074 org.apache.ibatis.transaction.jdbc.JdbcTransaction: Setting autocommit to false on JDBC Connection [[email protected]] 4 DEBUG 2016-02-27 11:51:57,076 org.apache.ibatis.logging.jdbc.BaseJdbcLogger: ==> Preparing: select * from t_pet where type = ‘cat‘ 5 DEBUG 2016-02-27 11:51:57,107 org.apache.ibatis.logging.jdbc.BaseJdbcLogger: ==> Parameters: 6 DEBUG 2016-02-27 11:51:57,121 org.apache.ibatis.logging.jdbc.BaseJdbcLogger: <== Total: 1 7 CatBean [fish=10, toString()=PetBean [id=1, name=大脸猫]] 8 DEBUG 2016-02-27 11:51:57,122 org.apache.ibatis.transaction.jdbc.JdbcTransaction: Opening JDBC Connection 9 DEBUG 2016-02-27 11:51:57,133 org.apache.ibatis.datasource.pooled.PooledDataSource: Created connection 28157774. 10 DEBUG 2016-02-27 11:51:57,134 org.apache.ibatis.transaction.jdbc.JdbcTransaction: Setting autocommit to false on JDBC Connection [[email protected]] 11 DEBUG 2016-02-27 11:51:57,134 org.apache.ibatis.logging.jdbc.BaseJdbcLogger: ==> Preparing: select * from t_pet 12 DEBUG 2016-02-27 11:51:57,134 org.apache.ibatis.logging.jdbc.BaseJdbcLogger: ==> Parameters: 13 DEBUG 2016-02-27 11:51:57,135 org.apache.ibatis.logging.jdbc.BaseJdbcLogger: <== Total: 2 14 CatBean [fish=10, toString()=PetBean [id=1, name=大脸猫]] 15 DogBean [bone=10, toString()=PetBean [id=2, name=哈士奇]]
以上是关于MyBatis学习笔记 关联关系的主要内容,如果未能解决你的问题,请参考以下文章