发表于: 2018-10-18 23:34:04
1 514
今日完成:
1.开启项目debug模式
第一组按钮
> Show Execution Point (Alt + F10):如果你的光标在其它行或其它页面,点击这个按钮可跳转到当前代码执行的行。
> Step Over (F8):步过,一行一行地往下走,如果这一行上有方法不会进入方法。
> Step Into (F7):步入,如果当前行有方法,可以进入方法内部,一般用于进入自定义方法内,不会进入官方类库的方法,如第25行的put方法。
> Force Step Into (Alt + Shift + F7):强制步入,能进入任何方法,查看底层源码的时候可以用这个进入官方类库的方法。
> Step Out (Shift + F8):步出,从步入的方法内退出到方法调用处,此时方法已执行完毕,只是还没有完成赋值。
> Drop Frame (默认无):回退断点,后面章节详细说明。
> Run to Cursor (Alt + F9):运行到光标处,你可以将光标定位到你需要查看的那一行,然后使用这个功能,代码会运行至光标行,而不需要打断点。
> Evaluate Expression (Alt + F8):计算表达式
第二组按钮
> Rerun 'xxxx':重新运行程序,会关闭服务后重新启动程序。
> Update 'tech' application (Ctrl + F5):更新程序,一般在你的代码有改动后可执行这个功能。而这个功能对应的操作则是在服务配置里,如图2.3。
> Resume Program (F9):恢复程序,比如,你在第20行和25行有两个断点,当前运行至第20行,按F9,则运行到下一个断点(即第25行),再按F9,则运行完整个流程,因为后面已经没有断点了。
> Pause Program:暂停程序,启用Debug。目前没发现具体用法。
> Stop 'xxx' (Ctrl + F2):连续按两下,关闭程序。有时候你会发现关闭服务再启动时,报端口被占用,这是因为没完全关闭服务的原因,你就需要查杀所有JVM进程了。
> View Breakpoints (Ctrl + Shift + F8):查看所有断点,后面章节会涉及到。
> Mute Breakpoints:哑的断点,选择这个后,所有断点变为灰色,断点失效,按F9则可以直接运行完程序。再次点击,断点变为红色,有效。如果只想使某一个断点失效,可以在断点上右键取消Enabled,如图2.4,则该行断点失效。
查看变量变化
debug博客链接:https://www.cnblogs.com/xzhuan/articles/ideaDebug.html
2.mybatis一对多
1)关系和需求
关系
一个教师可以讲多门课程
一门课程只能被一个老师讲
需求
根据教师名字查询教师教哪些课程
根据课程名字查看是哪个老师教
2)设计数据库表
//teacher表
create table teacher(
t_id int(5) primary key ,
t_name varchar(10)
);
//课程表
create table course(
c_id int(5) primary key ,
c_name varchar(10) ,
teacher_id int(5) ,
constraint teacher_id_fk foreign key(teacher_id) references teacher(t_id)
);
teacher表记录
course表记录
3)设计实体
public class Teacher {
private int tid;
private String tname;
private List<Course> courses = new ArrayList<Course>();//关联属性
public Teacher() {}
getter setter
public class Course {
private int cId;
private String cName;
private int teacherId;
private Teacher teacher;//关联属性
public Course() {}
getter setter
4)创建mapper接口
public interface O2mMapper {
//根据教师名字查询教师教哪些课程
public List<Course> queryCourseByTeacherName(String teacherName);
//根据课程名字查看是哪个老师教
public Teacher queryTeacherByCourseName(String courseName);
//根据教师id查询教师id,教师姓名,所讲的课程信息
public Teacher queryTeacherAndCoursesByTeacerId(int teacherId);
}
5)创建mapper文件
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.jnshu.mybatis.dao.O2mMapper">
<select id="queryCourseByTeacherName" resultMap="CourseResult" parameterType="String">
select * from course c ,teacher t
where c.teacher_id = t.t_id and t.t_name = #{teacherName}
</select>
<select id="queryTeacherByCourseName" resultMap="TeacherResult" parameterType="String">
select t.t_id,t.t_name from teacher t,course c
where c.c_name = #{courseName} and t.t_id = c.teacher_id
</select>
<select id="queryTeacherAndCoursesByTeacerId" parameterType="int" resultMap="TeacherAndCoursesResult">
select t_id,t_name,c_id,c_name from teacher t left join course c
on t.t_id = c.teacher_id
where t_id=#{teacherId}
</select>
<resultMap id="CourseResult" type="Course">
<id property="cId" column="c_id"/>
<result property="cName" column="c_name"/>
<result property="teacherId" column="teacher_id"/>
<association property="teacher" javaType="Teacher" resultMap="TeacherResult"/>
</resultMap>
<resultMap id="TeacherResult" type="Teacher">
<id property="tid" column="t_id"/>
<result property="tname" column="t_name"/>
</resultMap>
<resultMap id="TeacherAndCoursesResult" type="Teacher">
<id property="tid" column="t_id"/>
<result property="tname" column="t_name"/>
<collection property="courses" ofType="Course" column="c_id">
<id property="cId" column="c_id"/>
<result property="cName" column="c_name"/>
<result property="teacherId" column="teacher_id"/>
</collection>
</resultMap>
</mapper>
6)编写测试类
public class O2mMapperTest {
@Test
public void queryCourseByTeacherName() {
SqlSession sqlSession = MybatisSqlSessionFactory.openSession();
O2mMapper mapper = sqlSession.getMapper(O2mMapper.class);
List<Course> courses = mapper.queryCourseByTeacherName("小明");
for (Course course:courses) {
System.out.println("课程id:"+course.getcId()+"\t课程名:"+course.getcName()
+"\t讲课老师:"+course.getTeacher().getTname());
}
}
@Test
public void queryTeacherByCourseName() {
SqlSession sqlSession = MybatisSqlSessionFactory.openSession();
O2mMapper mapper = sqlSession.getMapper(O2mMapper.class);
Teacher teacher = mapper.queryTeacherByCourseName("java");
System.out.println("教师id:"+teacher.getTid()+
"\t教师姓名:"+teacher.getTname());
}
@Test
public void queryTeacherAndCoursesByTeacerId() {
SqlSession sqlSession = MybatisSqlSessionFactory.openSession();
O2mMapper mapper = sqlSession.getMapper(O2mMapper.class);
Teacher teacher = mapper.queryTeacherAndCoursesByTeacerId(1);
List<Course> courses = teacher.getCourses();
System.out.println("教师id:"+teacher.getTid()+
"\t教师姓名:"+teacher.getTname());
for (Course course:courses) {
System.out.println("课程id:"+course.getcId()+"\t课程名:"+course.getcName());
}
}
}
7)运行查看结果
queryCourseByTeacherName
queryTeacherByCourseName
queryTeacherAndCoursesByTeacerId
3.mybatis多对多
mybatis中多对多的处理可以构建一个中间的表,通过这个中间表将多对多拆分为一对多
学生和课程:多对多中经典的实例关系
由于学生student和课程course被前面的一对一和一对多练习所占用,而我又是一个比较怕麻烦的人,就不想再去改表了,直接创两张新表。用拼音表示其名字。
1)设计数据库表
//学生表
create table xuesheng(
id int(5) primary key ,
stud_name varchar(10)
);
//课程表
create table kecheng(
id int(5) primary key ,
course_name varchar(10)
);
//学生课程表
create table student_course(
id int(5) primary key ,
s_id int(5) references xuesheng(id),
c_id int(5) references kecheng(id)
);
2)设计实体bean
public class Xuesheng {
private int id;
private String name;
private List<Kecheng> kechengs =new ArrayList<Kecheng>();
public Xuesheng() {
}
public Xuesheng(int id, String name) {
this.id = id;
this.name = name;}
getter setter
public class Kecheng {
private int id;
private String name;
private List<Xuesheng> xueshengs = new ArrayList<Xuesheng>();
public Kecheng() {
}
public Kecheng(int id, String name) {
this.id = id;
this.name = name;}
getter setter
3)mapper接口
public interface M2mMapper {
//添加一个新的学生信息
public void saveXuesheng(Xuesheng xuesheng);
//添加一门新的选修课
public void saveKecheng(Kecheng kecheng);
//新来的学生选修了新开设的选修课。
public void xueshengSelectKecheng(Xuesheng xuesheng,Kecheng kecheng);
//通过一个学生的id,查询出此学生的学生信息及所选选修课信息
public Xuesheng queryXueshengAndKechengBystuId(int xid);
//通过一个选修课的id,查询出此选修课的信息及所有选修本课的学生信息
public Kecheng queryKechengAndXueshengByCourId(int kid);
}
4)映射文件
<mapper namespace="com.jnshu.mybatis.dao.M2mMapper">
<insert id="saveXuesheng" parameterType="Xuesheng">
insert into xuesheng (id, stud_name) values (#{id},#{name})
</insert>
<insert id="saveKecheng" parameterType="Kecheng">
insert into kecheng (id, course_name) values (#{id},#{name})
</insert>
<insert id="xueshengSelectKecheng" useGeneratedKeys="true" keyProperty="id" >
<selectKey keyProperty="id" order="AFTER" resultType="int">
select LAST_INSERT_ID()
</selectKey>
insert into student_course (s_id,c_id) values (#{param1.id},#{param2.id})
</insert>
<select id="queryXueshengAndKechengBystuId" resultMap="XueshengResult">
select x.id as xid,stud_name,k.id as kid,course_name
from xuesheng x,kecheng k,student_course sc
where x.id=sc.s_id and k.id=sc.c_id and x.id=#{xid}
</select>
<select id="queryKechengAndXueshengByCourId" resultMap="KechengResult">
select x.id as xid,stud_name,k.id as kid,course_name
from xuesheng x,kecheng k,student_course sc
where x.id=sc.s_id and k.id=sc.c_id and k.id=#{kid}
</select>
<resultMap id="XueshengResult" type="Xuesheng">
<id property="id" column="xid"/>
<result property="name" column="stud_name"/>
<collection property="kechengs" ofType="Kecheng" column="kid">
<id property="id" column="kid"/>
<result property="name" column="course_name"/>
</collection>
</resultMap>
<resultMap id="KechengResult" type="Kecheng">
<id property="id" column="kid"/>
<result property="name" column="course_name"/>
<collection property="xueshengs" ofType="Xuesheng" column="xid">
<id property="id" column="xid"/>
<result property="name" column="stud_name"/>
</collection>
</resultMap>
</mapper>
5)测试类
package com.jnshu.mybatis.dao;
import com.jnshu.mybatis.common.bean.Kecheng;
import com.jnshu.mybatis.common.bean.Xuesheng;
import com.jnshu.mybatis.common.utils.MybatisSqlSessionFactory;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;
import java.util.List;
public class M2mMapperTest {
@Test
public void saveXuesheng() {
SqlSession sqlSession = MybatisSqlSessionFactory.openSession();
try {
Xuesheng xuesheng = new Xuesheng(3,"tony");
M2mMapper mapper = sqlSession.getMapper(M2mMapper.class);
mapper.saveXuesheng(xuesheng);
sqlSession.commit();
} catch (Exception e) {
e.printStackTrace();
sqlSession.rollback();
} finally {
sqlSession.close();
}
}
@Test
public void saveKecheng() {
SqlSession sqlSession = MybatisSqlSessionFactory.openSession();
try {
Kecheng kecheng = new Kecheng(2,"c++");
M2mMapper mapper = sqlSession.getMapper(M2mMapper.class);
mapper.saveKecheng(kecheng);
sqlSession.commit();
} catch (Exception e) {
e.printStackTrace();
sqlSession.rollback();
} finally {
sqlSession.close();
}
}
@Test
public void xueshengSelectKecheng() {
SqlSession sqlSession = MybatisSqlSessionFactory.openSession();
try {
Xuesheng xuesheng = new Xuesheng(3,"jack");
Kecheng kecheng = new Kecheng(2,"java");
M2mMapper mapper = sqlSession.getMapper(M2mMapper.class);
mapper.xueshengSelectKecheng(xuesheng,kecheng);
sqlSession.commit();
} catch (Exception e) {
e.printStackTrace();
sqlSession.rollback();
} finally {
sqlSession.close();
}
}
@Test
public void queryXueshengAndKechengBystuId() {
SqlSession sqlSession = MybatisSqlSessionFactory.openSession();
M2mMapper mapper = sqlSession.getMapper(M2mMapper.class);
Xuesheng xuesheng = mapper.queryXueshengAndKechengBystuId(1);
List<Kecheng> kechengs = xuesheng.getKechengs();
System.out.println("id为"+xuesheng.getId()+" 姓名为"+xuesheng.getName()+
"的学生选了"+kechengs.size()+"门课程。\n分别是:"+kechengs.get(0).getName()+
"和"+kechengs.get(1).getName());
}
@Test
public void queryKechengAndXueshengByCourId() {
SqlSession sqlSession = MybatisSqlSessionFactory.openSession();
M2mMapper mapper = sqlSession.getMapper(M2mMapper.class);
Kecheng kecheng = mapper.queryKechengAndXueshengByCourId(2);
List<Xuesheng> xueshengs = kecheng.getXueshengs();
System.out.println(kecheng.getName()+"这门课程有"+xueshengs.size()+"名学生选择");
System.out.println("分别是:\n"+xueshengs.get(0).getName());
System.out.println(xueshengs.get(1).getName());
System.out.println(xueshengs.get(2).getName());
}
}
6)测试类运行结果
queryXueshengAndKechengBystuId
queryKechengAndXueshengByCourId
一对多掌握了之后,多对多就水到渠成了
今天完成:mybatis的一对一和多对多,任务一task21
收获;mybatis中一对一,一对多,多对多的关系,至于mybatis中的其他知识点,比如动态sql,分页查询和类型转换等知识就留到以后项目中用到再去学吧。
遇到的问题:没有深入理解resultmap,把它想得过于复杂了,他就是一个处理结果集映射一个方式。想通了写起来还是很快的。
明天:任务一步骤19
评论