lidaye2396

博客园 首页 新随笔 联系 订阅 管理

11、一对多处理

一个老师多个学生;

对于老师而言,就是一对多的关系;

1. 环境搭建

实体类

@Data
public class Student {
   private int id;
   private String name;
   private int tid;
}
123456
@Data
public class Teacher {
   private int id;
   private String name;

   //一个老师拥有多个学生
   private List<Student> students;
}
12345678

2. 按照结果嵌套嵌套处理

<!--按结果嵌套查询-->
<select id="getTeacher" resultMap="StudentTeacher">
  SELECT s.id sid, s.name sname,t.name tname,t.id tid FROM student s, teacher t
  WHERE s.tid = t.id AND tid = #{tid}
</select>
<resultMap id="StudentTeacher" type="Teacher">
   <result property="id" column="tid"/>
   <result property="name" column="tname"/>
   <!--复杂的属性,我们需要单独处理 对象:association 集合:collection
   javaType=""指定属性的类型!
   集合中的泛型信息,我们使用ofType获取
   -->
   <collection property="students" ofType="Student">
       <result property="id" column="sid"/>
       <result property="name" column="sname"/>
       <result property="tid" column="tid"/>
   </collection>
</resultMap>
123456789101112131415161718

小结

  1. 关联 - association 【多对一】

  2. 集合 - collection 【一对多】

  3. javaType & ofType

    1. JavaType用来指定实体类中的类型

    2. ofType用来指定映射到List或者集合中的pojo类型,泛型中的约束类型

注意点:

  • 保证SQL的可读性,尽量保证通俗易懂

  • 注意一对多和多对一,属性名和字段的问题

  • 如果问题不好排查错误,可以使用日志,建议使用Log4j

面试高频

  • Mysql引擎

  • InnoDB底层原理

  • 索引

  • 索引优化

12、动态SQL

什么是动态SQL:动态SQL就是根据不同的条件生成不同的SQL语句

所谓的动态SQL,本质上还是SQL语句,只是我们可以在SQL层面,去执行一个逻辑代码


动态 SQL 是 MyBatis 的强大特性之一。如果你使用过 JDBC 或其它类似的框架,你应该能理解根据不同条件拼接 SQL 语句有多痛苦,例如拼接时要确保不能忘记添加必要的空格,还要注意去掉列表最后一个列名的逗号。利用动态 SQL,可以彻底摆脱这种痛苦。

搭建环境

CREATE TABLE `mybatis`.`blog` (
`id` int(10) NOT NULL AUTO_INCREMENT COMMENT '博客id',
`title` varchar(30) NOT NULL COMMENT '博客标题',
`author` varchar(30) NOT NULL COMMENT '博客作者',
`create_time` datetime(0) NOT NULL COMMENT '创建时间',
`views` int(30) NOT NULL COMMENT '浏览量',
PRIMARY KEY (`id`)
)
12345678

创建一个基础工程

  1. 导包

  2. 编写配置文件

  3. 编写实体类

    @Data
    public class Blog {
       private int id;
       private String title;
       private String author;

       private Date createTime;// 属性名和字段名不一致
       private int views;
    }
    123456789
  4. 编写实体类对应Mapper接口和Mapper.xml文件

IF

<select id="queryBlogIF" parameterType="map" resultType="blog">
  select * from blog
   <where>
       <if test="title!=null">
          and title = #{title}
       </if>
       <if test="author!=null">
          and author = #{author}
       </if>
   </where>
</select>
1234567891011

choose (when, otherwise)

trim、where、set

SQL片段

有的时候,我们可能会将一些功能的部分抽取出来,方便服用!

  1. 使用SQL标签抽取公共部分可

    <sql id="if-title-author">
       <if test="title!=null">
          title = #{title}
       </if>
       <if test="author!=null">
          and author = #{author}
       </if>
    </sql>
  2. 在需要使用的地方使用Include标签引用即可

    <select id="queryBlogIF" parameterType="map" resultType="blog">
      select * from blog
       <where>
           <include refid="if-title-author"></include>
       </where>
    </select>

注意事项:

  • 最好基于单标来定义SQL片段

  • 不要存在where标签

动态SQL就是在拼接SQL语句,我们只要保证SQL的正确性,按照SQL的格式,去排列组合就可以了

建议:

    • 先在Mysql中写出完整的SQL,再对应的去修改成我们的动态SQL实现通用即可

posted on 2021-04-09 11:11  lidaye2396  阅读(49)  评论(0编辑  收藏  举报