mybatis学习第三天【跟着狂神说学习】

lombok的使用

1、在IDEA上安装lombok插件

2、在pom.xml中导入lombok类库

3、使用

Lombok注解的使用

POJO类常用注解:

@Getter/@Setter: 作用类上,生成所有成员变量的getter/setter方法;作用于成员变量上,生成该成员变量的getter/setter方法。可以设定访问权限及是否懒加载等。

package com.kaplan.pojo;

import lombok.*;

import lombok.extern.log4j.Log4j;

@Getter

@Setter

public class TestDemo {

private String name;

private int age ; private String email;

private String address; private String password;

@Getter @Setter private boolean funny;

}

@ToString:作用于类,覆盖默认的toString()方法,可以通过of属性限定显示某些字段,通过exclude属性排除某些字段。

 

 
 


@EqualsAndHashCode:作用于类,覆盖默认的equals和hashCode

@NonNull:主要作用于成员变量和参数中,标识不能为空,否则抛出空指针异常。

 

 
 

@NoArgsConstructor, @RequiredArgsConstructor, @AllArgsConstructor:作用于类上,用于生成构造函数。有staticName、access等属性。

staticName属性一旦设定,将采用静态方法的方式生成实例,access属性可以限定访问权限。

@NoArgsConstructor:生成无参构造器;

@RequiredArgsConstructor:生成包含final和@NonNull注解的成员变量的构造器;

@AllArgsConstructor:生成全参构造器

 

 
 

@Data:作用于类上,是以下注解的集合:@ToString @EqualsAndHashCode @Getter @Setter @RequiredArgsConstructor

@Builder:作用于类上,将类转变为建造者模式

@Log:作用于类上,生成日志变量。针对不同的日志实现产品,有不同的注解:



多对一处理:

结果映射(resultMap)

  • constructor - 用于在实例化类时,注入结果到构造方法中
    • idArg - ID 参数;标记出作为 ID 的结果可以帮助提高整体性能
    • arg - 将被注入到构造方法的一个普通结果
  • id – 一个 ID 结果;标记出作为 ID 的结果可以帮助提高整体性能
  • result – 注入到字段或 JavaBean 属性的普通结果
  • association – 一个复杂类型的关联;许多结果将包装成这种类型
    • 嵌套结果映射 – 关联可以是 resultMap 元素,或是对其它结果映射的引用
  • collection – 一个复杂类型的集合
    • 嵌套结果映射 – 集合可以是 resultMap 元素,或是对其它结果映射的引用
  • discriminator – 使用结果值来决定使用哪个 resultMap
    • case – 基于某些值的结果映射
      • 嵌套结果映射 – case 也是一个结果映射,因此具有相同的结构和元素;或者引用其它的结果映射
ResultMap 的属性列表
属性描述
id 当前命名空间中的一个唯一标识,用于标识一个结果映射。
type 类的完全限定名, 或者一个类型别名(关于内置的类型别名,可以参考上面的表格)。
autoMapping 如果设置这个属性,MyBatis 将会为本结果映射开启或者关闭自动映射。 这个属性会覆盖全局的属性 autoMappingBehavior。默认值:未设置(unset)。

最佳实践 最好逐步建立结果映射。单元测试可以在这个过程中起到很大帮助。 如果你尝试一次性创建像上面示例那么巨大的结果映射,不仅容易出错,难度也会直线上升。 所以,从最简单的形态开始,逐步迭代。而且别忘了单元测试! 有时候,框架的行为像是一个黑盒子(无论是否开源)。因此,为了确保实现的行为与你的期望相一致,最好编写单元测试。 并且单元测试在提交 bug 时也能起到很大的作用。

下一部分将详细说明每个元素。

 

对于一对多,我们使用集合:collection,而对于多对一则是使用关联:association

javaType & ofType

javaType 用来指定实体类中属性的类型

ofType用来指定映射到list或集合中的Pojo类型,泛型中的约束类型

注意点:

1、保证SQL的可读性,尽量保证通信易懂

2、注意一对多和多对一中,属性和字段的问题

3、如果问题不好排查错误,可以使用日志,建议使用log4j

以下是多对一的代码示例:多个学生对应一个老师:

备注:实例都使用了lombok插件

实体类代码:Teacher类和Student类

package com.fengfang.domain;

import lombok.Data;

/**
 * @Description TODO
 * @Author liuxh
 * @Date 2020/8/6 11:27
 **/
@Data
public class Teacher {
    private int id;
    private String name;
}
package com.fengfang.domain;

import lombok.Data;

/**
 * @Description TODO
 * @Author liuxh
 * @Date 2020/8/6 11:26
 **/
@Data
public class Student {
    private int id;
    private String name;
    private Teacher teacher;
}

dao实体类

package com.fengfang.dao;

import com.fengfang.domain.Student;

import java.util.List;

/**
 * @Description TODO
 * @Author liuxh
 * @Date 2020/8/6 11:29
 **/
public interface IStudentDao {
    /**
     * 使用子查询方法
     * @return
     */
    public List<Student> findAll();

    /**
     * 使用结果查询方法
     * @return
     */
    public List<Student> findAll2();
}

配置映射文件:使用子查询和结果查询的方法配置

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.fengfang.dao.IStudentDao">
<!--按照查询方法处理-->
    <resultMap id="studentTeacher" type="student">
        <id column="id" property="id"></id>
        <result column="name" property="name"></result>
<!--复杂的属性,我们要单独处理
        association 使用对象
        collection  集合
-->
        <collection property="teacher" column="tid" javaType="Teacher" select="getTeacher">
            <id column="id" property="id" />
            <collection property="name" column="name"/>
        </collection>
    </resultMap>
    <select id="findAll" resultMap="studentTeacher">
        select * from student
    </select>
    <select id="getTeacher" resultType="Teacher">
        select * from teacher where id=#{id}
    </select>
<!--按照结果嵌套处理-->
    <resultMap id="studentTeacher2" type="Student">
        <id column="sid" property="id"/>
        <result column="sname" property="name"/>
        <association property="teacher" javaType="Teacher">
            <id column="tid" property="id"/>
            <result column="tname" property="name"/>
        </association>
    </resultMap>
    <select id="findAll2" resultMap="studentTeacher2">
        select s.id as sid,s.name as sname,t.name tname,t.id as tid
        from student s ,teacher t where s.tid=t.id
    </select>
</mapper>

测试结果如下:

 

以下代码安全为多对一安全,即一个老师有多个学生

dao实体类代码以下:

package com.fengfang.domain;

import lombok.Data;
import org.junit.Test;

/**
 * @Description TODO
 * @Author liuxh
 * @Date 2020/8/6 11:26
 **/
@Data
public class Student {
    private int id;
    private String name;
}
package com.fengfang.domain;

import lombok.Data;

import java.util.List;

/**
 * @Description TODO
 * @Author liuxh
 * @Date 2020/8/6 11:27
 **/
@Data
public class Teacher {
    private int id;
    private String name;
    private List<Student> studentList;
}

Dao接口类

package com.fengfang.dao;

import com.fengfang.domain.Teacher;
import org.apache.ibatis.annotations.Select;

import java.util.List;

/**
 * @Description TODO
 * @Author liuxh
 * @Date 2020/8/6 11:29
 **/
public interface ITeacherDao {

    public List<Teacher> findAll();

    public List<Teacher> findAll2();

}

结果映射文件:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.fengfang.dao.ITeacherDao">
<!--    对过结果查询来查询一对多关系-->
    <resultMap id="teacherStudent" type="Teacher">
        <id column="id" property="id"/>
        <result column="name" property="name"/>
        <collection property="studentList" ofType="Student">
            <result column="sid" property="id"/>
            <result column="sname" property="name" />
            <result column="tid" property="tid"/>
        </collection>
    </resultMap>
    <select id="findAll" resultMap="teacherStudent">
        select s.id as sid,s.name as sname,t.id,t.name
         from student s ,teacher t where s.tid=t.id
    </select>
<!--    通过子查询来查询一对多方式-->
    <resultMap id="teacherStudent2" type="teacher">
        <id column="id" property="id" />
        <result column="name" property="name" />
        <collection property="studentList"  javaType="ArrayList" ofType="Student" select="getStudent" column="id">
        </collection>

    </resultMap>
    <select id="getStudent" resultType="Student">
        select * from student where tid=#{tid}
    </select>
    <select id="findAll2" resultMap="teacherStudent2">
        select * from teacher
    </select>
</mapper>

测试结果代码:

 

后续还要学习

  • mysql引擎
  • InnoDB底层原理
  • 索引
  • 索引优化

 

posted @ 2020-08-07 15:37  aaron616  阅读(154)  评论(0)    收藏  举报