优雅写代码系统bootmybatispagehelpermybatisplusdruid教你优雅写代码

[TOC]

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.addTransactionalMethod("list*", txAttr_REQUIRED_READONLY);
    source.addTransactionalMethod("count*", txAttr_REQUIRED_READONLY);
    source.addTransactionalMethod("is*", txAttr_REQUIRED_READONLY);
    return new TransactionInterceptor(primaryTransactionManager(), source);
}
  • 最初咱们配置一下咱们的切面、切点

@Bean
public Advisor txAdviceAdvisor() {
    AspectJExpressionPointcut pointcut = new AspectJExpressionPointcut();
    pointcut.setExpression(AOP_POINTCUT_EXPRESSION);
    return new DefaultPointcutAdvisor(pointcut, txAdvice());
}@Bean
public Advisor txAdviceAdvisor() {
    AspectJExpressionPointcut pointcut = new AspectJExpressionPointcut();
    pointcut.setExpression(AOP_POINTCUT_EXPRESSION);
    return new DefaultPointcutAdvisor(pointcut, txAdvice());
}
  • 最初阐明下。TransactionConfig这个类因为配置事务、拦挡所以咱们须要退出如下注解在雷伤

@Configuration
@Aspect
@EnableTransactionManagement

资源放行

  • 以上就是mybatis根本的一个配置了。然而这个时候还是不能应用的。因为咱们的mapper对应的xml是放在java目录下的。失常src下都是java。xml文件在maven编译时不放行的。咱们须要非凡解决下
  • 在pom的build下退出放行配置

<resources>
    <resource>
        <directory>src/main/java</directory>
        <includes>
            <include>**/*.xml</include>
            <include>**/*.properties</include>
            <include>**/*.yaml</include>
        </includes>
        <filtering>true</filtering>
    </resource>
    <resource>
        <directory>src/main/resources</directory>
        <includes>
            <include>**/*.*</include>
        </includes>
        <filtering>false</filtering>
    </resource>
</resources>
  • 退出如下配置后别忘记了clean一下在运行。避免缓存。clean之后看看target下文件

测试

  • 为了不便测试咱们须要编写测试类。

@SpringBootTest(classes = Application.class)
@RunWith(SpringJUnit4ClassRunner.class)
@WebAppConfiguration
public class TestDataSource {
  
    @Autowired
    private TestMapper testMapper;
    
    @Test
    public void test() {
        List<Map<String, Object>> test = testMapper.test();
        System.out.println(test);
    }
}

后果

  • 这里是我查询数据库中的一条数据。次要是测试springboot整合mybatis的流程。到这里mybatis就整合完了。

思考&&疑难

  • 下面的配置咱们是接入mybatis了。然而在笔者其余架构上测试过。在MybatisConfig这个类中配置数据源的时候能够间接new出DruidDataSource就能够了。springboot会主动通过DataSourceProperties这个类获取到数据源信息的。然而笔者这里始终没有尝试胜利。至于原理更是没有搞懂了。这里留下一个彩蛋心愿晓得的敌人能说说这事怎么回事

@Bean
@ConfigurationProperties(prefix = "spring.datasource")
public DataSource primaryDataSource() {
    return new DruidDataSource();
}
  • 上述代码和本案例中相比就少了很多配置。尽管有的敌人说能够通过映射实体来做。然而间接new对象对咱们而言更简略。疑难

应用通用mapper性能

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


<dependency>
    <groupId>tk.mybatis</groupId>
    <artifactId>mapper</artifactId>
    <version>3.3.9</version>
</dependency>
  • 这些插件其实就是改写咱们之前学习的myabtis四大组件中的某一个组件而实现的。所以不论是通用mapper还是前面要说的myabtis-plus都是须要从新改写咱们的myabtis配置类的。
  • 首先咱们想接入通用mapper时,咱们须要改用tk提供的扫包配置

@Bean
public MapperScannerConfigurer mapperScannerConfigurer() {
    tk.mybatis.spring.mapper.MapperScannerConfigurer mapperScannerConfigurer = new tk.mybatis.spring.mapper.MapperScannerConfigurer();
    //MapperScannerConfigurer mapperScannerConfigurer = new MapperScannerConfigurer();
    mapperScannerConfigurer.setSqlSessionFactory(primarySqlSessionFactory());
    //每张表对应的*.java,interface类型的Java文件
    mapperScannerConfigurer.setBasePackage("com.github.zxhtom.**.mapper");
    return mapperScannerConfigurer;
}
  • 而后增加通用mapper配置

@Bean()
public MapperHelper primaryMapperHelper() throws Exception {
    MapperHelper mapperHelper = new MapperHelper();

    Config config = mapperHelper.getConfig();
    //表名字段名应用驼峰转下划线大写模式
    config.setStyle(Style.camelhumpAndUppercase);

    mapperHelper.registerMapper(Mapper.class);
    mapperHelper.processConfiguration(primarySqlSessionFactory().getConfiguration());
    return mapperHelper;
}
  • 测试代码就很简略了。

User user = tkMapper.selectByPrimaryKey(1);

应用mybatis-plus

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

  • mybatis-plus 实际上就是通用mapper 。这里能够了解就是不同的实现。接入mybatis-plus其实很简略。首先咱们引入坐标


<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-boot-starter</artifactId>
    <version>2.2.0</version>
</dependency>
  • 而后咱们创立实体

@Data
@TableName(value = "person_info_large")
public class User {
    @TableId(value = "id",type = IdType.AUTO)
    private Integer id;
    private String account;
    private String name;
    private String area;
    private String title;
    private String motto;
}
  • 而后就是编写咱们的Mapper 。须要继承BaseMapper

public interface PlusMapper extends BaseMapper<User> {
}
  • 上述的编写之后根本就能够查问了。然而留神一下咱们须要批改下面的myabtisCOnfog这个类。因为接入mybatisplus后须要咱们用mybatisplus中的sqlsessionbean。

@Bean
public SqlSessionFactory primarySqlSessionFactory() {
    SqlSessionFactory factory = null;
    try {
        MybatisSqlSessionFactoryBean sqlSessionFactoryBean = new MybatisSqlSessionFactoryBean();
        sqlSessionFactoryBean.setDataSource(primaryDataSource());
        sqlSessionFactoryBean.setConfigLocation(new DefaultResourceLoader().getResource("classpath:mybatis-primary.xml"));
        sqlSessionFactoryBean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath*:com/github/zxhtom.**./*.xml"));
        sqlSessionFactoryBean.setTypeAliasesPackage("com.github.zxhtom.**.model");
        factory = sqlSessionFactoryBean.getObject();
    } catch (Exception e) {
        e.printStackTrace();
    }
    return factory;
}
  • 和通用mapper一样。就这样咱们就能够调用BaseMapper为咱们提供的办法操作数据库了。

@Test
public void plusTest() {
    User user = plusMapper.selectById(1);
    System.out.println(user);
}

应用分页插件

mybatis-plus自带分页

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

  • 首先咱们应用mybatis plus自带的分页插件,将插件类注入到容器中

@Bean
public PaginationInterceptor paginationInterceptor() {
    return new PaginationInterceptor();
}
  • 而后咱们查问的结构一个Page对象就行了。参数别离是第几页、展现条数

return plusMapper.selectPage(page, null);
  • 就是这么简略。应用简略原理才是咱们学习的重点。喜爱myabtis插件原理的能够留言。抽空能够钻研

github分页插件

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

  • 因为myatis-plus自带了分页插件。下面也展现了如何应用myabtis-plus插件。还有一个github上开元的分页插件。这里就和通用mapper进行组合应用
  • pagehelper官网更新还是挺怠惰的。提供了pagehelper 和springboot auto拆卸两种。 笔者这里测试了pagehelper-spring-boot-starter这个包不适宜本案例中。因为本案例中扫描mapper门路是通过MapperScannerConfigurer注册的。如果应用pagehelper-spring-boot-starter的话就会导致分页拦截器生效。咱们看看源码

  • 这是因为这版本提供了springboot主动拆卸。然而主动拆卸的代码中进行增加拦截器的时候sqlsessionfactory这个时候还没有进行扫描mapper.也就没有进行addMapper 。 所以这个时候增加的拦截器拦挡不到咱们的mapper . 如果非要应用这个版本的话。咱们扫描mapper就不能通过MapperScannerConfigurer . 通过笔者测试。须要在MybatisConfig类上增加扫描注解@MapperScan(basePackages = {"com.github.zxhtom.**.mapper"}, sqlSessionFactoryRef = "primarySqlSessionFactory")

应用惯例版本

  • 为了合乎本版本主旨 。 咱们这里应用如下坐标

<dependency>
    <groupId>com.github.pagehelper</groupId>
    <artifactId>pagehelper</artifactId>
    <version>5.1.7</version>
</dependency>
  • 应用这个版本pagehelper。 没有了springboot的主动拆卸了。咱们能够本人增加插件。增加插件有两种形式。想主动拆卸版本一样通过Configuration进行增加不过咱们通过Condition条件抉择增加的机会 。
  • 还有一个简略的形式就是通过SqlSessionFactoryBean设置sqlSessionFactoryBean.setPlugins(new Interceptor[]{new PageInterceptor()});
  • 因为通过sqlsessionFactoryBean增加的插件和在settings文件中增加是一样的。在通过XmlFactory.build Configuration对象是会主动将插件装在上。这个时候mapper也都扫描过了。

@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"));
        sqlSessionFactoryBean.setTypeAliasesPackage("com.github.zxhtom.**.model");
        sqlSessionFactoryBean.setPlugins(new Interceptor[]{new PageInterceptor()});
        factory = sqlSessionFactoryBean.getObject();
    } catch (Exception e) {
        e.printStackTrace();
    }
    return factory;
}

总结

  • 这里简略论述下为什么不实用注解扫描mapper、或者不在配置文件中配置扫包门路。因为通过MapperScannerConfigurer咱们能够动态控制门路。这样显得比拟有逼格。在理论开发中笔者举荐应用注解形式扫描。因为这样能够防止不必要的坑。
  • 到这里咱们整顿了【springboot整合mybaits】、【mybatis-plus】、【通用mapper】、【pagehelper插件整合】 这四个模块的整顿中咱们发现离不开myabtis的四大组件。springboot其实咱们还未接触到深的内容。这篇文章次要偏差myabtis . 后续还会持续衍生摸索 【myabtis+druid】监控数据信息 。
  • 喜爱钻研源码和开元框架小试牛刀的欢送关注我

代码仓库: https://gitee.com/zxhTom/spri…

退出战队

<span id=”addMe”>退出战队</span>

微信公众号

主题

非xml配置springboot+mybatis事务管理

【腾讯云】轻量 2核2G4M,首年65元

阿里云限时活动-云数据库 RDS MySQL  1核2G配置 1.88/月 速抢

本文由乐趣区整理发布,转载请注明出处,谢谢。

您可能还喜欢...

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据