SpringBoot2.X 整合mybatisPlus3(一)

1.修改pom 直接使用官网的依赖  mybatisPlus官网:https://mp.baomidou.com/



    com.baomidou
    mybatis-plus
    3.1.1

2.配置 MybatisPlusConfig.java文件 加上@Configuration注解 以下为配置文件

import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.annotation.FieldStrategy;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.core.MybatisConfiguration;
import com.baomidou.mybatisplus.core.MybatisXMLLanguageDriver;
import com.baomidou.mybatisplus.core.config.GlobalConfig;
import com.baomidou.mybatisplus.extension.plugins.OptimisticLockerInterceptor;
import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor;
import com.baomidou.mybatisplus.extension.plugins.PerformanceInterceptor;
import com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean;
import org.apache.ibatis.logging.stdout.StdOutImpl;
import org.apache.ibatis.plugin.Interceptor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Profile;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;

import javax.sql.DataSource;
import java.util.ArrayList;
import java.util.List;

/**
 * MybatisPlus全局配置 
 */
@Configuration
public class MybatisPlusConfig {

    @Autowired
    @Qualifier("dataSource")
    private DataSource dataSource;

    /**
     * 乐观锁
     *
     * @return
     */
    @Bean
    public OptimisticLockerInterceptor optimisticLockerInterceptor() {
        return new OptimisticLockerInterceptor();
    }

    @Bean
    public MybatisSqlSessionFactoryBean sqlSessionFactory() throws Exception{
        MybatisSqlSessionFactoryBean sqlSessionFactoryBean= new MybatisSqlSessionFactoryBean();
        sqlSessionFactoryBean.setDataSource(dataSource);
        // MyBatis Mapper 所对应的 XML 文件位置,如果您在 Mapper 中有自定义方法(XML 中有自定义实现),需要进行该配置,告诉 Mapper 所对应的 XML 文件位置
        sqlSessionFactoryBean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath*:/mapper/*Dao.xml"));
        // MyBaits 别名包扫描路径,通过该属性可以给包中的类注册别名,注册后在 Mapper 对应的 XML 文件中可以直接使用类名,而不用使用全限定的类名(即 XML 中调用的时候不用包含包名)
        sqlSessionFactoryBean.setTypeAliasesPackage("com.disp.*.entity");
        sqlSessionFactoryBean.setTypeEnumsPackage("com.disp.common.enums");

        // GlobalConfig 配置
        GlobalConfig globalConfig = new GlobalConfig();
        GlobalConfig.DbConfig dbConfig = new GlobalConfig.DbConfig();
        dbConfig.setIdType(IdType.AUTO);
        dbConfig.setTableUnderline(true);
        dbConfig.setCapitalMode(false);
        dbConfig.setFieldStrategy(FieldStrategy.NOT_NULL);
        globalConfig.setDbConfig(dbConfig);
        globalConfig.setEnableSqlRunner(true);
        sqlSessionFactoryBean.setGlobalConfig(globalConfig);

        MybatisConfiguration mybatisConfiguration = new MybatisConfiguration();
        // 打印sql
        mybatisConfiguration.setLogImpl(StdOutImpl.class);
        
        mybatisConfiguration.setDefaultScriptingLanguage(MybatisXMLLanguageDriver.class);
        mybatisConfiguration.setMapUnderscoreToCamelCase(true);
        mybatisConfiguration.setCacheEnabled(false);
        mybatisConfiguration.setCallSettersOnNulls(true);
        sqlSessionFactoryBean.setConfiguration(mybatisConfiguration);
        List interceptors = new ArrayList<>();
        PaginationInterceptor paginationInterceptor = new PaginationInterceptor();
        // 设置数据库
        paginationInterceptor.setDialectType(DbType.MYSQL.getDb());
        // 设置分页插件
        interceptors.add(paginationInterceptor);
        sqlSessionFactoryBean.setPlugins(interceptors.toArray(new Interceptor[0]));
        System.out.println("sqlSessionFactory注入成功》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》");
        return sqlSessionFactoryBean;
    }

    @Bean
    @Profile({"dev", "test"})// 设置 dev test 环境开启
    public PerformanceInterceptor performanceInterceptor() {
        PerformanceInterceptor performanceInterceptor = new PerformanceInterceptor();
        // dev环境,格式化输出的sql语句
        performanceInterceptor.setFormat(true);
        performanceInterceptor.setMaxTime(5000);
        return performanceInterceptor;
    }

}

3.写一个实体类 UserEntity

import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;

import java.io.Serializable;
import java.util.Date;

/**
 * 用户表
 * 
 * @author xuzl
 * @email [email protected]
 * @date 2019-05-30 15:15:45
 */
@Data
@TableName("tb_user")
public class UserEntity implements Serializable {
   private static final long serialVersionUID = 1L;

   /**
    * 用户ID
    */
   @TableId
   private Long userId;
   /**
    * 用户名
    */
   private String username;
   /**
    * 密码
    */
   private String password;
   /**
    * 部门ID
    */
   private Long deptId;
   /**
    * 邮箱
    */
   private String email;
   /**
    * 联系电话
    */
   private String mobile;
   /**
    * 状态 0锁定 1有效
    */
   private String status;
   /**
    * 创建时间
    */
   private Date crateTime;
   /**
    * 修改时间
    */
   private Date modifyTime;
   /**
    * 最近访问时间
    */
   private Date lastLoginTime;
   /**
    * 性别 0男 1女
    */
   private String ssex;
   /**
    * 主题
    */
   private String theme;
   /**
    * 头像
    */
   private String avatar;
   /**
    * 描述
    */
   private String description;

}

4.UserService 代码

public interface UserService extends IService {

    /**  
     * 查询
     *
     * @param 
     * @return 
     * @Author: xuzl
     * @Date: 2019年06月03日
     **/
    List getUser();

    /**  
     * 添加
     *
     * @param 
     * @return 
     * @Author: xuzl
     * @Date: 2019年06月03日
     **/
    void insertUser();

    /**  
     * 修改
     *
     * @param id
     * @return 
     * @Author: xuzl
     * @Date: 2019年06月03日
     **/
    void updateUser(Long id);

    /**  
     * 多个删除
     *
     * @param ids
     * @return 
     * @Author: xuzl
     * @Date: 2019年06月03日
     **/
    void delAllUser(String[] ids);

    /**  
     * 删除
     *
     * @param id
     * @return 
     * @Author: xuzl
     * @Date: 2019年06月03日
     **/
    void deleteUser(Long id);

    /**  
     * 分页查询
     *
     * @param currentPage 
     * @param pageSize
     * @return 
     * @Author: xuzl
     * @Date: 2019年06月03日
     **/
    IPage getUserPage(Integer currentPage, Integer pageSize);
}

5.UserServiceImpl 代码

@Service("userService")
public class UserServiceImpl extends ServiceImpl implements UserService {
    @Autowired
    private UserDao userDao;

    @Override
    public List getUser() {
        return this.list(new QueryWrapper());
    }

    @Override
    @Transactional(propagation = Propagation.REQUIRED, isolation = Isolation.DEFAULT, timeout = 36000, rollbackFor = Exception.class)
    public void insertUser() {
        UserEntity userEntity = new UserEntity();
        userEntity.setUsername("55555");
        userEntity.setPassword("123456");
        userEntity.setDeptId(415L);
        userEntity.setEmail("asd");
        userEntity.setMobile("das");
        userEntity.setStatus("1");
        userEntity.setCrateTime(new Date());
        userEntity.setModifyTime(new Date());
        userEntity.setLastLoginTime(new Date());
        userEntity.setSsex("1");
        userEntity.setTheme("2");
        userEntity.setAvatar("2");
        userEntity.setDescription("3");
        userDao.insert(userEntity);
    }

    @Override
    @Transactional(propagation = Propagation.REQUIRED, isolation = Isolation.DEFAULT, timeout = 36000, rollbackFor = Exception.class)
    public void updateUser(Long id) {
        UserEntity userEntity = new UserEntity();
        userEntity.setUserId(id);
        userEntity.setEmail("[email protected]");
        userDao.updateById(userEntity);
    }

    @Override
    @Transactional(propagation = Propagation.REQUIRED, isolation = Isolation.DEFAULT, timeout = 36000, rollbackFor = Exception.class)
    public void delAllUser(String[] ids) {
        userDao.deleteBatchIds(Arrays.asList(ids));
    }

    @Override
    @Transactional(propagation = Propagation.REQUIRED, isolation = Isolation.DEFAULT, timeout = 36000, rollbackFor = Exception.class)
    public void deleteUser(Long id) {
        userDao.deleteById(id);
    }

    @Override
    public IPage getUserPage(Integer currentPage, Integer pageSize) {
        IPage page = new Page<>(currentPage, pageSize);
        QueryWrapper wrapper = new QueryWrapper<>();
        wrapper.orderByAsc("CRATE_TIME");
        IPage userIPage = userDao.selectPage(page, wrapper);
        System.out.println("总条数 ------> " + userIPage.getTotal());
        System.out.println("当前页数 ------> " + userIPage.getCurrent());
        System.out.println("当前每页显示数 ------> " + userIPage.getSize());
        return userIPage;
    }
}

6.启动类

@EnableTransactionManagement
@SpringBootApplication
@MapperScan("com.disp.dao")
public class App {

   public static void main(String[] args) {
      SpringApplication.run(App.class, args);
      System.out.println("Success!!!");
   }

}

踩到的坑:

调用自带方法报错Invalid bound statement

解决方案:

 1.配置项与启动类都配置了@MapperScan("com.disp.dao")注解

 3.检查是否指定了主键 实体类 主键id 加入 @TableId 注解

 2.mybatis-plus的yml配置未生效 使用@Bean 注入

SpringBoot2.X 整合mybatisPlus3(一)_第1张图片

分页:

 SpringBoot2.X 整合mybatisPlus3(一)_第2张图片

SpringBoot2.X 整合mybatisPlus3(一)_第3张图片

这两个一起注入 分页插件不会生效

要在MybatisSqlSessionFactoryBean中设置分页插件 要不然 分页出来的的total 与 page 都是0

SpringBoot2.X 整合mybatisPlus3(一)_第4张图片

以上就这么多 初次写文章 可能写的不是很仔细

贴上github地址:https://github.com/18614035671/mybatis-plus

你可能感兴趣的:(springboot2.X)