MyBatis基础操作

黑马程序员JavaWeb开发教程

文章目录

  • 根据资料中提供的《tlias智能学习辅助系统》页面原型及需求,完成员工管理的需求开发
    • 一、环境准备
      • 1、准备数据库表emp
      • 2、创建一个新的springboot工程,选择引入对应的起步依赖(mybatis、mysql驱动、lombok)
      • 3、application.properties中引入数据库连接信息
      • 4、创建对应的实体类Emp(实体类属性采用驼峰命名)
      • 5、准备Mapper接口EmpMApper
      • 6、准备好的基础工程框架
    • 二、基础操作-删除
      • 1、根据主键ID删除
      • 2、根据主键ID批量删除
    • 三、基础操作-新增
      • (1)SQL语句
      • (2)Mapper接口
      • (3)测试
      • (4)主键返回
    • 四、基础操作-更新
      • (1)SQL语句
      • (2)Mapper接口
      • (3)测试
    • 五、基础操作-查询
      • 1、演示根据ID查询
        • (1)SQL语句
        • (2)Mapper接口
        • (3)测试
      • 2、出现问题
      • 3、问题原因
      • 4、解决方案
      • 5、演示根据条件查询
        • (1)SQL语句
        • (2)Mapper接口
        • (3)测试

根据资料中提供的《tlias智能学习辅助系统》页面原型及需求,完成员工管理的需求开发

一、环境准备

1、准备数据库表emp

  1. 创建表的sql语句
use mybatis;
-- 部门管理
create table dept(id int unsigned primary key auto_increment comment'ID,无符号整数,主键,自增长',name varchar(20) not null unique comment'部门名称,非空,唯一',create_time datetime not null comment'创建时间,非空',update_time datetime not null comment'修改时间,非空'
)comment '部门表';insert into dept (id, name, create_time, update_time)
values  (1,'学工部',now(),now()),(2,'教研部',now(),now()),(3,'咨询部',now(),now()),(4,'就业部',now(),now()),(5,'人事部',now(),now());select * from dept;-- 员工管理
create table emp(id int unsigned primary key auto_increment comment'ID,无符号整数,主键,自增长',username varchar(20) not null unique comment'用户名,非空,唯一',password varchar(32) default '123456' comment'密码,默认123456',name varchar(10) not null comment'姓名,非空',gender tinyint unsigned not null comment '性别,无符号整数,,非空,1男,2女',image varchar(300) comment'图像',job tinyint unsigned comment'工作,无符号整数,1 班主任,2 讲师,3 学工主管, 4 教研主管,5 咨询师',entrydate date comment'入职时间',dept_id int unsigned comment'部门ID',create_time datetime not null comment'创建时间',update_time datetime not null comment'修改时间'
)comment'员工表';INSERT INTO emp(id, username, password, name, gender, image, job, entrydate,dept_id, create_time, update_time)
VALUES  (1,'jinyong','123456','金庸',1,'1.jpg',4,'2000-01-01',2,now(),now()),(2,'zhangwuji','123456','张无忌',1,'2.jpg',2,'2015-01-01',2,now(),now()),(3,'yangxiao','123456','杨逍',1,'3.jpg',2,'2008-05-01',2,now(),now()),(4,'weiyixiao','123456','韦一笑',1,'4.jpg',2,'2007-01-01',2,now(),now()),(5,'changyuchun','123456','常遇春',1,'5.jpg',2,'2012-12-05',2,now(),now()),(6,'xiaozhao','123456','小昭',2,'6.jpg',3,'2013-09-05',1,now(),now()),(7,'jixiaofu','123456','纪晓芙',2,'7.jpg',1,'2005-08-01',1,now(),now()),(8,'zhouzhiruo','123456','周芷若',2,'8.jpg',1,'2014-11-09',1,now(),now()),(9,'dingminjun','123456','丁敏君',2,'9.jpg',1,'2011-03-11',1,now(),now()),(10,'zhaomin','123456','赵敏',2,'10.jpg',1,'2013-09-05',1,now(),now()),(11,'luzhangke','123456','鹿杖客',1,'11.jpg',5,'2007-02-01',3,now(),now()),(12,'hebiweng','123456','鹤笔翁',1,'12.jpg',5,'2008-08-18',3,now(),now()),(13,'fangdongbai','123456','方东白',1,'13.jpg',5,'2012-11-01',3,now(),now()),(14,'zhangsanfeng','123456','张三丰',1,'14.jpg',2,'2002-08-01',2,now(),now()),(15,'yulianzhou','123456','俞莲舟',1,'15.jpg',2,'2011-05-01',2,now(),now()),(16,'songyuanqiao','123456','宋远桥',1,'16.jpg',2,'2010-01-01',2,now(),now()),(17,'chenyouliang','123456','陈友谅',1,'17.jpg',NULL,'2015-03-21',NULL,now(),now());select * from emp;

2、创建一个新的springboot工程,选择引入对应的起步依赖(mybatis、mysql驱动、lombok)

在这里插入图片描述

3、application.properties中引入数据库连接信息

  1. 打开src.main.resources.application.properties,在其中填入配置数据库的信息

    在这里插入图片描述

  2. 配置数据库的信息

# 配置数据库四要素#驱动类名称
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
#数据库连接的url(将数据库的名字mybatis修改成自己的数据库的名字)
spring.datasource.url=jdbc:mysql://localhost:3306/mybatis
#连接数据库的用户名(将用户名root修改成自己数据库的用户名)
spring.datasource.username=root
#连接数据库的密码(将密码123456修改成自己数据库的密码)
spring.datasource.password=123456

4、创建对应的实体类Emp(实体类属性采用驼峰命名)

  1. 在src.main.java.com.itheima 包下新建包pojo,并在pojo下新建类Emp

    在这里插入图片描述

  2. 实体类属性和数据库中表的属性要同名,表中属性有下划线,实体类中使用驼峰命名即可

package com.itheima.pojo;import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;import java.time.LocalDate;
import java.time.LocalDateTime;@Data
@AllArgsConstructor
@NoArgsConstructor
public class Emp {private Integer id; // IDprivate String username; // 用户名private String password; // 密码private String name; // 姓名private Short gender; // 性别,1 男,2 女private String image; // 图像urlprivate Short job; // 职位,说明:1 班主任,2 讲师,3 学工主管,4 教研主管,5 咨询师private LocalDate entrydate; // 入职日期private Integer deptId; // 部门idprivate LocalDateTime createTime; // 创建时间private LocalDateTime updateTime; // 修改时间
}

5、准备Mapper接口EmpMApper

  1. 在src.main.java.com.itheima 包下新建包mapper,并在mapper下新建接口EmpMapper并加入@Mapper注解

    在这里插入图片描述

  2. EmpMapper接口中的代码

package com.itheima.mapper;import org.apache.ibatis.annotations.Mapper;@Mapper
public interface EmpMapper {
}

6、准备好的基础工程框架

在这里插入图片描述

二、基础操作-删除

1、根据主键ID删除

  1. 接口 EmpMapper 中的代码
package com.itheima.mapper;import org.apache.ibatis.annotations.Delete;
import org.apache.ibatis.annotations.Mapper;@Mapper // 程序在运行时会自动创建改接口的代理对象,并且会将该代理对象放到IOC当中
public interface EmpMapper {//根据ID删除(一般都不需要返回值)@Delete("delete from emp where id=#{id}")public void deleteById(Integer id);
}
  1. 测试类中的代码(src.test.java.com.itheima.SpringbootMybatisEmpApplicationTests)
package com.itheima;import com.itheima.mapper.EmpMapper;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;@SpringBootTest
class SpringbootMybatisEmpApplicationTests {@Autowiredprivate EmpMapper empMapper;@Testpublic void deleteById() {empMapper.deleteById(17);}}
  1. 注意事项:如果mapper接口方法形参只要有一个普通类型的参数,#{…}里面的属性名可以随便写,如:#{id}、#{value},但是为了增强可读性还是建议和参数名一样

2、根据主键ID批量删除

三、基础操作-新增

(1)SQL语句

  1. 正式开始之前,现根据要求将SQL语句写出来,插入的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());

(2)Mapper接口

  1. 在EmpMapper接口中新增一个insert方法,使用 @Insert 注解将SQL语句传入,代码如下
//新增员工@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);

(3)测试

  1. 在测试类中编写测试代码(src.test.java.com.itheima.SpringbootMybatisEmpApplicationTests)给Emp中的每个属性赋值
@Testpublic 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);}

(4)主键返回

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

  2. 实现:@Options(useGeneratedKeys = true, keyProperty = “id”)

    在这里插入图片描述

四、基础操作-更新

(1)SQL语句

  1. 根据要求编写用于更新的SQL语句
update emp set username='',name='',gender='',image='',job='',entrydate='',dept_id='',update_time='' where id=1;

(2)Mapper接口

  1. 新增一个修改员工信息的方法,并使用@Update注解将SQL语句传入
//修改员工信息@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);

(3)测试

 //测试修改员工信息@Testpublic void testUpdate() {// 构造员工对象Emp emp = new Emp();// 给员工对象赋值emp.setId(18);emp.setUsername("newTom");emp.setName("新汤姆");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);}

五、基础操作-查询

1、演示根据ID查询

(1)SQL语句
select id, username, password, name, gender, image, job, entrydate, dept_id, create_time, update_time from emp where id=18;
或者
select * from emp where id=18;
(2)Mapper接口
  //根据ID查询员工信息@Select("select id, username, password, name, gender, image, job, entrydate, dept_id, create_time, update_time from emp where id=#{id}")public Emp getEmpById(Integer id);
(3)测试
 @Testpublic void testGetEmpById(){Emp emp = empMapper.getEmpById(18);System.out.println(emp);}

2、出现问题

  1. 可以看到返回值如下,其中 deptId=null, createTime=null, updateTime=null
Emp(id=18, username=newTom, password=123456, name=新汤姆, gender=1, image=1.jpg, job=1, entrydate=2000-01-01, deptId=null, createTime=null, updateTime=null)

3、问题原因

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

4、解决方案

  1. 方案一:起别名,在SQL语句中,UI不一样的列名其别名,别名和实体类属性名一样
 //方案一:起别名@Select("select id, username, password, name, gender, image, job, entrydate, dept_id as deptId, create_time as createTime, update_time as updateTime from emp where id = #{id}")public Emp getEmpById(Integer id);
  1. 方案二:手动结果映射,通过@Results以及@Result进行手动结果映射
@Results({@Result(column = "dept_id",property = "deptId"),@Result(column = "create_time",property = "createTime"),@Result(column = "update_time",property = "updateTime")})@Select("select id, username, password, name, gender, image, job, entrydate, dept_id, create_time,update_time from emp where id = #{id}")public Emp getEmpById(Integer id);
  1. 方案三:开启驼峰命名,如果字段名与属性名符合驼峰命名规则,mybatis会自动通过驼峰命名规则映射注意:前提是数据库中的一下划线分割,实体类中是驼峰命名才可以使用这个解决方案,同时这也是推荐的解决方案
    • 首先在src.main.resources.application.properties配置文件中加入:
# 开启 mybatis驼峰命名的映射
mybatis.configuration.map-underscore-to-camel-case=true
    • 之后就可以像之前一样直接写
//    方案三@Select("select id, username, password, name, gender, image, job, entrydate, dept_id, create_time,update_time from emp where id = #{id}")public Emp getEmpById(Integer id);

5、演示根据条件查询

在这里插入图片描述

(1)SQL语句
select * from emp where name like'%张%' and gender='' and entrydate between '' and '' order by update_time desc;
(2)Mapper接口
  1. 不知道为什么使用的是2.X也需要加@Param注解
//条件查询@Select("select * from emp where name like concat('%',#{name},'%') and gender=#{gender} and " +"entrydate between #{begin}  and #{end}  order by update_time desc")public List<Emp> list(@Param("name") String name, @Param("gender") Short gender, @Param("begin") LocalDate begin, @Param("end") LocalDate end);
(3)测试

@Test
public void testList(){
List list = empMapper.list(“张”, (short) 1, LocalDate.of(2010, 1, 1), LocalDate.of(2020, 1, 1));
System.out.println(list);
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/3490.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【树莓派4B】如何点亮树莓派的LED灯

在之前一系列文章中&#xff0c;使用python、行人入侵检测&#xff0c;确没有使用树莓派的硬件。控制引脚进行输出&#xff1a; 如何写python点亮led灯闪烁&#xff0c;我灯接在gpio13,GPIO19,gpio26。我都想闪烁。 你可以使用Python的GPIO库来控制树莓派上的LED灯。首先&…

Linux 安装 nvm,并使用 Jenkins 打包前端

文章目录 nvm是什么nvm下载nvm安装设置 nvm 环境变量设置 Jenkins 打包命令 nvm是什么 nvm全英文也叫node.js version management&#xff0c;是一个nodejs的版本管理工具。nvm和n都是node.js版本管理工具&#xff0c;为了解决node.js各种版本存在不兼容现象可以通过它可以安装…

数仓开发LAG 和 LEAD 函数详细解析和用例

在做Iot大数据开发时&#xff0c;需要用到lag和lead函数来计算设备故障。下面详细解析lag和lead函数的作用和例子。 LAG 和 LEAD 函数是用于在 Spark SQL 中进行窗口函数操作时常用的两个函数&#xff0c;它们用于获取某一行在分组内的前一行或后一行的数值。下面详细解释它们…

element-ui el-tabs el-tab-pane 的使用

实现效果&#xff1a;1、去掉它的下划线 2、标签切换的蓝色线条 3、字体&#xff0c;鼠标滑过字体、点击的字体 4、如果数据超出&#xff0c;出现左右滑动标签 html <div class"activity"><div class"cont"><el-tabsv-if"search &…

实验 | RT-Thread:L1

1 线程间同步 同步是指按预定的先后次序进行运行&#xff0c;线程同步是指多个线程通过特定的机制&#xff08;如互斥量&#xff0c;事件对象&#xff0c;临界区&#xff09;来控制线程之间的执行顺序&#xff0c;也可以说是在线程之间通过同步建立起执行顺序的关系&#xff0…

视频抽帧转图片,opencv和ffmpeg效果测评

最近在做一个项目&#xff0c;需要从视频中抽帧转图片&#xff0c;于是对opencv和ffmpeg效果进行了测评。 文章目录 1. open cv2. ffmpeg3.抽帧效果对比 1. open cv open cv 视频抽图片的教程&#xff0c;推荐以下链接&#xff0c;抽的帧数可以自行调节&#xff01; 用pythono…

maya 设置半径 获取时长,设置时长

maya 选择当前节点的所有子节点&#xff0c;设置半径&#xff0c;获取动画时长&#xff0c;并且设置时长 python 脚本 import maya.cmds as cmds# 获取当前选择的节点 selected_nodes cmds.ls(selectionTrue)# 创建一个列表来存储所需的节点&#xff1a;当前选中的节点及其所…

四川易点慧电子商务:抖音小店引领潮流,先进模式打造电商新标杆

在当下数字化浪潮中&#xff0c;电子商务行业如日中天&#xff0c;四川易点慧电子商务有限公司以其独特的视角和前瞻性的战略布局&#xff0c;成功在抖音小店领域崭露头角&#xff0c;成为行业内的佼佼者。本文将深入剖析四川易点慧电子商务的成功秘诀&#xff0c;以及其在抖音…

Mysql当前列的值等于上一行的值累加前一列的值

Mysql当前列的值等于上一行的值累加前一列的值 前言&#xff1a;公司项目需要做数据可视化&#xff0c;统计一些数据&#xff0c;比如用户增长量&#xff0c;按每天分组&#xff0c;还要计算每天累加的用户量&#xff0c;一开始也是想了很久&#xff0c;不知道怎么做&#xff…

百度网盘svip白嫖永久手机2024最新教程

百度网盘&#xff08;原名百度云&#xff09;是百度推出的一项云存储服务&#xff0c;已覆盖主流PC和手机操作系统&#xff0c;包含Web版、Windows版、Mac版、Android版、iPhone版和Windows Phone版。用户将可以轻松将自己的文件上传到网盘上&#xff0c;并可跨终端随时随地查看…

从0到1:如何成为优秀产品经理?必备哪些硬核技能?

成为一名优秀的产品经理&#xff0c;需要深入理解产品设计的理念、出发点&#xff0c;以及如何把控和收集需求。首先&#xff0c;产品设计的出发点应该是工具化思维、以人为本的设计&#xff0c;以及以完成商业目的的设计。这意味着产品经理需要根据产品的不同阶段&#xff0c;…

基于SpringBoot和Leaflet的地震台网信息预警可视化

目录 前言 一、后台管理设计与实现 1、Model层 2、业务层 3、控制层 二、前端预警可视化设计与实现 1、网页结构 2、数据绑定 三、效果展示 总结 前言 在之前的几篇博客中&#xff0c;我们讲解了如何在Leaflet中进行预警信息提示效果&#xff0c;以及基于XxlCrawler进…

软件无线电系列——宽带中频带通采样(超外差接收体制)和射频直接带通采样定理(盲区采样定理)

本节目录 一、宽带中频带通采样(超外差接收体制) 1、宽带中频带通采样的原理 2、宽带中频带通采样的设计示例 二、射频直接带通采样定理 1、整带采样 2、射频直接带通采样本节内容 一、宽带中频带通采样(超外差接收体制) 1、宽带中频带通采样的原理 宽带中频带通采样(超外差接…

wstunnel (websocket模式ssh)

接上一篇 修改客户端运行参数 ssh -o ProxyCommand"./wstunnel client -L stdio://%h:%p ws://192.168.254.131:8080" 127.0.0.1 其中127.0.0.1为服务端的本地ssh访问&#xff0c;可以修改为通过服务端访问其他设备的ssh服务。例如&#xff1a; ssh -o ProxyComma…

Python框架:Django和Flask介绍应用场景和优缺点

Python框架&#xff1a;Django和Flask介绍应用场景和优缺点 Django 和 Flask 都是 Python 语言的 Web 框架&#xff0c;它们用于构建 Web 应用程序。以下是它们的基本介绍、使用方式、优点、缺点以及适用场景的对比。 Django 是什么 Django 是一个高级的 Web 框架&#xff0c…

三 SpringMVC返回数据以及RESTFul设计标准

SpringMVC返回数据 一 控制页面跳转 1.1 快速使用 开发模式回顾在 Web 开发中&#xff0c;有两种主要的开发模式&#xff1a;前后端分离和混合开发。前后端分离模式&#xff1a;[重点]指将前端的界面和后端的业务逻辑通过接口分离开发的一种方式。开发人员使用不同的技术栈和…

【Ajax-异步刷新技术】什么是Ajax之续章 !

文章目录 Ajax第五章1、layui的后台布局2、layui的数据表格1、在jsp页面中编写table2、在页面中引入文件3、编写代码4、参照文档修改表格属性 **3、最终效果** 第六章1、继续第五章内容1、layui组件2、添加数据3、查看数据4、修改数据5、删除数据 2、批量删除核心 3、数据表格重…

橡胶硫化机的单片机控制

/*** 2020 10 16 21:21硫化机控制程序 ***/ /****L971 CODE5035*********************/ #include <REG52.H> #include <intrins.h> #include <string.h> #include …

测试的分类(3)

目录 按照测试阶段测试 系统测试 冒烟测试和回归测试的区别 验收测试 单元测试, 集成测试, 系统测试, 回归测试之间的关系 是否按手工进行测试 手工测试 自动化测试 自动化测试和手工测试的优缺点 自动化测试优点 自动化测试缺点 手工测试优点 手工测试缺点 按照…

Python基础:【习题系列】列表、元组、字典和集合

在Python中,用于创建空列表的语法是什么?( A ) A.[] B.() C.{} D.None 答案:A 难易程度:易 答案解析:在Python中,空列表可以通过空方括号[]来创建。 知识点:列表;Python数据结构 在Python中,以下哪个方法用于向列表添加元素?( B ) A.insert B.append C.ad…