MyBatis注解开发的多表操作

1.一对一

环境准备

数据表为之前多表操作db1的数据表

bean.Card:

package Mybatis5.bean;public class Card {private Integer id; //主键idprivate String number; //身份证号private Person p;//所属人的对象public Card() {}public Card(Integer id, String number, Person p) {this.id = id;this.number = number;this.p = p;}public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getNumber() {return number;}public void setNumber(String number) {this.number = number;}public Person getP() {return p;}public void setP(Person p) {this.p = p;}@Overridepublic String toString() {return "Card{" +"id=" + id +", number='" + number + '\'' +", p=" + p +'}';}
}

bean.Person:

package Mybatis5.bean;public class Person {private Integer id; //主键idprivate String name;//人的姓名private Integer age;//人的年龄public Person() {}public Person(Integer id, String name, Integer age) {this.id = id;this.name = name;this.age = age;}public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public Integer getAge() {return age;}public void setAge(Integer age) {this.age = age;}@Overridepublic String toString() {return "Person{" +"id=" + id +", name='" + name + '\'' +", age=" + age +'}';}
}

PersonMapper接口:

package Mybatis5.one_to_one;import Mybatis5.bean.Person;
import org.apache.ibatis.annotations.Select;public interface PersonMapper {//根据id查询@Select("SELECT * FROM person WHERE id=#{id}")public abstract Person selectById(Integer id);
}

CardMapper接口:

package Mybatis5.one_to_one;import Mybatis5.bean.Card;import java.util.List;public interface CardMapper {//查询全部public abstract List<Card> selectAll();
}

功能实现 

@Results:封装映射关系的父注解。
    Result[] value():定义了 Result 数组
@Result:封装映射关系的子注解。
    column 属性:查询出的表中字段名称
    property 属性:实体对象中的属性名称
    javaType 属性:被包含对象的数据类型
    one 属性:一对一查询固定属性
@One:一对一查询的注解。
    select 属性:指定调用某个接口中的方法
 

使用注解配置CardMapper:

package Mybatis5.one_to_one;import Mybatis5.bean.Card;
import Mybatis5.bean.Person;
import org.apache.ibatis.annotations.One;
import org.apache.ibatis.annotations.Result;
import org.apache.ibatis.annotations.Results;
import org.apache.ibatis.annotations.Select;import java.util.List;public interface CardMapper {//查询全部@Select("SELECT * FROM card")@Results({@Result(column = "id",property = "id"),@Result(column = "number",property = "number"),@Result(property = "p",             // 被包含对象的变量名javaType = Person.class,    // 被包含对象的实际数据类型column = "pid",             // 根据查询出的card表中的pid字段来查询person表/*one、@One 一对一固定写法select属性:指定调用哪个接口中的哪个方法*/one = @One(select = "Mybatis5.one_to_one.PersonMapper.selectById"))})public abstract List<Card> selectAll();
}

MybatisConfig.xml:

<package name="Mybatis5.one_to_one"/>

测试类:

package Mybatis5.one_to_one;import Mybatis5.bean.Card;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Test;import java.io.InputStream;
import java.util.List;public class Test01 {@Testpublic void selectAll() throws Exception{InputStream is = Resources.getResourceAsStream("MyBatisConfig.xml");SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);SqlSession sqlSession = sqlSessionFactory.openSession(true);CardMapper mapper = sqlSession.getMapper(CardMapper.class);List<Card> list = mapper.selectAll();for (Card card : list) {System.out.println(card);}sqlSession.close();is.close();}
}

2.一对多

环境准备 

bean.Student:

package Mybatis5.bean;public class Student {private Integer id; //主键idprivate String name; //学生姓名private Integer age; //学生年龄public Student() {}public Student(Integer id, String name, Integer age) {this.id = id;this.name = name;this.age = age;}public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public Integer getAge() {return age;}public void setAge(Integer age) {this.age = age;}@Overridepublic String toString() {return "Student{" +"id=" + id +", name='" + name + '\'' +", age=" + age +'}';}
}

bean.classes:

package Mybatis5.bean;import java.util.List;public class Classes {public Integer id; //主键idprivate String name; //班级名称private List<Student> students; //班级中所有学生对象public Classes() {}public Classes(Integer id, String name, List<Student> students) {this.id = id;this.name = name;this.students = students;}public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public List<Student> getStudents() {return students;}public void setStudents(List<Student> students) {this.students = students;}@Overridepublic String toString() {return "Classes{" +"id=" + id +", name='" + name + '\'' +", students=" + students +'}';}
}

功能实现

@Results:封装映射关系的父注解。
    Result[] value():定义了 Result 数组
@Result:封装映射关系的子注解。
    column 属性:查询出的表中字段名称
    property 属性:实体对象中的属性名称
    javaType 属性:被包含对象的数据类型
    many 属性:一对多查询固定属性
@Many:一对多查询的注解。
    select 属性:指定调用某个接口中的方法

StudentMapper接口:

package Mybatis5.one_to_many;import Mybatis5.bean.Student;
import org.apache.ibatis.annotations.Select;import java.util.List;public interface StudentMapper {//根据cid查询student表@Select("SELECT * FROM student WHERE cid=#{cid}")public abstract List<Student> selectByCid(Integer cid);
}
<package name="Mybatis5.one_to_many"/>

使用注解配置ClassesMapper:

package Mybatis5.one_to_many;import Mybatis5.bean.Classes;
import org.apache.ibatis.annotations.Many;
import org.apache.ibatis.annotations.Result;
import org.apache.ibatis.annotations.Results;
import org.apache.ibatis.annotations.Select;import java.util.List;public interface ClassesMapper {//查询全部@Select("SELECT * FROM classes")@Results({@Result(column = "id",property = "id"),@Result(column = "name",property = "name"),@Result(property = "students",  // 被包含对象的变量名javaType = List.class,  // 被包含对象的实际数据类型column = "id",          // 根据查询出的classes表的id字段来查询student表/*many、@Many 一对多查询的固定写法select属性:指定调用哪个接口中的哪个查询方法*/many = @Many(select = "Mybatis5.one_to_many.StudentMapper.selectByCid"))})public abstract List<Classes> selectAll();
}

测试类:

package Mybatis5.one_to_many;import Mybatis5.bean.Classes;
import Mybatis5.bean.Student;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Test;import java.io.InputStream;
import java.util.List;public class Test01 {@Testpublic void selectAll() throws Exception{InputStream is = Resources.getResourceAsStream("MyBatisConfig.xml");SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);SqlSession sqlSession = sqlSessionFactory.openSession(true);ClassesMapper mapper = sqlSession.getMapper(ClassesMapper.class);List<Classes> list = mapper.selectAll();for (Classes cls : list) {System.out.println(cls.getId() + "," + cls.getName());List<Student> students = cls.getStudents();for (Student student : students) {System.out.println("\t" + student);}}sqlSession.close();is.close();}
}

3.多对多

环境准备

bean.Course:

package Mybatis5.bean;public class Course {private Integer id; //主键idprivate String name;//课程名称public Course() {}public Course(Integer id, String name) {this.id = id;this.name = name;}public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}@Overridepublic String toString() {return "Course{" +"id=" + id +", name='" + name + '\'' +'}';}
}

修改bean.Student:

package Mybatis5.bean;import java.util.List;public class Student {private Integer id; //主键idprivate String name; //学生姓名private Integer age; //学生年龄private List<Course> courses; //学生所选择的课程对象public Student() {}public Student(Integer id, String name, Integer age, List<Course> courses) {this.id = id;this.name = name;this.age = age;this.courses = courses;}public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public Integer getAge() {return age;}public void setAge(Integer age) {this.age = age;}public List<Course> getCourses() {return courses;}public void setCourses(List<Course> courses) {this.courses = courses;}@Overridepublic String toString() {return "Student{" +"id=" + id +", name='" + name + '\'' +", age=" + age +", courses=" + courses +'}';}
}

功能实现

@Results:封装映射关系的父注解。
    Result[] value():定义了 Result 数组
@Result:封装映射关系的子注解。
    column 属性:查询出的表中字段名称
    property 属性:实体对象中的属性名称
    javaType 属性:被包含对象的数据类型
    many 属性:一对多查询固定属性
@Many:一对多查询的注解。
    select 属性:指定调用某个接口中的方法

CourseMapper接口:

package Mybatis5.many_to_many;import Mybatis5.bean.Course;
import org.apache.ibatis.annotations.Select;import java.util.List;public interface CourseMapper {//根据学生id查询所选课程@Select("SELECT c.id,c.name FROM stu_cr sc,course c WHERE sc.cid=c.id AND sc.sid=#{id}")public abstract List<Course> selectBySid(Integer id);
}
<?xml version="1.0" encoding="UTF-8" ?>
<!--MyBatis的DTD约束-->
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
<!--configuration 核心根标签-->
<configuration><!--引入数据库连接的配置文件--><properties resource="jdbc.properties"/><!--配置LOG4J:以下name和value是固定写法--><settings><setting name="logImpl" value="log4j"/></settings><!--起别名--><typeAliases><package name="mybatis03.bean"/>
</typeAliases><!--集成分页助手插件--><plugins><plugin interceptor="com.github.pagehelper.PageInterceptor"/></plugins><!--每一个environment标签都是一个具体的连接数据库的环境 ,default:设置默认使用的环境的id--><environments default="mysql"><!--environment配置数据库环境  id属性唯一标识--><environment id="mysql"><!-- transactionManager事务管理。  type属性,采用JDBC默认的事务--><transactionManager type="JDBC"/><!-- 设置数据源的类型,以下表示使用数据库连接池缓存数据库连接--><dataSource type="POOLED"><!-- property获取数据库连接的配置信息 --><property name="driver" value="${driver}"/><property name="url" value="${url}"/><property name="username" value="${username}"/><property name="password" value="${password}"/></dataSource></environment></environments><!--mappers引入映射配置文件--><!--配置映射关系:这里已经没有Mapper映射文件了,但是我们需要配置mapper接口所在的包--><mappers><package name="Mybatis4.mapper"/><package name="Mybatis5.one_to_one"/><package name="Mybatis5.one_to_many"/><package name="Mybatis5.many_to_many"/></mappers><!--其实是注解的方式帮助我们生成了映射文件,所以我们依然是在mappers节点里配置-->
</configuration>

使用注解配置StudentMapper:

package Mybatis5.many_to_many;import Mybatis5.bean.Student;
import org.apache.ibatis.annotations.Many;
import org.apache.ibatis.annotations.Result;
import org.apache.ibatis.annotations.Results;
import org.apache.ibatis.annotations.Select;import java.util.List;public interface StudentMapper {//查询全部@Select("SELECT DISTINCT s.id,s.name,s.age FROM student s,stu_cr sc WHERE sc.sid=s.id")@Results({@Result(column = "id",property = "id"),@Result(column = "name",property = "name"),@Result(column = "age",property = "age"),@Result(property = "courses",   // 被包含对象的变量名javaType = List.class,  // 被包含对象的实际数据类型column = "id",          // 根据查询出student表的id来作为关联条件,去查询中间表和课程表/*many、@Many 一对多查询的固定写法select属性:指定调用哪个接口中的哪个查询方法*/many = @Many(select = "Mybatis5.many_to_many.CourseMapper.selectBySid"))})public abstract List<Student> selectAll();
}

测试类:

package Mybatis5.many_to_many;import Mybatis5.bean.Course;
import Mybatis5.bean.Student;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Test;import java.io.InputStream;
import java.util.List;public class Test01 {@Testpublic void selectAll() throws Exception{InputStream is = Resources.getResourceAsStream("MyBatisConfig.xml");SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);SqlSession sqlSession = sqlSessionFactory.openSession(true);StudentMapper mapper = sqlSession.getMapper(StudentMapper.class);List<Student> list = mapper.selectAll();for (Student student : list) {System.out.println(student.getId() + "," + student.getName() + "," + student.getAge());List<Course> courses = student.getCourses();for (Course cours : courses) {System.out.println("\t" + cours);}}sqlSession.close();is.close();}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/98931.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

GitHub要求开启2FA,否则不让用了。

背景 其实大概在一个多月前&#xff0c;在 GitHub 网页端以及邮箱里都被提示&#xff1a;要求开启 2FA &#xff0c;即双因子认证&#xff1b;但是当时由于拖延症和侥幸心理作祟&#xff0c;直接忽略了相关信息&#xff0c;毕竟“又不是不能用”。。 只到今天发现 GitHub 直接…

Linux软硬链接和动静态库

本文已收录至《Linux知识与编程》专栏&#xff01; 作者&#xff1a;ARMCSKGT 演示环境&#xff1a;CentOS 7 软硬链接和动静态库 前言正文软硬链接原理使用 文件时间动静态库库介绍静态库静态库制作静态库的使用关于静态链接 动态库动态库制作动态库的使用关于动态链接 补充 最…

Java练习题-用冒泡排序法实现数组排序

✅作者简介&#xff1a;CSDN内容合伙人、阿里云专家博主、51CTO专家博主、新星计划第三季python赛道Top1&#x1f3c6; &#x1f4c3;个人主页&#xff1a;hacker707的csdn博客 &#x1f525;系列专栏&#xff1a;Java练习题 &#x1f4ac;个人格言&#xff1a;不断的翻越一座又…

Computer Architecture Subtitle:Engineering And Technology

原文链接&#xff1a;https://www.cs.umd.edu/~meesh/411/CA-online/index.html

基于Springboot实现疫情网课管理系统项目【项目源码+论文说明】

基于Springboot实现疫情网课管理系统演示 摘要 随着科学技术的飞速发展&#xff0c;各行各业都在努力与现代先进技术接轨&#xff0c;通过科技手段提高自身的优势&#xff1b;对于疫情网课管理系统当然也不能排除在外&#xff0c;随着网络技术的不断成熟&#xff0c;带动了疫情…

net core 反射获取泛型-泛型方法method<T>(T t1)

参考微软说明: How to: Examine and Instantiate Generic Types with Reflection - .NET Framework | Microsoft Learn 目标方法 public class GenericTest{public Dictionary<string, string> TestGeneric<T1, T2>(T1 t1, T2 t2)where T1 : TestBase, ITestArgum…

Windows11 安全中心页面不可用问题(无法打开病毒和威胁防护)解决方案汇总(图文介绍版)

本文目录 Windows版本与报错信息问题详细图片&#xff1a; 解决方案:方案一、管理员权限&#xff08;若你确定你的电脑只有你一个账户&#xff0c;则此教程无效&#xff0c;若你也不清楚&#xff0c;请阅读后再做打算&#xff09;方案二、修改注册表(常用方案)方案三、进入开发…

leetcode:2427. 公因子的数目(python3解法)

难度&#xff1a;简单 给你两个正整数 a 和 b &#xff0c;返回 a 和 b 的 公 因子的数目。 如果 x 可以同时整除 a 和 b &#xff0c;则认为 x 是 a 和 b 的一个 公因子 。 示例 1&#xff1a; 输入&#xff1a;a 12, b 6 输出&#xff1a;4 解释&#xff1a;12 和 6 的公因…

Meta分析的流程及方法

Meta分析是针对某一科研问题&#xff0c;根据明确的搜索策略、选择筛选文献标准、采用严格的评价方法&#xff0c;对来源不同的研究成果进行收集、合并及定量统计分析的方法&#xff0c;最早出现于“循证医学”&#xff0c;现已广泛应用于农林生态&#xff0c;资源环境等方面。…

linux日志审计常用命令

文章目录 cut参数指定范围命令 awk参数内置变量命令 wc参数命令 uniq参数命令 sort参数命令 head参数 cut 参数 选项含义-b仅显示行中指定直接范围的内容-c仅显示行中指定范围的字符-d指定分割符&#xff0c; 默认为“TAB”制表符-f显示指定字段的内容-n与“-b”连用&#xf…

Prometheus普罗米修斯

什么是Prometheus 官网&#xff1a;Overview | Prometheus 是一个开源的系统监控和警报工具&#xff0c;多数Prometheus组件是Go语言写的 为用户提供可视化仪表板、警报、告警等功能&#xff0c;以帮助用户快速定位和解决问题 现在已经成为一个独立于企业级的开源项目和一个…

供水管网监测系统

随着城市人口的不断增长和经济的快速发展&#xff0c;供水管网的安全和可靠性变得尤为重要。在过去&#xff0c;供水管网的监测往往是依靠人工巡查&#xff0c;这种方式不仅费时费力&#xff0c;而且容易出现疏漏和盲区。然而&#xff0c;随着科技的进步&#xff0c;供水管网监…

大数据集群(Hadoop生态)安装部署

目录 1. 简介 2. 前置要求 3. Hadoop集群角色 4. 角色和节点分配 5. 调整虚拟机内存 6. Zookeeper集群部署 7. Hadoop集群部署 7.1 下载Hadoop安装包、解压、配置软链接 7.2 修改配置文件&#xff1a;hadoop-env.sh 7.3 修改配置文件&#xff1a;core-site…

Vue3目录结构与Yarn.lock 的版本锁定

Vue目录结构与Yarn.lock 的版本锁定 一、Vue3.0目录结构图总览 举个例子看vue的目录&#xff0c;一开始不知道该目录是什么意思目录里各个文件包里安放有什么&#xff0c;程序员在哪里操作该如何操作。 下图目录看Vue新项目 VS Code 打开文件包后出现一列目录 二、目录结构 1…

宝塔面板二次元透明主题美化模板

看惯了宝塔面板默认风格模板&#xff0c;我们可以试试自己美化修改&#xff0c;我的站长站知道一款非常漂亮的宝塔面板二次元透明主题美化模板&#xff0c;美不美大家看下图&#xff0c;分享给大家。 下载&#xff1a;飞猫盘&#xff5c;文件加速传输工具&#xff5c;云盘&…

怎么使用jenkins设置web自动打包

在Jenkins中设置Web自动打包需要完成以下步骤&#xff1a; 1.环境基础 安装Jenkins&#xff1a;首先&#xff0c;你需要在服务器上安装Jenkins。 你可以从Jenkins官网下载Jenkins的安装包&#xff0c;并按照官方指导进行安装。 2.使用jenkins设置web自动打包步骤 创建Jenk…

Vulnhub系列靶机-The Planets Earth

文章目录 Vulnhub系列靶机-The Planets: Earth1. 信息收集1.1 主机扫描1.2 端口扫描1.3 目录爆破 2. 漏洞探测2.1 XOR解密2.2 解码 3. 漏洞利用3.1 反弹Shell 4. 权限提升4.1 NC文件传输 Netcat&#xff08;nc&#xff09;文件传输 Vulnhub系列靶机-The Planets: Earth 1. 信息…

Hadoop2复安装过程详细步骤

1、在vmware中更改了虚拟机的网络类型&#xff0c;--->NAT方式&#xff0c;&#xff08;虚拟交换机的ip可以从vmvare的edit-->vertual network editor看到&#xff09; 2、根据这个交换机&#xff08;网关&#xff09;的地址&#xff0c;来设置我们的客户端windows7的ip&…

软件工程师都应该知道的10个定律

一、海勒姆法则 内容 当一个 API 有足够多的用户&#xff0c;你在契约中承诺了什么并不重要&#xff1a;系统中所有看得见的行为都会有某个人依赖…… 案例 现在有两个系统A和B&#xff0c;B的一个接口返回一个列表。A系统的开发人员发现返回的列表都是按照ID正向排序的。本…

vue-组件定义注册使用

vue组件使用的步骤 定义组件注册组件使用组件 定义组件 Vue.extend(options) 其中options和new Vue(options)出入的options对象几乎一样&#xff0c;但是也有不同。 创建 el不用写—最终所有组件需要经过一个vm的管理&#xff0c;由vm的el决定服务哪个容器。 data必须写成函…