mybatis

每个线程都应该有它自己的SqlSession实例。SqlSession的实例不能共享使用,它是线程不安全的

配置文件

(已下载IDEA Mybatis插件 ---- MyBatis plugin)

  • SqlMapConfig.xml

    mybatis的全局配置文件,配置了mybatis的运行环境等信息

    • 配置的内容顺序如下:

      • properties(属性) ---- 用resource属性加载外部配置文件

      • typeAliases(类型别名)---- 给类起别名

      • environments(环境集合属性对象)

        • environment(环境子属性对象)
        • transactionManager(事务管理)
        • dataSource(数据源)
      • mappers(映射器)

        • ---- 使用相对于xml路径的资源

        • ---- 使用mapper接口类路径

          此种方法要求mapper接口名称和mapper映射文件名称相同,且放在同一个目录中

        • ---- 注册指定包下的所有mapper接口

          此种方法要求mapper接口名称和mapper映射文件名称相同,且放在同一个目录中

          idea maven 需要额外配置

          
            
              
                src/main/java
                
                  **/*.xml
                  **/*.properties
                
                true
              
              
                src/main/resources
                
                  **/*.xml
                  **/*.properties
                
              
            
          
          
    
    
    
        
        
    
      
          
          
          
          
          
      
    
        
        
            
                
                
                
                
                    
                    
                    
                    
                
            
        
        
        
            
        
    
    
    
  • mapper.xml

    sql映射文件,文件中配置了操作数据库的sql语句。此文件需要在SqlMapConfig.xml中加载,

    #{} ---- 占位符

    ${} ---- 字符串拼接,${}里面传递简单类型时必须写value即${value},传递pojo对象或pojo包装对象则需要写对象对应属性

    
    
    
      
        
        
            
            
            
            
            
            
                SELECT LAST_INSERT_ID()
            
            INSERT INTO user (username,birthday,sex,address) VALUES (#{username},#{birthday},#            {sex},#{address})
        
    
    
  • 测试

    String resource = "mybatis-config.xml";
    InputStream inputStream = Resources.getResourceAsStream(resource);
    SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
    SqlSession sqlSession = sqlSessionFactory.openSession();
      ......
    sqlSession.commit();
    sqlSession.close();
    

Mapper动态代理方式

只需要编写Mapper接口(相当于Dao接口),由Mybatis框架根据接口定义创建接口的动态代理对象

  • Mapper接口开发需要遵循以下规范:
    1. Mapper.xml文件中的namespace与mapper接口的类路径相同。
    2. Mapper接口方法名和Mapper.xml中定义的每个statement的id相同
    3. Mapper接口方法的输入参数类型和mapper.xml中定义的每个sql 的parameterType的类型相同
    4. Mapper接口方法的输出参数类型和mapper.xml中定义的每个sql的resultType的类型相同
public interface UserMapper {
    User findUserById(Integer id);
}

    

UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
User user = userMapper.findUserById(1);
System.out.println(user);

输入映射及输出映射

  • parameterType

    • 传递简单类型

      #{...} ${value}

    • 传递pojo对象

      #{pojo对象属性} ${pojo对象属性}

    • 传递pojo包装对象

      #{pojo对象属性} ${pojo对象属性}

    • 传递多参数

      • 接口@Param("record") Orders record
      • xml文件 parameterType="map" #{record.xxx}
  • resultType

    指定将查询结果映射为pojo,但需要pojo的属性名和sql查询的列名一致方可映射成功

    • 输出简单类型
    • 输出pojo对象
    • 输出pojo列表
  • resultMap

    如果sql查询字段名和pojo的属性名不一致,可以通过resultMap将字段名和属性名作一个对应关系 ,resultMap实质上还需要将查询结果映射到pojo对象中。resultMap可以实现将查询结果映射为复杂类型的pojo

    
        
            
        
        
    
    

动态Sql

通过mybatis提供的各种标签方法实现动态拼接sql

  • if标签 xxx

    
    
  • where标签 xxx

    可以自动添加where,同时处理sql语句中第一个and关键字

    
    
  • SQL片段标签 xxx xxx

    Sql中可将重复的sql提取出来,使用时用include引用即可,最终达到sql重用的目的。

    如果要使用别的Mapper.xml配置的sql片段,可以在include标签属性refid值添加对应的Mapper.xml的namespace

    
    
        id, username, birthday, sex, address
    
    
  • foreach标签 xxx

    向sql传递数组或List,mybatis使用foreach解析

    
        id, username, birthday, sex, address
    
    
    

关联查询

  • 一对一查询

  • ResultType

    定义专门的pojo类作为输出类型,pojo类中定义了sql查询结果集所有的字段

    • ResultMap

      根据表的关系,改造pojo对象,使用resultMap描述对象之间的关系

      • 定义对象

        class Many{

          class One;
         }
        
      • xml配置

        
        
        
        
        
            
            
        
        

  • 一对多查询

    • 定义对象

      class One{
        List list;
      }
      
    • xml配置

      
          
          
      
          
              
              
          
      
      
      
      

Sping与mybatis整合

Spring与mybatis整合,负责数据库池及SessionFactory的创建,不管已下哪种方式都要配置数据库池及SessionFactory






    
    
    
    
    
    



    
    

//mybatis-config.xml


    



    

  • 传统dao开发方式

    原始的DAO开发接口+实现类来完成。需要dao实现类需要继承SqlsessionDaoSupport类

    • spring生成实现类

          
      
      
    • 实现类中调用执行

      SqlSession sqlSession = super.getSqlSession();
      User user = sqlSession.selectOne("queryUserById", id);
      
  • 手动配置mapper代理

    • 创建mapper代理接口

    • 实现接口与xml文件之前的关系映射

    • spring生成实现类

      
          
          
          
          
      
      
    • Service中调用执行

      ApplicationContext context=ClassPathXmlApplicationContext("classpath:applicationContext.xml");
      UserMapper userMapper = this.context.getBean("userMapper");
      User user = userMapper.queryUserById(1);
      
  • 扫描方式配置mapper代理

    • 创建mapper代理接口

    • 实现接口与xml文件之前的关系映射

    • spring生成实现类

      
      
      
          
          
      
      
    • Service中调用执行

      ApplicationContext applicationContext = new ClassPathXmlApplicationContext("classpath:applicationContext.xml");
      UserMapper userMapper=applicationContext.getBean(UserMapper.class);
      System.out.printf(String.valueOf(userMapper.findUserById(10)));
      

Mybatis逆向工程

你可能感兴趣的:(mybatis)