1.基本配置
1.1 添加通用 Mapper 提供的 starter 就完成了最基本的集成,依赖如下:
springboot的版本都可以,本次用的是2.3.1.RELEASE
<!--连接数据库-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.10</version>
</dependency>
<!--springboot集成mybatis-->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.3.2</version>
</dependency>
<!--通用mapper与springboot集成-->
<dependency>
<groupId>tk.mybatis</groupId>
<artifactId>mapper-spring-boot-starter</artifactId>
<version>2.1.5</version>
</dependency>
<!--通用mapper逆向工程-->
<dependency>
<groupId>tk.mybatis</groupId>
<artifactId>mapper-generator</artifactId>
<version>1.1.4</version>
</dependency>
<!--集成web-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
//*springboot集成通用mapper的逆向工程*
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<!--集成tkmybatis-->
<plugin>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-maven-plugin</artifactId>
<version>1.3.5</version>
<configuration>
<!--逆向工程配置文件的位置-->
<configurationFile>
${basedir}/src/main/resources/generator/generatorConfig.xml
</configurationFile>
<overwrite>true</overwrite>
<verbose>true</verbose>
</configuration>
<dependencies>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.16</version>
</dependency>
<dependency>
<groupId>tk.mybatis</groupId>
<artifactId>mapper</artifactId>
<version>4.1.4</version>
</dependency>
</dependencies>
</plugin>
</plugins>
</build>
1.2. @MapperScan 注解配置
你可以给带有 @Configuration 的类配置该注解,或者直接配置到 Spring Boot 的启动类上,如下:
<!--@tk 此注解集成了mybatis,所以自己写sql时也不用更换成mybatis专属的-->
@tk.mybatis.spring.annotation.MapperScan(basePackages = "扫描包")
@SpringBootApplication
public class SampleMapperApplication implements CommandLineRunner {}
- 注意:在 starter 的逻辑中,如果你没有使用 @MapperScan 注解,你就需要在你的接口上增加 @Mapper 注解,否则 MyBatis 无法判断扫描哪些接口。
2.配置文件
2.1 springboot的配置文件
server:
port: 8888
servlet:
context-path: /xiaomai
spring:
datasource:
#数据源
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.cj.jdbc.Driver
#?后面的前两个是时区报错时用,最后一个是找不到主键报错用
url: jdbc:mysql://localhost:3306/hpu_gp_ts?serverTimezone=UTC&characterEncoding=utf-8&nullCatalogMeansCurrent=true
username: root
password: Lys
#mybatis相关配置,通用mapper用不到,当自己在xml文件中写sql时能用到
mybatis:
type-aliases-package: com.per.lys.entity
mapper-locations: classpath:mapper/*.xml
# 打印sql语句
logging:
level:
com.per.lys.mapper : debug
2.2 通用mapper逆向工程的配置文件
2.2.1 配置文件一:generatorConfig.xml(存放路径与pom中提到的相对应)
<?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>
#引入配置小文件(在2.2.2中会提到)
<properties resource="generator/config.properties"/>
<context id="Mysql" targetRuntime="MyBatis3Simple" defaultModelType="flat">
<property name="javaFileEncoding" value="UTF-8"/>
#useMapperCommentGenerator 默认是true,生成属性和字段一一对应的注解 @Column()
<property name="useMapperCommentGenerator" value="true"/>
<plugin type="tk.mybatis.mapper.generator.MapperPlugin">
<!--mappers,配置后生成的 Mapper 接口都会自动继承上该接口-->
<property name="mappers" value="tk.mybatis.mapper.common.Mapper"/>
#以下两个虽然说都有意义,但是试了没有任何反应,也不知道为啥,就这样待着吧
<property name="forceAnnotation" value="true"/>
<property name="caseSensitive" value="true"/>
#lombok,在实体类上生成@data注解,省去写getter/setter等方法
<property name="lombok" value="Data"/>
<property name="beginningDelimiter" value="`" />
<property name="endingDelimiter" value="`" />
<!--<property name="generateColumnConsts" value="true"/>-->
<!--<property name="useMapperCommentGenerator" value="false"/>-->
</plugin>
<commentGenerator>
<property name="suppressDate" value="true"/>
<!-- 是否去除自动生成的注释 true:是 : false:否 -->
<property name="suppressAllComments" value="true"/>
</commentGenerator>
<!--数据库链接URL,用户名、密码
1.一般jdbc数据库的版本6.x以上,都是com.mysql.cj.jdbc.Driver 其他的低版本就是com.mysql.cj.jdbc.Driver
-->
<jdbcConnection driverClass="com.mysql.cj.jdbc.Driver"
connectionURL="${db.url}"
userId="${db.username}"
password="${db.password}">
</jdbcConnection>
<javaTypeResolver>
<property name="forceBigDecimals" value="false"/>
</javaTypeResolver>
<!-- 生成模型entity的包名和位置-->
<javaModelGenerator targetPackage="${model.package}" targetProject="${model.path}">
<!-- enableSubPackages:是否让schema作为包的后缀 -->
<property name="enableSubPackages" value="false"/>
<!-- 从数据库返回的值被清理前后的空格 -->
<property name="trimStrings" value="true"/>
</javaModelGenerator>
<!-- 生成映射文件mapper.xml的包名和位置-->
<sqlMapGenerator targetPackage="${sqlmap.package}" targetProject="${sqlmap.path}">
<property name="enableSubPackages" value="false"/>
</sqlMapGenerator>
<!-- 生成DAO的包名和位置-->
<javaClientGenerator type="XMLMAPPER" targetPackage="${dao.package}" targetProject="${dao.path}">
<property name="enableSubPackages" value="false"/>
</javaClientGenerator>
<!-- 要生成的表 tableName是数据库中的表名或视图名 domainObjectName是实体类名-->
<table tableName="tabple_emp" domainObjectName="Employee">
<property name="useActualColumnNames" value="false"/>
#说明主键是谁,在实体类属性上添加@ID注解
<generatedKey column="emp_id" sqlStatement="JDBC"/>
</table>
</context>
</generatorConfiguration>
2.2.2 配置文件二:config.properties(逆向工程配置文件中用)
# configuration for mybatis generator plugin
# spy 2020.7.13
#让逆向工程连接数据库
db.url=jdbc:mysql://localhost:3306/hpu_gp_ts?serverTimezone=UTC&characterEncoding=utf-8&useSSL=false&nullCatalogMeansCurrent=true
db.username=root
db.password=Lys
# entity file
model.package=com.xm.hardwaremanagement.entity
model.path=src/main/java
#
# sqlmap file
sqlmap.package=mapper
sqlmap.path=src/main/resources
#
# dao file
dao.package=com.xm.hardwaremanagement.dao
dao.path=src/main/java
3 完成效果(全部为自动生成)
3.1在mapper.xml文件中
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.per.lys.tkmbg.dao.EmployeeMapper">
<resultMap id="BaseResultMap" type="com.per.lys.tkmbg.entity.Employee">
<!--
WARNING - @mbg.generated
-->
<id column="emp_id" jdbcType="INTEGER" property="empId" />
<result column="emp_name" jdbcType="VARCHAR" property="empName" />
<result column="emp_salary" jdbcType="DOUBLE" property="empSalary" />
<result column="emp_age" jdbcType="INTEGER" property="empAge" />
</resultMap>
</mapper>
3.2在dao中
import com.per.lys.tkmbg.entity.Employee;
import tk.mybatis.mapper.common.Mapper;
public interface EmployeeMapper extends Mapper<Employee> {
}
3.3在实体类中
@Data
@Table(name = "`tabple_emp`")
public class Employee implements Serializable {
@Id
@Column(name = "`emp_id`")
@GeneratedValue(strategy = GenerationType.IDENTITY)//让通用 Mapper 在执行 insert 操作之后将数据库自动生成的主键值回写到实 体类对象中。
private Integer empId;
@Column(name = "`emp_name`")
private String empName;
@Column(name = "`emp_salary`")
private Double empSalary;
@Column(name = "`emp_age`")
private Integer empAge;
@Transient //非数据库表中字段
private String otherThings;
}
4 下面才是真正的使用方法
4.1 简单查询:简单增删改查 直接用dao中的对象调用其中的内置方法即可
-
selectOne 方法
-
xxxByPrimaryKey 方法
需要使用@Id 主键明确标记和数据库表主键字段对应的实体类字段,否则通用 Mapper 会将所有实体类字段作为联合主键。 -
xxxSelective 方法
非主键字段如果为 null 值,则不加入到 SQL 语句中。4.2 繁杂查询
例如:
目标:WHERE (emp_salary>? AND emp_age<?) OR (emp_salary<? AND emp_age>?)
1.创建 Example 对象
Example example = new Example(Employee.class);
2.通过 Example 对象创建 Criteria 对象
Criteria criteria01 = example.createCriteria();
Criteria criteria02 = example.createCriteria();
3.在两个 Criteria 对象中分别设置查询条件
//property 参数:实体类的属性名
//value 参数:实体类的属性值
criteria01.andGreaterThan("empSalary", 3000) .andLessThan("empAge", 25);
criteria02.andLessThan("empSalary", 5000) .andGreaterThan("empAge", 30);
4.使用 OR 关键词组装两个 Criteria 对象
example.or(criteria02);