第四章 关联映射和优化

版权声明:本文为博主原创文章,未经博主允许不得转载 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>

猜你喜欢

转载自blog.csdn.net/Mythology_px/article/details/82891956