MyBatis学习笔记

MyBatis学习笔记

quick start(XML方式配置)

  1. 导入依赖

      
     org.mybatis   
     mybatis   
     3.4.5  
       
    
  2. 创建SqlMapConfig.xml配置文件

    常用需要配置的项有:

    1.  
          
       
    
    2.  
           
       
    
    3.  
           
           
       
    
    4.  
           
               
               
                   
                   
                   
                   
               
           
       
    
    5.
           
           
           
       
    
  3. 编写Dao接口的方法

  4. 配置Dao.xml文件

    
     
     
      
      
    
    

    5.测试

    //引入配置,得到sqlSession
    InputStreamis = Resources.getResourceAsStream("SqlMapConfig.xml");
    SqlSessionFactoryBuilder factoryBuilder = new SqlSessionFactoryBuilder();
    SqlSessionFactory factory = factoryBuilder.build(is);
    SqlSession sqlSession = factory.openSession();
    IUserDao mapper = sqlSession.getMapper(IUserDao.class);
    //使用mapper的方法操作数据库
    

常用特性(xml配置,注解方式在后面介绍)

缓存

  • 一级缓存:SqlSession 级别的缓存,只要 SqlSession 没有 flush 或 close,它就存在。 一级缓存是 SqlSession 范围的缓存,当调用 SqlSession 的修改,添加,删除,commit(),close()等方法时,就会清空一级缓存。
  • 二级缓存: mapper 映射级别的缓存,多个 SqlSession 去操作同一个 Mapper 映射的 sql 语句,多个 SqlSession 可以共用二级缓存,二级缓存是跨 SqlSession 的。

一级缓存自带,二级缓存需要开启,在xml配置中,需要三处配置:

  1. SqlMapConfig.xml中setting中开启二级缓存
 
  
 
 
因为 cacheEnabled 的取值默认就为 true,所以这一步可以省略不配置。为 true 代表开启二级缓存;为 false 代表不开启二级缓存。
  1. 配置相关的 Mapper 映射文件
标签表示当前这个 mapper 映射将使用二级缓存,区分的标准就看 mapper 的 namespace 值。 
  
 
     
     
 
  1. 配置 statement 上面的 useCache 属性
 
 

将UserDao.xml映射文件中的 
    select * from user where 1=1 
      
        and username like #{username}  
     
      
        and address like #{address}
      
  
注意:标签的 test 属性中写的是对象的属性名,如果是包装类的对象要使用 OGNL 表达式的写法。 另外要注意 where 1=1 的作用~! 
  1. where标签
  

  1. foreach标签
  
 

SQL 语句:    
    select 字段 from user where id in (?) 
标签用于遍历集合,它的属性:  
collection:代表要遍历的集合元素,注意编写时不要写#{}  
open:代表语句的开始部分  
close:代表结束部分 
item:代表遍历集合的每个元素,生成的变量名  
sperator:代表分隔符 

多表查询

1对1

1.定义一个包含两个实体的新类

2.使用resultMap配置

 
      
      
     
      
      
          
          
           
          
         
      
   

1对多


 
   
   
      
       
      
       
       
      
       
          
            
          
      
  
 
  
     
 
collection:部分定义了用户关联的账户信息。表示关联查询结果集 
property="accList" :关联查询的结果集存储在 User 对象的上哪个属性。 
ofType="account" :指定关联查询的结果集中的对象类型即List中的对象类型。此处可以使用别名,也可以使用全限定名。 

多对多

可以看成两个1对多

延迟加载

使用association

  1. 开启延迟加载
 
      
    

  1. 配置resultMap
  
     
      
     
     
      
     
   

使用Collection

  1. 开启延迟加载
 
      
    

  1. 配置resultMap
  
      
     
      
      
     
     
      
     
 
 
标签: 
     主要用于加载关联的集合对象 
select 属性:  
     用于指定查询 account 列表的 sql 语句,所以填写的是该 sql 映射的 id 
column 属性:  
     用于指定 select 属性的 sql 语句的参数来源,上面的参数来自于 user 的 id 列,所以就写成 id 这一个字段名

注解方式配置Mybatis

常用注解

@Insert:实现新增

@Update:实现更新

@Delete:实现删除

@Select:实现查询

@Result:实现结果集封装

@Results:可以与@Result 一起使用,封装多个结果集

@ResultMap:实现引用

@Results 定义的封装

@One:实现一对一结果集封装

@Many:实现一对多结果集封装

@SelectProvider: 实现动态 SQL 映射

@CacheNamespace:实现注解二级缓存的使用

根据实例快速复习

@Select("select * from user")  
@Results(id="userMap",    
value= {     
    @Result(id=true,column="id",property="userId"),
    @Result(column="username",property="userName"),
    @Result(column="sex",property="userSex"),
    @Result(column="address",property="userAddress"),
    @Result(column="birthday",property="userBirthday")    
})  
List findAll(); 
@Select("select * from user where id = #{uid} ")  
@ResultMap("userMap")  
User findById(Integer userId); 
@Insert("insert into user(username,sex,birthday,address)values(#{username},#{sex},#{birthday},#{address} )") @SelectKey(keyColumn="id",keyProperty="id",resultType=Integer.class,before = false, statement = { "select last_insert_id()" })  
int saveUser(User user);   
@Update("update user set username=#{username},address=#{address},sex=#{sex},birthday=#{birthday} where id =#{id} ")  
int updateUser(User user); 
@Delete("delete from user where id = #{uid} ")  
int deleteUser(Integer userId);   
@Select("select * from user where username like #{username} ")  
List findByName(String name); 

配置SqlMapConfig.xml

  

   
     
 

多表查询

实现复杂关系映射之前我们可以在映射文件中通过配置来实现,在使用注解开发时我们需要借助@Results 注解,@Result 注解,@One 注解,@Many 注解。

注意:聚集元素用来处理“一对多”的关系。需要指定映射的 Java 实体类的属性,属性的 javaType (一般为 ArrayList)但是注解中可以不定义;

1对1

@Select("select * from account")  
@Results(id="accountMap",    
         value= {     
             @Result(id=true,column="id",property="id"),
             @Result(column="uid",property="uidjava"),
             @Result(column="money",property="money"),
             @Result(column="uid",property="user",
                     one=@One(select="com.itheima.dao.IUserDao.findById",
                              fetchType=FetchType.LAZY))    
         })  
List findAll(); 

1对多

@Select("select * from user")  
@Results(id="userMap",    
         value= {     
             @Result(id=true,column="id",property="userId"),
             @Result(column="username",property="userName"),
             @Result(column="sex",property="userSex"),
             @Result(column="address",property="userAddress"),
             @Result(column="birthday",property="userBirthday"),
             @Result(column="id",property="accounts",
                     many=@Many(
                         select="com.itheima.dao.IAccountDao.findByUid",
                         fetchType=FetchType.LAZY)       
                    )    
         })  
List findAll();

@Many: 
 相当于的配置  select 属性:代表将要执行的 sql 语句  fetchType 属性:代表加载方式,一般如果要延迟加载都设置为 LAZY 的值 

开启二级缓存

  1. 在 SqlMapConfig.xml 中开启二级缓存支持
 
 
      
     

  1. 在持久层接口中使用注解配置二级缓存
@CacheNamespace(blocking=true)//mybatis 基于注解方式实现配置二级缓存 
public interface IUserDao {
    
} 
 

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