一、简介
Mybatis是一个持久化框架,支持自定义sql、存储过程和高级映射。
Mybatis 3中文官方文档地址:https://mybatis.org/mybatis-3/zh/java-api.html
1.1 映射支持的jdbc类型
BIT FLOAT CHAR TIMESTAMP OTHER UNDEFINED TININT REAL VARCHAR BINARY BLOB NVARCHAR SMALLINT DOUBLE LONGVARCHAR CLOB NCHAR INTEGER NUMERIC DATE LONGVARBINARY BOOLEAN NCLOB BIGINT DECIMAL TIME NULL CURSOR ARRAY
二、SpringBoot整合Mybatis
2.1 添加依赖
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
<version>1.3.0</version>
</dependency>
<dependency>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-core</artifactId>
<version>1.3.3</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.10</version>
</dependency>
2.2 修改配置文件
spring:
datasource:
druid:
username:
password:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/monster?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai&useSSL=false
max-active: 20 # 最大连接数
initial-size: 5 # 初始化连接数
min-idle: 5 # 最小连接数
max-wait: 60000 # 连接等待超时时间
mybatis:
## 实体类
type-aliases-package: mall.admin.mbg.entity
## mapper xml文件
mapper-locations:
- classpath*:mbg/mapper/*Mapper.xml
2.3 扫描mapper接口
package mall.admin.config;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Configuration;
@Configuration
@MapperScan(basePackages = {"mall.admin.mbg.mapper"})
public class MybatisConfig {
}
2.4 自动生成代码
GeneratorComment.java(构造实体类时添加上注释)
package mall.admin.mbg;
import org.mybatis.generator.api.IntrospectedColumn;
import org.mybatis.generator.api.IntrospectedTable;
import org.mybatis.generator.api.dom.java.CompilationUnit;
import org.mybatis.generator.api.dom.java.Field;
import org.mybatis.generator.api.dom.java.FullyQualifiedJavaType;
import org.mybatis.generator.internal.DefaultCommentGenerator;
import org.mybatis.generator.internal.util.StringUtility;
import java.util.Properties;
/**
* @description
* @author: hengDa.song
* @date: 2021/4/20 15:31
*/
public class GeneratorComment extends DefaultCommentGenerator {
private boolean addRemark=false;
private static final String EXAMPLE_SUFFIX="Example";
private static final String API_MODEL_PROPERTY_FULL_CLASS_NAME="io.swagger.annotations.ApiModelProperty";
@Override
public void addConfigurationProperties(Properties properties) {
super.addConfigurationProperties(properties);
this.addRemark= StringUtility.isTrue(properties.getProperty("addRemarkComments"));
}
@Override
public void addFieldComment(Field field, IntrospectedTable introspectedTable, IntrospectedColumn introspectedColumn) {
String remarks = introspectedColumn.getRemarks();
if (addRemark&&StringUtility.stringHasValue(remarks)){
if (remarks.contains("\"")){
remarks.replace("\"","");
}
field.addJavaDocLine("@ApiModelProperty(value=\""+remarks+"\")");
}
}
@Override
public void addJavaFileComment(CompilationUnit compilationUnit) {
super.addJavaFileComment(compilationUnit);
if (!compilationUnit.isJavaInterface()&&!compilationUnit.getType().getFullyQualifiedName().contains(EXAMPLE_SUFFIX)){
compilationUnit.addImportedType(new FullyQualifiedJavaType(API_MODEL_PROPERTY_FULL_CLASS_NAME));
}
}
}
generator.properties(构造代码数据库信息配置)
jdbc.driver=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/monster?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai&useSSL=false
jdbc.userId=root
jdbc.password=Aaa#19930511
generator.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>
<properties resource="generator\generator.properties"/>
<context id="MySqlContext" targetRuntime="MyBatis3" defaultModelType="flat">
<property name="beginningDelimiter" value="`"/>
<property name="endingDelimiter" value="`"/>
<property name="javaFileEncoding" value="UTF-8"/>
<!-- 为模型生成序列化方法-->
<plugin type="org.mybatis.generator.plugins.SerializablePlugin"/>
<!-- 为生成的Java模型创建一个toString方法 -->
<plugin type="org.mybatis.generator.plugins.ToStringPlugin"/>
<!--可以自定义生成model的代码注释-->
<commentGenerator type="mall.admin.mbg.GeneratorComment">
<!-- 是否去除自动生成的注释 true:是 : false:否 -->
<property name="suppressAllComments" value="true"/>
<property name="suppressDate" value="true"/>
<property name="addRemarkComments" value="true"/>
</commentGenerator>
<!--配置数据库连接-->
<jdbcConnection driverClass="${jdbc.driver}"
connectionURL="${jdbc.url}"
userId="${jdbc.userId}"
password="${jdbc.password}">
<!--解决mysql驱动升级到8.0后不生成指定数据库代码的问题-->
<property name="nullCatalogMeansCurrent" value="true"/>
</jdbcConnection>
<!--指定生成model的路径-->
<javaModelGenerator targetPackage="mall.admin.mbg.entity" targetProject="mall-admin\src\main\java"/>
<!--指定生成mapper.xml的路径-->
<sqlMapGenerator targetPackage="mbg\mapper" targetProject="mall-admin\src\main\resources"/>
<!--指定生成mapper接口的的路径-->
<javaClientGenerator type="XMLMAPPER" targetPackage="mall.admin.mbg.mapper"
targetProject="mall-admin\src\main\java"/>
<!-- 生成全部表tableName设为%-->
<table tableName="sys_admin">
<generatedKey column="admin_id" sqlStatement="MySql" identity="true"/>
</table>
<table tableName="sys_role">
<generatedKey column="role_id" sqlStatement="Mysql" identity="true"/>
</table>
<table tableName="sys_permission">
<generatedKey column="permission_id" sqlStatement="Mysql" identity="true"/>
</table>
<table tableName="sys_org">
<generatedKey column="org_id" sqlStatement="Mysql" identity="true"/>
</table>
</context>
</generatorConfiguration>
Generator.java(构造代码main)
package mall.admin.mbg;
import org.mybatis.generator.api.MyBatisGenerator;
import org.mybatis.generator.config.Configuration;
import org.mybatis.generator.config.xml.ConfigurationParser;
import org.mybatis.generator.exception.InvalidConfigurationException;
import org.mybatis.generator.exception.XMLParserException;
import org.mybatis.generator.internal.DefaultShellCallback;
import java.io.IOException;
import java.io.InputStream;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
/**
* @description
* @author: hengDa.song
* @date: 2021/4/20 15:32
*/
public class Generator {
public static void main(String[] args) throws XMLParserException, IOException, InvalidConfigurationException, SQLException, InterruptedException {
//mbg执行过程中的告警信息
List<String> warning=new ArrayList<>();
boolean overwrite=true;
InputStream inputStream = Generator.class.getResourceAsStream("/generator/generator.xml");
ConfigurationParser configurationParser = new ConfigurationParser(warning);
Configuration configuration = configurationParser.parseConfiguration(inputStream);
inputStream.close();
DefaultShellCallback defaultShellCallback = new DefaultShellCallback(overwrite);
MyBatisGenerator myBatisGenerator = new MyBatisGenerator(configuration, defaultShellCallback, warning);
myBatisGenerator.generate(null);
for (String warn:warning){
System.out.println(warn);
}
}
}
2.5 model、mapper接口、mapper xml
model
package mall.admin.mbg.entity;
import io.swagger.annotations.ApiModelProperty;
import java.io.Serializable;
import java.util.Date;
public class SysAdmin implements Serializable {
@ApiModelProperty(value="主键")
private String adminId;
@ApiModelProperty(value="管理员账号")
private String account;
@ApiModelProperty(value="管理员密码")
private String password;
...
}
mapper接口
package mall.admin.mbg.mapper;
import java.util.List;
import mall.admin.mbg.entity.SysAdmin;
import mall.admin.mbg.entity.SysAdminExample;
import org.apache.ibatis.annotations.Param;
public interface SysAdminMapper {
....
}
mapper xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="mall.admin.mbg.mapper.SysAdminMapper">
<resultMap id="BaseResultMap" type="mall.admin.mbg.entity.SysAdmin">
<id column="admin_id" jdbcType="VARCHAR" property="adminId" />
<result column="account" jdbcType="VARCHAR" property="account" />
<result column="password" jdbcType="VARCHAR" property="password" />
<result column="head_pic" jdbcType="VARCHAR" property="headPic" />
<result column="email" jdbcType="VARCHAR" property="email" />
<result column="phone" jdbcType="CHAR" property="phone" />
<result column="name" jdbcType="VARCHAR" property="name" />
<result column="sex" jdbcType="INTEGER" property="sex" />
<result column="status" jdbcType="INTEGER" property="status" />
<result column="create_time" jdbcType="DATE" property="createTime" />
<result column="update_time" jdbcType="DATE" property="updateTime" />
<result column="login_time" jdbcType="DATE" property="loginTime" />
<result column="last_login_time" jdbcType="DATE" property="lastLoginTime" />
<result column="login_ip" jdbcType="VARCHAR" property="loginIp" />
<result column="last_login_ip" jdbcType="VARCHAR" property="lastLoginIp" />
<result column="salt" jdbcType="CHAR" property="salt" />
</resultMap>
...
</mapper>