mybatis--一对一关联查询
(1)创建数据库mybatisonetoone
有两张表,老师表teacher和班级表class,一个class班级对应一个teacher,一个teacher对应一个class
需求是根据班级id查询班级信息(带老师的信息),
创建teacher和class表:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | CREATE DATABASE mybatisonetoone; CREATE TABLE teacher ( t_id INT PRIMARY KEY AUTO_INCREMENT, t_name VARCHAR( 20 ) ); CREATE TABLE class ( c_id INT PRIMARY KEY AUTO_INCREMENT, c_name VARCHAR( 20 ), teacher_id INT ); ALTER TABLE class ADD CONSTRAINT fk_teacher_id FOREIGN KEY (teacher_id) REFERENCES teacher(t_id); INSERT INTO teacher(t_name) VALUES( 'LS1' ); INSERT INTO teacher(t_name) VALUES( 'LS2' ); INSERT INTO class (c_name, teacher_id) VALUES( 'bj_a' , 1 ); INSERT INTO class (c_name, teacher_id) VALUES( 'bj_b' , 2 ); |
(2)创建config/config.xml文件:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | <?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> <environments default = "development" > <environment id= "development" > <transactionManager type= "JDBC" /> <dataSource type= "POOLED" > <property name= "driver" value= "com.mysql.jdbc.Driver" /> <property name= "url" value= "jdbc:mysql://localhost:3306/mybatisonetoone" /> <property name= "username" value= "root" /> <property name= "password" value= "123456" /> </dataSource> </environment> </environments> <mappers> <!-- // power by http://www.yiibai.com --> <mapper resource= "mybatis/bean/ClassMapper.xml" /> </mappers> </configuration> |
(3) 实现两个实体类Class.class和Teacher.class
Class.class
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 | package mybatis.bean; public class Class { private int id; private String name; private Teacher teacher; public Class() { } public Class( int id, String name, Teacher teacher) { super (); this .id = id; this .name = name; this .teacher = teacher; } public int getId() { return id; } public void setId( int id) { this .id = id; } public String getName() { return name; } public void setName(String name) { this .name = name; } public Teacher getTeacher() { return teacher; } public void setTeacher(Teacher teacher) { this .teacher = teacher; } @Override public String toString() { return "Class [id=" + id + ", name=" + name + ", teacher=" + teacher + "]" ; } } |
Teacher.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 | package mybatis.bean; public class Teacher { private int id; private String name; public Teacher() { } public Teacher( int id, String name) { super (); this .id = id; this .name = name; } public int getId() { return id; } public void setId( int id) { this .id = id; } public String getName() { return name; } public void setName(String name) { this .name = name; } @Override public String toString() { return "Teacher [id=" + id + ", name=" + name + "]" ; } } |
(4) 然后配置ClassMapper.xml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | <?xml version= "1.0" encoding= "UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" > <mapper namespace= "mybatis.bean.classMapper" > <!--根据id查询到一个班级信息(带老师信息) --> <!-- 嵌套结果 --> <!-- <select id= "getClass" parameterType= "int" resultMap= "ClassResultMap" > 方式一 select * from class c, teacher t where c.teacher_id=t.t_id and c.c_id=#{id} </select> <resultMap type= "mybatis.bean.Class" id= "ClassResultMap" > <id property= "id" column= "c_id" /> <result property= "name" column= "c_name" /> <association property= "teacher" column= "teacher_id" javaType= "mybatis.bean.Teacher" > <id property= "id" column= "t_id" /> <result property= "name" column= "t_name" /> </association> </resultMap> --> <!--嵌套查询 --> <select id= "getClass" parameterType= "int" resultMap= "ClassResultMap" > select * from class where c_id=#{id} </select> <resultMap type= "mybatis.bean.Class" id= "ClassResultMap" > <id property= "id" column= "c_id" /> <result property= "name" column= "c_name" /> <association property= "teacher" column= "teacher_id" javaType= "mybatis.bean.Teacher" select= "getTeacher" > </association> </resultMap> <!-- 使用了sql别名 --> <select id= "getTeacher" parameterType= "int" resultType= "mybatis.bean.Teacher" > SELECT t_id id, t_name name FROM teacher WHERE t_id=#{id} </select> </mapper> |
(5)最后配置Main.class执行查询操作
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 | package Main; import java.io.Reader; import java.text.MessageFormat; import java.util.List; import mybatis.bean.Class; import org.apache.ibatis.io.Resources; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder; public class Main { private static SqlSessionFactory sqlSessionFactory; private static Reader reader; static { try { reader = Resources.getResourceAsReader( "config/config.xml" ); sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader); } catch (Exception e) { e.printStackTrace(); } } public static SqlSessionFactory getSession() { return sqlSessionFactory; } /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub SqlSession session = sqlSessionFactory.openSession(); mybatis.bean.Class clazz = session.selectOne( "mybatis.bean.classMapper.getClass" , 2 ); System.out.println(clazz); } } |
执行Main函数后得出的程序结果如下:
程序结构图如下:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)