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 );

添加数据。

 

 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

 

3) 定义接口  

CoursesMapper.java

 

StudentMapper.java

 

 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

 

 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:

 

CatBean:

 

DogBean:

 

 

   接口

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=哈士奇]]

时间: 2024-12-09 03:06:34

MyBatis学习笔记(三) 关联关系的相关文章

mybatis学习笔记三(关联关系)

学习mybatis的关联关系,主要注解在代码上,这里不做解释.配置文件一样的就不贴了 1.关联关系表创建(学生对应老师 多对一) 学生老师表 2.表对应的实体类 package com.home.entity; /** * 此类是:学生 * @author hpc * @2017年1月14日下午7:06:33 */ public class Student { private Integer student_id;//学生id private String student_name;//学生名字

MyBatis学习笔记(二) 关联关系

今天主要学习的关联关系是一对一关系与一对多关系. 一.一对一关系 还是通过例子来解释说明.(一个妻子对应一个丈夫). 1)数据库信息 1 create table t_wife( 2 id int primary key auto_increment, 3 wife_name varchar(20), 4 fk_husband_id int 5 ); 6 7 create table t_husband( 8 id int primary key auto_increment, 9 husban

mybatis学习笔记(三)-- 优化数据库连接配置

原来直接把数据库连接配置信息写在conf.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&

MyBatis:学习笔记(3)——关联查询

MyBatis:学习笔记(3)--关联查询 关联查询 理解联结 SQL最强大的功能之一在于我们可以在数据查询的执行中可以使用联结,来将多个表中的数据作为整体进行筛选. 模拟一个简单的在线商品购物系统,如果我们将用户信息和订单信息都保存在user表中,这样就不存在联结关系,因为我们仅仅操作一张表就好. 但是这是非常不明智的选择,举例来说,一个用户可以拥有多个订单,如果保存在一个表中,势必会导致用户信息的多次出现,因为每个订单绑定的用户信息都是相同的. 所以我们尽量要将不同的信息存储与不同的表中,但

MyBatis MapperScannerConfigurer配置――MyBatis学习笔记之八

MyBatis MapperScannerConfigurer配置——MyBatis学习笔记之八 2012-09-02 20:01:42 标签:Spring MyBatis MapperScannerConfigurer bean默认命名 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://legend2011.blog.51cto.com/3018495/980150 在上一篇博文的示例中,我们在beans.xml中配置了stu

mybatis学习笔记(五) -- maven+spring+mybatis从零开始搭建整合详细过程(附demo和搭建过程遇到的问题解决方法)

文章介绍结构一览 一.使用maven创建web项目 1.新建maven项目 2.修改jre版本 3.修改Project Facts,生成WebContent文件夾 4.将WebContent下的两个文件复制到src/main/webapp下,删掉WebContent 5.修改Deployment Assembly 6.测试 二.mybatis访问mysql 1.数据库准备 2.修改pom.xml 3.创建实体类 4.创建访问接口 5.添加映射文件 6.添加MyBatisCfg.xml配置文件,注

MyBatis学习笔记之resultMap

使用mybatis不能不说的是resultMap 相比resultClass来说resultMap可以适应更复杂的关系映射,允许指定字段的数据类型,支持“select *” ,并不要求定义 ResultSet所有返回字段的映射 在resultMap中配置如下, 主要是搞懂关联关系怎么配置就可以了,无非就是一对一,一对多, 多对多: <resultMap id="BaseResultMap" type="类的全路径" > <id column=&qu

Caliburn.Micro学习笔记(三)----事件聚合IEventAggregator和 Ihandle&lt;T&gt;

Caliburn.Micro学习笔记(三)----事件聚合IEventAggregator和 Ihandle<T> 今天 说一下Caliburn.Micro的IEventAggregator和IHandle<T>分成两篇去讲这一篇写一个简单的例子 看一它的的实现和源码 下一篇用它们做一个多语言的demo 这两个是事件的订阅和广播,很强大,但用的时候要小心发生不必要的冲突. 先看一下它的实现思想 在Caliburn.Micro里EventAggregator要以单例的形式出现这样可以

OpenCV for Python 学习笔记 三

给源图像增加边界 cv2.copyMakeBorder(src,top, bottom, left, right ,borderType,value) src:源图像 top,bottem,left,right: 分别表示四个方向上边界的长度 borderType: 边界的类型 有以下几种: BORDER_REFLICATE # 直接用边界的颜色填充, aaaaaa | abcdefg | gggg BORDER_REFLECT # 倒映,abcdefg | gfedcbamn | nmabcd