为了账号安全,请及时绑定邮箱和手机立即绑定

Mybatis官方生成器入门详解

标签:
Java SSM 数据库
概述

Mybatis官方生成器(Mybatis Generator)是一个强大的工具,用于生成Mybatis的映射文件和DAO接口,能够减少手工代码编写,提高开发效率。本文将详细介绍如何配置Mybatis官方生成器,包括生成器的配置文件编写、输出目录和包名配置以及映射规则配置。通过自动生成代码,可以快速搭建数据库操作的基础环境。

Mybatis环境搭建

Mybatis是一个优秀的持久层框架,它是SqlSession的简单封装,提供了动态SQL、存储过程等功能。Mybatis能够通过简单的配置和Java对象来完成大部分SQL操作,对于用户来说,只需要关注自己的业务逻辑,其他都由Mybatis框架负责处理。本文将详细介绍如何搭建Mybatis环境。

Mybatis简介

Mybatis是一个开源的持久层框架,它简化了数据库操作,使得开发者能够通过简单的配置和Java对象来完成大部分SQL操作。Mybatis的核心思想是将SQL语句配置在XML文件中,或注解在Java对象中,然后通过Mybatis提供的API执行SQL语句,并将结果映射为Java对象。这种编程方式使得数据库操作变得非常灵活,同时也大大降低了数据库操作的复杂度。

下载Mybatis并引入项目

为了在项目中使用Mybatis,首先需要下载Mybatis的jar包并将其引入到项目中。

  1. 下载Mybatis

  2. 引入Mybatis依赖
    • 如果使用Maven,可以在pom.xml文件中添加以下依赖:
      <dependencies>
       <dependency>
           <groupId>org.mybatis</groupId>
           <artifactId>mybatis</artifactId>
           <version>3.5.7</version>
       </dependency>
       <!-- 添加数据库驱动依赖,例如MySQL -->
       <dependency>
           <groupId>mysql</groupId>
           <artifactId>mysql-connector-java</artifactId>
           <version>8.0.26</version>
       </dependency>
      </dependencies>
    • 如果使用Gradle,可以在build.gradle文件中添加以下依赖:
      dependencies {
       implementation 'org.mybatis:mybatis:3.5.7'
       implementation 'mysql:mysql-connector-java:8.0.26'
      }
创建数据库及表

为了让Mybatis能够操作数据库,需要创建一个实际的数据库及表。这里以MySQL数据库为例。

CREATE DATABASE mybatis;
USE mybatis;

CREATE TABLE t_user (
    id INT PRIMARY KEY AUTO_INCREMENT,
    username VARCHAR(50),
    password VARCHAR(50),
    email VARCHAR(50)
);
配置数据库连接信息

为了使Mybatis能够连接到MySQL数据库,需要在项目中配置数据库连接信息。通常,这些信息会配置在application.propertiesapplication.yml文件中。

  1. 配置文件

    • 如果使用Spring Boot,可以在application.properties文件中添加数据库连接信息:

      spring.datasource.url=jdbc:mysql://localhost:3306/mybatis?serverTimezone=UTC
      spring.datasource.username=root
      spring.datasource.password=root
      spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
    • 如果使用Spring框架,可以在applicationContext.xml文件中配置数据源:
      <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
       <property name="driverClassName" value="com.mysql.cj.jdbc.Driver" />
       <property name="url" value="jdbc:mysql://localhost:3306/mybatis?serverTimezone=UTC" />
       <property name="username" value="root" />
       <property name="password" value="root" />
      </bean>
Mybatis官方生成器介绍

Mybatis官方生成器(Mybatis Generator)是一个强大的工具,用于生成Mybatis的映射文件和DAO接口。通过自动生成代码,可以减少重复的开发工作,提高开发效率。

什么是Mybatis官方生成器

Mybatis官方生成器(Mybatis Generator)是一个开源工具,它能够自动生成Mybatis所需的映射文件(XML)和对应的Java接口(Mapper接口),这些生成的代码可以帮助开发者快速搭建数据库操作的基础环境。

生成器的作用及优势
  1. 减少手工代码编写
    • 使用Mybatis Generator可以自动生成映射文件和Mapper接口,减少了手工编写的繁琐工作。
  2. 提高开发效率
    • 自动生成代码,使得开发人员可以专注于业务逻辑的实现,而不需要花费大量时间编写基础的数据库操作代码。
  3. 维护方便
    • 自动生成的代码遵循一定的规则,便于维护和扩展。
  4. 支持多种数据库
    • Mybatis Generator支持多种数据库,包括MySQL、Oracle、SQL Server等。
Mybatis官方生成器的配置

为了使用Mybatis Generator生成代码,需要在项目中正确配置生成器的配置文件。

编写生成器配置文件

Mybatis Generator的配置文件通常是一个XML文件,命名为generatorConfig.xml。该文件指定了数据库连接信息、生成的代码的位置、生成规则等。

示例配置文件

<generatorConfiguration>
    <classPathEntry location="D:/generator/mysql-connector-java-8.0.26.jar" />
    <context id="DB2Tables" targetRuntime="MyBatis3Simple">
        <commentGenerator>
            <property name="suppressAllComments" value="true" />
        </commentGenerator>
        <jdbcConnection driverType="MySQL">
            <property name="connectionURL" value="jdbc:mysql://localhost:3306/mybatis" />
            <property name="driverClass" value="com.mysql.cj.jdbc.Driver" />
            <property name="password" value="root" />
            <property name="userId" value="root" />
        </jdbcConnection>
        <javaModelGenerator targetPackage="com.example.model" targetProject="src/main/java">
            <property name="enableSubPackages" value="true" />
            <property name="trimStrings" value="true" />
        </javaModelGenerator>
        <sqlMapGenerator targetPackage="com.example.mapper" targetProject="src/main/resources">
            <property name="enableSubPackages" value="true" />
        </sqlMapGenerator>
        <javaClientGenerator type="ANNOTATEDMAPPER" targetPackage="com.example.mapper" targetProject="src/main/java">
            <property name="enableSubPackages" value="true" />
        </javaClientGenerator>
        <table tableName="t_user" domainObjectName="User" enableCounting="true" />
    </context>
</generatorConfiguration>

配置文件说明

  • classPathEntry:指定数据库驱动的路径。
  • context:生成器的上下文,可以在其中配置生成器的行为。
  • commentGenerator:配置生成的代码注释。
  • jdbcConnection:配置数据库连接信息。
  • javaModelGenerator:配置生成的Java模型类。
  • sqlMapGenerator:配置生成的SQL映射文件。
  • javaClientGenerator:配置生成的Mapper接口。
  • table:指定要生成代码的数据库表。
配置生成器的输出目录和包名

generatorConfig.xml文件中,可以配置生成代码的输出目录和包名。

输出目录和包名配置

<javaModelGenerator targetPackage="com.example.model" targetProject="src/main/java">
    <property name="enableSubPackages" value="true" />
    <property name="trimStrings" value="true" />
</javaModelGenerator>
<sqlMapGenerator targetPackage="com.example.mapper" targetProject="src/main/resources">
    <property name="enableSubPackages" value="true" />
</sqlMapGenerator>
<javaClientGenerator type="ANNOTATEDMAPPER" targetPackage="com.example.mapper" targetProject="src/main/java">
    <property name="enableSubPackages" value="true" />
</javaClientGenerator>

配置文件说明

  • targetPackage:生成代码的目标包名。
  • targetProject:生成代码的目标项目路径。
  • enableSubPackages:是否启用子包。
  • trimStrings:是否去除字符串的空格。
配置生成器映射规则

generatorConfig.xml文件中,可以通过配置table标签来指定生成器的映射规则。

映射规则配置

<table tableName="t_user" domainObjectName="User" enableCounting="true" />

配置文件说明

  • tableName:数据库表名。
  • domainObjectName:生成的Java模型类名。
  • enableCounting:是否生成计数方法。
使用Mybatis官方生成器生成代码

生成器生成代码的步骤包括配置生成器配置文件、运行生成器、解析生成的代码。

生成器生成代码的步骤
  1. 配置生成器配置文件:在项目中创建一个generatorConfig.xml文件,并根据需要配置生成器的参数。
  2. 运行生成器:通过命令行或IDE运行生成器,生成对应的Java接口、映射文件及实体类。
  3. 解析生成的代码:生成的代码包括Java接口、映射文件和实体类,需要理解这些代码的基本结构。

运行生成器

可以使用命令行工具或IDE运行生成器。

命令行

java -cp mybatis-generator-core-1.3.7.jar:lib/* org.mybatis.generator.api.MyBatisGenerator -configfile generatorConfig.xml -overwrite

IDE

  1. 创建一个新的Java类,用于调用生成器。
  2. 添加Mybatis Generator的jar包到项目的类路径中。
  3. 编写代码调用生成器。

    import org.mybatis.generator.api.MyBatisGenerator;
    import org.mybatis.generator.config.Configuration;
    import org.mybatis.generator.config.xml.ConfigurationParser;
    import org.mybatis.generator.exception.XMLParserException;
    import org.mybatis.generator.internal.DefaultShellCallback;
    
    import java.io.File;
    import java.util.ArrayList;
    import java.util.List;
    
    public class MybatisGeneratorRunner {
       public static void main(String[] args) throws Exception {
           List<String> warnings = new ArrayList<>();
           boolean overwrite = true;
           File configFile = new File("src/main/resources/generatorConfig.xml");
           ConfigurationParser cp = new ConfigurationParser(warnings);
           Configuration config = cp.parseConfiguration(configFile);
           DefaultShellCallback callback = new DefaultShellCallback(overwrite);
           MyBatisGenerator myBatisGenerator = new MyBatisGenerator(config, callback, warnings);
           myBatisGenerator.generate(null);
       }
    }

解析生成的代码

生成的代码通常包括以下几个部分:

  1. 实体类:对应的数据库表的Java模型类。
  2. Mapper接口:包含数据库操作方法的Java接口。
  3. 映射文件:包含SQL语句的XML文件。

实体类

生成的实体类通常位于配置文件中指定的包下。例如,假设配置文件中targetPackagecom.example.model,那么生成的实体类将位于src/main/java/com/example/model目录下。

public class User {
    private Integer id;
    private String username;
    private String password;
    private String email;

    // 构造函数
    // Getter和Setter方法
}

Mapper接口

生成的Mapper接口位于配置文件中指定的包下。例如,假设配置文件中targetPackagecom.example.mapper,那么生成的Mapper接口将位于src/main/java/com/example/mapper目录下。

public interface UserMapper {
    int deleteByPrimaryKey(Integer id);
    int insert(User record);
    int insertSelective(User record);
    User selectByPrimaryKey(Integer id);
    int updateByPrimaryKeySelective(User record);
    int updateByPrimaryKey(User record);
}

映射文件

生成的映射文件位于配置文件中指定的包下。例如,假设配置文件中targetPackagecom.example.mapper,那么生成的映射文件将位于src/main/resources/com/example/mapper目录下。

<?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="com.example.mapper.UserMapper">
    <resultMap id="BaseResultMap" type="com.example.model.User">
        <id column="id" property="id" />
        <result column="username" property="username" />
        <result column="password" property="password" />
        <result column="email" property="email" />
    </resultMap>
    <sql id="Base_Column_List">id, username, password, email</sql>
    <select id="selectByPrimaryKey" resultMap="BaseResultMap" parameterType="java.lang.Integer">
        SELECT
        <if test="distinct">
            DISTINCT
        </if>
        <include refid="Base_Column_List" />
        FROM t_user
        WHERE id = #{id,jdbcType=INTEGER}
    </select>
    <insert id="insert" parameterType="com.example.model.User">
        INSERT INTO t_user (username, password, email)
        VALUES (#{username,jdbcType=VARCHAR}, #{password,jdbcType=VARCHAR}, #{email,jdbcType=VARCHAR})
    </insert>
    <delete id="deleteByPrimaryKey" parameterType="java.lang.Integer">
        DELETE FROM t_user WHERE id = #{id,jdbcType=INTEGER}
    </delete>
    <update id="updateByPrimaryKey" parameterType="com.example.model.User">
        UPDATE t_user SET
        username = #{username,jdbcType=VARCHAR},
        password = #{password,jdbcType=VARCHAR},
        email = #{email,jdbcType=VARCHAR}
        WHERE id = #{id,jdbcType=INTEGER}
    </update>
</mapper>
如何运行生成器

使用命令行或IDE运行生成器时,确保generatorConfig.xml文件路径正确,并且设置了正确的数据库连接信息和输出目录。

生成代码的使用

生成的代码可以帮助开发者快速搭建数据库操作的基础环境,包括如何使用生成的Mapper接口及XML文件,以及如何使用生成的实体类。

如何使用生成的Mapper接口及XML文件

生成的Mapper接口及XML文件可以与Mybatis的SqlSession集成,实现对数据库表的CRUD操作。

使用Mapper接口

import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import java.io.InputStream;
import java.util.List;

public class UserMapperExample {
    public static void main(String[] args) {
        // 读取Mybatis配置文件
        InputStream inputStream = Resources.getResourceAsStream("MyBatisConfig.xml");
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        SqlSession session = sqlSessionFactory.openSession();

        UserMapper mapper = session.getMapper(UserMapper.class);

        // 查询所有用户
        List<User> users = mapper.selectAll();
        for (User user : users) {
            System.out.println(user);
        }

        // 添加用户
        User newUser = new User();
        newUser.setUsername("John");
        newUser.setPassword("123456");
        newUser.setEmail("john@example.com");
        mapper.insert(newUser);

        // 更新用户信息
        User updatedUser = new User();
        updatedUser.setId(1);
        updatedUser.setUsername("John");
        updatedUser.setPassword("654321");
        mapper.updateByPrimaryKey(updatedUser);

        // 删除用户
        mapper.deleteByPrimaryKey(1);

        session.commit();
        session.close();
    }
}

代码说明

  • 读取Mybatis配置文件:使用SqlSessionFactoryBuilder从配置文件中读取Mybatis配置。
  • 获取SqlSession:通过SqlSessionFactory打开一个SqlSession
  • 获取Mapper实例:通过SqlSession.getMapper方法获取Mapper接口的实现类。
  • 执行数据库操作:调用生成的Mapper接口中的方法,进行数据库的CRUD操作。
如何使用生成的实体类

生成的实体类可以作为参数传递给Mapper接口的方法,或作为方法的返回值。

使用实体类

import com.example.model.User;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import java.io.InputStream;
import java.util.List;

public class UserEntityExample {
    public static void main(String[] args) {
        // 读取Mybatis配置文件
        InputStream inputStream = Resources.getResourceAsStream("MyBatisConfig.xml");
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        SqlSession session = sqlSessionFactory.openSession();

        UserMapper mapper = session.getMapper(UserMapper.class);

        // 查询用户
        User user = mapper.selectByPrimaryKey(1);
        System.out.println(user);

        // 更新用户
        User updatedUser = new User();
        updatedUser.setId(1);
        updatedUser.setUsername("John");
        updatedUser.setPassword("654321");
        updatedUser.setEmail("john@example.com");
        mapper.updateByPrimaryKey(updatedUser);

        session.commit();
        session.close();
    }
}

代码说明

  • 读取Mybatis配置文件:使用SqlSessionFactoryBuilder从配置文件中读取Mybatis配置。
  • 获取SqlSession:通过SqlSessionFactory打开一个SqlSession
  • 获取Mapper实例:通过SqlSession.getMapper方法获取Mapper接口的实现类。
  • 使用实体类:创建实体类对象,作为参数传递给Mapper接口中的方法,或作为方法的返回值。
实际示例:CRUD操作

为了更好地理解生成器生成的代码的使用,下面给出一个具体的CRUD操作示例。

CRUD操作示例

import com.example.model.User;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import java.io.InputStream;
import java.util.List;

public class CRUDExample {
    public static void main(String[] args) {
        // 读取Mybatis配置文件
        InputStream inputStream = Resources.getResourceAsStream("MyBatisConfig.xml");
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        SqlSession session = sqlSessionFactory.openSession();

        UserMapper mapper = session.getMapper(UserMapper.class);

        // 插入用户
        User newUser = new User();
        newUser.setUsername("John");
        newUser.setPassword("123456");
        newUser.setEmail("john@example.com");
        mapper.insert(newUser);
        session.commit();

        // 查询用户
        User user = mapper.selectByPrimaryKey(newUser.getId());
        System.out.println(user);

        // 更新用户
        newUser.setUsername("John Updated");
        newUser.setPassword("654321");
        mapper.updateByPrimaryKey(newUser);
        session.commit();

        // 删除用户
        mapper.deleteByPrimaryKey(newUser.getId());
        session.commit();

        // 查询所有用户
        List<User> users = mapper.selectAll();
        for (User u : users) {
            System.out.println(u);
        }

        session.close();
    }
}

代码说明

  • 读取Mybatis配置文件:使用SqlSessionFactoryBuilder从配置文件中读取Mybatis配置。
  • 获取SqlSession:通过SqlSessionFactory打开一个SqlSession
  • 获取Mapper实例:通过SqlSession.getMapper方法获取Mapper接口的实现类。
  • 插入用户:创建一个新的用户对象,并调用Mapper接口的insert方法将其插入数据库。
  • 查询用户:调用Mapper接口的selectByPrimaryKey方法查询用户。
  • 更新用户:修改用户对象的信息,并调用Mapper接口的updateByPrimaryKey方法更新数据库中的用户信息。
  • 删除用户:调用Mapper接口的deleteByPrimaryKey方法删除用户。
  • 查询所有用户:调用Mapper接口的selectAll方法查询所有用户。
常见问题及解决方法

在使用Mybatis Generator过程中,可能会遇到一些常见问题。下面列出了常见问题及其解决方案,以及生成器的高级配置和自定义扩展方法。

常见错误及解决方案

错误1:找不到数据库表

  • 问题描述:生成器无法找到数据库表。
  • 解决方案:确保generatorConfig.xml文件中的tableName配置正确,并且数据库中存在该表。

错误2:生成器无法连接数据库

  • 问题描述:生成器无法连接到数据库。
  • 解决方案:检查generatorConfig.xml文件中的数据库连接信息,确保connectionURLdriverClasspassworduserId等配置正确。

错误3:生成的代码不正确

  • 问题描述:生成的Mapper接口或映射文件中的SQL语句不正确。
  • 解决方案:检查generatorConfig.xml文件中的配置,确保table标签中的tableNamedomainObjectName配置正确。

错误4:生成器运行时抛出异常

  • 问题描述:运行生成器时抛出异常。
  • 解决方案:查看异常信息,检查generatorConfig.xml文件中的配置是否正确。确保所有路径和类路径设置正确。
生成器的高级配置

Mybatis Generator提供了许多高级配置,可以进一步定制生成的代码。

高级配置示例

<generatorConfiguration>
    <classPathEntry location="D:/generator/mysql-connector-java-8.0.26.jar" />
    <context id="DB2Tables" targetRuntime="MyBatis3Simple">
        <commentGenerator>
            <property name="suppressAllComments" value="true" />
        </commentGenerator>
        <jdbcConnection driverType="MySQL">
            <property name="connectionURL" value="jdbc:mysql://localhost:3306/mybatis" />
            <property name="driverClass" value="com.mysql.cj.jdbc.Driver" />
            <property name="password" value="root" />
            <property name="userId" value="root" />
        </jdbcConnection>
        <javaModelGenerator targetPackage="com.example.model" targetProject="src/main/java">
            <property name="enableSubPackages" value="true" />
            <property name="trimStrings" value="true" />
            <property name="immutable" value="true" />
        </javaModelGenerator>
        <sqlMapGenerator targetPackage="com.example.mapper" targetProject="src/main/resources">
            <property name="enableSubPackages" value="true" />
            <property name="supportMToNMappings" value="true" />
        </sqlMapGenerator>
        <javaClientGenerator type="ANNOTATEDMAPPER" targetPackage="com.example.mapper" targetProject="src/main/java">
            <property name="enableSubPackages" value="true" />
            <property name="additionalInterfaces" value="com.example.mapper.ext.MyCustomMapper" />
        </javaClientGenerator>
        <table tableName="t_user" domainObjectName="User" enableCounting="true">
            <generatedKey column="id" sqlType="INTEGER" identity="true" />
            <columnOverride column="username" javaType="String" jdbcType="VARCHAR" />
        </table>
    </context>
</generatorConfiguration>

配置文件说明

  • immutable:是否生成不可变实体类。
  • supportMToNMappings:是否支持多对多映射。
  • additionalInterfaces:指定额外的接口文件。
生成器的自定义扩展

Mybatis Generator支持自定义扩展,可以进一步定制生成的代码。

自定义扩展示例

<generatorConfiguration>
    <classPathEntry location="D:/generator/mysql-connector-java-8.0.26.jar" />
    <context id="DB2Tables" targetRuntime="MyBatis3Simple">
        <commentGenerator>
            <property name="suppressAllComments" value="true" />
        </commentGenerator>
        <jdbcConnection driverType="MySQL">
            <property name="connectionURL" value="jdbc:mysql://localhost:3306/mybatis" />
            <property name="driverClass" value="com.mysql.cj.jdbc.Driver" />
            <property name="password" value="root" />
            <property name="userId" value="root" />
        </jdbcConnection>
        <javaModelGenerator targetPackage="com.example.model" targetProject="src/main/java">
            <property name="enableSubPackages" value="true" />
            <property name="trimStrings" value="true" />
            <property name="immutable" value="true" />
        </javaModelGenerator>
        <sqlMapGenerator targetPackage="com.example.mapper" targetProject="src/main/resources">
            <property name="enableSubPackages" value="true" />
            <property name="supportMToNMappings" value="true" />
        </sqlMapGenerator>
        <javaClientGenerator type="ANNOTATEDMAPPER" targetPackage="com.example.mapper" targetProject="src/main/java">
            <property name="enableSubPackages" value="true" />
            <property name="additionalInterfaces" value="com.example.mapper.ext.MyCustomMapper" />
        </javaClientGenerator>
        <table tableName="t_user" domainObjectName="User" enableCounting="true">
            <generatedKey column="id" sqlType="INTEGER" identity="true" />
            <columnOverride column="username" javaType="String" jdbcType="VARCHAR" />
        </table>
    </context>
</generatorConfiguration>

配置文件说明

  • generatedKey:定义主键生成规则。
  • columnOverride:覆盖某些列的Java类型和数据库类型。

通过以上配置,可以进一步定制生成的代码,满足特定的需求。

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消