mybatis 学习笔记

1.mybatis返回主键的值:{


    insert into sys_user(
        id,user_name,user_password,user_email,
        user_info,head_img,create_time
    )
    values(
        #{id},#{userName},#{userPassword},#(userEmail),
        #{userInfo},#{headImg,jdbcType=BLOB},#{createTime,jdbdType=TIMESTAMP}
    )


·Mysql:{


    1)适用于主键值自增(数据库主键数据类型为int或者Long){
        ·修改配置文件
        
            insert into sys_user(
                id,user_name,user_password,user_email,
                user_info,head_img,create_time
            )
            values(
                #{id},#{userName},#{userPassword},#(userEmail),
                #{userInfo},#{headImg,jdbcType=BLOB},#{createTime,jdbdType=TIMESTAMP}
            )
        
        
        ·在对应的接口中将方法的返回值设定为对应的返回值。
    }
    
    2)适用于所有的情况:{
    
        ·修改配置文件
            
                insert into sys_user(
                    id,user_name,user_password,user_email,
                    user_info,head_img,create_time
                )
                values(
                    #{id},#{userName},#{userPassword},#(userEmail),
                    #{userInfo},#{headImg,jdbcType=BLOB},#{createTime,jdbdType=TIMESTAMP}
                )
                
                
                    SELECT LAST_INSERT_ID()
                
            
    
        ·在对应的接口中将方法的返回值设定为对应的返回值即可
    }

}

Oracle:{


    ·修改配置文件
            
                
                    SELECT SEQ_ID.nextval from dual
                
                
                insert into sys_user(
                    id,user_name,user_password,user_email,
                    user_info,head_img,create_time
                )
                values(
                    #{id},#{userName},#{userPassword},#(userEmail),
                    #{userInfo},#{headImg,jdbcType=BLOB},#{createTime,jdbdType=TIMESTAMP}
                )
            
    
        ·在对应的接口中将方法的返回值设定为对应的返回值即可

}

注意:类似于Mysql第二种方式,或者是Oracle的返回主键值的方式标签执行的顺序仅仅和改标签配置的
      order属性值相关,和它在insert语句的前后顺序无关;
      其他一些支持逐渐自增数据库配置selectKey中回写主键的sql可查阅《Mybatis从入门到精通 刘增辉著》第二章,p42.

}

2.使用map或者@Param注解来解决多个接口参数的问题{
·当接口对应的方法中只有一个参数时,Mybatis并不关心参数叫什么名字就会把这个唯一的参数值拿来使用;
·当接口对应的方法中有多个入参时,若没有使用@Param注解来标识参数名,那么Mybatis默认可用的参数名只有
[0,1,param1,param2]
·当多接口参数中使用了@Param注解来标识参数名,那么Mybatis便可识别对应在注解中标识的参数.
}

3.mybatis 模糊查询(like):{
·普通SQL

·动态SQL

}

4.动态SQL:{

1)if{

    ·在where子句中使用if(例如上述笔记的like模糊查询)
    
    ·在UPDATE中使用if{
        
            update sys_user
            set
                
                    user_name = #{userName},
                
                
                    user_password = #{userPassword},
                
                
                    user_email = #{userEmail},
                
                
                    user_info = #{userInfo},
                
                
                    head_img = #{headImg,jdbcType=BLOB},
                
                id = #{id}
            where id=#{id}
        
    }
    
    ·在INSERT动态插入中使用if:{
    
        
            
            insert into sys_user(
                id,user_name,user_password,
                
                    user_email,
                
                user_info,head_img,create_time
            )
            values(
                #{id},#{userName},
                
                    #(userEmail),
                
                #{userInfo},#{headImg,jdbcType=BLOB},#{createTime,jdbdType=TIMESTAMP}
            )
        
    }


}


2)choose提供if...else、if...else...的逻辑:{

    需求:当参数id有值的时候优先使用id进行查询,当id没有值的时候就判断userName是否有值,如果用户名有值
          就使用用户名查询,如果用户名也没有值那就使SQL查询无结果。
          
    
    
}


3)where、set、trim{

    1)where{
    
        
            select * 
            from sys_user
            where id in
            
                #{id}
            
        
    }       
    
    注意:
        ·当只有一个数组参数或者一个结婚参数的时:
                当参数类型为集合(Collection)类型时,默认在Mybatis底层会将其转换为Map类型,并添加
                一个key为collection的值;
                当参数是一个list集合类型时,也会默认转换成map类型,默认的key为list;
                当参数类型为数组时,也会默认转换成map类型,默认的key为array.
          
          ·有多个参数:
                使用@Param注解来给每个参数指定一个名字,将collection的值设置为@Param指定的注解的名称即可.
          
          ·参数是Map类型:    
                使用Map类型和使用@Param注解的情形类似只要将map的key的值绑定给collection的属性即可;
                如果要循环所输入的Map,推荐使用@Param注解指定名字,此时可以将collection的值设置为@Param注解指定的名字即可,如果不想指定名字,则使用_parameter.
          
          ·参数是一个对象:
                这种情况下指定collection属性值为对象的属性名即可,当使用对象内多层嵌套的对象时,使用属性.属性(集合和数组可以使用下标取值),可以指定深层次的属性值.
                
                
                
                
    foreach实现批量插入:{
        
        
            
            insert into sys_user(
                user_name,user_password,user_email,
                user_info,head_img,create_time
            )
            values
            
                (
                    #{userName},#{userPassword},#{userEmail},
                    #{userInfo},#{headImg,jdbcType=BLOB},#{createTime,jdbcType=TIMESTAMP}
                )
            
        
    }
    
    
    foreach实现动态update:{
    
        
            update sys_user
            set
            
                ${key}= #{val}
            
        
        
        
        注意:当参数为map类型时,foreach标签的index属性值对应的不是索引值,而是map中的key;
              如上以map的key作为列名,对应的值作为该列的值,通过foreach将需要更新的字段拼接在SQL语句中。
    }
}


5)bind用法:{

    ·bind可以使用OGNL创建一个变量并将其绑定到上下文中;
    ·例子:修改之前的like模糊查询:{
    
        未修改之前:{
            
                and user_name like concat('%',#{userName},'%')
            
        }
        在未修改之前的版本中为使用like模糊查询,使用了concat函数来实现字符串拼接,在MySql中这个函数支持多个参数,但是在Oracle中这个函数
        只支持两个参数;由于不同数据库之间语法的差异,如果更换数据库,有些SQL语句就可能需要重写,针对这种情况可以使用bind标签来避免由于
        更换数据库而带来的麻烦。
        
        修改后:{
            
            
                
                and user_name like #{userNameLike}
            
            
            注意:bind标签的两个属性都是必选项,name为绑定到上下文的变量名,value为OGNL表达式。
        }
        
    }
}

}

5.mybatis二级缓存配置:{

}

6.mybatis高级映射:{

1)mybatis单表查询:{

    ·单表查询时可以使用字段别名来实现查询返回结果集和JavaBean的映射;
    ·可以通过配置resultMap来实现映射;
    ·如果数据库字段和JavaBean符合转驼峰规则,通过在mybatis中配置全局属性:
        
            
            
            
        
}

2)一对一映射:{

    eg:{
    
        package com.hsun.mybatis.model.SysUser;
        public class User{
        
            private String userName;
            
            private String userPassword;
            
            private SysRole role;//SysRole是一个实体类
            //setter、getter
        }
        
        
        ·使用别名映射
             
                
                selcet 
                    u.user_name,
                    u.user_password,
                    r.id role_id,
                    r.role_name
                from sys_user u
                inner join sys_user_role ur on u.id = ur.user_id
                inner join sys_role r on ur.role_id = r.id
                where u.id = #{id}
            
            
            
            
        ·使用resultMap标签的association标签来配置一对一映射
            
            
                
                
                
                
                
                     
                    
                                           
                
            
            
            注意:
                ·property:实体类中的属性名,必选项,
                ·javaType:属性对应的Java类型。
                ·resultMap:可以使用现有的resultMap,而不需要在association标签中配置result
                ·columnPrefix:查询列的前缀,配置前缀后,在子标签result的column可以省略前缀。
                                但是在查询时,role对应的查询列都要使用别名并且别名必须是以此处配置的前缀开头的。
                                
                ·在mybatis中不同命名空间下的resultMap也是可以引用的,引用时需要加上”命名空间.resultMap的id属性“
                    例如:有关role的属性全部配置到RoleMapper.xml 文件中,其中有一个resultMap的id为roleMap,那么在
                           UserMapper.xml文件中引用的方式如下:
                           
                            
                                
                                
                                
                                
                                
                            
    }
    
    ·association标签嵌套查询:{
    
        ·association标签的嵌套查询常用的属性如下:{
            select:另一个映射查询的id,mybatis会额外执行这个查询获取嵌套对象的结果.
            column: 列名(或别名),将主查询中列的结果作为嵌套查询的参数,配置方式如:
                    column={prop1=col1,prop2=col2},prop1,prop2将作为嵌套查询的参数.
            ·fetchType:数据加载方式,可选值为lazy和eager,分别为延迟加载和积极加载,这个配置
                        会会覆盖全局的lazyLoadingEnabled配置。
                        
                        
            
                
                
            
            
        }
    }

    
}


3)一对多映射:{

    使用collection集合的嵌套映射:
        
        
            
            
            
            
            
                 
                
                                       
            
        
        
        或者:
        
        
            
            
            
            
            
            
        
    
}

}

7.mybatis 部分常用settings配置:{


            
            
            
            
            
            
            
            
            
            
            
            
        

}

你可能感兴趣的:(mybatis 学习笔记)