springboot+mybatis-generator逆向工程自动生成的代码文件内容详细解析+使用(Mapper.xml+实体类+增删查改条件模板类+Mapper接口类)

逆向工程生成代码

此部分请转到:Springboot的mybatis逆向工程自动生成代码+神坑规避指南(全网最全攻略|附思维导图)

数据库设计

CREATE TABLE `test`  (
  `test_id` varchar(255),
  `test_name` varchar(255),
  PRIMARY KEY (`test_id`) 
)

w

生成目录结构

文件作用
Test.java实体类
TestExample.java复杂增删查改所需的条件的模板类
TestMapper.java方法的接口
TestMapper.xml方法的sql语句映射文件类

如果有两个以上的主键,则会生成TestKey,java

实体类.java

public class Test {

    private String testId;

    private String testName;

	/*
		get set
	*/
    public String getTestId() {
        return testId;
    }

    public void setTestId(String testId) {
        this.testId = testId == null ? null : testId.trim();
    }

    public String getTestName() {
        return testName;
    }

    public void setTestName(String testName) {
        this.testName = testName == null ? null : testName.trim();
    }
}

增删查改条件模板类 XxxExample.java

这个类是用来作为条件的类(可简称:增删查改条件模板类),里边封装了很多的条件,要增删查改的时候就可以new一个Example类,然后定义里边的条件,这样就是一个条件类了,最后让它作为参数进行select等方法。

看一下类的样子:一个主类有三个内部类,其中有一个内部类继承自另一个内部类

在这里插入图片描述

主类XxxExample.java:

属性作用
orderByClause按照什么来排序
distinct是否要去掉重复
oredCriteria增删查改条件的集合

内部类GeneratedCriteria.java:

属性作用
criteria许多小条件的集合

内部类Criterion.java

属性作用
condition查询的条件具体是什么
value条件里的第一个值
secondValue条件里的第二个值
noValue是否是not条件
singleValue条件的参数值是否是单个的值
betweenValue是否是between条件
listValue条件的参数值是否是集合
typeHandler类型的处理器(暂且没有用到)

XxxMapper.java接口详解

方法名作用
selectByExample根据模板类来查询
selectByPrimaryKey根据主键查询
deleteByPrimaryKey根据主键来删除
deleteByExample根据模板类来删除
insert普通的插入方法(全字段)
insertSelective可选的插入方法,一般不是null就写入sql语句,是null就算了
countByExample根据查询条件数元组个数
updateByExampleSelective根据条件类来可选择地更新元组(还是对null的优化处理)
updateByExample根据条件类来更新元组()
updateByPrimaryKeySelective根据主键来可选择地更新元组
updateByPrimaryKey根据主键来更新元组
public interface TestMapper {
    long countByExample(TestExample example);

    int deleteByExample(TestExample example);

    int deleteByPrimaryKey(String testId);

    int insert(Test record);

    int insertSelective(Test record);

    List<Test> selectByExample(TestExample example);

    Test selectByPrimaryKey(String testId);

    int updateByExampleSelective(@Param("record") Test record, @Param("example") TestExample example);

    int updateByExample(@Param("record") Test record, @Param("example") TestExample example);

    int updateByPrimaryKeySelective(Test record);

    int updateByPrimaryKey(Test record);
}

~Mapper.xml

大致情况:

在这里插入图片描述

名称空间:定义到Mapper接口类上

<mapper namespace="com.superkarx.dao.TestMapper">

结果集:定义要返回什么

  <!--结果集,指定这个结果集的 id 叫什么,返回的类型是对应哪个 bean-->
  <resultMap id="BaseResultMap" type="com.superkarx.pojo.Test">
    <!--id标签是主键的意思-->
    <!--column:数据库的列(字段),jdbcType:数据库的属性类型,property:对应bean的对应属性名-->
    <id column="test_id" jdbcType="VARCHAR" property="testId" />
    <!--result标签是非主键的意思-->
    <result column="test_name" jdbcType="VARCHAR" property="testName" />
  </resultMap>

sql语句模板

sql模板id作用
Example_Where_Clausewhere查询条件的模板
Update_By_Example_Where_Clause更新用的where查询条件的模板
Base_Column_List所有属性列依次列出,不用去再输入一遍

以下只讲述一个sql模板,其他以此类推

  <sql id="Example_Where_Clause">
    <where>
    <!--循环查询条件集合,拿出来赋予criteria-->
      <foreach collection="oredCriteria" item="criteria" separator="or">
        <!--生效否,test:if的具体条件-->
        <if test="criteria.valid">
        <!--修剪,去掉多余的关键字(and或or等)-->
        <!--
            prefix:给sql语句拼接的前缀
            suffix:给sql语句拼接的后缀
            prefixOverrides:去除sql语句前面的关键字或者字符
        -->
            <trim prefix="(" prefixOverrides="and" suffix=")">
            <!--循环criteria.criteria那些小规则小标准,然后赋予名为criterion的item-->
            <foreach collection="criteria.criteria" item="criterion">
            <!--choose标签+when:若其中一个成立则退出-->
              <choose>
              <!--当这个是真,说明这条查询条件是noValue的条件,则插入具体的查询条件内容-->
              <!--以此类推~~~~-->
                <when test="criterion.noValue">
                  and ${criterion.condition}
                </when>
                <when test="criterion.singleValue">
                  and ${criterion.condition} #{criterion.value}
                </when>
                <when test="criterion.betweenValue">
                  and ${criterion.condition} #{criterion.value} and #{criterion.secondValue}
                </when>
                <when test="criterion.listValue">
                  and ${criterion.condition}
                  <foreach close=")" collection="criterion.value" item="listItem" open="(" separator=",">
                    #{listItem}
                  </foreach>
                </when>
              </choose>
            </foreach>
          </trim>
        </if>
      </foreach>
    </where>
  </sql>

这里只讲诉一个方法的xml配置详情

  <select id="selectByExample" parameterType="com.superkarx.pojo.TestExample" resultMap="BaseResultMap">
    select
    <if test="distinct">
      distinct
    </if>
    <!--用include标签引入sql模板(不用去写第二次)-->
    <include refid="Base_Column_List" />
    from test
    <!--
    	查询条件(因为输入参数是TestExample,用Example模板来查询)
    	Example类:有很多的查询条件属性
    -->
    <if test="_parameter != null">
      <include refid="Example_Where_Clause" />
    </if>
    <!--按什么来排序-->
    <if test="orderByClause != null">
      order by ${orderByClause}
    </if>
  </select>

运行测试使用

在数据库存入以下字段

在这里插入图片描述

@RestController
public class TestController {

    @Resource
    private TestMapper testMapper;

    @GetMapping("/test/{id}")
    public List getById(@PathVariable("id")String id){
        /**
         * 直接用主键的查询
         */
        Test test = testMapper.selectByPrimaryKey(id);
        TestExample testExample = new TestExample();
        /**
         * 通用的增删查改(不是主键,所以返回集合)
         */
        testExample.createCriteria().andTestIdEqualTo(id);
        List<Test> tests = testMapper.selectByExample(testExample);
        /**
         * 返回
         */
        ArrayList<Object> objects = new ArrayList<>();
        objects.add(test);
        objects.add(tests);
        return objects;
    }
}

两种查询方法皆可行

在这里插入图片描述

让我们看看编译器的各种提示

这里是mapper接口的提示

在这里插入图片描述

增删查改模板类Example的使用

在这里插入图片描述

直接在这里添加很多的标准(增删查改条件)

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值