MyBatis(三)MyBatis-映射文件

一 介绍

映射文件指导着MyBatis如何进行数据库增删改查,有着非常重要的意义;

  • cache –命名空间的二级缓存配置
  • cache-ref – 其他命名空间缓存配置的引用。
  • resultMap – 自定义结果集映射
  • parameterMap – 已废弃!老式风格的参数映射
  • sql –抽取可重用语句块。
  • insert – 映射插入语句
  • update– 映射更新语句
  • delete– 映射删除语句
  • select – 映射查询语句

二 主键生成方式

  • 若数据库支持自动生成主键的字段(比如 MySQL和 SQL Server),则可以设置useGeneratedKeys=”true”,然后再把keyProperty 设置到目标属性上。
    
        insert into t_user(username,birthday,sex,address) values(#{username},#{birthday},#{sex},#{address})
    

还可以
将insert插入的数据的主键返回到User对象中

        
            select last_insert_id()
        

mysql的uuid(),实现非自增主键的返回

           
               select uuid()
           
           insert into t_user (id,username,birthday,sex,address) values(#{id},#{username},#{birthday},#{sex},#{address})
  • 而对于不支持自增型主键的数据库(例如Oracle),则可以使用 selectKey 子元素:selectKey 元素将会首先运行,id 会`被设置·,然后插入语句会被调用

    
        
            select EMPLOYEE_SEQ.nextval from dual
        
        
            insert into employee(id,last_name,age,email)
                values(#{id},#{lastName},#{age},#{email})
     

三 参数传递

单个参数

mybatis不会做特殊处理,#{参数名/任意名}:取出参数值(测试得:真的任意名都可以)

多个参数

mybatis会做特殊处理,多个参数会被封装成 一个map
key:param1...paramN,或者arg0...argN-1

    

命名参数

明确指定封装参数时map的key;@Param("id")

public User findUserByIdAndName(@Param("id")int id, @Param("name")String name);

映射文件

    

POJO

如果多个参数正好是我们业务逻辑的数据模型,我们就可以直接传入pojo;
#{属性名}:取出传入的pojo的属性值

    

Map

这个是我们自己传得map,不是上面多参数是mybatis帮我们处理得。所以可以直接通过key来获取

    

集合类型参数

#{list[0]},数组就是#{array[0]}

    

四 #和$

#{key}:获取参数的值,预编译到SQL中(因为预编译,最好用在where里面,测试发现:在编译之后加了引号)。安全。
${key}:获取参数的值,拼接到SQL中。有SQL注入问题。

五 resultType

简单类型


List类型

没什么区别
Mapper

public List findUserByName(String username);

映射文件

    
        select * from t_employee where id = #{id}
    

查询多条记录

可以把查询的数据以{表中某一字段名, JavaBean}方式来封装成Map。
mapper

    // 查询所有员工的信息,把数据库中的 'id' 字段作为 key,对应的 value 封装成 Employee 对象
    // @MapKey 中的值表示用数据库中的哪个字段名作 key
    @MapKey("id")
    Map getAllEmpsAsMap();

映射文件

    
    

自动映射

全局setting设置

  • autoMappingBehavior默认是PARTIAL,开启自动映射的功能。唯一的要求是列名和javaBean属性名一致
  • 如果autoMappingBehavior设置为null则会取消自动映射
  • 数据库字段命名规范,POJO属性符合驼峰命名法,如A_COLUMNaColumn,我们可以开启自动驼峰命名规则映射功能,mapUnderscoreToCamelCase=true

六 自定义resultMap

可以实现高级结果集映射

范例


    
    
        
        
        
        
        
    

    
    
    

"一对一"

查询Employee的同时查询员工对应的部门,就像hibernate中得一对一

sql语句

    

级联属性

    
    
        
        
        
        
        
    

使用association

    
    
        
        
        
        
        
        
            
            
        
    

association分步查询

  1. 先按照员工id查询员工信息
  2. 根据查询员工信息中的d_id值去部门表查出部门信息
  3. 部门设置到员工中;
     
        
        
        
        
        
        
        
     

延迟加载(懒加载)

主配置文件

    


    
        
        
        
        
        
        
    

"一对多"

例如:查询部门的时候将部门对应的所有员工信息也查询出来

sql语句

    

一次查询

    
    
        
        
        
        
            
            
            
            
            
        
    
    
    

分步查询

    
    
        
        
        
    
    
    

扩展:传递多列得值

  • 分步查询的时候通过column指定,将对应的列的数据传递过去,我们有时需要传递多列数据。使用{key1=column1,key2=column2…}的形式
  • association或者collection标签的fetchType=eager/lazy可以覆盖全局的延迟加载策略,指定立即加载(eager)或者延迟加载(lazy)

鉴别器

discriminator


     
        
        
        
        
        
        
            
            
                
                
            
            
            
                
                
                
                
            
        
     

参考

  1. 尚硅谷mybatis教材
  2. MyBatis查询结果resultType返回值类型详细介绍
  3. https://www.cnblogs.com/xiaoxi/p/6378960.html

你可能感兴趣的:(MyBatis(三)MyBatis-映射文件)