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

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

MBG官方文档

MBG的配置使用

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

<build>
        <plugins>
            <plugin>
                <groupId>org.mybatis.generatorgroupId>
                <artifactId>mybatis-generator-maven-pluginartifactId>
                <version>1.3.0version>
                
                <dependencies>
                    <dependency>
                        <groupId>mysqlgroupId>
                        <artifactId>mysql-connector-javaartifactId>
                        <version>5.1.38version>
                    dependency>
                dependencies>
                <configuration>
                    
                                <configurationFile>${basedir}/src/main/resources/generatorConfig.xmlconfigurationFile>
                    
                    <overwrite>trueoverwrite>
                configuration>
            plugin>


        plugins>
    build>

2.在resources目录下建mappers文件夹存放生成的xxx-mapper.xml,并在java目录下建立dao和entity目录分别存放生成的Mapper接口和实体类
3.配置generatorConfig.xml




<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>
        
        <javaTypeResolver >
            <property name="forceBigDecimals" value="false" />
        javaTypeResolver>

        
        <javaModelGenerator targetPackage="com.chinasofti.ssm.dal.entity" targetProject="src/main/java">
            <property name="enableSubPackages" value="true" />
            <property name="trimStrings" value="true" />
        javaModelGenerator>

        
        <sqlMapGenerator targetPackage="resources.mappers"  targetProject="src/main/">
            <property name="enableSubPackages" value="true" />
        sqlMapGenerator>
        
        <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" >
            
            <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 map);

}

对应的mapper.xml如下:



<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>

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

你可能感兴趣的:(总结)