当前位置: 首页 > backend >正文

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

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

作者:blue

时间:2025.5.25

文章目录

  • 菜鸟之路Day34一一Mybatis-基础操作
      • 1.删除操作
      • 2.插入操作
      • 3.修改操作
      • 4.查询操作

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在执行过程中采用的是预编译形式

在这里插入图片描述

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

使用#{…}:执行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);//指定要修改的对象的idemp.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会自动封装。

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

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

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

在这里插入图片描述

根据条件查询

接口

//根据条件查询员工信息@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);
http://www.xdnf.cn/news/8996.html

相关文章:

  • 基于深度学习的情绪识别检测系统【完整版】
  • 什么是时空学习(Spatiotemporal Learning)
  • 大语言模型 20 - MCP 在客户端中使用 Cursor Cline 中配置 MCP 服务
  • 如何安全配置数据库(MySQL/PostgreSQL/MongoDB)
  • QT5.15 MacOS 打包指南
  • ai作诗平台:AnKo引领未来诗歌创作新时代!
  • CC工具箱使用指南:【计算线要素的插值点数据】
  • 华为OD机试真题——新学校选址(2025A卷:100分)Java/python/JavaScript/C/C++/GO最佳实现
  • 《软件工程》第 5 章 - 需求分析模型的表示
  • Android开机向导定制(1)开机向导加载流程
  • 小土堆pytorch--损失函数与反向传播
  • Godot的RichTextLabel富文本标签,鼠标拖拽滚动,方向键滚动,底部吸附,自动滚动
  • 微信小程序进阶第2篇__事件类型_冒泡_非冒泡
  • 【QT】TXT文件的基础操作
  • 运行打印Hello World启动了多少线程?
  • Python线程同步:保障多线程程序的稳定性与正确性
  • 加速科技荣登2025杭州准独角兽榜单
  • ChatGPT 如何工作——提示工程、对话记忆与上下文管理解析
  • 临床试验中的独立数据监查委员会
  • hadoop纠删码基本原理
  • 【Fifty Project - D31】
  • 【ArcGIS】ArcGIS AI 助手----复现
  • Java设计模式之观察者模式:从基础到高级的全面解析
  • MySql(二)
  • 高效的接口自动化测试工具:Apifox
  • 学习threejs,使用three-spritetext实现黑客帝国数字雨效果
  • Kafka Kraft模式集群 + ssl
  • 14.测速小车(测速模块)
  • Linux连接服务器全攻略:从基础到进阶
  • AI时代新词-生成对抗网络(GAN)