zoukankan      html  css  js  c++  java
  • Mybatis 通用 Mapper 和 Spring 集成

    依赖

      正常情况下,在原有依赖基础上增加的 mapper-spring。

    <!-- https://mvnrepository.com/artifact/tk.mybatis/mapper-spring -->
    <dependency>
        <groupId>tk.mybatis</groupId>
        <artifactId>mapper-spring</artifactId>
        <version>1.0.5</version>
    </dependency>

      如果想使用其他版本的依赖文件,可以在Maven仓库上搜索“tk.mybatis”。

    配置 

      MapperScannerConfigurer xml

    <bean class="tk.mybatis.spring.mapper.MapperScannerConfigurer">
        <property name="basePackage" value="tk.mybatis.mapper.mapper"/>
        <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
        <property name="properties">
            <value>
                mappers=tk.mybatis.mapper.common.Mapper
            </value>
        </property>
    </bean>

      @MapperScan 注解

      Spring Boot 环境中使用 application.properties] 配置文件

      在 Spring Boot 中使用 Mapper 时,如果选择使用注解方式,可以不引入 mapper-starter 依赖。

      特别提醒:Spring Boot 中常见的是配置文件方式,使用环境变量或者运行时的参数都可以配置,这些配置都可以对通用 Mapper 生效。

      在 propertie 配置中:

    mapper.mappers=tk.mybatis.mapper.common.Mapper,tk.mybatis.mapper.common.Mapper2
    mapper.not-empty=true

      tk.mybatis.mapper.session.Configuration 配置

      使用要求:MyBatis (3.4.0+) 和 mybatis-spring (1.3.0+)

      注意该类的包名,这个类继承了 MyBatis 的 Configuration 类,并且重写了 addMappedStatement 方法,如下:

    @Override
    public void addMappedStatement(MappedStatement ms) {
        try {
            super.addMappedStatement(ms);
            //在这里处理时,更能保证所有的方法都会被正确处理
            if (this.mapperHelper != null) {
                this.mapperHelper.processMappedStatement(ms);
            }
        } catch (IllegalArgumentException e) {
            //这里的异常是导致 Spring 启动死循环的关键位置,为了避免后续会吞异常,这里直接输出
            e.printStackTrace();
            throw new RuntimeException(e);
        }
    }

      tk.mybatis.mapper.session.Configuration 提供了 3 种配置通用 Mapper 的方式,如下所示:

    /**
     * 直接注入 mapperHelper
     *
     * @param mapperHelper
     */
    public void setMapperHelper(MapperHelper mapperHelper) {
        this.mapperHelper = mapperHelper;
    }
    
    /**
     * 使用属性方式配置
     *
     * @param properties
     */
    public void setMapperProperties(Properties properties) {
        if (this.mapperHelper == null) {
            this.mapperHelper = new MapperHelper();
        }
        this.mapperHelper.setProperties(properties);
    }
    
    /**
     * 使用 Config 配置
     *
     * @param config
     */
    public void setConfig(Config config) {
        if (mapperHelper == null) {
            mapperHelper = new MapperHelper();
        }
        mapperHelper.setConfig(config);
    }

      这里直接配置一个 tk 中提供的 Configuration,然后注入到 SqlSessionFactoryBean 中。

      使用 tk.mybatis.mapper.session.Configuration 和 Spring 集成

    @Bean
    public SqlSessionFactory sqlSessionFactory() throws Exception {
        SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
        sessionFactory.setDataSource(dataSource());
        //创建 Configuration,设置通用 Mapper 配置
        tk.mybatis.mapper.session.Configuration configuration = new tk.mybatis.mapper.session.Configuration();
        //有 3 种配置方式
        configuration.setMapperHelper(new MapperHelper());
        sessionFactory.setConfiguration(configuration);
        
        return sessionFactory.getObject();
    }

    代码演示  

      创建一个超类接口,继承通用mapper内部的所有方法,然后就可以直接调用了。

    public interface BaseMapper<T> extends InsertSelectiveMapper<T>, UpdateByExampleSelectiveMapper<T>, UpdateByPrimaryKeySelectiveMapper<T>,
            SelectOneMapper<T>, SelectByPrimaryKeyMapper<T>, SelectMapper<T>, SelectByExampleMapper<T>, SelectByExampleRowBoundsMapper<T>,
            SelectCountByExampleMapper<T> {}

      下面介绍一下通用Mapper的内置方法

       countByExample --- 根据条件查询数量 

    int countByExample(UserExample example);
    //完整案例
    UserExample example=new UserExample();
    Criteria criteria = example.createCriteria();
    criteria.andAgeEqualTo(23);
    int count=userDAO.countByExample(example);
    //相当于:select count(*) from user where age=23;

      deleteByExample  --- 根据条件删除多条

    int deleteByExample(AccountExample example);
     
    //完整的案例
    
    UserExample example = new UserExample();
    
     Criteria criteria = example.createCriteria();
    
     criteria.andUsernameEqualTo("joe");
    
     userDAO.deleteByExample(example);
    
     //相当于:delete from user where username='joe'

      deleteByPrimaryKey ---根据主键删除

    int deleteByPrimaryKey(Integer id);
    
    //完整案例
    userDAO.deleteByPrimaryKey(101);  
    
    //相当于:delete from user where id=101

      insertSelective --- 插入数据

    int insertSelective(Account record); 
    //完整的案例
    User user = new User();
    user.setUsername("test"); 
    user.setPassword("123456") 
    user.setEmail("674531003@qq.com"); 
    userDAO.insertSelective(user); 
    //相当于:insert into user(username,password,email) values('test','123456','674531003@qq.com');

      selectByExample --- 根据条件查询数据

     List<Account> selectByExample(AccountExample example); 
    //完整的案例
    UserExample example = new UserExample();
    Criteria criteria = example.createCriteria();
    criteria.andUsernameEqualTo("joe");
    criteria.andUsernameIsNull();
    example.setOrderByClause("username asc,email desc");
    List<?> list = userDAO.selectByExample(example);
    //相当于:select * from user where username = 'joe' and username is null order by username asc,email desc
    //注:在myBatis 生成的文件UserExample.java中包含一个static 的内部类 Criteria ,在Criteria中有很多方法,主要是定义SQL 语句where后的查询条件。

      selectByPrimaryKey --- 根据主键查询数据

    Account selectByPrimaryKey(Integer id);
    //相当于select * from user where id = id

      updateByExampleSelective --- 按条件更新值不为null的字段

    int updateByExampleSelective(@Param("record") Account record, @Param("example") AccountExample example);
     //完整的案列
    UserExample example = new UserExample();
    Criteria criteria = example.createCriteria(); 
    criteria.andUsernameEqualTo("joe");
     User user = new User(); 
    user.setPassword("123"); userDAO.updateByPrimaryKeySelective(user,example); 
    //相当于:update user set password='123' where username='joe'

      updateByPrimaryKeySelective --- 根据主键更新

    int updateByPrimaryKeySelective(Account record);
     //完整的案例  
    User user = new User();
    user.setId(101);
    user.setPassword("joe");
    userDAO.updateByPrimaryKeySelective(user);
    //相当于:update user set password='joe' where id=101

     最后补一张从网上盗的关于Example的图

     

  • 相关阅读:
    枚举转中文,通过反射方法与描述的方式获取
    PropertyGrid 重难点总结
    Image与Bitmap的区别及相互转换
    A generic error occurred in GDI+的解决方案
    C# 鼠标穿透窗体与恢复
    struts2 validate验证
    Struts2 | struts.xml文件中使用method属性和通配符简化action标签和Action处理类的编写
    struts2中struts.xml和web.xml文件解析及工作原理
    Struts2中Struts.xml的作用
    <a>标签是什么意思 怎么使用?
  • 原文地址:https://www.cnblogs.com/JackpotHan/p/9802548.html
Copyright © 2011-2022 走看看