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各种版本存在不兼容现象可以通过它可以安装…

实验 | 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…

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

在当下数字化浪潮中&#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…

三 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、数据表格重…

测试的分类(3)

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

【SpringCloud】LoadBalance负载均衡服务调用快速入门

【SpringCloud】LoadBalance负载均衡服务调用快速入门 文章目录 【SpringCloud】LoadBalance负载均衡服务调用快速入门1. 概述2. 引入依赖3. 配置、验证3.1 配置3.2 验证 1. 概述 官网地址&#xff1a;点击跳转 Spring Cloud LoadBalancer 是由 SpringCloud 官方提供的一个开…

MemFire案例-政务应急物联网实时监测预警项目

客户背景 党的十八大以来&#xff0c;中央多次就应急管理工作做出重要指示&#xff1a;要求坚持以防为主、防抗救相结合&#xff0c;全面提升综合防灾能力&#xff1b;坚持生命至上、安全第一&#xff0c;完善安全生产责任制&#xff0c;坚决遏制重特大安全事故。 面对新形势…

2024年大数据应用、智能控制与软件工程国际会议(BDAICSE2024)

2024年大数据应用、智能控制与软件工程国际会议(BDAICSE2024) 会议简介 我们诚挚邀请您参加2024年大数据应用、智能控制和软件工程国际会议&#xff08;BDAICSE2024&#xff09;。这次会议将在美丽的长沙市举行。 本次大会旨在汇聚全球大数据应用、智能控制、软件工程等领…

云LIS系统概述JavaScript+前端框架JQuery+EasyUI+Bootstrap医院云HIS系统源码 开箱即用

云LIS系统概述JavaScript前端框架JQueryEasyUIBootstrap医院云HIS系统源码 开箱即用 云LIS&#xff08;云实验室信息管理系统&#xff09;是一种结合了计算机网络化信息系统的技术&#xff0c;它无缝嵌入到云HIS&#xff08;医院信息系统&#xff09;中&#xff0c;用于连…

[iOS]CocoaPods安装和使用

1.了解brew、rvm、ruby、gem、cocaspods之间的关系 在 macOS 环境中&#xff0c;Brew、RVM、Ruby、Gem 和 CocoaPods 之间存在以下关系&#xff1a; Homebrew (Brew)&#xff1a;Homebrew 是 macOS 上的包管理器&#xff0c;用于安装和管理各种开源软件包。它使您能够轻松地从…

信息系统项目管理师0069:数据运维(5信息系统工程—5.2数据工程—5.2.3数据运维)

点击查看专栏目录 文章目录 5.2.3数据运维1.数据存储2.数据备份3.数据容灾4.数据质量评价与控制记忆要点总结5.2.3数据运维 数据开发利用的前提是通过合适的方式将数据保存到存储介质上,并能保证有效的访问,还要通过数据备份和容灾手段,保证数据的高可用性。数据质量管理是在…