SSM框架-MyBatis


MyBatis


1. 概述:

    MyBatis是一个基于Java持久层的框架,内部封装了JDBC,简化了开发时对数据库驱动装载和连接的过程,使我们主要关注与sql语句的编写。MyBatis支持定制化SQL、存储过程以及高级映射,几乎避免了所有的JDBC代码和手动设置参数以及获取结果集。MyBatis支持使用XML和注解的方式来配置和映射原生信息,将接口和Java的POJOs(Plain Old Java Objects 普通的Java对象)映射成数据库中的记录。

2. MyBatis的具体使用

  1. 在Maven中导入MyBatis的坐标
···
    
        
            org.mybatis
            mybatis
            3.4.5
        
    
    ···
  1. MyBatis主配置文件

    1. 主配置文件的约束头信息
    
    
    1. 主配置文件的配置内容和顺序
    -property(属性)
            --property
        -settings(全局配置参数)
            --setting
        -typeAliases(类型别名)
            --typeAliases
            --package
        -typeHandlers(类型处理器)
        -objectFactory(对象工厂)
        -plugins(插件)
        -environments(环境集合属性对象)
            --ebvironment(环境子属性对象)
                ---transactionManager(事务管理)
                ---dataSource(数据源)
        -mappers(映射器)
            --mapper
            --package
    1. 简单的主配置文件
    
        
        
        
            
            
                
                
                    
                    
                    
                    
                        
                        
                        
                        
                        
                    
                
            
            
            
                
            
                
                
            
        
    1. 常见的属性标签
      1. property(属性):可以使用两种方式来进行属性的配置
        • 直接写在属性中
        
            
            
            
            
        
        • 导入外部配置文件中的属性
        
        
        
        • 数据源引用配置的属性
        
           
           
           
           
        
      2. typeAliases(类型别名):可以将全类名替换为别名
      
          
          
          
          
          
      
      1. mappers(映射器)
      
      
      
      
      
      
  2. MyBatis的执行方法

    1. 读取主配置文件: InputStream is = Resources.getResourceAsStream("SqlMapConfig.xml");
    2. 创建SqlSessionFactoryBuilder对象:SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
    3. 使用builder对象构建SqlSessionFactory工厂对象:SqlSessionFactory factory = builder.build(is);
    4. 使用工厂对象获取SqlSession对象:SqlSession session = factory.openSession();
    5. 使用SqlSession对象构建出持久层接口的代理对象:UserDao userDao = session.getMapper(UserDao.class);
    6. 使用代理对象执行数据库操作:List users = userDao.findAll();
    7. 提交事务(增删改):session.commit();
    8. 查询操作执行遍历
    9. 关闭流

2. MyBatis基于XML配置的使用

  1. MyBatis在Maven中需要导入的坐标

  2. MyBatis配置主配置文件及映射

  3. MyBatis配置具体持久层接口的XML配置文件,需要创建出对应包目录结构的映射配置文件

    1. 持久层接口的约束头信息
    
    
    1. 持久层接口的具体信息
    
    
    
    
        
        
    
  4. 基于XML映射的单表CRUD操作

    • 查询所有
    
         
        
    
    • 根据Id查询
    
        
        
    
    • 添加
    
        
        
            
            
                select last_insert_id()
            
            insert into user(username,birthday,sex,address) values(#{username},#{birthday},#{sex},#{address})
        
    
    • 更新
    
        
        
        update user set username=#{username},birthday=#{birthday},sex=#{sex},address=#{address}
        where id=#{id}
        
    
    • 删除
    
        
        
            delete from user where id = #{id}
        
    
    • 模糊查询
      1. 使用占位符的sql语句
      
          
          
      
      写查询方法时:`List users = userDao.findByName("%王%");`
        执行中的代码如下:`select * from user where username like ?`
      1. 不适用占位符的sql语句
      
          
          
      
      写查询方法时:`List users = userDao.findByName("王");`  
        执行中的代码如下:`select * from user where username like '%王%'`
      #{}和${}的区别:
      1. #{} 表示一个占位符,自动进行java类型和jdbc类型转换,可以有效的防止sql注入。
      2. ${} 表示拼接sql串,${}括号中只能是value。
    • 动态SQL之标签
    
        
        
        
    
    • 动态SQL之标签
    
        
        
            select * from user 
        
        
        
    
  5. 基于XML映射的多表CRUD操作

    1. 多对一查询(多个账户对应一个用户)
      1. 在账户实体类中引入用户对象 private User user; ,提供getter和setter方法
      2. 在对应的账户持久层接口配置文件中使用进行配置
      
          
          
              select * from account
          
          
          
              
              
              
              
              
              
              
                  
                  
                  
                  
                  
                  
                  
              
          
          
          
      
    2. 一对多查询(一个用户对应多个账户)
      1. 在用户实体类中添加账户对象集合 private List accounts ,提供getter和setter方法
      2. 在对应的用户持久层接口配置文件中使用进行配置
      
          
          
              
              
              
              
              
              
              
                  
                  
                  
                  
                  
              
          
      
          
          
      
  6. 基于XML映射的常用标签及属性

    1. resultMap标签:resultMap可以用于当实体类的类名和数据库的列名对应不上时建立对应关系,同时resultMap可以将查询结果映射为复杂类型。
      1. 属性:
        • type:指定实体类的全限定类名
        • id:给出一个唯一标识,是给查询select标签引用使用
      2. 子标签:
        • id:用于指定主键字段
        • result:用于指定非主键字段
          1. 属性:
            • column:对应数据库中的列名
            • property:实体类中的属性名
    
        
        
            
            
            
            
            
        
    
    1. 可以使用子标签针对实体类和集合进行封装。
  7. 基于XML设置的延迟加载

    1. 延迟加载概念:只有当需要用到数据时才进行加载,不需要用到数据时不加载数据。
    2. 使用标签实现延迟加载
      1. 指定从表的方向引用实体属性
      
      
          
          
          
          
          
          
          
          
      
      1. 在主配置文件中添加延迟加载的配置
      
         
         
         
         
      
    3. 使用标签实现延迟加载
      1. 指定从表的方向引用实体属性
      
      
          
          
          
          
          
          
          
          
      
      1. 在主配置文件中添加延迟加载的配置
      
         
         
         
         
      
  8. 基于XML的缓存设置

    1. MyBatis中的缓存分为一级缓存和二级缓存
      1. 一级缓存:一级缓存是SqlSession级别的缓存,只要当SqlSession没有flush或close时,就存在。
      2. 二级缓存:二级缓存是mapper映射级别的缓存,多个SqlSession对象去操作同一个mapper映射的sql语句,多个SqlSession对象间可以共用二级缓存,二级缓存可以跨SqlSession。
    2. 开启二级缓存
      1. 主配置文件中开启二级缓存
      
          
          
      
      1. 配置相关的Mapper映射文件
      
      
          
          
      
      1. 在需要应用的标签上使用useCache属性
      
          
      

3. MyBatis基于注解配置的使用

  1. MyBatis在Maven中导入坐标(同上)
  2. MyBatis配置主配置文件及映射
  3. MyBatis中的常用注解
    • @Insert:实现插入操作
    • @Update:实现更新操作
    • @Delete:实现删除操作
    • @Select:实现查询操作
    • @Result:实现结果集的封装
    • @Results:实现多个结果集的封装
    • @One:实现一对一结果集封装
    • @Many:实现一对多的结果集封装
    • @SelectProvider:实现动态SQL映射
    • @CacheNameSpace:实现注解二级缓存的使用
  4. 使用注解完成单表的CRUD操作
    • 首先配置主配置文件,选择使用注解的方式
    
    
    
        
            
                
                
                    
                    
                    
                    
                
            
        
    
        
            
        
    
    1. 查询所有(其他略)
    public interface UserDao {
        /**
         * 查询所有
         * @return
         */
        @Select("select * from user")
        List findAll();
    }
    1. 当实体类的属性和数据库列名不对应时
    public interface UserDao {
        /**
         * 查询所有
         * @return
         */
        @Select("select * from user")
        @Results(id="userMap",
            value={
                @Result(id=true,column="id",property="userId"),
                @Result(column="username",property="userName"),
                @Result(column="birthday",property="userBirthday"),
                @Result(column="sex",property="userSex"),
                @Result(column="address",property="userAddress")
            })
        List findAll();
    }
    1. 引入ResultMap配置的查询操作
    public interface UserDao {
        /**
         * 根据Id查询
         * @return
         */
        @Select("select * from user where id = #{uid}")
        @ResultMap("userMap")
        User findById(Integer userId);
    }
    1. 执行保存操作并返回主键值
    public interface UserDao {
        /**
         * 保存用户
         * @param user
         */
        @Insert("insert into user(username,birthday,sex,address) values(#{username},#{birthday},#{sex},#{address})")
        @SelectKey(keyColumn = "id" , keyProperty = "id" , resultType = Integer.class , before = false , 
                statement = { "select last_insert_id()" } )
        void saveUser(User user);
    }
  5. 使用注解完成多表的CRUD操作及延迟加载
    1. 多对一(多个账户对应一个用户)
      • @One的注解代替了标签
        • select:指定多表查询的sqlmapper
        • fetchType:覆盖全局的配置参数lazyLoadingEnabled,应用延迟加载
    public interface AccountDao {
        /**
         * 查询所有并显示用户信息
         * @return
         */
        @Select("select * from account")
        @Results(id = "accountMap",value = {
                @Result(id = true, column = "id", property = "id"),
                @Result(column = "uid", property = "uid"),
                @Result(column = "money", property = "money"),
                @Result(column = "uid", property = "user",
                one = @One(select = "com.hsh.study.dao.UserDao.findById",
                fetchType = FetchType.LAZY))
        })
        List findAll();
    }
    1. 一对多(一个用户对应多个账户)
      • @Many的注解代替了标签
    public interface UserDao {
         /**
          * 查询所有
          * @return
          */
         @Select("select * from user")
         @Results(id = "userMap", value = {
                 @Result(id = true, column = "id", property = "id"),
                 @Result(column = "uid", property = "uid"),
                 @Result(column = "money", property = "money"),
                 @Result(column = "id", property = "accounts",
                         many = @Many(select = "com.hsh.study.dao.AccountDao.findByUid",
                         fetchType = FetchType.LAZY
                         )
                 )
         })
         List findAll();
     }
  6. 使用注解配置二级缓存
    1. 在主配置文件中开启二级缓存支持
    
        
        
    
    1. 使用注解开启二级缓存
    @CacheNamespace(blocking=true)
    public interface UserDao{
        ···
    }

你可能感兴趣的:(数据库,mybatis,mysql,java,hibernate)