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