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 也是一个结果映射,因此具有相同的结构和元素;或者引用其它的结果映射
- case – 基于某些值的结果映射
| 属性 | 描述 |
|---|---|
| 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底层原理
- 索引
- 索引优化

浙公网安备 33010602011771号