MybatisPlus与MybatisGenerator框架对比
为什么要使用持久化框架
作为一名Java工程师,开发工程中必不可少会遇到数据持久化问题。而在与数据库交互的过程中,将常规的sql语句通过模板的方式快速生成已经是CRUD开发中必不可少的工具,现在也有很多相关的框架可以使用,例如MybatisPlus、MybatisGenerator等,笔者两个框架都有使用过,在这里想比较一下二者的使用方式及优缺点,供大家更好地选择。
两种持久化框架的说明
MybatisPlus
mybatisPlus的接口框架,利用接口实现的方式封装了一些常用的CRUD方法,最大的好处就是:基本不用写sql,不用写sql,不用写sql!!!像平常用到的CRUD都会有,另外还有批处理的方法可供使用,减少了一大波重复写sql的麻烦。首先,配置方式:
引入maven包
<!-- mybatis-plus -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.4.3.1</version>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-extension</artifactId>
<version>3.4.3.1</version>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-core</artifactId>
<version>3.4.3.1</version>
</dependency>
数据库配置
datasource的配置各公司可能集成了不同的实现方式,可以使用xml方式配置也可以使用@Configration的注解来代替。
- 方式一:使用XML
spring:
datasource:
url: jdbc:mysql://localhost:3306/mybatisplus?useSSL=false&serverTimezone=Asia/Shanghai&characterEncoding=UTF8
username: root
password: password
driver-class-name: com.mysql.cj.jdbc.Driver
mybatis-plus:
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
type-enums-package: com.peter.mybatisplus.enums
global-config:
db-config:
logic-delete-value: 1 # 删除时赋1
logic-not-delete-value: 0 # 不删除赋0
- 方式二:使用@Configration
@Bean(name = "sqlSessionFactory")
public SqlSessionFactory sqlSessionFactory1(@Qualifier("dataSource") DataSource dataSource,
@Value("classpath:mybatis/mybatis-config.xml") Resource configLocation,
@Value("classpath:mybatis/mapper/*.xml") Resource[] mapperLocations) throws Exception {
MybatisSqlSessionFactoryBean sqlSessionFactoryBean = new MybatisSqlSessionFactoryBean();
sqlSessionFactoryBean.setDataSource(dataSource);
sqlSessionFactoryBean.setVfs(SpringBootVFS.class);
sqlSessionFactoryBean.setMapperLocations(mapperLocations);
sqlSessionFactoryBean.setTypeAliasesPackage("com.*);//多个包用逗号分割
sqlSessionFactoryBean.setTypeEnumsPackage("com.heyi.qa.abird.enums");
MybatisConfiguration mc = new MybatisConfiguration();
mc.setDefaultScriptingLanguage(MybatisXMLLanguageDriver.class);
mc.setJdbcTypeForNull(JdbcType.NULL);
mc.setUseColumnLabel(true);
mc.setMapUnderscoreToCamelCase(true);
mc.setLogPrefix("mybaits-sql");
mc.setLogImpl(StdOutImpl.class);
mc.setCacheEnabled(true);
sqlSessionFactoryBean.setConfigLocation(configLocation);
sqlSessionFactoryBean.setGlobalConfig(globalConfiguration());
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
sqlSessionFactoryBean.setPlugins(interceptor);
return sqlSessionFactoryBean.getObject();
}
@MapperScan指定到哪里找到Mapper
入口函数里增加@MapperScan的注解:
@SpringBootApplication
@MapperScan(basePackages = {"com.*.mapper","com.baomidou.mybatisplus.core"},
sqlSessionFactoryRef = "sqlSessionFactory")
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
接下来就可以在工程里使用了。使用方式:
第一,在生成的DO中,使用TableName注解,以User表为例;
@TableName("user")
public class User {
private Integer id;
private String name;
private Integer age;
}
第二,在要使用的Mapper中继承对应的BaseMapper类;
@Component
public interface UserMapper extends BaseMapper<User> {}
第三,进而在ServiceImpl中继承自动生成的ServiceImpl类,在这里就可以使用框架自带的各种操作函数了。
public class DevStoryReqServiceImpl extends ServiceImpl<DevStoryReqMapper, DevStoryReqDO>{
//插入
public void insert(){
insert(user);
saveBatch(list);
}
//更新
public void update(){
updateBatchById(list);
}
//删除
public void delete(){
delete();
}
}
好处:更改数据库字段之后再也不用担心忘了给sql加字段的问题,编码效率大大提升。
Mybatis Generator
使用mybatis-generator的模板框架,利用模板方式来实现。
引入maven配置
在pom的根结点下配置
<build>
<plugins>
<plugin>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-maven-plugin</artifactId>
<version>1.3.7</version>
</plugin>
<plugins>
</build>
插件配置
使用插件配置来
<plugins>
<plugin>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-maven-plugin</artifactId>
<version>${mybatis.generator.version}</version>
<configuration>
<configurationFile>src/main/resources/mybatis-generator/generatorConfig.xml</configurationFile>
<verbose>true</verbose>
<overwrite>true</overwrite>
</configuration>
<executions>
<execution>
<id>Generate MyBatis Artifacts</id>
<goals>
<goal>generate</goal>
</goals>
</execution>
</executions>
<dependencies>
<dependency>
<groupId>com.taobao.tddl</groupId>
<artifactId>tddl-client</artifactId>
<version>5.1.23-2</version>
<scope>compile</scope>
</dependency>
</dependencies>
</plugin>
</plugins>
按照上文中的路径配置的genrationConfig.xml如下:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE generatorConfiguration
PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
"http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
<generatorConfiguration>
<!-- 配置文件路径 -->
<!--数据库驱动包路径 在maven插件添加就可以了 -->
<context id="MySQLTables" targetRuntime="MyBatis3">
<plugin type="org.mybatis.generator.plugins.RenameExampleClassPlugin">
<property name="searchString" value="Example$"/>
<property name="replaceString" value="Criteria"/>
</plugin>
<!--关闭注释 -->
<commentGenerator>
<property name="suppressDate" value="true"/>
<property name="suppressAllComments" value="true"/>
</commentGenerator>
<!--数据库连接信息 -->
<jdbcConnection driverClass="com.mysql.jdbc.Driver"
connectionURL="jdbc:mysql://****"
userId="***" password="***">
</jdbcConnection>
<!--生成的model 包路径 -->
<javaModelGenerator targetPackage="com.*"
targetProject="src/main/java">
<property name="trimStrings" value="false"/>
</javaModelGenerator>
<!--生成xml mapper文件 路径 -->
<sqlMapGenerator targetPackage="mybatis"
targetProject="../*/src/main/resources">
<property name="enableSubPackages" value="true"></property>
</sqlMapGenerator>
<!-- 生成的java mapper接口的包路径 -->
<javaClientGenerator type="XMLMAPPER"
targetPackage="com.*.mybatis.mapper" targetProject="src/main/java">
</javaClientGenerator>
<table tableName="user" domainObjectName="*DO">
</table>
</context>
</generatorConfiguration>
使用方式:以
![在这里插入图片描述](https://img-blog.csdnimg.cn/bd9d3be2024e4e7491cd034af10089fd.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBAeWFub19zZA==,size_20,color_FFFFFF,t_70,g_se,x_16)
好处:不用手动加字段,每次可以连接数据库自动进行字段补齐。但是会生成一堆可能无用的sql,十分影响视觉。
总结
两种方式各有优劣,但在设计模式上有 一些共同点,下一篇会分享一下二者在设计思路上有哪些异同。