1、获取主键值

1.1使用useGeneratedKeys属性

1.2使用selectKey标签
修改UserMapper

2、分页

3、多表操作(重难点)


3.1一对一

需求:(电商)【一个用户对应一个购物车】,查询这个用户信息时同时关系他的购车信息。

1、新建Person与Car

CREATE TABLE `person` (`id` int(11) NOT NULL,`name` varchar(32) DEFAULT NULL,`birthday` date DEFAULT NULL,`address` varchar(32) DEFAULT NULL,PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO `person` VALUES (1, '梦琪', '2019-05-08', '北京市');
INSERT INTO `person` VALUES (2, '忆柳', '2019-05-14', '天津市');
INSERT INTO `person` VALUES (3, '慕青', '2018-10-17', '上海市');
INSERT INTO `person` VALUES (4, '初夏', '2017-04-13', '重庆市');
INSERT INTO `person` VALUES (5, '新柔', '2018-12-29', '广州市');DROP TABLE IF EXISTS `car`;
CREATE TABLE `car` (`cid` int(11) NOT NULL AUTO_INCREMENT,`cname` varchar(20) DEFAULT NULL,`pid` int(11) NOT NULL,PRIMARY KEY (`cid`),KEY `cp` (`pid`),CONSTRAINT `cp` FOREIGN KEY (`pid`) REFERENCES `person` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8;INSERT INTO `car` VALUES (1, '忆柳的购物车', 2);
INSERT INTO `car` VALUES (2, '梦琪的购物车', 1);
INSERT INTO `car` VALUES (3, '新柔的购物车', 5);
INSERT INTO `car` VALUES (4, '慕青的购物车', 3);
INSERT INTO `car` VALUES (5, '初夏的购物车', 4);DROP TABLE IF EXISTS `order`;
CREATE TABLE `order` (`oid` int(11) NOT NULL AUTO_INCREMENT,`oname` varchar(255) DEFAULT NULL,`pid` int(11) DEFAULT NULL,PRIMARY KEY (`oid`),KEY `op` (`pid`),CONSTRAINT `op` FOREIGN KEY (`pid`) REFERENCES `person` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8;INSERT INTO `order` VALUES (1, '荣耀MagicBook 2019 14英寸轻薄窄边框', 2);
INSERT INTO `order` VALUES (2, '小米 (MI)Ruby 2019款 15.6英寸金属轻薄', 1);
INSERT INTO `order` VALUES (3, '戴尔灵越14 燃 14英寸英特尔酷睿i5轻薄窄边框', 3);
INSERT INTO `order` VALUES (4, '联想(Lenovo)小新14英寸 锐龙版R5', 4);
INSERT INTO `order` VALUES (5, '红辣椒7X 4+64GB 学生智能手机', 5);
INSERT INTO `order` VALUES (6, '荣耀10青春版 幻彩渐变', 1);
INSERT INTO `order` VALUES (7, 'OPPO K1 全面屏手机', 2);
INSERT INTO `order` VALUES (8, '卡梵蒂GAVADI 鳄鱼皮钱包', 5);
INSERT INTO `order` VALUES (9, '七匹狼钱包', 2);
INSERT INTO `order` VALUES (10, '金利来(Goldlion)男士钱包', 1);#学生表
DROP TABLE IF EXISTS `student`;
CREATE TABLE `student` (`sid` int(11) NOT NULL AUTO_INCREMENT,`sname` varchar(20) DEFAULT NULL,PRIMARY KEY (`sid`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;INSERT INTO `student` VALUES (1, '梦琪');
INSERT INTO `student` VALUES (2, '初夏');
INSERT INTO `student` VALUES (3, '忆柳');
#课程表
DROP TABLE IF EXISTS `course`;
CREATE TABLE `course` (`cid` int(11) NOT NULL AUTO_INCREMENT,`cname` varchar(20) DEFAULT NULL,PRIMARY KEY (`cid`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;INSERT INTO `course` VALUES (1, 'JAVA');
INSERT INTO `course` VALUES (2, 'HTML');
INSERT INTO `course` VALUES (3, 'DATABASE');
#中间表
DROP TABLE IF EXISTS `stu_cou`;
CREATE TABLE `stu_cou` (`scid` int(11) NOT NULL AUTO_INCREMENT,`cid` int(11) DEFAULT NULL,`sid` int(11) DEFAULT NULL,PRIMARY KEY (`scid`),KEY `scs` (`sid`),KEY `scc` (`cid`),CONSTRAINT `scc` FOREIGN KEY (`cid`) REFERENCES `course` (`cid`),CONSTRAINT `scs` FOREIGN KEY (`sid`) REFERENCES `student` (`sid`)
) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8;INSERT INTO `stu_cou` VALUES (1, 1, 1);
INSERT INTO `stu_cou` VALUES (2, 1, 2);
INSERT INTO `stu_cou` VALUES (3, 1, 3);
INSERT INTO `stu_cou` VALUES (4, 2, 1);
INSERT INTO `stu_cou` VALUES (5, 2, 2);
INSERT INTO `stu_cou` VALUES (6, 2, 3);
INSERT INTO `stu_cou` VALUES (7, 3, 1);

3.1.1连表操作
1、确定sql

2、新建实体类并分析实体类之间的关系
【用户拥购物车】在pserson有一个car的属性
Person

public class Person {private Integer id;private String name;private Date birthday;private String address;
}

car

public class Car {private Integer cid;private String cname;private Integer pid;
}

3、新建接口PersonMapper.java

public interface PersonMapper {List<Person> listAll();//模糊查询List<Person> listByName(@Param("name") String name);//一对一   联合查询List<Person> list();//一对一   分表查询List<Person> list2();//一对多   连接查询Person getById(int id);//一对多   分表查询Person getById2(int id);int update(Person person);int add(Person person);int delete(int id);
}

4、新建映射文件PersonMapper.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   StudentMapper   DogMapper-->
<mapper namespace="com.wwz.mapper.PersonMapper">
<!--    <mapper namespace="UserMapper">--><!--开启二级缓存-->
<cache /><!--  select标签是专门用来执行查询的sql<select></select>称为:执行单元id:是这个执行单元的唯一标识符   作用是区别多个执行单元resultType:映射结果类型   就是说把sql查询到的记录晨映射成哪个类型(实体类)完全限定名:包名+类名标签体就写我们要执行sql--><!--这个resultType是你sql语句执行结果的返回类型(要写全限定名)--><select id="listAll" resultType="com.wwz.pojo.Person">select * from person</select><!--  一对一  联合查询  --><resultMap id="baseResultMap" type="com.wwz.pojo.Person"><!--主键列用id标签表示--><id column="id" property="id" /><result column="name" property="name" /><result column="birthday" property="birthday" /><result column="address" property="address" /><!--association 专门用来做一对一的  property="car" 是person中的car属性javaType="Car  是属性car类型--><association property="car" javaType="com.wwz.pojo.Car"><id column="cid" property="cid" /><result column="cname" property="cname" /><result column="pid" property="pid" /></association></resultMap><select id="list" resultMap="baseResultMap">select * from person p inner join car c on p.id = c.pid</select><!--  一对一  分表查询  --><resultMap id="baseResultMap2" type="com.wwz.pojo.Person"><!--主键列用id标签表示--><id column="id" property="id" /><result column="name" property="name" /><result column="birthday" property="birthday" /><result column="address" property="address" /><!--   select="com.wwz.mapper.CarMapper.get"  调用CarMapper下的get方法得到一个 car值,把car值赋给属性carcolumn="id"  把列id的值作为参数            --><association property="car" javaType="com.wwz.pojo.Car"select="com.wwz.mapper.CarMapper.get" column="id" ></association></resultMap><select id="list2" resultMap="baseResultMap2">select * from person</select><!--  一对多 分表查询  --><resultMap id="baseResultMap3" type="com.wwz.pojo.Person"><!--主键列用id标签表示--><id column="id" property="id" /><result column="name" property="name" /><result column="birthday" property="birthday" /><result column="address" property="address" /><!--   select="com.wwz.mapper.CarMapper.get"  调用CarMapper下的get方法得到一个 car值,把car值赋给属性carcolumn="id"  把列id的值作为参数            --><association property="car" javaType="com.wwz.pojo.Car"select="com.wwz.mapper.CarMapper.get" column="id" ></association></resultMap><select id="getById2" resultMap="baseResultMap3">select * from `person` where id = #{id}</select><!--多对多  连接查询--><!--  模糊查询  --><select id="listByName" resultType="com.wwz.pojo.Person">SELECT * FROM personWHERE `NAME` LIKE '%${name}%';</select><!--  useGeneratedKeys="true"  声明返回主键(开启), keyProperty="id"把返回主键的值封装到实体的id属性中(只适用于主键自增的数据库) --><insert id="add" parameterType="com.wwz.pojo.Person" useGeneratedKeys="true" keyProperty="id">insert into person (id,name,birthday,address)values (#{id},#{name},#{age},#{email})</insert><update id="update" parameterType="com.wwz.pojo.Person">update person setid = #{id},name = #{name },age = #{age},email = #{email}where name = #{name }</update><delete id="delete" parameterType="com.wwz.pojo.Person">delete from person where id = #{id}</delete>
</mapper>

5、测试

@Testpublic void testUser3() throws IOException {UserMapper mapper = sqlSession.getMapper(UserMapper.class);List<User> users = mapper.list3();//遍历集合for (User user : users) {System.out.println(user);System.out.println(user.getCar());}}

6、总结

3.1.2单表操作(推荐)
连接表查(慢),所以我们使用单表查


3.2、一对多
需求:【一个用户对应多个订单】查询用户信息时关联订单信息
sql

3.2.1连表操作
1、确定sql



3.2.2单表操作
分别实现两张表的操作


3.3、同时实现一对一与一对多

3.4多对多

3.4.1、连表操作
1、确定sql


4、idea工具database使用

5、动态 SQL




5.3choose、when、otherwise




5.6、foreach(重点)

mybatis多表操作(一对一、一对多、多对多)相关推荐

  1. 7. MyBatis多表查询 - 一对一 - 一对多 - 多对多

    7. MyBatis多表查询 - 一对一 - 一对多 - 多对多 前言 在前面的篇章,我们已经熟悉了单表查询,下面我们来看看如何进行 多表查询. 数据准备 create database if not ...

  2. mybatis 多表查询 一对一 一对多查询

    本文举例: 1.订单信息表 2.订单详情表 3.发票表 三表关系: 订单信息表 订单信息详情表 1:n 订单信息表 发票表 1:1 需求: 查询订单表订单详情表和发票表所有信息: <!-- 订单 ...

  3. Python进阶----表与表之间的关系(一对一,一对多,多对多),增删改查操作

    Python进阶----表与表之间的关系(一对一,一对多,多对多),增删改查操作,单表查询,多表查询 一丶表与表之间的关系 背景: ​ ​ ​  ​ ​ 由于如果只使用一张表存储所有的数据,就会操作数 ...

  4. mybatis的一对一 一对多 多对多

    mybatis的一对一 一对多 多对多 1.表 2.建表语句 order_t表 CREATE TABLE `order_t` ( `id` int(11) NOT NULL, `user_id` in ...

  5. SQLAlchemy_定义(一对一/一对多/多对多)关系

    SQLAlchemy_定义(一对一/一对多/多对多)关系 目录 Basic Relationship Patterns One To Many One To One Many To Many Basi ...

  6. day 69-70 一对一 一对多 多对一联表查询

    day 69 orm操作之表关系,多对多,多对一多对一/一对多,多对多{类中的定义方法}day691. 昨日内容回顾1. 单表增删改查2. 单表查询API返回QuerySet对象的:1. .all() ...

  7. mybatis多表查询(一对多,多对一,多对多)

    mybatis多表查询.多对一,一对多,多对多 多对一.一对多 准备阶段 建立dept实体类和emp实体类 建立Dao接口 写Dao的Mapper映射 多对多 多对一.一对多 准备阶段 建立一个部门表 ...

  8. JAVA日记之mybatis-3一对一,一对多,多对多xml与注解配置 ----喝最烈的酒.

    1.Mybatis多表查询 1.1 一对一查询 1.1.1 一对一查询的模型 用户表和订单表的关系为,一个用户有多个订单,一个订单只从属于一个用户 一对一查询的需求:查询一个订单,与此同时查询出该订单 ...

  9. Mybatis多表操作

    文章目录 前言 一.一对一操作 数据库环境 Mapper.xml文件的编写 功能实现 遇到的问题 关于mybatis中起别名的问题 二.一对多操作 数据库环境 Mapper.xml的编写 功能实现 小 ...

最新文章

  1. 【 Notes 】RFID Preliminary Introduction
  2. 消灭Bug!推荐7款优秀的开源Bug跟踪工具
  3. mac地址修改_快速更改WiFi MAC地址
  4. Linux小工具(4)之apt软件管理
  5. Python 编码规范 PEP 8
  6. oracle日期与字符串的相互转化
  7. PAT 1087 有多少不同的值(20 分)- 乙级
  8. http 性能测试. Apache ab 使用.
  9. HTML5-打字游戏
  10. 如何使用Java开发QQ机器人 方法一
  11. 【芯片学习】X86 CPU 发展历史与分析——1971~2020——明白Intel架构的变迁
  12. msvcr100.dll解决方法
  13. 绕过 office 宏密码保护
  14. 第二章-FPGA的概要-《FPGA的原理与结构》
  15. c语言保龄球计分系统课程设计,[C语言课程设计保龄球积分.doc
  16. 塞拉利昂一公司计划投资10亿美元用于建设光伏农业项目
  17. 可以旅游了_原水_新浪博客
  18. 手机NFC开启门禁方案介绍
  19. 通过接口获取数据登录
  20. Maven使用Profile

热门文章

  1. 无创脑刺激对不同神经和神经精神疾病睡眠障碍的影响
  2. 【C语言总结】C语言预处理器
  3. CH340驱动安装失败 win10
  4. 在线教育平台项目——需求分析
  5. 2022年危险化学品生产单位安全生产管理人员操作证考试题库及答案
  6. 神了!有人用一个项目把23种设计模式与六大原则融会贯通了
  7. tpc-c 服务器性能,TPC-E和TPC-C测试结果比较之我见
  8. 30岁以后搞Android已经没有前途?复习指南
  9. 数论读书笔记——线性丢番图方程——解不定方程
  10. 2021-03-22