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

Mybatis官方生成器项目实战:从入门到实战

概述

Mybatis官方生成器(Mybatis Generator)是一个强大的代码生成工具,它可以生成用于Mybatis的Java实体类、Mapper接口和XML文件。本文将详细介绍如何在项目中配置和使用Mybatis Generator,并通过实战案例展示其在数据库操作中的应用。

Mybatis官方生成器简介

Mybatis简介

Mybatis是一个优秀的持久层框架,它支持定制化SQL、存储过程以及高级映射。Mybatis避免了几乎所有的JDBC代码和手动设置参数以及获取结果集。Mybatis可以使用XML或注解来配置和映射原生类型、接口和Java POJO(Plain Old Java Object,普通老式Java对象)。

Mybatis官方生成器概述

Mybatis官方生成器(Mybatis Generator)是一个代码生成器,它可以生成用于Mybatis的Java Entity类、Mapper接口、Mapper XML文件等。它主要通过配置文件来定义生成规则,适用于那些需要频繁与数据库交互的项目。它支持自定义模板,可以根据项目需求生成不同类型的代码。

安装配置Mybatis官方生成器

要使用Mybatis Generator,首先需要将其添加到构建工具中。这里以Maven为例说明如何配置Mybatis Generator。

  1. 在项目pom.xml文件中添加Mybatis Generator的依赖。
  2. 配置数据库连接信息。

下面是如何在pom.xml中添加Mybatis Generator依赖的示例:

<dependencies>
    <dependency>
        <groupId>org.mybatis.generator</groupId>
        <artifactId>mybatis-generator-core</artifactId>
        <version>1.3.7</version>
    </dependency>
</dependencies>

创建项目环境

创建Maven项目

创建一个Maven项目,确保项目结构清晰,便于后续的代码生成和调试。

  1. 初始化一个新的Maven项目。
  2. 配置pom.xml文件,确保项目依赖正确。
  3. 创建必要的目录结构,如src/main/javasrc/main/resources等。

引入Mybatis官方生成器依赖

在上一步中,我们已经在pom.xml中添加了Mybatis Generator的依赖。这里再确认一下,确保依赖配置正确。

配置数据库连接信息

在项目的src/main/resources目录下,创建Mybatis Generator的配置文件,通常命名为generatorConfig.xml。配置文件中需要定义数据库连接信息和生成器的其他参数。

<generatorConfiguration>
    <context id="DB2Tables" targetRuntime="MyBatis3">
        <jdbcConnection driverClass="com.mysql.jdbc.Driver"
                        connectionURL="jdbc:mysql://localhost:3306/mydb"
                        userId="root"
                        password="password"/>
        <javaModelGenerator targetPackage="com.example.entity"
                            targetProject="src/main/java"/>
        <sqlMapGenerator targetPackage="com.example.mapper"
                         targetProject="src/main/resources"/>
        <javaClientGenerator type="XMLMAPPER" targetPackage="com.example.mapper"
                             targetProject="src/main/java"/>
    </context>
</generatorConfiguration>

使用Mybatis官方生成器生成代码

生成基本的Java实体类

使用Mybatis Generator可以生成基本的Java实体类,这些实体类通常包含数据库表对应的字段。

  1. 执行Mybatis Generator命令。
  2. 检查生成的Java实体类。

示例的Java实体类生成如下:

public class User {
    private int id;
    private String name;
    private String email;

    // Getter and Setter
}

生成Mapper接口和XML文件

Mybatis Generator还会生成Mapper接口和XML文件。Mapper接口用于定义数据库操作方法,而XML文件用于配置SQL语句。

示例的Mapper接口生成如下:

public interface UserMapper {
    int insertUser(User record);
    User selectUser(int id);
    int updateUser(User record);
    int deleteUser(int id);
}

示例的XML文件生成如下:

<mapper namespace="com.example.mapper.UserMapper">
    <insert id="insertUser">
        INSERT INTO user (id, name, email) VALUES (#{id}, #{name}, #{email})
    </insert>
    <select id="selectUser" resultType="com.example.entity.User">
        SELECT * FROM user WHERE id = #{id}
    </select>
    <update id="updateUser">
        UPDATE user SET name = #{name}, email = #{email} WHERE id = #{id}
    </update>
    <delete id="deleteUser">
        DELETE FROM user WHERE id = #{id}
    </delete>
</mapper>

生成DAO层代码

除了实体类、Mapper接口和XML文件外,Mybatis Generator还可以生成DAO层代码,通常包含数据库操作的实现方法。

示例的DAO层代码生成如下:

public class UserDAO {
    private SqlSessionFactory sqlSessionFactory;

    public UserDAO(SqlSessionFactory sqlSessionFactory) {
        this.sqlSessionFactory = sqlSessionFactory;
    }

    public int insertUser(User user) {
        try (SqlSession session = sqlSessionFactory.openSession()) {
            UserMapper mapper = session.getMapper(UserMapper.class);
            return mapper.insertUser(user);
        }
    }

    public User selectUser(int id) {
        try (SqlSession session = sqlSessionFactory.openSession()) {
            UserMapper mapper = session.getMapper(UserMapper.class);
            return mapper.selectUser(id);
        }
    }

    public int updateUser(User user) {
        try (SqlSession session = sqlSessionFactory.openSession()) {
            UserMapper mapper = session.getMapper(UserMapper.class);
            return mapper.updateUser(user);
        }
    }

    public int deleteUser(int id) {
        try (SqlSession session = sqlSessionFactory.openSession()) {
            UserMapper mapper = session.getMapper(UserMapper.class);
            return mapper.deleteUser(id);
        }
    }
}

代码生成后的调试与运行

检查生成的代码是否正确

生成代码后,应该检查生成的代码是否符合预期。例如,检查生成的实体类、Mapper接口、XML文件以及DAO层代码是否正确。

调试与运行生成的代码

在IDE中运行生成的代码,确保其能够正常工作。通常需要配置SqlSessionFactory,然后使用SqlSession来执行数据库操作。

验证数据库操作

在数据库中插入、查询、更新和删除数据,验证生成的代码是否能够正确执行数据库操作。例如,可以通过编写测试用例来验证这些操作是否成功。

实战案例:简单CRUD操作

实现增删改查操作

在项目中实现基本的增删改查操作,可以在DAO层代码中定义这些操作,并通过SQLSession来执行。

示例的CRUD操作实现:

public class UserDAO {
    private SqlSessionFactory sqlSessionFactory;

    public UserDAO(SqlSessionFactory sqlSessionFactory) {
        this.sqlSessionFactory = sqlSessionFactory;
    }

    public int insertUser(User user) {
        try (SqlSession session = sqlSessionFactory.openSession()) {
            UserMapper mapper = session.getMapper(UserMapper.class);
            return mapper.insertUser(user);
        }
    }

    public User selectUser(int id) {
        try (SqlSession session = sqlSessionFactory.openSession()) {
            UserMapper mapper = session.getMapper(UserMapper.class);
            return mapper.selectUser(id);
        }
    }

    public int updateUser(User user) {
        try (SqlSession session = sqlSessionFactory.openSession()) {
            UserMapper mapper = session.getMapper(UserMapper.class);
            return mapper.updateUser(user);
        }
    }

    public int deleteUser(int id) {
        try (SqlSession session = sqlSessionFactory.openSession()) {
            UserMapper mapper = session.getMapper(UserMapper.class);
            return mapper.deleteUser(id);
        }
    }
}

测试CRUD操作的正确性

编写测试用例来验证CRUD操作的正确性,确保插入、查询、更新和删除操作都能正常执行。

示例的测试用例:

public class UserDAOTest {
    @Test
    public void testInsertUser() {
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsStream("mybatis-config.xml"));
        UserDAO dao = new UserDAO(sqlSessionFactory);
        User user = new User();
        user.setName("John Doe");
        user.setEmail("john.doe@example.com");
        int result = dao.insertUser(user);
        assertEquals(1, result);
    }

    @Test
    public void testSelectUser() {
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsStream("mybatis-config.xml"));
        UserDAO dao = new UserDAO(sqlSessionFactory);
        User user = dao.selectUser(1);
        assertNotNull(user);
        assertEquals("John Doe", user.getName());
    }

    @Test
    public void testUpdateUser() {
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsStream("mybatis-config.xml"));
        UserDAO dao = new UserDAO(sqlSessionFactory);
        User user = new User();
        user.setId(1);
        user.setName("Jane Doe");
        user.setEmail("jane.doe@example.com");
        int result = dao.updateUser(user);
        assertEquals(1, result);
    }

    @Test
    public void testDeleteUser() {
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsStream("mybatis-config.xml"));
        UserDAO dao = new UserDAO(sqlSessionFactory);
        int result = dao.deleteUser(1);
        assertEquals(1, result);
    }
}

优化和调整代码

在实际项目中,可能需要根据项目需求对生成的代码进行进一步的优化和调整。例如,可以调整生成的代码模板,或者自定义生成规则,以适应更复杂的项目需求。

示例的代码优化:

public class UserDAO {
    private SqlSessionFactory sqlSessionFactory;

    public UserDAO(SqlSessionFactory sqlSessionFactory) {
        this.sqlSessionFactory = sqlSessionFactory;
    }

    public int insertUser(User user) {
        try (SqlSession session = sqlSessionFactory.openSession()) {
            UserMapper mapper = session.getMapper(UserMapper.class);
            int result = mapper.insertUser(user);
            session.commit();
            return result;
        }
    }

    public User selectUser(int id) {
        try (SqlSession session = sqlSessionFactory.openSession()) {
            UserMapper mapper = session.getMapper(UserMapper.class);
            return mapper.selectUser(id);
        }
    }

    public int updateUser(User user) {
        try (SqlSession session = sqlSessionFactory.openSession()) {
            UserMapper mapper = session.getMapper(UserMapper.class);
            int result = mapper.updateUser(user);
            session.commit();
            return result;
        }
    }

    public int deleteUser(int id) {
        try (SqlSession session = sqlSessionFactory.openSession()) {
            UserMapper mapper = session.getMapper(UserMapper.class);
            int result = mapper.deleteUser(id);
            session.commit();
            return result;
        }
    }
}

Mybatis官方生成器的高级用法

自定义生成代码的模板

Mybatis Generator支持自定义生成代码的模板。可以在generatorConfig.xml文件中定义模板文件,自定义生成的代码。

示例的模板文件UserMapperTemplate.xml

<template autoDelimited="true" closeCurly="}" closeRound=")" closeSquare="]" end="</mapper>" fileEncoding="UTF-8"
          openCurly="{0}" openRound="(" openSquare="[" root="templates" statementExecutable="true"
          statementRemoveIndent="true" statementStart="INSERT INTO user (id, name, email) VALUES (#{id}, #{name}, #{email})"
          statementTrimWhitespaces="true" trimMode="ALL">
    <property name="statementRemoveIndent" value="true"/>
    <property name="statementTrimWhitespaces" value="true"/>
    <property name="statementExecutable" value="true"/>
</template>

定制生成规则

通过修改generatorConfig.xml文件中的配置,可以定制生成规则。例如,可以指定生成哪些表、生成哪些字段、生成哪些方法等。

示例的生成规则配置:

<context id="DB2Tables" targetRuntime="MyBatis3">
    <table tableName="user" domainObjectName="User" enableCountByExample="false" enableUpdateByExample="false"
           enableDeleteByExample="false" selectByExampleQueryId="false" />
</context>

处理复杂数据库结构

处理复杂数据库结构时,可以通过配置generatorConfig.xml文件中的<table>标签来指定生成规则。例如,可以处理多个关联表、继承关系等。

示例的复杂数据库结构生成配置:

<context id="ComplexTables" targetRuntime="MyBatis3">
    <table tableName="user" domainObjectName="User" enableCountByExample="false" enableUpdateByExample="false"
           enableDeleteByExample="false" selectByExampleQueryId="false" />
    <table tableName="order" domainObjectName="Order" enableCountByExample="false" enableUpdateByExample="false"
           enableDeleteByExample="false" selectByExampleQueryId="false" />
    <table tableName="order_item" domainObjectName="OrderItem" enableCountByExample="false" enableUpdateByExample="false"
           enableDeleteByExample="false" selectByExampleQueryId="false" />
</context>
点击查看更多内容
TA 点赞

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

评论

作者其他优质文章

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

100积分直接送

付费专栏免费学

大额优惠券免费领

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

举报

0/150
提交
取消