【优雅写代码系统】springboot+mybatis+pagehelper+mybatisplus+druid教你如何优雅写代码

springboot 融合了很多插件。springboot相比spring来说有一下有点

  • 自动配置: 针对很多spring的应用程序,springboot提供了很多自动配置
  • 起步依赖: 告诉springboot你需要什么,他就会引入需要的库
  • 命令行界面:springboot的可选特性
  • Autuator: 监控springboot项目的运行情况

spring基本搭建

  • springboot的配置很简单。在pom中继承springboot的pom .然后依赖一下pom就可以继承所需的jar了

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.0.3.RELEASE</version>
</parent>


<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-test</artifactId>
    <scope>test</scope>
</dependency>

  • 出了jar外。我们pom中配置一个插件就行了

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
    </plugins>
</build>

整合mybatis

【详见feature/0002/spring-mybatis 分支】

  • 之前我们梳理过mybatis的运行机制及注意点。javaweb的开发时离不开spring的。一个完整的框架是离不开spirng的。所以spring整合mybatis势在必行。我们下面实现如何在spring下融合mybatis及其优秀的一些插件搭建架构

pom配置

  • 我们在springboot项目的pom中继续添加我们mybatis的jar就完成了第一步。
  • 一个是mybatis与spring的整合jar 。 开启springboot加载mybatis项目
  • 一个是spring的aopjar包。主要是实现mybatis的事务问题
  • 一个是mysql的jar包。这里主要看你自己的需求。如果你的项目中使用oracle那么久加入oracle的坐标就行了
  • druid是管理数据的数据源

<dependency>
    <groupId>org.mybatis.spring.boot</groupId>
    <artifactId>mybatis-spring-boot-starter</artifactId>
    <version>1.3.1</version>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-aop</artifactId>
</dependency>
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid</artifactId>
    <version>1.1.10</version>
</dependency>

mybatis配置

  • 上面的pom设置已经准备了mybatis开发阶段的基本jar。 有了上述的包就可以搭建mybatis . 正常我们在我们的springboot项目中配置一个bean配置的类 MybatisConfig

设置数据源


@Bean
@ConfigurationProperties("spring.datasource")
public DataSource primaryDataSource() {
    // 这里为了演示,暂时写死 。 实际上是可以通过autoConfigure装配参数的
    DruidDataSource dataSource = new DruidDataSource();
    dataSource.setUsername("root");
    dataSource.setPassword("123456");
    dataSource.setDriverClassName("com.mysql.jdbc.Driver");
    dataSource.setUrl("jdbc:mysql://192.168.44.130:3306/others?useUnicode=true&amp;characterEncoding=utf8");
    return dataSource;
}

  • 在springboot中我们只需要在方法上添加Bean注解,就相当于我们在spring的xml中配置的bean标签。在java代码中我们可以进行我们业务处理。个人理解感觉更加的可控。 因为我们使用的mysql。所以这里我们简单的使用druid的数据源

设置sqlsessionfactory


@Bean
public SqlSessionFactory primarySqlSessionFactory() {
    SqlSessionFactory factory = null;
    try {
        SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
        sqlSessionFactoryBean.setDataSource(primaryDataSource());
        sqlSessionFactoryBean.setConfigLocation(new DefaultResourceLoader().getResource("classpath:mybatis-primary.xml"));
        sqlSessionFactoryBean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath*:/com/github/zxhtom.**./*.xml"));
        factory = sqlSessionFactoryBean.getObject();
    } catch (Exception e) {
        e.printStackTrace();
    }
    return factory;
}

  • 在mybatis中sqlsesson是我们操作数据库最直接的java类。管理sqlsession就是上面的sqlsessionFactory 。 所以我们配置它也是必须的。因为和spring整合。Mybatis的SqlsessionFactory交由给spring的SqlsessionfactoryBean管理。所以我们先构建SqlSessionFactoryBean。然后配置必须的数据源、Configuration、mybatis的xml路径等等信息
  • SqlSessionFactoryBean 设置出了spring的FactoryBean属性意外。最重要的是可以设置Mybatis的sqlsessionfactory的属性。上面我们只是简单的设置了。后期可以根据架构的需求进行不断的完善。
  • 可以设置插件、缓存、别名、映射处理器、事务、环境等等所有mybatis的配置

设置扫描


@Bean
public MapperScannerConfigurer mapperScannerConfigurer() {
    MapperScannerConfigurer mapperScannerConfigurer = new MapperScannerConfigurer();
    mapperScannerConfigurer.setSqlSessionFactory(primarySqlSessionFactory());
    //每张表对应的*.java,interface类型的Java文件
    mapperScannerConfigurer.setBasePackage("com.github.zxhtom.**.mapper");
    return mapperScannerConfigurer;
}

  • springboot 中我们的mapper接口也是交由spring来扫描的。之前mybatis程序我们是一个一个手动加入的。spring的特性可以直接扫描指定路径的所有java类。这里我们就设置了一下mapper的路径。

设置开启事务

  • 优秀的架构没有事务是能使用的。我们配置事务也是很简单的。在springboot中我们推荐使用java代码来配置事务的。下面的配置我们为了容易阅读。配置在TransactionConfig类中

@Bean
public DataSourceTransactionManager primaryTransactionManager() {
    return new DataSourceTransactionManager(dataSource);
}

  • 首先是配置事务管理器。事务管理的是数据源。所以这里我们需要将MybatisConfig中的DataSource加载进来。这里不多说
  • 然后配置我们的通知点

@Bean
public TransactionInterceptor txAdvice() {
DefaultTransactionAttribute txAttr_REQUIRED = new DefaultTransactionAttribute();
txAttr_REQUIRED.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);

DefaultTransactionAttribute txAttr_REQUIRED_READONLY = new DefaultTransactionAttribute();
txAttr_REQUIRED_READONLY.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);
txAttr_REQUIRED_READONLY.setReadOnly(true);

NameMatchTransactionAttributeSource source = new NameMatchTransactionAttributeSource();
source.addTransactionalMethod("add*", txAttr_REQUIRED);
source.addTransactionalMethod("save*", txAttr_REQUIRED);
source.addTransactionalMethod("delete*", txAttr_REQUIRED);
source.addTransactionalMethod("update*", txAttr_REQUIRED);
source.addTransactionalMethod("exec*", txAttr_REQUIRED);
source.addTransactionalMethod("set*", txAttr_REQUIRED);
source.addTransactionalMethod("get*", txAttr_REQUIRED_READONLY);
source.addTransactionalMethod("query*", txAttr_REQUIRED_READONLY);
source.addTransactionalMethod("find*", txAttr_REQUIRED_READONLY);
source.addTr