第四章 關聯映射和優化

               數據庫表與表之間是有關聯關係的, 需要在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>

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章