发表于: 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




返回列表 返回列表
评论

    分享到