mybatis+oracle实现一对多,多对一查询
首先创建表
学生表
create table stu(
id number(11) primary key,
name varchar2(255),
age number(11),
cid number(11)
);
班级表
create table cls(
id number(11) primary key,
cname varchar2(255)
);
创建序列
create sequence seq_stu;
create sequence seq_cls;
添加数据
insert into stu values(seq_stu.nextval,'小乔',16,1);
insert into stu values(seq_stu.nextval,'干将',88,1);
insert into stu values(seq_stu.nextval,'鲁班',18,1);
insert into stu values(seq_stu.nextval,'婉儿',22,1);
insert into stu values(seq_stu.nextval,'艾琳',23,2);
insert into stu values(seq_stu.nextval,'安其拉',14,2);
insert into stu values(seq_stu.nextval,'牛魔',50,2);
insert into stu values(seq_stu.nextval,'猴子',66,2);
insert into stu values(seq_stu.nextval,'李白',26,1);
insert into stu values(seq_stu.nextval,'韩信',32,1);
insert into cls values (seq_cls.nextval,'QY75');
insert into cls values (seq_cls.nextval,'QY97');
创建工具类
package com.aaa.mybatis.util; 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 java.io.IOException;
import java.io.Reader; public class SqlSessionFactoryUtil {
private static SqlSessionFactory sessionFactory;
static {
Reader reader =null;
try {
reader= Resources.getResourceAsReader("mybatis.xml");
/*sessionFactory =new SqlSessionFactoryBuilder().build(reader,"mysql");*/
sessionFactory =new SqlSessionFactoryBuilder().build(reader,"myOracle");
} catch (IOException e) {
e.printStackTrace();
}finally {
try {
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
public static SqlSession getSession(){
return sessionFactory.openSession();
}
}
创建mybatis主配置文件
<?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="myOracle">
<environment id="myOracle">
<transactionManager type="JDBC"></transactionManager>
<dataSource type="POOLED">
<property name="driver" value="oracle.jdbc.driver.OracleDriver"></property>
<property name="url" value="jdbc:oracle:thin:@localhost:1521:orcl"></property>
<property name="username" value="scott"></property>
<property name="password" value="tiger"></property>
</dataSource>
</environment>
<--连接MySQL用下面这个,工具类加着注释-->
<environment id="mysql">
<transactionManager type="JDBC"></transactionManager>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"></property>
<property name="url" value="jdbc:mysql://localhost:3306/test"></property>
<property name="username" value="root"></property>
<property name="password" value="admin"></property>
</dataSource>
</environment>
</environments> <mappers>
<mapper resource="com/aaa/mybatis/dao/StuDaoMapper.xml"></mapper>
<mapper resource="com/aaa/mybatis/dao/ClsDaoMapper.xml"></mapper>
</mappers>
</configuration>
创建Stu,Cls表实体
package com.aaa.mybatis.entity;
import java.util.*; public class Cls {
private int cid;
private String cname;
private List<Stu> stu; public int getCid() {
return cid;
} public void setCid(int cid) {
this.cid = cid;
} public String getCname() {
return cname;
} public void setCname(String cname) {
this.cname = cname;
} public List<Stu> getStu() {
return stu;
} public void setStu(List<Stu> stu) {
this.stu = stu;
}
}
package com.aaa.mybatis.entity;
public class Stu {
private int id;
private String name;
private int age;
private Cls cls; 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 int getAge() {
return age;
} public void setAge(int age) {
this.age = age;
} public Cls getCls() {
return cls;
} public void setCls(Cls cls) {
this.cls = cls;
}
} 创建Stu接口
package com.aaa.mybatis.dao; import com.aaa.mybatis.entity.Stu;
import org.apache.ibatis.annotations.Param; import java.util.*; public interface StuDao {
/**
* 根据学生编号查询学生信息和班级信息
* @param id
* @return
*/ }
创建Cls接口
package com.aaa.mybatis.dao; import com.aaa.mybatis.entity.Cls; import java.util.*; public interface ClsDao {
/**
* 根据班级编号查询该班级信息和所有学生信息
*/
public List<Cls> allClsAndStuByCid();
} 一对多mapper根据学生编号查询学生信息和班级信息
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.aaa.mybatis.dao.StuDao">
<resultMap id="stuMap" type="com.aaa.mybatis.entity.Stu" autoMapping="true">
<association property="cls" javaType="com.aaa.mybatis.entity.Cls" autoMapping="true"><--autoMapping如果属性名与实体一致可以省略里面的字段--> </association>
</resultMap>
<select id="allstuByStuId" resultMap="stuMap">
select * from stu a join cls b on a.cid=b.cid where a.id=#{id}
</select>
</mapper> 多对一mapper查询所有班级信息和每个班的学生信息
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.aaa.mybatis.dao.ClsDao">
<resultMap id="clsMap" type="com.aaa.mybatis.entity.Cls" autoMapping="true">
<id column="cid" property="cid"></id><--加上autoMapping可以省略实体里字段名与属性名相同的信息,但是多对一必须在这里加ID标签-->
<collection property="stu" ofType="com.aaa.mybatis.entity.Stu" autoMapping="true"></collection>
</resultMap>
<select id="allClsAndStuByCid" resultMap="clsMap">
select * from cls a join stu b on a.cid=b.cid
</select>
</mapper> 测试一对多
package com.aaa.mybatis.text; import com.aaa.mybatis.dao.StuDao;
import com.aaa.mybatis.entity.Stu;
import com.aaa.mybatis.util.SqlSessionFactoryUtil;
import org.apache.ibatis.session.SqlSession; public class text01 {
public static void main(String[] args) {
SqlSession session= SqlSessionFactoryUtil.getSession();
StuDao mapper = session.getMapper(StuDao.class);
Stu stu = mapper.allstuByStuId(6);
System.out.println("学生姓名:"+stu.getName());
System.out.println("学生编号:"+stu.getId());
System.out.println("学生年龄:"+stu.getAge());
System.out.println("班级编号:"+stu.getCls().getCid());
System.out.println("班级名称:"+stu.getCls().getCname());
}
}
测试结果
学生姓名:艾琳
学生编号:6
学生年龄:23
班级编号:2
班级名称:QY97 Process finished with exit code 0 测试多对一
package com.aaa.mybatis.text; import com.aaa.mybatis.dao.ClsDao;
import com.aaa.mybatis.dao.StuDao;
import com.aaa.mybatis.entity.Cls;
import com.aaa.mybatis.entity.Stu;
import com.aaa.mybatis.util.SqlSessionFactoryUtil;
import org.apache.ibatis.session.SqlSession; import java.util.List; public class text02 {
public static void main(String[] args) {
SqlSession session= SqlSessionFactoryUtil.getSession();
ClsDao mapper = session.getMapper(ClsDao.class);
List<Cls> cls = mapper.allClsAndStuByCid();
for(int i=0;i<cls.size();i++){
System.out.println("班级编号:"+cls.get(i).getCid());
System.out.println("班级名称:"+cls.get(i).getCname());
System.out.println("------------------");
List<Stu> e = cls.get(i).getStu();
for (Stu stu : e) {
System.out.println("学生姓名:"+stu.getName());
System.out.println("学生编号:"+stu.getId());
System.out.println("学生年龄:"+stu.getAge());
System.out.println("**********************");
}
} }
}
测试结果
班级编号:1
班级名称:QY75
------------------
学生姓名:小乔
学生编号:2
学生年龄:16
**********************
学生姓名:干将
学生编号:3
学生年龄:88
**********************
学生姓名:鲁班
学生编号:4
学生年龄:18
**********************
学生姓名:婉儿
学生编号:5
学生年龄:22
**********************
学生姓名:李白
学生编号:10
学生年龄:26
**********************
学生姓名:韩信
学生编号:11
学生年龄:32
**********************
班级编号:2
班级名称:QY97
------------------
学生姓名:艾琳
学生编号:6
学生年龄:23
**********************
学生姓名:安其拉
学生编号:7
学生年龄:14
**********************
学生姓名:牛魔
学生编号:8
学生年龄:50
**********************
学生姓名:猴子
学生编号:9
学生年龄:66
********************** Process finished with exit code 0
mybatis+oracle实现一对多,多对一查询的更多相关文章
- Mybatis一对多/多对多查询时只查出了一条数据
问题描述: 如果三表(包括了关系表)级联查询,主表和明细表的主键都是id的话,明细表的多条数据只能查询出来第一条/最后一条数据. 三个表,权限表(Permission),权限组表(Permission ...
- mybatis入门_一对多,多对多映射以及整合spring框架
一.一对多映射. 1.1 一对多映射之根据多的一方关联查询一的一方 示例:查询出具体的订单信息,同时也查询出来订单的用户信息. 引入的订单表如下所示: 框选出来的为具体的外键. 订单的Pojo类如下所 ...
- mybatis的执行流程 #{}和${} Mysql自增主键返回 resultMap 一对多 多对一配置
n Mybatis配置 全局配置文件SqlMapConfig.xml,配置了Mybatis的运行环境等信息. Mapper.xml文件即Sql映射文件,文件中配置了操作数据库的Sql语句.此文件需要在 ...
- mybatis实战教程二:多对一关联查询(一对多)
多对一关联查询 一.数据库关系.article表和user表示多对一的关系 CREATE TABLE `article` ( `id` ) NOT NULL AUTO_INCREMENT, `user ...
- mybatis(一、原理,一对多,多对一查询)
MyBatis框架及原理分析 MyBatis 是支持定制化 SQL.存储过程以及高级映射的优秀的持久层框架,其主要就完成2件事情: 封装JDBC操作 利用反射打通Java类与SQL语句之间的相互转换 ...
- SpringBoot使用Mybatis注解进行一对多和多对多查询(2)
SpringBoot使用Mybatis注解进行一对多和多对多查询 GitHub的完整示例项目地址kingboy-springboot-data 一.模拟的业务查询 系统中的用户user都有唯一对应的地 ...
- mybatis学习记录六——一对一、一对多和多对多查询
9 订单商品数据模型 9.1 数据模型分析思路 1.每张表记录的数据内容 分模块对每张表记录的内容进行熟悉,相当 于你学习系统 需求(功能)的过程. 2.每张表重要的字段设置 非空 ...
- Mybatis一对一、一对多、多对多查询。+MYSQL
场景:使用三张数据表:student学生表.teacher教师表.position职位表 一个学生可以有多为老师.一位老师可以有多个学生.但是一个老师只能有一个职位:教授.副教授.讲师:但是一个职位可 ...
- mybatis报错:查询一对多或多对多时只返回一条数据的问题
问题: 使用映射文件实现查询一对多或多对多时只返回一条数据问题 解决方法: 导致这种情况出现的问题是因为两个表中的主键是一样所以出现了数据覆盖问题. 解决方式一:修改数据库表中的主键(这种方法比较麻烦 ...
随机推荐
- (转)OL2中设置鼠标的样式
http://blog.csdn.net/gisshixisheng/article/details/49496289 概述: 在OL2中,鼠标默认是箭头,地图移动时,鼠标样式是移动样式:很多时候,为 ...
- HDU_1079_思维题
Calendar Game Time Limit: 5000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Tot ...
- node里读取命令行参数
一.process.env process.env属性返回一个包含用户环境信息的对象. 最常见的需求,前端需要根据不同的环境(dev,prd),来调用不同的后端接口.如果用webpack,是这么做的: ...
- Sping——使用注解创建切面
为讲解例子,我们首先定义一个Performance接口: package aoptest; public interface Performance { public void perform(); ...
- MHA的MySQL高可用方案实战
功能: 1)master的故障切换(keepalived VIP的飘移) 2)主从复制角色的提升和重新转向 其中master 对外提供写服务,备选master2(实际的slave提供读服务,slave ...
- 1 TaskQueue 实现Task 队列
class Program { static void Main(string[] args) { List<Person> list = new List<Person>() ...
- Optimizing web servers for high throughput and low latency
转自:https://blogs.dropbox.com/tech/2017/09/optimizing-web-servers-for-high-throughput-and-low-latency ...
- DP背包问题小总结
DP的背包问题可谓是最基础的DP了,分为01背包,完全背包,多重背包 01背包 装与不装是一个问题 01背包基本模型,背包的总体积为v,总共有n件物体,每件物品的体积为v[i],价值为w[i],每件物 ...
- JAVA中 redisTemplate 和 jedis的配合使用
首先项目A,也就是SpringBOOT项目中使用redisTemplate 来做REDIS的缓存时,你会发现存到REDIS里边的KEY和VALUE,redisTemplat使用jdkSerialize ...
- Django——7 常用的查询 常用的模型字段类型 Field的常用参数 表关系的实现
Django 常用的查询 常用的查询方法 常用的查询条件 常用字段映射关系 Field常用参数 表关系的实现 查用的查询方法 这是需要用到的数据 from django.http import Htt ...