Mybatis-5-适合初学

目录

一.数据库的多对一,一对多问题

二.设置案例,设置sql,建表(学生和老师)

三.总结,测试环境的搭建

四.多对一实现

五.一对多实现


一.数据库的多对一,一对多问题

多个老师,对应一个老师

对于学生,关联一个老师

对于老师,下面有多个学生--->集合-->assocition和collection

二.设置案例,设置sql,建表(学生和老师)

USE mybatis;
CREATE TABLE student(
 `id` INT(10) NOT NULL,
  `NAME` VARCHAR(40) DEFAULT NULL,
   `tid` INT(10) DEFAULT NULL,
    PRIMARY KEY(`id`),
    KEY `fktid` (`tid`),
CONSTRAINT  `fktid`  FOREIGN KEY(`tid`) REFERENCES `teacher` (`id`)
)ENGINE=INNODB DEFAULT CHARSET=utf8

CREATE TABLE teacher(
`id` INT(10) NOT NULL,
`name` VARCHAR(40),
PRIMARY KEY(`id`)
)ENGINE=INNODB DEFAULT CHARSET=utf8

在表里插入数据--->student(小张,小红,小王,小明,小李)---->teacher表里插入(1,易老师)---》

---------------------------------------》

    1. 创建StudentMapper和TeacherMapper接口

public interface StudentMapper 
public interface TeacherMapper 

2.配置StudentMapper.xml和TeacherMapper.xml

<?xml version="1.0" encoding="UTF8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--核心配置文件-->
<mapper namespace="Dao.StudentMapper">
</mapper>
<!--第二个-->
<?xml version="1.0" encoding="UTF8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--核心配置文件-->
<mapper namespace="Dao.TeacherMapper">

</mapper>

 3.在mybatis.xml中注册,注册的方式有很多中,mapper class 和mapper resource也可以

<!--    每一个都需要在核心配置文件中注册-->
    <mappers>
        <mapper class="Dao.StudentMapper"/>
        <mapper class="Dao.TeacherMapper"/>

    </mappers>

4.测试

在TeacherMapper接口加入查询方法

 @Select("select *from teacher where id=#{tid}")
    Teacher getTeacher(@Param("tid") int id);
    public static void main(String[] args) {
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        TeacherMapper mapper = sqlSession.getMapper(TeacherMapper.class);
        Teacher teacher = mapper.getTeacher(1);
        System.out.println(teacher);
        sqlSession.close();
    }

结果:

三.总结,测试环境的搭建

  1. 导入lombok
  2. 新建实体类Teacher,Student
  3. 建立Mapper接口
  4. 建立Mapper.XML
  5. 在核心配置文件中注册Mapper接口或者文件
  6. 测试是否查询成功

四.多对一实现

1.按照结果嵌套

<!--核心配置文件-->
<mapper namespace="Dao.StudentMapper">
   <!--思路?查询学生和老师表
   根据学生的tid去老师的表中寻找数据-->

    <select id="getStudent" resultMap="StudentTeacher">
        select *from mybatis.student
    </select>
    <resultMap id="StudentTeacher" type="Student">
        <result property="id" column="id"/>
        <result property="name" column="name"/>
<!--        <result property="tid" column="??"这里明显不可以使用上面的方法-->
<!--        对于复杂的属性,我们要单独处理
             对象:association
             集合:collection-->
        <association property="teacher" column="tid" javaType="Teacher" select="getTeacher"/>
    </resultMap>
    <select id="getTeacher" resultType="pojo.Teacher">
        select *from mybatis.teacher where id=#{id};
    </select>

测试:

    @Test
    public void getStudent(){
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        StudentMapper mapper = sqlSession.getMapper(StudentMapper.class);
        List<Student> studentList = mapper.getStudent();
        for (Student student : studentList) {
            System.out.println(student);
        }
        sqlSession.close();

    }

回顾mysql,子查询,联表查询

select s.id s.name,t.name  from student s,teacher t
where s.tid=t.id

你要想在java里面实现,必须使用这个嵌套查询!!!

五.一对多实现

比如一个老师拥有多个学生,对于老师来说就是一对多

1.环境搭建

和刚刚一样,环境的搭建

实体类:Teacher,这次老师有多个学生

public class Teacher {
    private int id;
    private String name;
    private List<Student> students;
}

student只有一个老师

public class Student {
    private  int id;
    private String name;
    private int tid;
}

方法一样,首先创建实体类----》写接口----》编写xml----》写xml(相当于实现接口)

2.写接口,思路按老师的id获得全部的学生

public List<Teacher> getTeacher(@Param("tid") int id);

3.配置TeacherMapper.xml文件

  1. 现在数据库控制台打出你想要查询的信息
    select  s.id sid,s.name sname,t.name tname,t.id tid
    from student s,teacher t
    where s.tid=t.id;
  2. 复制到TeacherMapper.xml中<select id="getTeacher" resultMap="TeacherStudent"> select s.id sid,s.name sname,t.name tname,t.id tid from mybatis.student s,mybatis.teacher t where s.tid=t.id and t.id=#{tid}; </select>

注意:为什么这里用的resultMap?1.如果你用的是resultType=Teacher的话,students--》null,因为你的Teacher里面的属性类型是一个List--》集合类型

  3.

<!--    按结果嵌套查询-->
    <resultMap id="TeacherStudent" type="Teacher">
        <result property="id" column="tid"/>
        <result property="name" column="tname"/>
        <collection property="students" ofType="Student" >
            <result property="id" column="sid"/>
            <result property="name" column="sname"/>
            <result property="tid" column="tid"/>
        </collection>

    </resultMap>

第一个id-->查询结果的tid(因为这个按查询结果的);name---》查询结果的tname

重点来了,students的属性是集合怎么写?答案是 如果属性是对象-->association;对象是集合-->collection

然后,collection property=属性的名字,我们这里oftype=Student来代替javatype,因为List这个属性不是你想要的,你要的是Student

这里的id---》查询结果的sid;name---》查询结果的sname;tid--tid

4.测试:

@Test
    public void getTeacher(){
    SqlSession sqlSession = MybatisUtils.getSqlSession();
    TeacherMapper mapper = sqlSession.getMapper(TeacherMapper.class);
    List<Teacher> teachers = mapper.getTeacher(1);
    for (Teacher teacher : teachers) {
        System.out.println(teacher);
    }

得到的信息是:

Teacher(id=1, name=易老师, students=[Student(id=1, name=小明, tid=1), Student(id=2, name=小红, tid=1), Student(id=3, name=小张, tid=1), Student(id=4, name=小李, tid=1), Student(id=5, name=小王, tid=1)])---------》而不是null

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值