菜鸟之路Day34一一Mybatis-基础操作

简介: 本文介绍了MyBatis的基础操作,包括删除、插入、修改和查询功能的实现。通过`@Delete`、`@Insert`、`@Update`和`@Select`注解完成对应操作,支持主键自动生成与返回。同时探讨了`#{}`和`${}`的区别,前者用于预编译SQL提升安全性,后者直接拼接但存在SQL注入风险。文章还提供了根据ID查询及条件查询的示例,并介绍了实体类属性与数据库字段不一致时的解决方案,如使用驼峰命名规则或配置映射关系,确保数据封装准确。

菜鸟之路Day34一一Mybatis-基础操作

作者:blue

时间:2025.5.25

[TOC]

1.删除操作

接口

@Mapper
public interface EmpMapper {
   
    //根据ID删除数据
    @Delete("delete from tb_emp where id = #{id}")
    public void delete(int id);
}

测试

@Autowired
private EmpMapper empMapper;

@Test
public void testDelete() {
   
    empMapper.delete(1);
}

日志

可以在application.properties中,打开mybatis的日志,并指定输出到控制台

#指定mybatis输出日志的位置,输出到控制台
mybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl

再次执行程序,我们可以看到Sql在执行过程中采用的是预编译形式

image-20250526092834531.png

这与所使用的不同的参数占位符有关

使用#{...}:执行SQL时会自动替换为?,生成预编译SQL,会自动设置参数值

使用${...}:拼接SQL。直接将参数拼接在SQL语句中,存在SQL注入的问题

2.插入操作

接口

//新增用户信息
    @Insert("insert into tb_emp(username, password, name, gender, image, job, entry_time, create_time, update_time, dept_id)" +
            "values (#{username},#{password},#{name},#{gender},#{image},#{job},#{entry_time},#{create_time},#{update_time},#{dept_id})")
    public void insert(Emp emp);

测试

@Test
public void testInsert() {
   
    Emp emp = new Emp();
    emp.setUsername("blue");
    emp.setPassword("123456");
    emp.setName("bruce");
    emp.setGender(1);
    emp.setImage("blue.jpg");
    emp.setJob(1);
    emp.setEntry_time(LocalDate.of(2022,11,1).atStartOfDay());
    emp.setCreate_time(LocalDateTime.now());
    emp.setUpdate_time(LocalDateTime.now());
    emp.setDept_id(1);

    empMapper.insert(emp);
}

主键返回

描述:在数据添加成功后,需要获取插入数据库的主键

实现

//新增用户信息
    @Options(keyProperty = "id", useGeneratedKeys = true)//会自动生成主键值,赋值给emp对象的id属性

    @Insert("insert into tb_emp(username, password, name, gender, image, job, entry_time, create_time, update_time, dept_id)" +
            "values (#{username},#{password},#{name},#{gender},#{image},#{job},#{entry_time},#{create_time},#{update_time},#{dept_id})")
    public void insert(Emp emp);

3.修改操作

接口

    //更新用户操作
    @Update("update tb_emp set username=#{username},password=#{password},name=#{name},gender=#{gender},image=#{image}," +
            "job=#{job},entry_time=#{entry_time},update_time=#{update_time},dept_id=#{dept_id} " +
            "where id=#{id}")
    public void update(Emp emp);

测试

@Test
public void testUpdate() {
   
    Emp emp = new Emp();
    emp.setId(16);//指定要修改的对象的id
    emp.setUsername("blue");
    emp.setPassword("123456");
    emp.setName("bruce");
    emp.setGender(1);
    emp.setImage("blue.jpg");
    emp.setJob(1);
    emp.setEntry_time(LocalDate.of(2022,11,1).atStartOfDay());
    emp.setCreate_time(LocalDateTime.now());
    emp.setUpdate_time(LocalDateTime.now());
    emp.setDept_id(5);

    empMapper.update(emp);
}

4.查询操作

根据ID查询

接口

//根据id查询员工信息
@Select("Select * from tb_emp where id=#{id}")
public Emp getEmpById(int id);

测试

@Test
public void testSelect() {
   
   Emp emp = empMapper.getEmpById(16);
   System.out.println(emp);
}

注意:

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

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

可以采取以下三种解决方案

但是注意,在采用方案三的时候必须严格遵循,数据库中用下划线命名,类中采用驼峰命名

image-20250526154513858.png

根据条件查询

接口

//根据条件查询员工信息
    @Select("select * from tb_emp where name like '%${name}%' and " +
            "gender=#{gender} and entry_time between #{begin} and #{end} " +
            "order by update_time desc")
    public List<Emp> getEmpBy(String name, int gender, LocalDateTime begin, LocalDateTime end);

实现类

 @Test
public void testSelect2() {
   
    List<Emp> emplist =empMapper.getEmpBy("b",1,
            LocalDate.of(1970,1,1).atStartOfDay(),
            LocalDate.of(2035,1,1).atStartOfDay());
    for(Emp emp:emplist){
   
        System.out.println(emp);
    }
}

这里的模糊查询需求由于要采用字符串拼接,所以使用$

但是这种方式效率降低并且存在SQL注入的危险

所用可以使用采用concat函数修改以上代码,concat函数会做一个字符串拼接的操作

//根据条件查询员工信息
    @Select("select * from tb_emp where name like concat('%',#{name},'%') and " +
            "gender=#{gender} and entry_time between #{begin} and #{end} " +
            "order by update_time desc")
    public List<Emp> getEmpBy(String name, int gender, LocalDateTime begin, LocalDateTime end);
目录
相关文章
|
存储 Java 数据库连接
MyBatis-Plus 基础操作指南:实现高效的增删改查
MyBatis-Plus 基础操作指南:实现高效的增删改查
799 0
|
SQL 存储 Java
基于MyBatis的增删改查的基础操作
基于MyBatis的增删改查的基础操作
81 0
|
SQL Java 数据库连接
2万字实操案例之在Springboot框架下基于注解用Mybatis开发实现基础操作MySQL之预编译SQL主键返回增删改查
2万字实操案例之在Springboot框架下基于注解用Mybatis开发实现基础操作MySQL之预编译SQL主键返回增删改查
180 2
|
SQL Java 数据库连接
MyBatis入门——MyBatis的基础操作(2)
MyBatis入门——MyBatis的基础操作(2)
80 4
|
SQL Java 数据库连接
JavaWeb基础第三章(MyBatis的应用,基础操作与动态SQL)
JavaWeb基础第三章(MyBatis的应用,基础操作与动态SQL)
|
SQL Java 数据库连接
Javaweb之Mybatis的基础操作之查询操作的详细解析
Javaweb之Mybatis的基础操作之查询操作的详细解析
149 0
|
SQL Java 数据库连接
Javaweb之Mybatis的基础操作之新增和更新操作的详细解析
Javaweb之Mybatis的基础操作之新增和更新操作的详细解析
131 0
|
SQL 安全 Java
Javaweb之Mybatis的基础操作之删除的详细解析
Javaweb之Mybatis的基础操作之删除的详细解析
187 0
|
Java 关系型数据库 MySQL
Javaweb之Mybatis的基础操作的详细解析
Javaweb之Mybatis的基础操作的详细解析
52 0
|
SQL XML Java
SpringBoot-18-Mybatis基础操作
SpringBoot-18-Mybatis基础操作
100 0