版权声明:本文为博主原创文章,未经博主允许不得转载 https://blog.csdn.net/Mythology_px/article/details/82891956
数据库表与表之间是有关联关系的, 需要在Mybatis的映射文件中把它描述出来,然后才能查询
数据库
-- 创建表空间
create tablespace dataspace
datafile'F:\\dataspace.dbf'
size 100M;
commit;
-- 创建用户
create user mjsw
identified by mjsw
default tablespace dataspace;
commit;
-- 授权
grant dba to mjsw;
commit;
-- 切换用户
-- 创建班级表
create table classs(
clsno varchar2(20) primary key,
cname varchar2(10) not null,
addr varchar2(10) not null
);
-- 创建学生表
create table student(
stuno varchar2(20) primary key ,
sname varchar2(10) not null,
age number(3),
phone varchar2(11),
clsno varchar2(20),
constraint Fk_stuno foreign key(clsno) references classs(clsno)
);
-- 删除表
drop table student
-- 添加班级表数据
insert into classs values('7801','Java','NewYork');
insert into classs values('7802','Python','HongKong');
insert into classs values('7803','Android','Taiwan');
commit;
-- 添加学生信息
insert into student values('7788001','Micro',21,'17742328212','7801');
insert into student values('7788002','Rose',22,'17629216075','7802');
insert into student values('7788003','Myth',20,'13992016753','7803');
insert into student values('7788004','Peter',23,'17823564231','7803');
insert into student values('7788005','Goler',19,'15678523645','7802');
insert into student values('7788006','Cosir',18,'17952635456','7803');
insert into student values('7788007','墨渐生微',19,'15642563645','7801');
commit;
-- 查询数据
select * from classs;
select * from student;
一对一:查询学生的班级信息
方式一:
public List<Student> findClasssByStuno(Map<String,String> map);
<select id="findClasssByStuno" parameterType="java.util.Map" resultMap="StudentList">
select * from student s,classs c where c.clsno=s.clsno and stuno=#{stuno}
</select>
<resultMap type="com.model.Student" id="StudentList">
<id property="stuno" column="stuno" />
<result property="sname" column="sname" />
<result property="age" column="age"/>
<result property="phone" column="phone" />
<result property="clsno" column="clsno"/>
<result property="classs.clsno" column="clsno"/>
<result property="classs.cname" column="cname"/>
<result property="classs.addr" column="addr"/>
</resultMap>
// 方式一:通过学生的编号查询班级信息
Map<String,String> map = new HashMap<String, String>();
map.put("stuno", "7788003");
List<Student> list = ism.findClasssByStuno(map);
System.out.println("查询编号为7788003的学生班级信息");
for (Student student : list) {
System.out.println(student);
}
System.out.println("\n\n");
方式二:
public List<Student> findClasssByStuno2(Map<String,String> map);
<select id="findClasssByStuno2" parameterType="java.util.Map" resultMap="StudentList2">
select * from student s,classs c where c.clsno=s.clsno and stuno=#{stuno}
</select>
<resultMap type="com.model.Student" id="StudentList2">
<id property="stuno" column="stuno" />
<result property="sname" column="sname" />
<result property="age" column="age"/>
<result property="phone" column="phone" />
<result property="clsno" column="clsno"/>
<association property="classs" column="clsno" javaType="com.model.Classs">
<result property="clsno" column="clsno"/>
<result property="cname" column="cname"/>
<result property="addr" column="addr"/>
</association>
</resultMap>
// 方式二:通过学生的编号查询班级信息
map.clear();
list.clear();
map.put("stuno", "7788003");
list = ism.findClasssByStuno2(map);
System.out.println("查询编号为7788003的学生班级信息");
for (Student student : list) {
System.out.println(student);
}
System.out.println("\n\n");
方式三:
public List<Classs> FindClasssByClsno(Map<String,String> map);
<select id="FindClasssByClsno" parameterType="java.util.Map" resultMap="ClasssList">
select * from classs where clsno=#{clsno}
</select>
<resultMap type="com.model.Classs" id="ClasssList">
<id property="clsno" column="clsno"/>
<result property="cname" column="cname"/>
<result property="addr" column="addr"/>
</resultMap>
public List<Student> findClasssByStuno3(Map<String,String> map);
<select id="findClasssByStuno3" parameterType="java.util.Map" resultMap="StudentList3">
select * from student where stuno=#{stuno}
</select>
<resultMap type="com.model.Student" id="StudentList3">
<id property="stuno" column="stuno" />
<result property="sname" column="sname" />
<result property="age" column="age"/>
<result property="phone" column="phone" />
<result property="clsno" column="clsno"/>
<association property="classs" column="clsno" select="com.mapper.IClasssMapper.FindClasssByClsno"></association>
</resultMap>
// 方式三:通过学生的编号查询班级信息
map.clear();
list.clear();
map.put("stuno", "7788003");
list = ism.findClasssByStuno3(map);
System.out.println("查询编号为7788003的学生班级信息");
for (Student student : list) {
System.out.println(student);
}
System.out.println("\n\n");
一对多:查询班级的学生信息
方式一:
public List<Classs> FindStudentsByClsno(Map<String,String> map);
<select id="FindStudentsByClsno" parameterType="java.util.Map" resultMap="ClasssList">
select * from classs c,student s where c.clsno=s.clsno and c.clsno=#{clsno}
</select>
<resultMap type="com.model.Classs" id="ClasssList">
<id property="clsno" column="clsno"/>
<result property="cname" column="cname"/>
<result property="addr" column="addr"/>
<collection property="students" column="clsno" ofType="com.model.Student">
<id property="stuno" column="stuno" />
<result property="sname" column="sname" />
<result property="age" column="age"/>
<result property="phone" column="phone" />
<result property="clsno" column="clsno"/>
</collection>
</resultMap>
// 方式一: 查询班级的学生信息通过班级编号
Map<String,String> map = new HashMap<String, String>();
map.put("clsno","7803" );
List<Classs> list = icm.FindStudentsByClsno(map);
for (Classs classs : list) {
System.out.println(classs);
}
方式二:
public List<Student> FindStudentsByClsno(Map<String,String> map);
<select id="FindStudentsByClsno" parameterType="java.util.Map" resultMap="StudentList">
select * from student where clsno=#{clsno}
</select>
<resultMap type="com.model.Student" id="StudentList">
<id property="stuno" column="stuno" />
<result property="sname" column="sname" />
<result property="age" column="age"/>
<result property="phone" column="phone" />
<result property="clsno" column="clsno"/>
</resultMap>
public List<Classs> FindStudentsByClsno2(Map<String,String> map);
<select id="FindStudentsByClsno2" parameterType="java.util.Map" resultMap="ClasssList2">
select * from classs where clsno=#{clsno}
</select>
<resultMap type="com.model.Classs" id="ClasssList2">
<id property="clsno" column="clsno"/>
<result property="cname" column="cname"/>
<result property="addr" column="addr"/>
<collection property="students" column="clsno" ofType="com.model.Student" select="com.mapper.IStudentMapper.FindStudentsByClsno"></collection>
</resultMap>
// 方式二: 查询班级的学生信息通过班级编号
map.clear();
list.clear();
map = new HashMap<String, String>();
map.put("clsno","7803" );
list = icm.FindStudentsByClsno2(map);
for (Classs classs : list) {
System.out.println(classs);
}
@Param: 声明属性
// 多条件查询:多个参数时,配置文件取值通过属性名取值,必须使用@Param(属性名)声明属性
public Student FindStudentByNameAndAge(@Param("name")String name,@Param("age")int age);
<select id="FindStudentByNameAndAge" resultType="com.model.Student">
<!-- 多个参数时,#{下标}取值可以通过下标取值 -->
<!-- select * from student where sname=#{0} and age=#{1} -->
<!-- 多个参数时,#{属性名};属性名必须使用@Param注解声明 -->
select * from student where sname=#{name} and age=#{age}
</select>
// 查询name为"Micro",年龄为21的学生信息
Student stu = ism.FindStudentByNameAndAge("Micro", 21);
System.out.println(stu);
多表联合查询:分布查询
通过学生查询班级信息
// 查询班级信息:通过班级编号
public Classs FindClasssByClsno(String clsno);
<select id="FindClasssByClsno" resultType="com.model.Classs">
select * from classs where clsno=#{clsno}
</select>
// 查询学生信息:通过学生编号
public Student findStudentBystuno(String stuno);
<select id="findStudentBystuno" resultType="com.model.Student">
select * from student where stuno=#{stuno}
</select>
// 反射
IStudentMapper ism = (IStudentMapper) db.getInterfaceSqlSession(IStudentMapper.class);
IClasssMapper icm = (IClasssMapper) db.getInterfaceSqlSession(IClasssMapper.class);
// 多表联合查询:通过学生查询班级信息
// ① 通过学生编号,查询学生信息
Student stu = ism.findStudentBystuno("7788007");
// ② 获取学生的班级编号
String clsno = stu.getClsno();
// ③ 通过班级编号,查询班级信息
Classs classs = icm.FindClasssByClsno(clsno);
// ④ 设置学生对象的班级信息
stu.setClasss(classs);
System.out.println(stu);
通过班级查询学生信息
// 查询学生信息:通过班级编号
public List<Student> findStudentByClsno(String clsno);
<select id="findStudentByClsno" resultMap="StudentList">
select * from student where clsno=#{clsno}
</select>
<resultMap type="com.model.Student" id="StudentList">
<id property="stuno" column="stuno" />
<result property="sname" column="sname" />
<result property="age" column="age"/>
<result property="phone" column="phone" />
<result property="clsno" column="clsno"/>
</resultMap>
// 查询班级信息:通过班级编号
public Classs FindClasssByClsno(String clsno);
<select id="FindClasssByClsno" resultType="com.model.Classs">
select * from classs where clsno=#{clsno}
</select>
// 反射
IStudentMapper ism = (IStudentMapper) db.getInterfaceSqlSession(IStudentMapper.class);
IClasssMapper icm = (IClasssMapper) db.getInterfaceSqlSession(IClasssMapper.class);
// 多表联合查询:通过班级查询学生信息
// ① 通过班级编号,查询班级信息
Classs classs = icm.FindClasssByClsno("7803");
// ② 获取学生的班级编号
String clsno = classs.getClsno();
// ③ 通过班级编号,查询学生信息
List<Student> students = ism.findStudentByClsno(clsno);
// ④ 设置班级对象的学生信息
classs.setStudents(students);
System.out.println(classs);
配置文件优化
<!-- 控制台打印sql语句 -->
<settings>
<setting name="logImpl" value="STDOUT_LOGGING" />
</settings>
<!-- 给全类名类型起别名: 简化映射配置文件配置 -->
<typeAliases>
<typeAlias alias="student" type="com.model.Student"/>
</typeAliases>
<!-- 采用包名获取类型,在引入的时候必须是包下面的类名: 简化映射配置文件配置-->
<typeAliases>
<package name="com.model"/>
</typeAliases>
<mappers>
<!-- 引入com.mapper包下的所有映射文件:会出现引入文件失败,资源不可找 -->
<package name="com.mapper"/>
</mappers>