mybatis generator的使用及自定义sql最佳实践

MyBatis Generator (MBG) 提供了代码生成功能,简化了SQL文件编写,通过Java API实现类似Hibernate的编程体验。配置MBG涉及在pom.xml添加插件、设置资源目录以及编写generatorConfig.xml。使用MBG时,如果存在主键,将自动生成相应的方法。Example类提供条件拼装API简化查询。避免重复生成代码的最佳实践是编写自定义Mapper接口,继承原Mapper并单独编写Mapper.xml,确保更新时不覆盖已有内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

mybatis generator提供的代码生成功能解决了繁琐的sql文件编写,提供了类似hibernate的javaapi编程拼装sql功能,对于效率提高颇有帮助。

MBG官方文档

MBG的配置使用

本文采用maven方式配置。
1.在pom.xml中加入插件,<build>应该与<dependencies>并列

<build>
        <plugins>
            <plugin>
                <groupId>org.mybatis.generator</groupId>
                <artifactId>mybatis-generator-maven-plugin</artifactId>
                <version>1.3.0</version>
                <!-- 所需依赖 -->
                <dependencies>
                    <dependency>
                        <groupId>mysql</groupId>
                        <artifactId>mysql-connector-java</artifactId>
                        <version>5.1.38</version>
                    </dependency>
                </dependencies>
                <configuration>
                    <!--配置文件的路径 -->
                                <configurationFile>${basedir}/src/main/resources/generatorConfig.xml</configurationFile>
                    <!-- 重复生成是否覆盖源文件 -->
                    <overwrite>true</overwrite>
                </configuration>
            </plugin>


        </plugins>
    </build>

2.在resources目录下建mappers文件夹存放生成的xxx-mapper.xml,并在java目录下建立dao和entity目录分别存放生成的Mapper接口和实体类
3.配置generatorConfig.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="tables" targetRuntime="MyBatis3">
        <!-- 数据库连接配置 -->
        <jdbcConnection driverClass="com.mysql.jdbc.Driver"
                        connectionURL="jdbc:mysql://localhost:3306/ssm?characterEncoding=UTF8"
                        userId="root"
                        password="root">
        </jdbcConnection>
        <!-- java类型调整,此处并不强制使用BigDecimal -->
        <javaTypeResolver >
            <property name="forceBigDecimals" value="false" />
        </javaTypeResolver>

        <!-- 模型类生成配置,targetPackage为生成后文件的目录 -->
        <javaModelGenerator targetPackage="com.chinasofti.ssm.dal.entity" targetProject="src/main/java">
            <property name="enableSubPackages" value="true" />
            <property name="trimStrings" value="true" />
        </javaModelGenerator>

        <!-- XXXMapper.xml生成配置,targetPackage为生成后文件的目录 -->
        <sqlMapGenerator targetPackage="resources.mappers"  targetProject="src/main/">
            <property name="enableSubPackages" value="true" />
        </sqlMapGenerator>
        <!-- Mapper接口即XXXMapper.java生成配置,targetPackage为生成后文件的目录 -->
        <javaClientGenerator type="XMLMAPPER" targetPackage="com.chinasofti.ssm.dal.dao"  targetProject="src/main/java">
            <property name="enableSubPackages" value="true" />
        </javaClientGenerator>
        <!-- 表的配置 -->
        <table schema="ssm" tableName="player" domainObjectName="Player" >
            <!-- useActualColumnNames设为true则会直接将数据库的表名作为模型类的表名,所以设为false,默认转成驼峰式 -->
            <property name="useActualColumnNames" value="false"/>
            <generatedKey column="id" sqlStatement="mysql" identity="true" />
            <columnOverride column="id" property="id"/>
        </table>

    </context>
</generatorConfiguration>

4.在项目根目录下执行mvn mybatis-generator:generate 则会自动生成到指定目录下。eclipse可以run as > maven build 在goal里输入mybatis-generator:generate

!注意,配置文件中指定的targetPackage不能有大写,必须全小写,否则出错

关于生成的方法,如果设置了主键,则会生成一系列XXByPrimaryKey的方法,如果没有检查是否有主键或者主键类型是否为自增int。
生成的XXByExample可能会让你觉得很奇怪。其实Example的API很简单。主要是createCreteria方法,该方法创建的对象提供了各种条件拼装的方法,使用这些方法就能够创建查询条件了。
一个列子

    PaymentExample example = new PaymentExample();
            example.setOrderByClause("amount desc");
            example.setDistinct(true);
            example.createCriteria().andAmountGreaterThan(new BigDecimal("100")).andPayTimeGreaterThan(DateUtil.parse("2018-12-12 00:00:00"));
            paymentMapper.selectByExample(example);

生成的sql为

select distinct id, user, amount, status, pay_time from payment WHERE ( amount > ? and pay_time > ? ) order by amount desc 

自定义sql最佳实践

使用MBG会有一个问题,就是重复生成代码,如果不配置override(见pom.xml中的插件配置),则会生成一堆重复文件,如果配置了,会将UserMapper里的内容覆盖掉。个人认为的最佳实践如下。
编写一个自定义Mapper接口继承自原Mapper,将自定义的方法写在该对象中,并自己编写一个对应的Mapper.xml
Mapper接口如下:

package com.ci.framework.door.dal.dao;

import java.util.Map;

import com.ci.framework.door.dal.entity.User;

public interface UserMapperCustom extends UserMapper {

    User findById(int userId);

    User selectUsernameAndPassword(Map<String, Object> map);

}

对应的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="com.ci.framework.door.dal.dao.UserMapperCustom" >

  <select id="findById" parameterType="int" resultType="com.chinasofti.framework.door.dal.entity.User">
    select * from users where user_id=#{userId} 

  </select>

   <select id="selectUsernameAndPassword" parameterType="map" resultType="com.chinasofti.framework.door.dal.entity.User">
    select * from users where username=#{username} and passwd=#{passwd} 
  </select>

</mapper>

这样重复生成覆盖内容将不会影响到原先的内容。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值