JavaEE——Mybatis(6)–association的分步查询以及延迟加载 以及Collection和鉴别器discriminatormybatis学习笔记。

使用association进行分步查询:(一般,部门什么的会见生和好之Mappper,所以一直运用就吓,不用还重复自己写)
1、先随学生id查询学生信息
2、根据查询学生信息中的grade_id值去班级表查出班级信息
3、班级设置到学生着;

以employee为例

association定义关联对象的卷入规则
  select:表明当前性能是调用select指定的方法查出的结果
  column:指定将哪一列的值传给这个措施 注意不光要所有用智所在的mapper ,还要来该措施的讳  com.dao.GradeMapper.getGradeById

1.概括询问:

  property:指定的习性
  流程:使用select指定的艺术(传入column指定的即排参数的值)查出对象,并打包给property指定的性质

/**
  1.接口式编程
  原生: dao –> daoimpl
  mybatis: mapper —> xxMapper.xml
 
  2.SqlSession 象征与数据库的同等不成对话:用了得关闭
 
3.SqlSession暨connection一样都是非线程安全,每次用还应该去抱新的目标
  4 mapper接口没有落实类似,但是mybatis会为之接口生成代理对象。
       (将接口及xml进行绑定)
       EmployeeMapper empMapper =
SqSession.getMapper(EmployeeMapper.class)
  5.零星单第一的布文件:
       mybatis的全局配置文件,包含数据库连接池信息,事务管理器信息相当。。。系统运行环境信息
         sql映射文件:保存了各国一个sql语句之映照信息:
           将sql抽取出来。
 
 

<!--public Students getStuAndGradeStep(Integer id);-->
<resultMap id="StuByStep" type="com.person.Students">
    <id column="id" property="id"/>
    <result column="name" property="name"/>
    <result column="sex" property="sex"/>
    <result column="age" property="age"/>

    <!-- association定义关联对象的封装规则
select:表明当前属性是调用select指定的方法查出的结果
column:指定将哪一列的值传给这个方法

流程:使用select指定的方法(传入column指定的这列参数的值)查出对象,并封装给property指定的属性
-->
    <association property="grade" select="com.dao.GradeMapper.getGradeById" column="grade_id">

    </association>
</resultMap>
<select id="getStuAndGradeStep" resultMap="StuByStep">
    SELECT * FROM student WHERE id=#{id}
</select>

2.dtd束缚绑定-mybatis.config.xml快捷键:(其他绑定雷同)

   其中GradeMapper.xml中之法

   
1.通过mybaits-版本(3.4.1)-jar包-org.apache.ibatis.builder.xml-找到mybatis-3-config.dtd和mybatis-3-mapper.dtd

<!--public Grade getGradeById(Integer id);-->
    <select id="getGradeById" resultType="com.person.Grade">
        SELECT * FROM grade WHERE id=#{id}
    </select>

   
把这半只dtd文件解压到指定文件夹,复制mybatis.config.xml文件的(http://mybatis.org/dtd/mybatis-3-config.dtd)url.

  GradeMapper接口中

    2.开拓window-preferences-xml-xml
catalog,点击add 在key里输入复制的url,key type选择url,在location选择file
S有stem找到你抽的相应之dtd文件

public Grade getGradeById(Integer id);

3.properties布置文件书写注意要求:

  

    1、名用大写比较标准

association使用缓加载(懒加载);(按需加载)
Students==>Grade:
咱每次查询Students对象的时,都用合查询出来。
班级信息以我们使用的时段还错过询问;
分段查询的基本功之上加上两只布局:

    2、=两止转移打空格

加在mybatis-config.xml里面

    3、名值对勾了后变卦打分号

<settings>
        <!--显示的指定每个我们需要更改的配置的值,即使他是默认的。防止版本更新带来的问题  -->
        <setting name="lazyLoadingEnabled" value="true"/>
        <setting name="aggressiveLazyLoading" value="false"/>
    </settings>

1.全局配置文件_properties标签说明:
     mybatis可以下properties引入外部properties配置文件之始末
     resource:引入类路径下的资源
     url:引入网络路径或者磁盘路径下的资源

  

2.全局配置文件_settings_设置项:

场景二:
  查询班级的早晚将班级对应之所有学员信息为询问出来:

    settings包含众多要之装置项
    setting:用来设置各一个设置项
    name:设置项名
    value:设置项取值

SELECT g.id id, g.grade_name gradeName, s.id stuId, s.name name, s.sex sex, s.age age 
FROM grade g LEFT JOIN student s ON g.id=s.grade_id WHERE g.id=2

实例:  <setting name=”mapUnderscoreToCamelCase” value=”true”/>

  

3.全局配置文件_typeAliases_别名处理器:

注释在GradeMapper.xml中

   typeAlias:为某java类型起别名 
   type:指定要由别名的全类名;默认别叫就是是近似名有点写;employee
   alias:指定新的号

<!-- public List<Employee> getEmpsByDeptId(Integer deptId); -->
<select id="getEmpsByDeptId" resultType="com.atguigu.mybatis.bean.Employee">
    select * from tbl_employee where d_id=#{deptId}
</select>

   package:为某某包下的所有类批量自别名
   name:指定包名(为即保跟下有的后包的各国一个像样都于一个默认别名(类名小写)) 

  DepartmentMapper.xml

实例:   <package name=”com.atguigu.mybatis.bean”/>

collection标签:概念关联集合类型的习性之包裹规则
         ofType:指定集合里面元素的路

4.全局配置文件_environments_环境布置:

<?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.dao.GradeMapper">

public class Grade {
    private Integer id;
    private String gradeName;
    private List<Students> students;

    <!--嵌套结果集的方式,使用collection标签定义关联的集合类型的属性封装规则  -->
    <!--public Grade getGradeAndStuById(Integer id);-->
    <resultMap id="GradeAndStu" type="com.person.Grade">
        <id column="id" property="id"/>
        <result column="gradeName" property="gradeName"/>
        <!--
            collection定义关联集合类型的属性的封装规则
            ofType:指定集合里面元素的类型
        -->
        <collection property="students" ofType="com.person.Students">
            <!-- 定义这个集合中元素的封装规则 -->
            <id column="stuId" property="id"/>
            <result column="name" property="name"/>
            <result column="sex" property="sex"/>
            <result column="age" property="age"/>
        </collection>

    </resultMap>
    <select id="getGradeAndStuById" resultMap="GradeAndStu">
        SELECT g.id id, g.grade_name gradeName,
         s.id stuId, s.name name,
         s.sex sex, s.age age
         FROM grade g
         LEFT JOIN student s ON g.id=s.grade_id
         WHERE g.id=#{id}
    </select>
</mapper>

   environments:环境等,mybatis可以配备多种环境
default指定使用某种环境好达成快速切换
   environment:配置一个具体的环境信息;必须来一定量个标签,
id代表时条件之唯一标识
   transactionManager:事务管理器
   type:事务管理器的色;JDBC(JdbcTransactionFactory)|MANAGED(ManagedTransactionFactory)
   自定义事务管理器:实现TransactionFactory接口.type指定为全类名
   dataSource:数据源;UNPOOLED | POOLED | JNDI 
   type:数据源类型:UNPOOLED | POOLED | JNDI

  collection的分步查询

实例:
 图片 1

<!--public Grade getGradeAndStuByIdStep(Integer id);-->
    <resultMap id="GradeAndStuByStep" type="com.person.Grade">
        <id column="id" property="id"/>
        <result column="gradeName" property="gradeName"/>
        <collection property="students"
                    select="com.dao.StudentMapperPlus.getStuByGradeId"
                    column="id"></collection>
    </resultMap>
    <select id="getGradeAndStuByIdStep" resultMap="GradeAndStuByStep">
        SELECT id, grade_name gradeName FROM grade WHERE id=#{id}
    </select>

5.全局配置文件_databaseIdProvider_大部分据库支持:

  以StudentMapper中发生getStuByGradeId方法来冲班级从学生说明中查询学生信息

    type=”DB_VENDOR”:VendorDatabaseIDProvider
   
作用就是是得数据库厂商的标识(驱动),mybatis就会因数量厂商标识来施行不同之sql
    MySQL,Orace,SQL Server,xxxx…

 

实例:

<!--public List<Students> getStuByGradeId(Integer grade_id);-->
    <select id="getStuByGradeId" resultType="com.person.Students">
        SELECT * FROM student WHERE grade_id=#{grade_id}
    </select>

图片 2

 

6.全局配置文件_mappers_登记一个sql映射:

<!– 扩展:多列的价传递过去:
用大半排的价值封装map传递;
column=”{key1=column1,key2=column2}”
fetchType=”lazy”:表示以延缓加载;

    mapper:注册一个sql映射
    注册配置文件
    resource:引用类路径下之sql映射文件
    url:引用网络路径或者磁盘路径下之sql映射文件
    注册接口
    class:引用(注册)接口,
    1.起sql映射文件,映射文件称必须和接口同名,并且在同接口同一包下
    2.并未sql映射文件,所有的sql都是使用注解写以接口及;
    推荐:
    比较重大之Dao接口我们来写sql映射文件
    不根本之Dao接口为了支付快速可以使用注解            

  • lazy:延迟
  • eager:立即
    –>

无sql映射文件写法:<mapper
class=”com.atguigu.mybatis.dao.EmployeeMapperAnnotation”/>

 

图片 3

 鉴别器

生sql映射文件写法:<mapper
resource=”mybatis/mapper/EmployeeMapper.xml”/>

<!– <discriminator javaType=””></discriminator>
  鉴别器:mybatis可以动用discriminator判断某列的价值,然后因某列的价改变封装行为
    封装Students:
    如果得知的是女生:就将班级信息查询出来,否则不查询;
    如果是男生,把id这同排列的价赋值给age;
–>

图片 4

  

mybatis对数据库的增删查改操作:

<!--public Students getStuByIdDiscriminator(Integer id);-->
    <resultMap id="Discriminator" type="com.person.Students">
        <id column="id" property="id"/>
        <result column="name" property="name"/>
        <result column="sex" property="sex"/>
        <result column="age" property="age"/>
        <!--
            column:指定判定的列名
            javaType:列值对应的java类型  -->
        <discriminator javaType="String" column="sex">
            <case value="girl" resultType="com.person.Students">
                <association property="grade" select="com.dao.GradeMapper.getGradeById" column="gid"></association>
            </case>
            <case value="boy" resultType="com.person.Students">
                <result column="id" property="age"/>
            </case>
        </discriminator>

    </resultMap>
    <select id="getStuByIdDiscriminator" resultMap="Discriminator">
        SELECT s.id id, s.name name, s.sex sex, s.age age, g.id gid, g.grade_name gradename FROM student s, grade g
        WHERE s.grade_id=g.id AND s.id=#{id}
    </select>

     mybatis允许增删改直接定义一下类别的返回值
     Integer,long,boolean,void
     我们要手动提交数据
     sessionFactory.openSession()==>手动提交
     sessionFactory.openSession(true)==>自动提交

  

 首先要定义一个接口类 ,写及增删查改方法,然后在部署文件上描绘上加码删查改四只标签(id为类名),利用test类实现接口

查询:

图片 5

图片 6

删除: 

图片 7

图片 8

增加:

图片 9

图片 10

 修改:

图片 11

图片 12

赢得自增主键:

图片 13

 

 mybatis_辉映文件_参数处理:

 单个参数:mybatis不会见召开特处理
 #{参数称呼}:取出参数值

实例:

图片 14

 

 

 多个参数:mybatis会做特处理
     多只参数会让封装成一个map,
     key:param1….paramN
     value:传入的参数值
     #{}就是自map中获取指定的key的价

荒谬实例:(不以接口方法的参数里定义map集合类或者@Parma注解直接行使employee方法的变量名是拂的)
图片 15

毋庸置疑实例:
布局文件内 使用parma1 和 Parma2 作为字段名 :
图片 16

 操作:

    方法:public Employee getEmpByIdAndLastName(Integer id,String
lastName);
    取值:#{id},#{lastName}

 取名参数:明确指定封装参数值map的key;@Param(“id”)
     多个参数会受封装成一个map,
     key:使用@param注解指定的价
     value:参数值
     #{指定的key}取出对应之参数值

实例:

 图片 17

当接口方法以注解@param设置,就可直接在部署文件查询关键字之询问艺术的规则里直接写副注解的字符

图片 18

 

一经多独参数正好是咱业务逻辑的数据模型,我们尽管可直接传入pojo
 #{属性名}:取出传入的pojo的属性值
 
map:
   
如果多个参数不是业务模型中之数,没有对号入座之pojo,不经常用,为了方便,我们啊得以传map
    #{key}:取出map中对应的值

实例:

1.每当接口类的对应措施参数中写副map集合类的参数:

图片 19

2.当测试方法中new 一个集合类,为集合类初始化

图片 20

3.采取定义的map集合类的键值对的键名作为查询句的原则字段名

图片 21

 

 
要多只参数不是事情遭的多寡,但是经常要用,推荐来编排一个TO(Transfer
Object)数据传对象
    Page{
     int index;
     int size;
    }

mybatis_传播参数的强措施汇总习题:

     public Emoployee getEmp(@param(“id”)Integer id,String lastName)
     取值: id===>#{id/param1} lastName===>#{param2}

     public Employee getEmp(Integer id,@(“e”)Employee emp);
    取值:id===>#{param1} lastName===>{param2.lastName/e.lastName}

    public Employee getEmpById(List<Integer> ids);
    取值:第一个id的值:#{list[0]}

mybatis_参数值的落:

#{}:可以拿走map中之价值或者是pojo对象属性之价
${}:可以获得map中的价值或者是pojo对象属性之值 

实例:select * from tbl_employee where id = ${id} and last_name =
#{lastName}
        preparing:select * from tbl_employee where id =2 and
last_name = ?
 区别:
    #{}:是盖预编译的款型。将参数设置到sql语句被;prepareStatement;防止sql注入
    ${}:取出的价值直接拼装在sql语句被;会发平安题材;
    大多情况下,我们取得参数的价值都应当去用#{};
  
    原生jdbc不支持占位符的地方我们尽管可采用${}进行取值
    比如分表,排序;按照春分表拆分
    select * from ${year}_salary where xxx;
    select * from tbl_employee order by ${f_name} ${order}

#{}:更增长的用法:
   规定参数的一部分条条框框:
   javaType,jdbcType,mode(存储过程),numericScale,
   resultMap,typeHandler,jdbcTypeName,expression(未来备选支持之功力)
 
   jdbcType通常需要在某种特定的原则下给装置:
    
在咱们多少吧null的时刻,有些数据库可能无克认识别mybatis对null的默认处理。比如Oracle(报错)
  
    由于全局配置中:jdbcTypeForNull=OTHER;oracle不支持;两栽方法
    1,#{email,jdbcType=OTHER};
    2,jdbcTypeForNull=NULL
       <setting name=”jdbcTypeForNull” value=”NULL”/>

 mybatis_select_记录封装map:

单条记录:

图片 22

图片 23

 图片 24

大抵长记下:
图片 25

图片 26

图片 27

 mybatis_resultMap_自定义javaBean封装规则:

  <resultMap type=”” id=””></resultMap>
   type:自定义规则的java类型
   id:唯一id方便引用

  指定主键列的包裹规则
  id定义主键会底层有优化
    column:指定哪一样排
    property:指定相应之javaBean属性

 图片 28

图片 29

 mybatis_级联属性封装结果:

    创建一个封装get set方法的Department类。

 在Employee类创建 Department类的积极分子属性.

   如下:

     private Department dept;

   调用Department类成员属性的计:

    图片 30

     也就是employee类属性.Department属性

 

 mybatis_association_定义级联属性关联规则:

    association得指定同之javaBean对象
    property=””:点名哪个属性是同台之目标
    javaType=””:点名这个特性对象的色[不能够大概]

 实例:(该标签作为resultType的字标签)

图片 31

 

 mybatis_association_分部查询:     association概念关联对象的卷入规则
    select:表名当前性能调用select指定的法门查出的结果
    column:点名将哪一样排的价传给此select标签
    流程:使用select指定的计(传入column指定的即时排参数的值)并包给property

流程:

    1.以相应接口创建对应措施:

图片 32

    2.每当对应的照文件写上相应标签:

    图片 33

3.于EmployeeMapperPlus映射文件写副查询标签 通过查tbl_embloyee表查到d_id,再经过resultMap标签里的association标签将曾查到的d_id传入

EmployeeMapperPlus映射文件然后查出tbl_dept表:

    图片 34

4.于测试类测试:

图片 35

mybatis_本需加载&延迟加载:

   
如果表及申内关于联合,则在每次查询的时候都见面询问相应的外键列的阐发。所以,可以经lazyLoadingEnabled属性和aggressiveLazyLoding性来对查询设置有些条条框框,按需要来询问。
    lazyLoadingEnabled:缓加载开启
开启后关联的价当采用的上会受延缓加载
    aggressiveLazyLoding:value=”true”完整加载
value=”false”让她本需要加载

 图片 36

 mybatis_connection_概念关联集合类型的属性之卷入规则:

 查询规则:

    通过tbl_dept的id值查出对应之员工信息

 1.每当DepartmentMapper接口创建带有一个整型的计:

图片 37

    2.查询标签:

图片 38

3.下resultMap设置封装规则,并透过子标签collection定义关联集合类属性
    collection:概念关联集合类型的性质的包规则
    ofType:指定集合里面元素的档次

图片 39

4.利用测试类测试:
图片 40

 mybatis_connection_分步查询:

    1.创造对应查询接口:

图片 41

 图片 42

   
2.在投文件下写副查询标签查询及对应之id值通过resultMap的connection属性返回查询到的id值到相应的炫耀文件:

图片 43

 

图片 44

     3.通过返回的id值查出员工信息:

 图片 45

    4.动测试类测试:
图片 46

 

 mybatis_conneciton_传扬多列值:

    多排的价传递过去,
    将大半排的价值封装map传递:
    column=”{key1=column1,key2=column2}”
    fetchType=”lazy”:表示用延缓加载
    -lazy:延迟
    -eager:立即

Mybatis_discriminator_鉴别器

    <discriminator javaType=””></discriminator>
  
  鉴别器:mybatis可以动用discrimination判断某列的价,然后因某列的价
     改变封装行为封装Employee;

    实例:

    如果得知的凡女生:就管单位信息查询出来,否则不查询;
         如果是男生,把last_name这同一列的值赋值给email;

图片 47