一、使用注解开发

1、面向接口编程的概念

大家之前都学过面向对象编程,也学习过接口,但在真正的开发中,很多时候我们会选择面向接口编程

  • 根本原因 : 解耦 , 可拓展 , 提高复用 , 分层开发中 , 上层不用管具体的实现 , 大家都遵守共同的标准 , 使得开发变得容易 , 规范性更好
  • 在一个面向对象的系统中,系统的各种功能是由许许多多的不同对象协作完成的。在这种情况下,各个对象内部是如何实现自己的,对系统设计人员来讲就不那么重要了。
  • 各个对象之间的协作关系则成为系统设计的关键。小到不同类之间的通信,大到各模块之间的交互,在系统设计之初都是要着重考虑的,这也是系统设计的主要工作内容。面向接口编程就是指按照这种思想来编程。

关于接口的理解

  • 接口从更深层次的理解,应是定义(规范,约束)与实现(名实分离的原则)的分离。
  • 接口的本身反映了系统设计人员对系统的抽象理解。

接口应有两类:

  • 第一类是对一个个体的抽象,它可对应为一个抽象体(abstract class);
  • 第二类是对一个个体某一方面的抽象,即形成一个抽象面(interface);
  • 一个体有可能有多个抽象面。抽象体与抽象面是有区别的。

三个面向区别

  • 面向对象是指,我们考虑问题时,以对象为单位,考虑它的属性及方法 。
  • 面向过程是指,我们考虑问题时,以一个具体的流程(事务过程)为单位,考虑它的实现 。
  • 接口设计与非接口设计是针对复用技术而言的,与面向对象(过程)不是一个问题.更多的体现就是对系统整体的架构。
2、使用注解开发

步骤:

  • 编写mapping层接口:这次我们不再去编写接口的.xml配置文件,而是直接在接口中使用注解去编写我们的SQL代码。
package com.zyh.mapping;import com.zyh.pojo.User;
import org.apache.ibatis.annotations.Select;import java.util.List;/*** 使用注解进行开发*/
public interface UserMapper {@Select("select * from user")List<User> getUsers();
}
  • 将接口绑定到 mybatis-config.xml 核心配置文件中。
    <!--绑定接口--><mappers><mapper class="com.zyh.mapping.UserMapper"/></mappers>

测试:

MyBatis 注解的本质:反射
底层原理:动态代理

3、使用注解完成CRUD操作

接口:

package com.zyh.mapping;import com.zyh.pojo.User;
import org.apache.ibatis.annotations.*;import javax.naming.Name;
import java.util.List;/*** 使用注解进行开发*/
public interface UserMapper {//查询用户信息@Select("select * from user")List<User> getUsers();//通过指定参数查询用户信息@Select("select * from mybatis.user where id=#{id} and name=#{name}")User getUserById(@Param("id") int id,@Param("name") String name);//插入用户信息@Insert("insert into user(id,name,pwd) values (#{id},#{name},#{pwd})")int addUser(User user);//修改用户信息@Update("update user set name=#{name},pwd=#{pwd} where id=#{id}")int updateuser(@Param("id") int id,@Param("name") String name,@Param("pwd") String pwd);//删除用户信息@Delete("delete from user where id=#{id}")int deleteUser(@Param("id") int id);
}

注意:一定要把UserMapper接口注册到Mybatis-Config.xml核心配置文件中。

测试:

import com.zyh.mapping.UserMapper;
import com.zyh.pojo.User;
import com.zyh.utils.MyBatisUtils;
import org.apache.ibatis.session.SqlSession;
import org.testng.annotations.Test;import java.util.List;public class UserMapperTest {@Testpublic void test(){SqlSession session = MyBatisUtils.getSession();UserMapper mapper = session.getMapper(UserMapper.class);List<User> users = mapper.getUsers();for (User user : users) {System.out.println(user);}session.close();}@Testpublic void test1(){SqlSession session = MyBatisUtils.getSession();UserMapper mapper = session.getMapper(UserMapper.class);User user = mapper.getUserById(1,"张三");System.out.println(user);session.close();}@Testpublic void test2(){SqlSession session = MyBatisUtils.getSession();UserMapper mapper = session.getMapper(UserMapper.class);int i = mapper.addUser(new User(5, "赵高", "123456"));if (i > 0) {System.out.println("查插入用户数据成功");}session.close();}@Testpublic void test3() {SqlSession session = MyBatisUtils.getSession();UserMapper mapper = session.getMapper(UserMapper.class);int i = mapper.updateuser(5, "小川", "11235813");if (i > 0) {System.out.println("修改成功!");}session.close();}@Testpublic void test4() {SqlSession session = MyBatisUtils.getSession();UserMapper mapper = session.getMapper(UserMapper.class);int i = mapper.deleteUser(5);if (i > 0) {System.out.println("删除成功!");}session.close();}
}

二、MyBatis 的执行流程

三、多对一、一对多的ResultMap

假如现在有一个老师和五个学生,站在老师的角度看,老师只有一个,但他的学生却有许多,这就像一对多,但站在学生的角度看,他们有许多学生,但却只有一位老师,这就像多对一。 多对一和一对多这个问题要看你从哪个角度分析,不同的角度分析的结果也是不同的。

  • 对于学生而言就是关联 association 多个学生关联一个老师。
  • 对于老师而言就是 集合 connection 一个老师有许多学生,当做一个集合。

准备数据库:

CREATE TABLE `teacher` (`id` INT(10) NOT NULL,`name` VARCHAR(30) DEFAULT NULL,PRIMARY KEY (`id`)
) ENGINE=INNODB DEFAULT CHARSET=utf8INSERT INTO teacher(`id`, `name`) VALUES (1, '秦老师'); CREATE TABLE `student` (`id` INT(10) NOT NULL,`name` VARCHAR(30) 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=utf8INSERT INTO `student` (`id`, `name`, `tid`) VALUES ('1', '小明', '1');
INSERT INTO `student` (`id`, `name`, `tid`) VALUES ('2', '小红', '1');
INSERT INTO `student` (`id`, `name`, `tid`) VALUES ('3', '小张', '1');
INSERT INTO `student` (`id`, `name`, `tid`) VALUES ('4', '小李', '1');
INSERT INTO `student` (`id`, `name`, `tid`) VALUES ('5', '小王', '1');

创建每个表对应的实体类:

//学生类
package com.zyh.pojo;import lombok.Data;@Data
public class Student {private int id;private String name;private Teacher teacher;
}//老师类
package com.zyh.pojo;import lombok.Data;@Data
public class Teacher {private int id;private String name;
}

每个实体类的接口:

// StudentMapper
package com.zyh.mapping;import com.zyh.pojo.Student;import java.util.List;public interface StudentMapper {}//TeacherMapper
package com.zyh.mapping;public interface TeacherMapper {List<Student> getStudnts();
}

给两个接口的分别编写XML配置:

多对一案例:关联 assocation

学生StudentMapper.xml 配置:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--namespace的作用:和你编写的持久层的接口关联起来-->
<mapper namespace="com.zyh.mapping.StudentMapper"><resultMap id="StudentTeacher" type="Student"><!--property对应实体类的属性 column对应数据库的字段名--><id property="id" column="sid"/><result property="name" column="sname" /><association property="teacher" javaType="Teacher"><result property="name" column="tname"/><result property="id" column="tid"/></association></resultMap><select id="getStudents" resultMap="StudentTeacher">select s.id sid,s.name sname,t.name tname,t.id tidfrom student s,teacher twhere s.tid = t.id</select>
</mapper>

测试

package com.zyh.mapping;import com.zyh.pojo.Student;
import com.zyh.utils.MyBatisUtils;
import org.junit.jupiter.api.Test;import java.util.List;public class StudentMapperTest {@Testpublic void test(){StudentMapper mapper = MyBatisUtils.getSession().getMapper(StudentMapper.class);List<Student> students = mapper.getStudents();for (Student student : students) {System.out.println(student);}}
}

执行结果:

一对多案例:集合collection

Teacher.xml 的配置:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--namespace的作用:和你编写的持久层的接口关联起来-->
<mapper namespace="com.zyh.mapping.TeacherMapper"><resultMap id="TeacherStudent" type="Teacher"><result property="id" column="id"/><result property="name" column="tname"/><!--一对多就是包含关系:collection  ofType表示这个属性的Java类型是什么--><collection property="students" ofType="Student"><result property="id" column="sid"/><result property="name" column="sname"/><result property="tid" column="tid"/></collection></resultMap><select id="getTeacher"  resultMap="TeacherStudent">select s.id sid, s.name sname,t.id id,t.name tnamefrom student s,teacher twhere s.tid=t.id and t.id=#{id};</select>
</mapper>

测试:

package com.zyh.mapping;import com.zyh.pojo.Teacher;
import com.zyh.utils.MyBatisUtils;
import org.apache.ibatis.session.SqlSession;
import org.junit.jupiter.api.Test;public class TeacherMapperTest {@Testpublic void test(){SqlSession session = MyBatisUtils.getSession();TeacherMapper mapper = session.getMapper(TeacherMapper.class);Teacher teacher = mapper.getTeacher(2);System.out.println(teacher);session.close();}
}

MyBatis学习(二)使用注解开发、Mybatis 执行流程、一对多多对一的结果集映射相关推荐

  1. SpringBoot_数据访问-整合MyBatis(二)-注解版MyBatis

    前面已经创建数据表和JAVABEAN,如何用mybatis来对数据进行增删改查,我们先说mybatis注解版的使用,我来写上一个mapper,操作我们这个数据库,我们放在mapper包下,我们操作de ...

  2. MyBatis学习笔记2 ——第一个MyBatis程序

    MyBatis学习笔记2 --第一个MyBatis程序 参考教程B站狂神https://www.bilibili.com/video/BV1NE411Q7Nx 环境搭建 建立一个mybatis数据库用 ...

  3. Mybatis学习第四天:Mybatis延迟加载懒加载,一级缓存,二级缓存,注解开发

    文章目录 Mybatis中的延迟加载 一对一进行延迟加载 一对多的延迟加载 缓存机制: 一级缓存 二级缓存 注解开发 注解开发--单表的增删改查 注解开发--建立表与实体类的对应关系 注解开发--多表 ...

  4. Mybatis(16)注解开发环境搭建

    创建项目: day04_eesy_03annotation_mybatis 工程目录如下: 创建实体类User: public class User implements Serializable { ...

  5. MyBatis复习(十):注解开发

    MyBatis有两种开发方式:XML开发和注解开发 注解与XML对应表格 注解 对应XML 说明 @Insert <insert> 新增SQL @Update <update> ...

  6. MyBatis学习笔记(四) 注解

    使用MyBatis注解开发,可以省去类配置文件,简洁方便.但是比较复杂的SQL和动态SQL还是建议书写类配置文件. 注解还是不推荐使用的.只是了解了解!简单的CRUD可以使用注解.简单写写. 把之前的 ...

  7. 【MyBatis笔记】使用注解开发

    在方法前使用注解的方式 绑定接口到核心配置文件中: 本质:使用反射 底层:动态代理 使用注解进行增删改查: 自动提交事务: 工具类: public interface UserMapper {@Sel ...

  8. MyBatis(三)--注解开发

    1 注解开发介绍 1.1 为什么要有注解开发 注解可以简化开发操作,省略映射配置文件的编写 1.2 常用的注解 @Insert("查询的SQL语句"):实现新增操作 @Update ...

  9. MyBatis(12) 源码解析之SQL执行流程

    一.前言 资料 mybatis文档:https://mybatis.org/mybatis-3/index.html mybatis源码:https://github.com/mybatis/myba ...

  10. SpringBoot_数据访问-整合MyBatis(二)-配置版MyBatis

    前面使用全注解的方式,我们写了一个Mybatis的类,我们对数据库进行增删改查的操作,在实际开发中呢,我们也经常使用配置文件的方式,我们需要一个Mybatis的全局配置文件,包括写一个映射文件,那我们 ...

最新文章

  1. Mysql aborted_client_MySQL之aborted connections和aborted clients
  2. NBTC明年6月将举行5G频谱拍卖 2.6GHz频段成关注重点
  3. 2013年4月工作小结 -- 穿越前的回眸
  4. 三国大将风云java_三国正史四大猛将:临阵斩杀敌方大将,连吕布和马超也做不到...
  5. Unity2020.1新功能探路:2D设计师工具相关更新
  6. Python实现大自然数分解为最多4个平方数之和(1)
  7. 天池学习赛——街景字符编码识别(得分上0.93)
  8. JavaScript自定义事件
  9. 计算生物学_01机器学习理论部分
  10. 动态修改EasyUI accordion选中面板的标题(title)
  11. 中国电信业的魔咒:第四运营商之梦
  12. 使用FIT2CLOUD在青云QingCloud快速部署和管理Kubernetes集群 1
  13. 电子签章服务器位置的确定,一文看懂如何实现服务端电子签章
  14. PWM的基本原理及如何产生PWM
  15. recycleview添加item点击事件--作业三
  16. Linux目录结构和文件、目录常用命令
  17. 网络安全 — 零信任网络访问(ZTNA)
  18. Go Module使用 六大场景讲解示例
  19. hive常用函数之其他函数
  20. php电影播放系统在线视频点播系统 php毕业设计题目课题选题 php毕业设计项目作品源码(1)功能模块概要

热门文章

  1. vue中:key 和react 中key={} 的作用,以及ref的特性?
  2. linux下mysql5.7以上my.cnf配置文件配置
  3. 【读书笔记】iOS-访问网络
  4. [USACO11DEC] 牧草种植Grass Planting
  5. elasticsearch.net search入门使用指南中文版(翻译)
  6. 2013-07-29 IT 要闻速记快想
  7. wince6.0 OK6410 启动NandFlash路径下的程序快捷键
  8. 网站登录验证码和小论坛程序[含源程序+数据库]
  9. c++构造函数、析构函数为什么不能取地址
  10. 孙鑫VC学习笔记:第七讲 对话框