mybatis

[TOC]

mybatis概念

![Uploading {H53VGSI{K_MEWKS(D2]0AC_588680.png . . .]

  • 概念:一个持久层框架

  • 作用:ORM将sql语句映射成实体类

  • 特点:

    • 巧灵活
    • 半自动化
    • 使用与中小型项目的开发

mybatis入门

mybatis_第1张图片
1.png

1、创建mybatis-config.xml文件



  
    
      
      
        
        
        
        
      
    
  
  
    
  

2、创建映射文件UserMapper.xml



  
    
  

3、获取xml配置文件

InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");

4、创建SqlSessionFactory

SqlSessionFactory factory=new SqlSessionFactoryBuilder().build(inputStream);

5、获取SqlSession

SqlSession sqlSession = factory.openSession();

6、调用SqlSession的selectOne(命名空间.id名称);

Object object = sqlSession.selectOne("user.selectUser");

7.关闭SqlSession

sqlSession.close();

增删改

mybatis_第2张图片
2.png

    
    insert into user (username,password) values(#{username},#{password}); 


    update user set username=#{username},password=#{password} where uid=#{uid}

3.png

    delete from user where uid=#{value}

Mapper接口开发

一、定义一个接口

public interface TypeMapper {
    Type selectType(int typeid);
}

二、定义一个mapper.xml映射文件

mapper文件的要求:

1.namespace的值就是对象接口的全类名,并且类名和xml文件名保持一致
2.id的值就是抽象方法
3.resultType的值必须和抽象方法的返回值一致
4.parameterType的值和抽象方法的参数类型一致

注意 mapper.xml文件的约束是mapper.dtd,不是config.dtd

三、使用

将mybatis入门步骤中的步骤六改为如下代码:

TypeMapper mapper=sqlSession.getMapper(TypeMapper.class);
Type type=mapper.selectType(1);

动态sql

if

  SELECT * FROM good INNER JOIN type ON good.type = type.typeid where 1=1
    
      and gname like concat('%',#{gname},'%')
    

注意:

1、字符串的拼接建议使用concat来代替${}

2、判断条件中获取数据不用加#{},与el表达式不一样

where

作用where可以自动去除第一个and


      
        and gname like concat('%',#{gname},'%')
      
      
        and typename like concat('%',#{typename},'%')
      

choose when otherwise

作用:组合使用,相当于if else if else


set

 update good 
     
        
          gname=#{gname},
        
        
          gprice=#{gprice}
        
      
  where gid=#{gid}

trim

作用:去除多余字符串

两种常见的用法

1、where and

prefix:字首 prefixOverrides:去除第一个指定的字符串

  
      
      
        and gname like concat('%',#{gname},'%')
      
      
        and typename like concat('%',#{typename},'%')
      
    

2.set ,

prefix:字首 suffixOverrides:去除最后指定的字符串

update good



gname=#{gname},


gprice=#{gprice},

foreach

作用:动态循环拼接sql部分内容

1、open代表在集合前面添加的字符串

2、close代表在集合后面添加的字符串

3、separator代表集合分割使用的字符串

4、collection代表被循环的集合,值可以是list、map、array

5、常见用法,in的语句


resultMap

作用:

1、可以将表字段与javabean对象属性名进行映射 2、将映射抽取出来,可以给多个statement所使用


  
      
      
      
      
      
      
      
    

映射的原理

1.先拿到type指定的类的class

2.通过newInstance创建对象

3.获取propetry中属性名,通过反射的方式调用对应的set方法

4.调用方法的invoke方法,将column的值赋值进去

5.返回封装好的对象

关联嵌套结果(resultMap与resultMap相互嵌套)

 
      
      
      
      
      
      
        
      
    
   

上面的association部分可以改造为,然后使用外部嵌套

  
    
      
      
      
    

关联嵌套查询

     
      
      
      
      
      
      
      
    

          

集合嵌套结果



注意

如果在主配置文件中配置了

  
    
    
  

缓存

mybatis_第3张图片
缓存.png

一级缓存(同一个SqlSession中执行同一个statement)

默认开启

二级缓存(同一个namespace中,不同SqlSession执行同一个statement)

配置 1、setting中设置cacheEnabled="true"
2、mapper中添加
3、statement中添加useCache="true"
4、调用session.close()时候才将数据写入二级缓存

mybatis的脑图

你可能感兴趣的:(mybatis)