Mybatis注解式开发动态sql的使用

1,360 阅读5分钟

项目架构

SpringBoot + Mybatis (注解式开发) 快速生成 实体类( pojo)以及Mapper.java,也就是Dao层:mybatis-generator插件

mybatis-generator插件的使用

<?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="DB2Tables"    targetRuntime="MyBatis3">
        <commentGenerator>
            <property name="suppressDate" value="true"/>
            <property name="suppressAllComments" value="true"/>
        </commentGenerator>
        <!--数据库链接地址账号密码-->
        <jdbcConnection driverClass="com.mysql.cj.jdbc.Driver" connectionURL="jdbc:mysql://127.0.0.1:3306/mac_dev" userId="root" password="root">
        </jdbcConnection>
        <javaTypeResolver>
            <property name="forceBigDecimals" value="false"/>
        </javaTypeResolver>
        <javaModelGenerator targetPackage="com.beijin.limengya.mobile.pojo"
                            targetProject="src/main/java">
            <property name="enableSubPackages" value="false" />
            <property name="trimStrings" value="true" />
        </javaModelGenerator>

        <sqlMapGenerator targetPackage="mapper"
                         targetProject="src/main/resources">
            <property name="enableSubPackages" value="false" />
        </sqlMapGenerator>

        <javaClientGenerator targetPackage="com.beijin.limengya.mobile.dao"
                             targetProject="src/main/java"
                             type="ANNOTATEDMAPPER"> <!-- type="XMLMAPPER" -->
            <property name="enableSubPackages" value="false" />
        </javaClientGenerator>
        <!--生成对应表及类名-->
        <table tableName="COLLECTION_USER_INFO" domainObjectName="Repairjl" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="false" selectByExampleQueryId="false">
        </table>
    </context>
</generatorConfiguration>

将数据库链接改为自己的数据库链接 其中tableName 为数据库 表名 domainObjectName 为对应实体类名

看一下生成的内容

public class Repairjl {
    private Integer id;

    private String deviceId;

    private String repairName;

    private String anceName;

    private String finishExplain;

    private String failureCause;

    private Integer preventId;

    private Integer testId;

    private Integer partId;

    private Integer repairUserid;

    private Integer wxUserid;

    private String repairTime;

    private String createTime;

    private String endTime;

    private Integer finishId;

    private Integer downId;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getDeviceId() {
        return deviceId;
    }

    public void setDeviceId(String deviceId) {
        this.deviceId = deviceId == null ? null : deviceId.trim();
    }

    public String getRepairName() {
        return repairName;
    }

    public void setRepairName(String repairName) {
        this.repairName = repairName == null ? null : repairName.trim();
    }

    public String getAnceName() {
        return anceName;
    }

    public void setAnceName(String anceName) {
        this.anceName = anceName == null ? null : anceName.trim();
    }

    public String getFinishExplain() {
        return finishExplain;
    }

    public void setFinishExplain(String finishExplain) {
        this.finishExplain = finishExplain == null ? null : finishExplain.trim();
    }

    public String getFailureCause() {
        return failureCause;
    }

    public void setFailureCause(String failureCause) {
        this.failureCause = failureCause == null ? null : failureCause.trim();
    }

    public Integer getPreventId() {
        return preventId;
    }

    public void setPreventId(Integer preventId) {
        this.preventId = preventId;
    }

    public Integer getTestId() {
        return testId;
    }

    public void setTestId(Integer testId) {
        this.testId = testId;
    }

    public Integer getPartId() {
        return partId;
    }

    public void setPartId(Integer partId) {
        this.partId = partId;
    }

    public Integer getRepairUserid() {
        return repairUserid;
    }

    public void setRepairUserid(Integer repairUserid) {
        this.repairUserid = repairUserid;
    }

    public Integer getWxUserid() {
        return wxUserid;
    }

    public void setWxUserid(Integer wxUserid) {
        this.wxUserid = wxUserid;
    }

    public String getRepairTime() {
        return repairTime;
    }

    public void setRepairTime(String repairTime) {
        this.repairTime = repairTime == null ? null : repairTime.trim();
    }

    public String getCreateTime() {
        return createTime;
    }

    public void setCreateTime(String createTime) {
        this.createTime = createTime == null ? null : createTime.trim();
    }

    public String getEndTime() {
        return endTime;
    }

    public void setEndTime(String endTime) {
        this.endTime = endTime == null ? null : endTime.trim();
    }

    public Integer getFinishId() {
        return finishId;
    }

    public void setFinishId(Integer finishId) {
        this.finishId = finishId;
    }

    public Integer getDownId() {
        return downId;
    }

    public void setDownId(Integer downId) {
        this.downId = downId;
    }

插件已经将实体生成完毕,并且自动生成了getset方法

dao层生成了两个文件 RepairjlSqlProvider.java和RepairjlMapper.java

这时候需要注意的是RepairjlMapper.java并没有自动生成@Mapper注解,我们手动加上

package com.beijin.limengya.mobile.dao;

import com.beijin.limengya.mobile.pojo.*;
import org.apache.ibatis.annotations.*;
import org.apache.ibatis.type.JdbcType;

import java.util.List;
import java.util.Map;

@Mapper
public interface RepairjlMapper {
    @Delete({
            "delete from COLLECTION_HISTORICAL_MAINTENANCE",
            "where ID = #{id,jdbcType=INTEGER}"
    })
    int deleteByPrimaryKey(Integer id);

    @Insert({
            "insert into COLLECTION_HISTORICAL_MAINTENANCE (ID, DEVICE_ID, ",
            "REPAIR_NAME, ANCE_NAME, ",
            "FINISH_EXPLAIN, FAILURE_CAUSE, ",
            "PREVENT_ID, TEST_ID, ",
            "PART_ID, REPAIR_USERID, ",
            "WX_USERID, REPAIR_TIME, ",
            "CREATE_TIME, END_TIME, ",
            "FINISH_ID)",
            "values (#{id,jdbcType=INTEGER}, #{deviceId,jdbcType=VARCHAR}, ",
            "#{repairName,jdbcType=VARCHAR}, #{anceName,jdbcType=VARCHAR}, ",
            "#{finishExplain,jdbcType=VARCHAR}, #{failureCause,jdbcType=VARCHAR}, ",
            "#{preventId,jdbcType=INTEGER}, #{testId,jdbcType=INTEGER}, ",
            "#{partId,jdbcType=INTEGER}, #{repairUserid,jdbcType=INTEGER}, ",
            "#{wxUserid,jdbcType=INTEGER}, #{repairTime,jdbcType=VARCHAR}, ",
            "#{createTime,jdbcType=VARCHAR}, #{endTime,jdbcType=VARCHAR}, ",
            "#{finishId,jdbcType=INTEGER})"
    })
    int insert(Repairjl record);

    @InsertProvider(type=RepairjlSqlProvider.class, method="insertSelective")
    int insertSelective(Repairjl record);

    @Select({
            "select",
            "ID, DEVICE_ID, REPAIR_NAME, DOWN_ID,ANCE_NAME, FINISH_EXPLAIN, FAILURE_CAUSE, PREVENT_ID, ",
            "TEST_ID, PART_ID, REPAIR_USERID, WX_USERID, REPAIR_TIME, CREATE_TIME, END_TIME, ",
            "FINISH_ID",
            "from COLLECTION_HISTORICAL_MAINTENANCE",
            "where ID = #{id,jdbcType=INTEGER}"
    })
    @Results({
            @Result(column="ID", property="id", jdbcType=JdbcType.INTEGER, id=true),
            @Result(column="DEVICE_ID", property="deviceId", jdbcType=JdbcType.VARCHAR),
            @Result(column="REPAIR_NAME", property="repairName", jdbcType=JdbcType.VARCHAR),
            @Result(column="DOWN_ID", property="downId", jdbcType=JdbcType.INTEGER),
            @Result(column="ANCE_NAME", property="anceName", jdbcType=JdbcType.VARCHAR),
            @Result(column="FINISH_EXPLAIN", property="finishExplain", jdbcType=JdbcType.VARCHAR),
            @Result(column="FAILURE_CAUSE", property="failureCause", jdbcType=JdbcType.VARCHAR),
            @Result(column="PREVENT_ID", property="preventId", jdbcType=JdbcType.INTEGER),
            @Result(column="TEST_ID", property="testId", jdbcType=JdbcType.INTEGER),
            @Result(column="PART_ID", property="partId", jdbcType=JdbcType.INTEGER),
            @Result(column="REPAIR_USERID", property="repairUserid", jdbcType=JdbcType.INTEGER),
            @Result(column="WX_USERID", property="wxUserid", jdbcType=JdbcType.INTEGER),
            @Result(column="REPAIR_TIME", property="repairTime", jdbcType=JdbcType.VARCHAR),
            @Result(column="CREATE_TIME", property="createTime", jdbcType=JdbcType.VARCHAR),
            @Result(column="END_TIME", property="endTime", jdbcType=JdbcType.VARCHAR),
            @Result(column="FINISH_ID", property="finishId", jdbcType=JdbcType.INTEGER)
    })
    Repairjl selectByPrimaryKey(Integer id);

    @UpdateProvider(type=RepairjlSqlProvider.class, method="updateByPrimaryKeySelective")
    int updateByPrimaryKeySelective(Repairjl record);

    @Update({
            "update COLLECTION_HISTORICAL_MAINTENANCE",
            "set DEVICE_ID = #{deviceId,jdbcType=VARCHAR},",
            "REPAIR_NAME = #{repairName,jdbcType=VARCHAR},",
            "DOWN_ID = #{downId,jdbcType=INTEGER},",
            "ANCE_NAME = #{anceName,jdbcType=VARCHAR},",
            "FINISH_EXPLAIN = #{finishExplain,jdbcType=VARCHAR},",
            "FAILURE_CAUSE = #{failureCause,jdbcType=VARCHAR},",
            "PREVENT_ID = #{preventId,jdbcType=INTEGER},",
            "TEST_ID = #{testId,jdbcType=INTEGER},",
            "PART_ID = #{partId,jdbcType=INTEGER},",
            "REPAIR_USERID = #{repairUserid,jdbcType=INTEGER},",
            "WX_USERID = #{wxUserid,jdbcType=INTEGER},",
            "REPAIR_TIME = #{repairTime,jdbcType=VARCHAR},",
            "CREATE_TIME = #{createTime,jdbcType=VARCHAR},",
            "END_TIME = #{endTime,jdbcType=VARCHAR},",
            "FINISH_ID = #{finishId,jdbcType=INTEGER}",
            "where ID = #{id,jdbcType=INTEGER}"
    })
    int updateByPrimaryKey(Repairjl record);

    @Select("SELECT ID,ANCE_NAME FROM COLLECTION_HISTORICAL_MAINTENANCE " +
            "WHERE DEVICE_ID = #{numbers,jdbcType=VARCHAR}" +
            "AND FINISH_ID = 1 ")
    List<Map<String,Object>> findHistory(String numbers);


    @InsertProvider(type = RepairjlSqlProvider.class , method = "insertSelective")
    int  writeRepair(Repairjl repairjl);

    @Select("SELECT D.ID, D.EQUIPMENT_NUMBER, D.EQUIPMENT_NAME, D.ENG_NAME,F.FACTORY_NAME,T.TYPE_NAME, L.LINE_NAME,P.WORK_NAME,H.REPAIR_NAME  " +
                   "FROM COLLECTION_DEVICE_INFORMATION D JOIN COLLECTION_FACTORY F ON  D.FACTURER_ID = F.ID  " +
                   "JOIN COLLECTION_EQUIPMENT_TYPE T ON D.EQUIPMENT_TYPE = T.ID " +
                   "JOIN COLLECTION_PRODUCTION_LINE L ON D.PRODUCTION_LINE = L.ID " +
                   "JOIN COLLECTION_PRODUCTION_LINE_POSITION P ON D.PRODUCTION_LINE_POSITION = P.ID  " +
                   "JOIN COLLECTION_HISTORICAL_MAINTENANCE H ON D.EQUIPMENT_NUMBER = H.DEVICE_ID " +
                   "WHERE H.DEVICE_ID = #{numbers,jdbcType=VARCHAR} AND H.FINISH_ID = 2"
    )
    List<Map<String, Object>> findRepair(String numbers);

    @Select("SELECT ID,ANCE_NAME FROM COLLECTION_HISTORICAL_MAINTENANCE WHERE DEVICE_ID = #{numbers,jdbcType=VARCHAR} AND FINISH_ID = 1")
    List<Map<String, Object>> findProblem(String numbers);

    @Select("SELECT ID,LOCATION_NAME FROM COLLECTION_FAULT_LOCATION WHERE EQUIPMENT_NUMBER = #{numbers,jdbcType=VARCHAR}")
    List<Map<String, Object>> findLocal(String numbers);

    @Select("SELECT ID,INFORMATION_NAME From COLLECTION_FAULT_INFORMATION WHERE EQUIPMENT_NUMBER = #{numbers,jdbcType=VARCHAR} ")
    List<Map<String, Object>> findMessage(String numbers);

    @Select("SELECT ID,CAUSE_NAME FROM COLLECTION_CAUSE_SHUTDOWN ")
    List<Shutdown> findDownList();

    @Select("SELECT ID,NUMBER,EQUIPMENT_NAME,FACTORY_NUMBER FROM COLLECTION_SPARE_PARTT_LEDGER")
    List<Map<String, Object>> findPart();

    @Select("SELECT ID,METHOD_NAME FROM COLLECTION_VERIFICATION_METHOD")
    List<YanZhengfs> findFsList();

    @Select("SELECT ID,RESULTS_NAME FROM COLLECTION_VERIFICATION_RESULTS")
    List<YanZhengjg> findJgList();

    @UpdateProvider(type = RepairjlSqlProvider.class,method = "updateByPrimaryKeySelective")
    int startRepair(Repairjl repair);

    @Select("SELECT ID,FAILURE_CAUSE FROM COLLECTION_HISTORICAL_MAINTENANCE WHERE ID = #{maxId,jdbcType=INTEGER}")
    Map<String, Object> findReason(int selectMaxId);

    @Select("SELECT MAX(ID)FROM COLLECTION_HISTORICAL_MAINTENANCE WHERE DEVICE_ID = #{numbers,jdbcType=VARCHAR} AND FINISH_ID = 1")
    int findMaxId(String numbers);
}

RepairjlSqlProvider.java的内容为

package com.beijin.limengya.mobile.dao;

import com.beijin.limengya.mobile.pojo.Repairjl;
import org.apache.ibatis.jdbc.SQL;

public class RepairjlSqlProvider {

    public String insertSelective(Repairjl record) {
        SQL sql = new SQL();
        sql.INSERT_INTO("COLLECTION_HISTORICAL_MAINTENANCE");
        
        if (record.getId() != null) {
            sql.VALUES("ID", "#{id,jdbcType=INTEGER}");
        }
        
        if (record.getDeviceId() != null) {
            sql.VALUES("DEVICE_ID", "#{deviceId,jdbcType=VARCHAR}");
        }
        
        if (record.getRepairName() != null) {
            sql.VALUES("REPAIR_NAME", "#{repairName,jdbcType=VARCHAR}");
        }

        if (record.getDownId() != null) {
            sql.VALUES("DOWN_ID", "#{downId,jdbcType=INTEGER}");
        }

        if (record.getAnceName() != null) {
            sql.VALUES("ANCE_NAME", "#{anceName,jdbcType=VARCHAR}");
        }

        if (record.getFinishExplain() != null) {
            sql.VALUES("FINISH_EXPLAIN", "#{finishExplain,jdbcType=VARCHAR}");
        }

        if (record.getFailureCause() != null) {
            sql.VALUES("FAILURE_CAUSE", "#{failureCause,jdbcType=VARCHAR}");
        }

        if (record.getPreventId() != null) {
            sql.VALUES("PREVENT_ID", "#{preventId,jdbcType=INTEGER}");
        }

        if (record.getTestId() != null) {
            sql.VALUES("TEST_ID", "#{testId,jdbcType=INTEGER}");
        }

        if (record.getPartId() != null) {
            sql.VALUES("PART_ID", "#{partId,jdbcType=INTEGER}");
        }

        if (record.getRepairUserid() != null) {
            sql.VALUES("REPAIR_USERID", "#{repairUserid,jdbcType=INTEGER}");
        }

        if (record.getWxUserid() != null) {
            sql.VALUES("WX_USERID", "#{wxUserid,jdbcType=INTEGER}");
        }

        if (record.getRepairTime() != null) {
            sql.VALUES("REPAIR_TIME", "#{repairTime,jdbcType=VARCHAR}");
        }

        if (record.getCreateTime() != null) {
            sql.VALUES("CREATE_TIME", "#{createTime,jdbcType=VARCHAR}");
        }

        if (record.getEndTime() != null) {
            sql.VALUES("END_TIME", "#{endTime,jdbcType=VARCHAR}");
        }

        if (record.getFinishId() != null) {
            sql.VALUES("FINISH_ID", "#{finishId,jdbcType=INTEGER}");
        }

        return sql.toString();
    }

    public String updateByPrimaryKeySelective(Repairjl record) {
        SQL sql = new SQL();
        sql.UPDATE("COLLECTION_HISTORICAL_MAINTENANCE");

        if (record.getDeviceId() != null) {
            sql.SET("DEVICE_ID = #{deviceId,jdbcType=VARCHAR}");
        }

        if (record.getRepairName() != null) {
            sql.SET("REPAIR_NAME = #{repairName,jdbcType=VARCHAR}");
        }

        if (record.getDownId() != null) {
            sql.SET("DOWN_ID =  #{downId,jdbcType=INTEGER}");
        }

        if (record.getAnceName() != null) {
            sql.SET("ANCE_NAME = #{anceName,jdbcType=VARCHAR}");
        }
        
        if (record.getFinishExplain() != null) {
            sql.SET("FINISH_EXPLAIN = #{finishExplain,jdbcType=VARCHAR}");
        }
        
        if (record.getFailureCause() != null) {
            sql.SET("FAILURE_CAUSE = #{failureCause,jdbcType=VARCHAR}");
        }
        
        if (record.getPreventId() != null) {
            sql.SET("PREVENT_ID = #{preventId,jdbcType=INTEGER}");
        }
        
        if (record.getTestId() != null) {
            sql.SET("TEST_ID = #{testId,jdbcType=INTEGER}");
        }
        
        if (record.getPartId() != null) {
            sql.SET("PART_ID = #{partId,jdbcType=INTEGER}");
        }
        
        if (record.getRepairUserid() != null) {
            sql.SET("REPAIR_USERID = #{repairUserid,jdbcType=INTEGER}");
        }
        
        if (record.getWxUserid() != null) {
            sql.SET("WX_USERID = #{wxUserid,jdbcType=INTEGER}");
        }
        
        if (record.getRepairTime() != null) {
            sql.SET("REPAIR_TIME = #{repairTime,jdbcType=VARCHAR}");
        }
        
        if (record.getCreateTime() != null) {
            sql.SET("CREATE_TIME = #{createTime,jdbcType=VARCHAR}");
        }
        
        if (record.getEndTime() != null) {
            sql.SET("END_TIME = #{endTime,jdbcType=VARCHAR}");
        }
        
        if (record.getFinishId() != null) {
            sql.SET("FINISH_ID = #{finishId,jdbcType=INTEGER}");
        }
        
        sql.WHERE("ID = #{id,jdbcType=INTEGER}");
        
        return sql.toString();
    }
}

可以看到 生成了两个方法 添加和删除方法,通过判断实体类属性值是否为空 对sql语句进行拼接 ,最后组成项目所需要的sql进行返回。

如何使用动态sql完成我们的需求

此处省略从controller到dao的方法调用 ,直接以mapper.java的方法进行SQL的调用 在Mapper.java中找到需要动态sql的方法

@InsertProvider(type=RepairjlSqlProvider.class, method="insertSelective")
    int insertSelective(Repairjl record);

在方法上写上需要进行的操作,这里以添加为例, type为生成的RepairjlSqlProvider的路径,method为这个类中的需要执行的方法 这里根据需要选择添加方法,启动项目,进行测试 。

以上就是基于Mybatis注解式开发动态sql的使用 ,个人理解有限 ,不足之处多多的指教