MyBatis逆向工程的使用(十二)下

简介: MyBatis逆向工程的使用(十二)

三. 自动生成的代码解析


三.一 POJO 类


1.pojo 类会根据表名(首字母大写) 创建相应的类名。 如user—>变成了User.java 类。

2. 会将user 表中的column 类名 变成类中的属性,默认为包装类型,并且创建setter和getter方法。

3. setter方法,如果在generatorConfig.xml 设置了

20190716192556258.png

那么 setter 方法为:


public void setName(String name) {
        this.name = name == null ? null : name.trim();
    }


  1. 类 User 并没有序列化,可以利用插件将其序列化。


在context 下:


<!-- pojo 序列化的插件 -->
<plugin type="org.mybatis.generator.plugins.SerializablePlugin" />


  1. 类 User 并没有toString() 的方法, 可以利用插件添加


在context 下:


<!-- toString() 方法的插件 -->
<plugin type="org.mybatis.generator.plugins.ToStringPlugin" />


如图所示:


20190716193732369.png


三.二 XxxExample 类文件


主要是查询的语句,设置查询的条件。 其中,有三个重要的字段。


20190716194118244.png


1.orderByClause , 设置排序, 单个的 “id desc”, 多个的"age desc,id asc" 。 即order by 后面的排序语句。

2.distinct 是否去重, 是select distinct 中的distinct, 是个boolean 值。

3.oredCriteria, 是条件的集合,用于添加不同的条件。


  UserExample example=new UserExample();
    Criteria criteria=example.createCriteria();
    criteria.andIdEqualTo(8);


其中,以 and 开头。 为and+属性+方法条件,可以添加的条件有:


20190716194705390.png


将其转换成表格为: (实际上是老蝴蝶想学习markdown 编辑表格的用法)。


image.png


三.三 Mapper 接口中的方法


Mapper 接口中 定义常见的 insert,update,delete ,select 方法。

有图片。


20190717120127244.png


三.四 Mapper.xml 中的sql语句配置。


其实,sql 语句就是前面讲解过的东西。


主要分为以下几个模块,


1 . 定义结果的resultMap,方便多次调用。


 <!-- 定义表的resultMap, 并且指定属性的jdbcType -->
  <resultMap id="BaseResultMap" type="com.yjl.pojo.User" >
    <id column="id" property="id" jdbcType="INTEGER" />
    <result column="name" property="name" jdbcType="VARCHAR" />
    <result column="age" property="age" jdbcType="INTEGER" />
    <result column="sex" property="sex" jdbcType="VARCHAR" />
    <result column="description" property="description" jdbcType="VARCHAR" />
  </resultMap>


2 . 定义查询条件的sql片段,用于拼接 where 后的查询条件。


<!--拼接 查询时所用的sql片段-->
  <sql id="Example_Where_Clause" >
    <where >
      <foreach collection="oredCriteria" item="criteria" separator="or" >
        <if test="criteria.valid" >
          <trim prefix="(" suffix=")" prefixOverrides="and" >
            <foreach collection="criteria.criteria" item="criterion" >
              <choose >
                <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 collection="criterion.value" item="listItem" open="(" close=")" separator="," >
                    #{listItem}
                  </foreach>
                </when>
              </choose>
            </foreach>
          </trim>
        </if>
      </foreach>
    </where>
  </sql>


3 . 定义更新条件的sql 片段,用于拼接 where 后的更新条件。


<!--定义更新时,所用的sql片段-->
  <sql id="Update_By_Example_Where_Clause" >
    <where >
      <foreach collection="example.oredCriteria" item="criteria" separator="or" >
        <if test="criteria.valid" >
          <trim prefix="(" suffix=")" prefixOverrides="and" >
            <foreach collection="criteria.criteria" item="criterion" >
              <choose >
                <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 collection="criterion.value" item="listItem" open="(" close=")" separator="," >
                    #{listItem}
                  </foreach>
                </when>
              </choose>
            </foreach>
          </trim>
        </if>
      </foreach>
    </where>
  </sql>


4 . 定义基本的列片段,方便查询使用。


 <!-- 定义 基本的列片段,方便查询使用 -->
  <sql id="Base_Column_List" >
    id, name, age, sex, description
  </sql>


接下来,就是具体的查询方法了。


5 . selectByExample


  <select id="selectByExample" resultMap="BaseResultMap" parameterType="com.yjl.pojo.UserExample" >
    select
    <!-- 看是否去重,为boolean 值 -->
    <if test="distinct" >
      distinct
    </if>
    <include refid="Base_Column_List" />
    from user
    <if test="_parameter != null" >
      <include refid="Example_Where_Clause" />
    </if>
    <!-- 有值,就进行排序,拼接排序后的字段 -->
    <if test="orderByClause != null" >
      order by ${orderByClause}
    </if>
  </select>


6 . selectByPrimaryKey


<select id="selectByPrimaryKey" resultMap="BaseResultMap" parameterType="java.lang.Integer" >
    select 
    <include refid="Base_Column_List" />
    from user
    where id = #{id,jdbcType=INTEGER}
  </select>


7 . deleteByPrimaryKey


<delete id="deleteByPrimaryKey" parameterType="java.lang.Integer" >
    delete from user
    where id = #{id,jdbcType=INTEGER}
  </delete>


8 . deleteByExample


<delete id="deleteByExample" parameterType="com.yjl.pojo.UserExample" >
    delete from user
    <if test="_parameter != null" >
      <include refid="Example_Where_Clause" />
    </if>
  </delete>


9 . insert 插入全部的字段


<insert id="insert" parameterType="com.yjl.pojo.User" >
    insert into user (id, name, age, 
      sex, description)
    values (#{id,jdbcType=INTEGER}, #{name,jdbcType=VARCHAR}, #{age,jdbcType=INTEGER}, 
      #{sex,jdbcType=VARCHAR}, #{description,jdbcType=VARCHAR})
  </insert>


10 . insertSelective


<insert id="insertSelective" parameterType="com.yjl.pojo.User" >
    insert into user
    <!--有选择性的拼接属性-->
    <trim prefix="(" suffix=")" suffixOverrides="," >
      <if test="id != null" >
        id,
      </if>
      <if test="name != null" >
        name,
      </if>
      <if test="age != null" >
        age,
      </if>
      <if test="sex != null" >
        sex,
      </if>
      <if test="description != null" >
        description,
      </if>
    </trim>
    <!--拼接value后半部分-->
    <trim prefix="values (" suffix=")" suffixOverrides="," >
      <if test="id != null" >
        #{id,jdbcType=INTEGER},
      </if>
      <if test="name != null" >
        #{name,jdbcType=VARCHAR},
      </if>
      <if test="age != null" >
        #{age,jdbcType=INTEGER},
      </if>
      <if test="sex != null" >
        #{sex,jdbcType=VARCHAR},
      </if>
      <if test="description != null" >
        #{description,jdbcType=VARCHAR},
      </if>
    </trim>
  </insert>


11 . countByExample


<select id="countByExample" parameterType="com.yjl.pojo.UserExample" resultType="java.lang.Integer" >
    select count(*) from user
    <if test="_parameter != null" >
      <include refid="Example_Where_Clause" />
    </if>
  </select>


12 . updateByExampleSelective


  <update id="updateByExampleSelective" parameterType="map" >
    update user
    <set >
    <!-- 有,才进行更新 -->
      <if test="record.id != null" >
        id = #{record.id,jdbcType=INTEGER},
      </if>
      <if test="record.name != null" >
        name = #{record.name,jdbcType=VARCHAR},
      </if>
      <if test="record.age != null" >
        age = #{record.age,jdbcType=INTEGER},
      </if>
      <if test="record.sex != null" >
        sex = #{record.sex,jdbcType=VARCHAR},
      </if>
      <if test="record.description != null" >
        description = #{record.description,jdbcType=VARCHAR},
      </if>
    </set>
    <!--拼接更新 where 语句-->
    <if test="_parameter != null" >
      <include refid="Update_By_Example_Where_Clause" />
    </if>
  </update>


13 . updateByExample


<update id="updateByExample" parameterType="map" >
    update user
    set id = #{record.id,jdbcType=INTEGER},
      name = #{record.name,jdbcType=VARCHAR},
      age = #{record.age,jdbcType=INTEGER},
      sex = #{record.sex,jdbcType=VARCHAR},
      description = #{record.description,jdbcType=VARCHAR}
    <if test="_parameter != null" >
      <include refid="Update_By_Example_Where_Clause" />
    </if>
  </update>


14 . updateByPrimaryKeySelective


<update id="updateByPrimaryKeySelective" parameterType="com.yjl.pojo.User" >
    update user
    <set >
      <if test="name != null" >
        name = #{name,jdbcType=VARCHAR},
      </if>
      <if test="age != null" >
        age = #{age,jdbcType=INTEGER},
      </if>
      <if test="sex != null" >
        sex = #{sex,jdbcType=VARCHAR},
      </if>
      <if test="description != null" >
        description = #{description,jdbcType=VARCHAR},
      </if>
    </set>
    where id = #{id,jdbcType=INTEGER}
  </update>


15 . updateByPrimaryKey


 <update id="updateByPrimaryKey" parameterType="com.yjl.pojo.User" >
    update user
    set name = #{name,jdbcType=VARCHAR},
      age = #{age,jdbcType=INTEGER},
      sex = #{sex,jdbcType=VARCHAR},
      description = #{description,jdbcType=VARCHAR}
    where id = #{id,jdbcType=INTEGER}
  </update>


这就是XxxMapper.xml 自动生成的主要代码。


四. 测试


四.一 insert() 方法的测试


@Test
  public void insertF1Test(){
    SqlSession sqlSession=SqlSessionFactoryUtils.getSession();
    UserMapper userMapper=sqlSession.getMapper(UserMapper.class);
    User user=new User();
    //不设置id,就报id为null的错误。 必须手动填写id
    user.setId(7);
    user.setName("自动生成插入名称");
    user.setSex("自动生成插入性别");
    user.setAge(24);
    user.setDescription("自动生成插入描述");
    userMapper.insert(user);
    sqlSession.commit();
    System.out.println(user);
  }


四.二 insertSelective() 方法的测试


@Test
  public void insertF2Test(){
    SqlSession sqlSession=SqlSessionFactoryUtils.getSession();
    UserMapper userMapper=sqlSession.getMapper(UserMapper.class);
    User user=new User();
    user.setName("自动生成插入名称");
    user.setSex("自动生成插入性别");
    user.setAge(24);
    user.setDescription("自动生成插入描述");
    int result=userMapper.insertSelective(user);
    sqlSession.commit();
    //可以自动生成,但不会返回id .
    System.out.println(user); //并不会打印出user中 id的值,不会回显。
    System.out.println("输出插入后的id:"+result); //1
  }


四.三 updateByPrimaryKey() 方法的测试


@Test
  public void updateF1Test(){
    SqlSession sqlSession=SqlSessionFactoryUtils.getSession();
    UserMapper userMapper=sqlSession.getMapper(UserMapper.class);
    User user=new User();
    user.setId(8);
    user.setName("自动修改插入名称");
    user.setSex("自动修改插入性别");
    user.setDescription("自动生成插入描述");
    userMapper.updateByPrimaryKey(user);
    sqlSession.commit();
    System.out.println(user);
  }


四.四 updateByPrimaryKeySelective() 方法的测试


@Test
  public void updateF2Test(){
    SqlSession sqlSession=SqlSessionFactoryUtils.getSession();
    UserMapper userMapper=sqlSession.getMapper(UserMapper.class);
    User user=new User();
    user.setId(8);
    user.setName("自动修改插入名称");
    user.setSex("自动修改插入性别123");
    userMapper.updateByPrimaryKeySelective(user);
    sqlSession.commit();
    //可以自动生成,但不会返回id .
    System.out.println(user);
  }


四.五 updateByExampleSelective() 方法的测试


@Test
  public void updateF3Test(){
    SqlSession sqlSession=SqlSessionFactoryUtils.getSession();
    UserMapper userMapper=sqlSession.getMapper(UserMapper.class);
    User user=new User();
    user.setId(8);
    user.setName("自动条件插入名称");
    user.setSex("自动条件插入性别123");
    user.setAge(26);
    UserExample example=new UserExample();
    Criteria criteria=example.createCriteria();
    criteria.andIdEqualTo(8);
    criteria.andAgeIsNull();
    userMapper.updateByExampleSelective(user,example);
    sqlSession.commit();
    //可以自动生成,但不会返回id .
    System.out.println(user);
  }


四.六 updateByExample() 方法的测试


@Test
  public void updateF4Test(){
    SqlSession sqlSession=SqlSessionFactoryUtils.getSession();
    UserMapper userMapper=sqlSession.getMapper(UserMapper.class);
    User user=new User();
    user.setId(8);
    user.setName("自动条件插入名称");
    user.setAge(26);
    UserExample example=new UserExample();
    Criteria criteria=example.createCriteria();
    criteria.andIdEqualTo(8);
    criteria.andAgeIsNull();
    userMapper.updateByExample(user,example);
    sqlSession.commit();
    //可以自动生成,但不会返回id .
    System.out.println(user);
  }


四.七 countByExample() 方法的测试


@Test
  public void countByExampleTest(){
    SqlSession sqlSession=SqlSessionFactoryUtils.getSession();
    UserMapper userMapper=sqlSession.getMapper(UserMapper.class);
    UserExample example=new UserExample();
    Criteria criteria=example.createCriteria();
    criteria.andAgeEqualTo(24);
    criteria.andSexEqualTo("男");
    int count=userMapper.countByExample(example);
    System.out.println("数目是:"+count);
  }


四.八 selectByExample() 方法的测试


@Test
  public void selectByExampleTest(){
    SqlSession sqlSession=SqlSessionFactoryUtils.getSession();
    UserMapper userMapper=sqlSession.getMapper(UserMapper.class);
    UserExample example=new UserExample();
    Criteria criteria=example.createCriteria();
    criteria.andAgeEqualTo(24);
    criteria.andSexEqualTo("男");
    List<User> userList=userMapper.selectByExample(example);
    userList.forEach(n ->System.out.println(n));
  }


四。九 deleteByExample() 方法的测试


@Test
  public void deleteTest(){
    SqlSession sqlSession=SqlSessionFactoryUtils.getSession();
    UserMapper userMapper=sqlSession.getMapper(UserMapper.class);
    UserExample example=new UserExample();
    Criteria criteria=example.createCriteria();
    criteria.andIdEqualTo(8);
    criteria.andAgeIsNull();
    userMapper.deleteByExample(example);
    sqlSession.commit();
  }


其他的方法与其类似,就不讲述了。


谢谢!!!

相关文章
|
1月前
|
XML Java 数据库连接
mybatis-plus逆向工程详解
mybatis-plus逆向工程详解
176 0
|
10月前
|
XML Java 数据库连接
Mybatis使用generator逆向工程生成器生成entity、mapper、.xml模版类
今天将表建好了,但是一个一个的建实体类、Mapper接口、Mapper.xml文件就十分的麻烦,所以我就想到了MyBatis逆向,今天就操作一把!这里我们采用maven来进行操作。
157 0
|
1月前
|
Java 数据库连接 数据库
Mybatis逆向工程笔记小结
Mybatis逆向工程笔记小结
|
1月前
|
XML Java 数据库连接
Mybatis逆向工程的2种方法,一键高效快速生成Pojo、Mapper、XML,摆脱大量重复开发
【5月更文挑战第10天】Mybatis逆向工程的2种方法,一键高效快速生成Pojo、Mapper、XML,摆脱大量重复开发
28 6
|
1月前
|
数据库
Springboot+mybatis-plus逆向工程生成代码器
Springboot+mybatis-plus逆向工程生成代码器
|
10月前
|
XML Java 数据库连接
优雅地使用Mybatis逆向工程生成类
优雅地使用Mybatis逆向工程生成类
78 1
|
1月前
|
SQL Java 数据库连接
MyBatis之逆向工程
【1月更文挑战第4天】 正向工程:先创建Java实体类,由框架负责根据实体类生成数据库表。Hibernate是支持正向工程的 逆向工程:先创建数据库表,由框架负责根据数据库表,反向生成如下资源: Java实体类 Mapper接口 Mapper映射文件
44 2
|
10月前
|
SQL 运维 前端开发
Mybatis-Plus之逆向工程之旅
Mybatis-Plus之逆向工程之旅
107 0
|
1月前
|
Java 数据库连接 Maven
MyBatis逆向工程可以生成哪些内容?
MyBatis逆向工程可以生成哪些内容?
25 0
|
1月前
|
SQL Java 数据库连接
MyBatis的逆向工程
MyBatis的逆向工程