文章目录
一、整合过程
1.添加依赖
如果要将其整合到当前项目中,首先我们需要将其依赖配置增加到 pom.xml 文件中,mybatis-springboot-starter 的最新版本为 1.3.2,需要 Spring Boot 版本达到 1.5 或者以上版本,同时,我们需要将数据源依赖和 jdbc 依赖也添加到配置文件中(如果不添加的话,将会使用默认数据源和 jdbc 配置):
<!-- 引入 MyBatis 场景启动器,包含其自动配置类及 MyBatis 3 相关依赖 -->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.3.2</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
2.application.properties/xml 配置
Spring Boot 整合 MyBatis 时几个比较需要注意的配置参数:
mybatis.config-location:
配置 mybatis-config.xml 路径,mybatis-config.xml 中配置 MyBatis 基础属性,如果项目中配置了 mybatis-config.xml 文件需要设置该参数。
mybatis.mapper-locations:
配置 Mapper 文件对应的 XML 文件路径。
mybatis.type-aliases-package:
配置项目中实体类包路径。
示例:
mybatis.config-location=classpath:mybatis-config.xml
mybatis.mapper-locations=classpath:mapper/*Dao.xml
mybatis.type-aliases-package=com.wang.entity
我们只配置 mapper-locations 即可,最终的 application.properties 文件如下:
# datasource配置
spring.datasource.url=jdbc:mysql://localhost:3306/mybatis_db?serverTimezone=UTC
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.username=root
spring.datasource.password=你的mysql密码
# 这里的classpath表示resources
mybatis.mapper-locations=classpath:mapper/*Dao.xml
3.启动类增加 Mapper 扫描
在启动类中添加对 Mapper 包扫描 @MapperScan,Spring Boot 启动的时候会自动加载包路径下的 Mapper 接口:
@SpringBootApplication
@MapperScan("com.wang.dao") //会扫描该路径下的Dao类,而无需每个Dao类都使用@Mapper
public class Boot05Application {
public static void main(String[] args) {
System.out.println("启动spring boot...");
SpringApplication.run(Boot05Application.class, args);
}
}
当然也可以直接在每个 Mapper 接口上面添加 @Mapper 注解,但是如果 Mapper 接口数量较多,在每个 Mapper 加注解是挺繁琐的,建议使用扫描注解。
二、实例
首先,确保mysql服务已经启动。
1.数据库中创建表格author
2.创建实体类
com.wang.entity下创建实体类Author:
package com.wang.entity;
import lombok.Data;
@Data
public class Author {
private String id;
private String name;
private String password;
private String mail;
public Author() {
}
public Author(String id, String name, String password, String mail) {
this.id = id;
this.name = name;
this.password = password;
this.mail = mail;
}
@Override
public String toString() {
return "Author{" +
"id='" + id + '\'' +
", name='" + name + '\'' +
", password='" + password + '\'' +
", mail='" + mail + '\'' +
'}';
}
}
可以看到我没有创建set方法和get方法,但这些都是必须的,其实是因为我引入了工具类,它帮我自动创建了。
下面我介绍一下lombok工具类用法:
- 导入依赖:
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
- IDEA中下载插件:
依次点击文件-设置-plugins,然后搜索lombok,点击安装,等待安装成功。
- 通过注解给类自动注入set和get方法:
在类上面使用@Data就可以了。
3.创建Dao类
com.wang.dao下创建AuthorDao接口:
package com.wang.dao;
import com.wang.entity.Author;
import org.apache.ibatis.annotations.Mapper;
import java.util.List;
@Mapper //Application类中已经开启了包扫描,其实这里可以不用此注解
public interface AuthorDao {
//增
int addAuthor(Author author);
//删
int delAuthorById(String id);
//改
int updateAuthor(Author author);
//查
List<Author> getAllAuthor();
}
4.创建Dao接口的映射文件XXDao.xml
在 resources/mapper 目录下新建 Mapper 接口的映射文件 AuthorDao.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 接口的对应关系-->
<mapper namespace="com.wang.dao.AuthorDao">
<!--配置表结构和实体类的对应关系-->
<resultMap type="com.wang.entity.Author" id="AuthorResult">
<result property="id" column="id"/>
<result property="name" column="name"/>
<result property="password" column="password"/>
<result property="mail" column="mail"/>
</resultMap>
<!--针对对应的接口方法,编写具体的 SQL 语句-->
<insert id="addAuthor" parameterType="com.wang.entity.Author">
insert into author(id,name,password,mail)
values(#{
id},#{
name},#{
password},#{
mail})
</insert>
<delete id="delAuthorById" parameterType="String">
delete from author where id=#{
id}
</delete>
<update id="updateAuthor" parameterType="com.wang.entity.Author">
update author
set name=#{
name},password=#{
password},mail=#{
mail}
where id=#{
id}
</update>
<select id="getAllAuthor" resultMap="AuthorResult">
select * from author
order by id desc
</select>
</mapper>
5.新建controller
在com.wang.controller包下创建MybatisController类:
package com.wang.controller;
import com.wang.dao.AuthorDao;
import com.wang.entity.Author;
import com.wang.util.StringTool;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
import java.util.List;
@RestController
public class MybatisController {
@Resource
AuthorDao authorDao;
//增
@GetMapping("/author/insert")
public boolean insert(Author author){
if(StringTool.isNotBlank(author.getId())&&StringTool.isNotBlank(author.getName())
&&StringTool.isNotBlank(author.getPassword())){
return authorDao.addAuthor(author)>0;
}
else {
System.out.println("作者信息有误");
return false;
}
}
//删
@GetMapping("/author/delete")
public boolean delete(String id){
if(id==null)return false;
else return authorDao.delAuthorById(id)>0;
}
//改
@GetMapping("/author/update")
public boolean update(Author author){
if(author==null||!StringTool.isNotBlank(author.getId())){
System.out.println("id不能为空");
return false;
}
return authorDao.updateAuthor(author)>0;
}
//查
@GetMapping("/author/queryAll")
public List<Author> queryAll(){
return authorDao.getAllAuthor();
}
}
这里我用到了一个自定义的工具类StringTool,用来判断字符串是否为空或空格。在com.wang.util下定义工具类StringTool:
package com.wang.util;
public class StringTool {
public static boolean isNotBlank(String str){
if(str==null||str.length()==0)return false;
char[] chs=str.toCharArray();
for(char ch:chs){
if(ch!=' ')return true;
}
return false;
}
}
6.测试
我们在test下面的com.wang包下创建MybatisTest类:
package com.wang;
import com.wang.controller.MybatisController;
import com.wang.entity.Author;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import java.util.List;
@SpringBootTest
public class MybatisTest {
@Autowired
MybatisController mybatisController;
@Test
public void testMybatisController(){
//测试insert
Author author=new Author("123","小王","234","[email protected]");
System.out.println("test insert:"+mybatisController.insert(author));
System.out.println("-------------");
//测试delete
System.out.println("test delete:"+mybatisController.delete("123"));
System.out.println("test delete:"+mybatisController.delete("0000"));//并不存在的id
System.out.println("-------------");
//测试update
author.setId("999");
author.setName("小龙虾");
author.setMail("[email protected]");
System.out.println("test update:"+mybatisController.update(author));
System.out.println("-------------");
//测试select
List<Author> list=mybatisController.queryAll();
System.out.println("test select:");
for(Author a:list){
System.out.println(a);
}
}
}
运行方法后:
三、Mybatis-Generator自动生成代码
MyBatis Generator 是 MyBatis 官方提供的代码生成器插件,可以用于 MyBatis 和 iBatis 框架的代码生成,支持所有版本的 MyBatis 框架以及 2.2.0 版本及以上的 iBatis 框架。
在前文中我们也介绍了如何使用 MyBatis 进行数据库操作,在进行功能开发时,一张表我们需要编写实体类、DAO 接口类以及 Mapper 文件,这些是必不可少的文件,如果表的数量较大,我们就需要重复的去创建实体类、Mapper 文件以及 DAO 类并且需要配置它们之间的依赖关系,这无疑是一个很麻烦的事情,而 MyBatis Generator 插件就可以帮助我们去完成这些开发步骤,使用该插件可以帮助开发者自动去创建实体类、Mapper 文件以及 DAO 类并且配置好它们之间的依赖关系,我们可以直接在项目中使用这些代码,后续只需要关注业务方法的开发即可。
1.导入依赖
<!--Mybatis-Generator插件-->
<plugin>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-maven-plugin</artifactId>
<version>1.3.5</version>
<dependencies>
<dependency>
<groupId> mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version> 8.0.23</version>
</dependency>
<dependency>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-core</artifactId>
<version>1.3.5</version>
</dependency>
</dependencies>
<executions>
<execution>
<id>Generate MyBatis Artifacts</id>
<phase>package</phase>
<goals>
<goal>generate</goal>
</goals>
</execution>
</executions>
<configuration>
<verbose>true</verbose>
<!-- 是否覆盖 -->
<overwrite>true</overwrite>
<!-- MybatisGenerator的配置文件位置 -->
<configurationFile>src/main/resources/mybatisGeneratorConfig.xml</configurationFile>
</configuration>
</plugin>
2.新增 MyBatis-Generator 的配置文件
在添加插件依赖到 pom.xml 文件中时,我们定义了 Mybatis Generator 的配置文件位置为 src/main/resources/mybatisGeneratorConfig.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>
<context id="my-blog-generator-config" targetRuntime="MyBatis3">
<!-- 生成的Java文件的编码 -->
<property name="javaFileEncoding" value="utf-8"/>
<!-- 格式化java代码 -->
<property name="javaFormatter" value="org.mybatis.generator.api.dom.DefaultJavaFormatter"/>
<!-- 格式化XML代码 -->
<property name="xmlFormatter" value="org.mybatis.generator.api.dom.DefaultXmlFormatter"/>
<plugin type="org.mybatis.generator.plugins.ToStringPlugin"/>
<!--创建Java类时对注释进行控制-->
<commentGenerator>
<property name="suppressDate" value="true"/>
<!-- 是否去除自动生成的注释 true:是 : false:否 -->
<property name="suppressAllComments" value="true"/>
</commentGenerator>
<!--数据库地址及登陆账号密码 改成你自己的配置-->
<jdbcConnection
driverClass="com.mysql.cj.jdbc.Driver"
connectionURL="jdbc:mysql://localhost:3306/blog?serverTimezone=UTC"
userId="root"
password="你的mysql密码">
</jdbcConnection>
<javaTypeResolver>
<property name="forceBigDecimals" value="false"/>
</javaTypeResolver>
<!--生成实体类设置-->
<javaModelGenerator targetPackage="com.wang.entity" targetProject="src/main/java">
<property name="enableSubPackages" value="true"/>
<property name="trimStrings" value="true"/>
</javaModelGenerator>
<!--生成Mapper文件设置-->
<sqlMapGenerator targetPackage="mapper" targetProject="src/main/resources">
<property name="enableSubPackages" value="true"/>
</sqlMapGenerator>
<!--生成Dao类设置-->
<javaClientGenerator type="XMLMAPPER" targetPackage="com.wang.dao"
targetProject="src/main/java">
<property name="enableSubPackages" value="true"/>
</javaClientGenerator>
<!--需要自动生成代码的表及对应的类名设置-->
<table tableName="generator_test" domainObjectName="GeneratorTest"
enableCountByExample="false"
enableUpdateByExample="false"
enableDeleteByExample="false"
enableSelectByExample="false"
selectByExampleQueryId="false">
</table>
</context>
</generatorConfiguration>
需要自动生成代码的表及对应类名的配置是写在 table 标签中的,如上所示,generator_test 表对应的实体类可以配置为 GeneratorTest,这些是开发者自定义的,也可以改成其他合适的类名。 如果有多张表同时生成,增加多个 table 标签配置即可。
注意:要先在数据库建立相应的表。
3.生成代码
配置文件和表结构都处理完成后就可以进行代码生成步骤了。IDEA 工具中的 Maven 插件中含有 mybatis-generator 的选项,双击 generate 即可,如下图所示:
接下来是最后一个步骤,在代码生成后,我们需要在 DAO 接口类上增加 @Mapper 注解,将其注册到 Spring 的 IOC 容器中以供其他类调用,在生成的文件中默认是没有这个注解的,或者是在主类中添加 @MapperScan 注解将相应包下的所有 Mapper 接口扫描到容器中。
至此,MyBatis-Generator 插件整合完成,也生成了对应的代码,接下来在项目开发时,我们都会使用它来生成我们 DAO 层的代码,之后再根据功能对 Mapper 文件进行修改,使用该插件时的注意事项如下:
由于数据库连接信息是单独定义在配置文件中的,所以在使用时一定要仔细检查,确保数据库连接正常。
在生成代码后,建议将 table 标签注释掉,不然在打包或者生成其他表的代码时会将原先已经生成的代码覆盖,可能会造成一些小麻烦。
代码生成后将 DAO 接口注册至 IOC 容器以供业务方法调用。