【SpringBootWeb入门-15】Mybatis-基础操作-增改查操作

发布时间 2023-12-19 23:09:30作者: hiker0412

1、章节回顾

上一篇文章我们讲解了Mybatis的删除操作,本篇继续学习Mybatis的新增操作:根据员工表字段,新增员工表的数据,新增的字段有:用户名、员工姓名、性别、图像、职位、入职日期、归属部门。

2、增删改查操作-新增操作

员工表emp新增数据,对应的SQL语句:

insert into emp(username, name, gender, image, job, entrydate, dept_id, create_time, update_time)
VALUES
    ('Tom','汤姆',1,'1.jpg',1,'2005-01-01',1,now(),now());
View Code

对应的接口方法:

package com.hiker.mapper;

import com.hiker.pojo.Emp;
import org.apache.ibatis.annotations.Delete;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Mapper;

@Mapper
public interface EmpMapper {

    //根据ID来删除数据
    @Delete("delete from emp where id=#{id}")
    //public void delete(Integer id);
    public int delete(Integer id);

    //新增员工
    @Insert("insert into emp(username, name, gender, image, job, entrydate, dept_id, create_time, update_time) " +
            " values (#{username},#{name},#{gender},#{image},#{job},#{entrydate},#{deptId},#{createTime},#{updateTime})")
    public void insert(Emp emp); //由于有多个参数,可以将实体类封装起来

}
View Code

对应的测试代码:

package com.hiker;

import com.hiker.mapper.EmpMapper;
import com.hiker.pojo.Emp;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

import java.time.LocalDate;
import java.time.LocalDateTime;

@SpringBootTest
class SpringbootMybatisCrudApplicationTests {

    @Autowired
    private EmpMapper empMapper;


    @Test
    public void testInsert() {
        Emp emp = new Emp();
        emp.setUsername("Tom");
        emp.setName("汤姆");
        emp.setImage("1.jpg");
        emp.setGender((short)1);
        emp.setJob((short)1);
        emp.setEntrydate(LocalDate.of(2000,1,1));
        emp.setCreateTime(LocalDateTime.now());
        emp.setUpdateTime(LocalDateTime.now());
        emp.setDeptId(1);
        //执行新增员工信息操作
        empMapper.insert(emp);
    }

}
View Code

运行单元测试的方法,看到username为Tom的记录已新增。

在这里增加一个小知识点,上述的新增操作是不涉及主键返回的,也就是说新增了一条数据,没有返回新增数据的主键是多少,例如上述新增的username为Tom的主键是20。

那我们怎么返回新增数据的主键呢:可以使用Options注解,配置keyProperty = "id",useGeneratedKeys = true,注意这里的keyProperty = "id"是指主键为id字段,如果主键为其他字段,则修改即可。配置完成后会自动将生成的主键值,赋值给emp对象的id属性。

我们来修改对应的接口方法:

package com.hiker.mapper;

import com.hiker.pojo.Emp;
import org.apache.ibatis.annotations.Delete;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Options;

@Mapper
public interface EmpMapper {

    //新增员工
    @Options(keyProperty = "id",useGeneratedKeys = true) //会自动将生成的主键值,赋值给emp对象的id属性
    @Insert("insert into emp(username, name, gender, image, job, entrydate, dept_id, create_time, update_time) " +
            " values (#{username},#{name},#{gender},#{image},#{job},#{entrydate},#{deptId},#{createTime},#{updateTime})")
    public void insert(Emp emp); //由于有多个参数,可以将实体类封装起来

}
View Code

对应的测试方法:

package com.hiker;

import com.hiker.mapper.EmpMapper;
import com.hiker.pojo.Emp;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

import java.time.LocalDate;
import java.time.LocalDateTime;

@SpringBootTest
class SpringbootMybatisCrudApplicationTests {

    @Autowired
    private EmpMapper empMapper;

    @Test
    public void testInsert() {
        Emp emp = new Emp();
        emp.setUsername("Tom2");
        emp.setName("汤姆2");
        emp.setImage("1.jpg");
        emp.setGender((short)1);
        emp.setJob((short)1);
        emp.setEntrydate(LocalDate.of(2000,1,1));
        emp.setCreateTime(LocalDateTime.now());
        emp.setUpdateTime(LocalDateTime.now());
        emp.setDeptId(1);
        //执行新增员工信息操作
        empMapper.insert(emp);
        //输出新增数据的主键ID值
        System.out.println(emp.getId());
    }

}
View Code

运行单元测试的方法,看到username为Tom2的记录已新增,主键值为21,并且也已输出21的值在控制台中。

3、增删改查操作-修改操作

新增操作完成之后,我们来学习更新操作,根据ID来更新员工信息,此时我们是需要进行两步的操作,第一步是根据ID获取到要修改的数据,第二步是修改数据。

例如我们要修改id=20的数据记录,对应的SQL语句:

update emp set username = 'Tom1', name = '汤姆1', gender = 1 , image = '1.jpg' , job = 2, entrydate = '2012-01-01', dept_id = 2, update_time = '2022-10-01 12:12:12' where id = 20;
View Code

 对应的接口方法:

package com.hiker.mapper;

import com.hiker.pojo.Emp;
import org.apache.ibatis.annotations.*;

@Mapper
public interface EmpMapper {

    //修改员工
    @Update("update emp set username = #{username}, name = #{name}, gender = #{gender} , image = #{image} , " +
            "job = #{job}, entrydate = #{entrydate}, dept_id = #{deptId}, update_time = #{updateTime} where id = #{id}")
    public void update(Emp emp);//由于有多个参数,可以将实体类封装起来

}
View Code

对应的测试代码:

package com.hiker;

import com.hiker.mapper.EmpMapper;
import com.hiker.pojo.Emp;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

import java.time.LocalDate;
import java.time.LocalDateTime;

@SpringBootTest
class SpringbootMybatisCrudApplicationTests {

    @Autowired
    private EmpMapper empMapper;

    //修改员工
    @Test
    public void testUpdate() {
        Emp emp = new Emp();
        emp.setId(20);
        emp.setUsername("Tom1");
        emp.setName("1");
        emp.setImage("1.jpg");
        emp.setGender((short)1);
        emp.setJob((short)1);
        emp.setEntrydate(LocalDate.of(2000,1,1));
        emp.setUpdateTime(LocalDateTime.now());
        emp.setDeptId(1);
        //执行新增员工信息操作
        empMapper.update(emp);
    }
}
View Code

运行单元测试的方法,看到id=20的记录,其username为Tom的记录已修改为Tom1。

4、增删改查操作-查询操作

学习完最基本的增、删、改操作之后,我们来学习查询操作,我们先来学习第一个查询需求:根据ID查询。

对应的SQL语句:select * from emp where id = 20

对应的接口方法:

package com.hiker.mapper;

import com.hiker.pojo.Emp;
import org.apache.ibatis.annotations.*;

import java.util.List;

@Mapper
public interface EmpMapper {

    //根据ID来查询员工
    @Select("select *  from emp where id = #{id}")
    //由于根据ID查询返回的数据只有一条,所以没必要封装到集合来返回,直接封装到一个员工对象即可
    public Emp getById(Integer id);

}
View Code

对应的测试代码:

package com.hiker;

import com.hiker.mapper.EmpMapper;
import com.hiker.pojo.Emp;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

import java.time.LocalDate;
import java.time.LocalDateTime;

@SpringBootTest
class SpringbootMybatisCrudApplicationTests {

    @Autowired
    private EmpMapper empMapper;

    //根据ID来查询员工
    @Test
    public void testgetById() {
        Emp id = empMapper.getById(20);
        System.out.println(emp);
    }
}
View Code

运行单元测试的方法,可以看到id=20的记录已经输出到控制台。

但是我们看控制台的输出中,deptId=null, createTime=null, updateTime=null 这三个字段是null值,这三个字段的值没有封装进来,但这三个字段在数据库表中是有数值的,那为什么会出现这种情况呢?这就涉及到了Mybatis的数据封装

数据封装

  • 实体类属性名 和 数据库表查询返回的字段名一致,mybatis会自动封装。
  • 如果实体类属性名 和 数据库表查询返回的字段名不一致,不能自动封装。

在这里我们可以看到,emp的实体类 deptId、createTime、updateTime与数据库表字段dept_id、create_time、update_time不一致,不能自动封装。

那怎么来解决这种问题呢?我们一般有三种处理方法。具体如下:

  • 起别名:在SQL语句中,对不一样的列名起别名,别名和实体类属性名一样。
@Select("select id, username, password, name, gender, image, job, entrydate, dept_id deptId, create_time createTime, update_time updateTime from emp where id = #{id} ")
public Emp getById(Integer id);
View Code
  • 手动结果映射:通过 @Results及@Result 进行手动结果映射。
@Select("select * from emp where id = #{id}")
@Results({
        @Result(column = "dept_id", property = "deptId"),
        @Result(column = "create_time", property = "createTime"),
        @Result(column = "update_time", property = "updateTime")})
public Emp getById(Integer id);
View Code
  • 开启驼峰命名:如果字段名与属性名符合驼峰命名规则,mybatis会自动通过驼峰命名规则映射。
#开启驼峰命名自动映射,即从数据库字段名 a_column 映射到Java 属性名 aColumn。
mybatis.configuration.map-underscore-to-camel-case=true
View Code

我们常用的推荐第三种,减少代码量。

开启驼峰命名自动映射后,我们再重新运行测试代码,输出如下:

可以看到,emp的实体类 deptId、createTime、updateTime已经输出有值了。

关于Mybatis的简单增删查改操作已经学习完毕,下一篇我们继续学习Mybatis的复杂查询操作