[JavaWeb]【八】web后端开发-Mybatis

news/2024/9/8 4:40:39/

目录

一 介绍

二 Mybatis的入门

2.1 快速入门

 2.1.1 准备SpringBoot工程

2.1.2 创建数据库mybatis以及对应库表user

2.1.3 创建User实体类

 2.1.4 配置application.properties数据库连接信息

2.1.5 编写sql语句(注解方式)

2.1.6 测试运行 

 2.1.7 配置SQL提示

2.2 JDBC介绍(了解)

2.2.1 JDBC 介绍

2.2.2 jdbc与Mybatis对比

2.3 数据库连接池(了解)

2.3.1 概念

2.3.2 mybatis切换Druid(德鲁伊)连接池

 2.3.3 总结

2.4 lombok

三 Mybatis的基础操作

3.1 准备工作

3.1.1 数据脚本在mybatis表执行脚本

3.1.2 创建一个springboot项目 

3.1.3 application.properties配置

3.1.4 创建对应实体类Emp

3.1.5 准备Mapper接口EmpMapper

3.2 日志输出

3.2.1 性能高 

 3.2.2 更安全

 3.2.3 总结 使用#

3.3 删除

 3.3.1 EmpMapper接口添加 删除方法

3.3.2 新增测试方法

3.4 新增

3.4.1 EmpMapper接口添加 新增方法

3.4.2 新增测试方法 

3.4.3 主键返回

3.4.4 总结 

3.5 更新

3.5.1 EmpMapper接口添加 更新方法

3.5.2 新增测试方法

3.6 查询

3.6.1 EmpMapper接口添加 查询方法

3.6.2 新增测试方法

3.6.3 数据封装

 3.6.3.1 方案一 (不推荐):当数据库字段与实体类字段不一致时取别名

3.6.3.2 方案二(不推荐) :通过@Results, @Result注解手动映射封装

 3.6.3.3 方案三(推荐):开启mybatis的驼峰命名自动映射开关

3.7 查询(条件查询)

3.7.1 EmpMapper接口添加 条件查询方法

3.7.2 新增测试方法

 3.7.3 使用concat解决使用'%$name}%'问题

四 XML映射文件

4.1 XML映射规范

4.1.1 第一步: 

 4.1.2 第二步:​编辑

4.1.3 第三步

4.1.4 验证

 4.2 mybatisx插件

4.3 总结

五 Mybatis的动态SQL

5.1

5.1.1 优化EmpMapper.xml

 5.1.2 案例

5.1.2.1 优化EmpMapper 新增一个方法update2

5.1.2.2 EmpMpapper.xml新增一个update2的sql 

5.1.2.3 新增测试方法testUpdate2测试

​编辑5.1.3 总结

5.2

5.2.1 优化EmpMapper 新增一个方法deleteByIds

5.2.2 EmpMpapper.xml新增一个deleteByIds的sql 

5.2.3 新增测试方法testDeleteByids

 5.2.4 总结

5.3

 5.3.1 EmpMpapper.xml新增sql 标签优化list2 include标签 

5.3.2 执行测试方法testList2

5.4 总结 


前言:Mybatis数据持久层,进行数据库操作,增删改查 ,动态sql

一 介绍

二 Mybatis的入门

2.1 快速入门

案例

 2.1.1 准备SpringBoot工程

 

2.1.2 创建数据库mybatis以及对应库表user

create database mybatis;
create table user(id int unsigned primary key auto_increment comment 'ID',name varchar(100) comment '姓名',age tinyint unsigned comment '年龄',gender tinyint unsigned comment '性别, 1:男, 2:女',phone varchar(11) comment '手机号'
) comment '用户表';insert into user(id, name, age, gender, phone) VALUES (null,'白眉鹰王',55,'1','18800000000');
insert into user(id, name, age, gender, phone) VALUES (null,'金毛狮王',45,'1','18800000001');
insert into user(id, name, age, gender, phone) VALUES (null,'青翼蝠王',38,'1','18800000002');
insert into user(id, name, age, gender, phone) VALUES (null,'紫衫龙王',42,'2','18800000003');
insert into user(id, name, age, gender, phone) VALUES (null,'光明左使',37,'1','18800000004');
insert into user(id, name, age, gender, phone) VALUES (null,'光明右使',48,'1','18800000005');

2.1.3 创建User实体类

package com.runa.pojo;public class User {private Integer id;private String name;private Short age;private Short gender;private String phone;public User() {}public User(Integer id, String name, Short age, Short gender, String phone) {this.id = id;this.name = name;this.age = age;this.gender = gender;this.phone = phone;}public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public Short getAge() {return age;}public void setAge(Short age) {this.age = age;}public Short getGender() {return gender;}public void setGender(Short gender) {this.gender = gender;}public String getPhone() {return phone;}public void setPhone(String phone) {this.phone = phone;}@Overridepublic String toString() {return "User{" +"id=" + id +", name='" + name + '\'' +", age=" + age +", gender=" + gender +", phone='" + phone + '\'' +'}';}
}

 2.1.4 配置application.properties数据库连接信息

# 配置数据库连接信息
#驱动类名称
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
#数据库连接的url
spring.datasource.url=jdbc:mysql://localhost:3306/mybatis
#连接数据库的用户名
spring.datasource.username=root
#连接数据库的密码
spring.datasource.password=1234
package com.runa.pojo;public class User {private Integer id;private String name;private Short age;private Short gender;private String phone;public User(Integer id, String name, Short age, Short gender, String phone) {this.id = id;this.name = name;this.age = age;this.gender = gender;this.phone = phone;}public User() {}public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public Short getAge() {return age;}public void setAge(Short age) {this.age = age;}public Short getGender() {return gender;}public void setGender(Short gender) {this.gender = gender;}public String getPhone() {return phone;}public void setPhone(String phone) {this.phone = phone;}@Overridepublic String toString() {return "User{" +"id=" + id +", name='" + name + '\'' +", age=" + age +", gender=" + gender +", phone='" + phone + '\'' +'}';}
}

2.1.5 编写sql语句(注解方式)

package com.runa.mapper;import com.runa.pojo.User;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;import java.util.List;@Mapper  // 运行时,会自动生成该接口的实现类对象(代理对象),并且将改对象交给IOC容器管理
public interface UserMapper {// 查询全部用户信息@Select("select * from user")public List<User> list();
}

2.1.6 测试运行 

package com.runa;import com.runa.mapper.UserMapper;
import com.runa.pojo.User;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;import java.util.List;@SpringBootTest
class SpringbootMybatisQuickstartApplicationTests {@Autowired  // 注入private UserMapper userMapper;@Testpublic void testListUser() {List<User> userList = userMapper.list();userList.stream().forEach(user -> {System.out.println(user);});}//    @Test
//    void contextLoads() {
//    }}

 

 2.1.7 配置SQL提示

 设置好,还不行的话(删除其他数据库连接,刷新数据库连接),重启IEDA

2.2 JDBC介绍(了解)

2.2.1 JDBC 介绍

@Testpublic void testJdbc() throws Exception {//1 注册驱动Class.forName("com.mysql.cj.jdbc.Driver");// 2 获取连接对象String url = "jdbc:mysql://localhost:3306/mybatis";String username = "root";String password = "runa#2050";Connection  connection = DriverManager.getConnection(url, username, password);// 3 获取执行sql的对象statement,执行sql 返回结果String sql = "select * from user";Statement statement = null;statement = connection.createStatement();ResultSet resultSet = null;resultSet = statement.executeQuery(sql);// 4 封装结果数据List<User> userList = new ArrayList<>();while (resultSet.next()) {int id = resultSet.getInt("id");String name = resultSet.getString("name");short age = resultSet.getShort("age");short gender = resultSet.getShort("gender");String phone = resultSet.getString("phone");User  user = new User(id, name, age, gender, phone);userList.add(user);}// 5 释放资源statement.close();connection.close();userList.stream().forEach(user -> {System.out.println(user);});}

 

 

2.2.2 jdbc与Mybatis对比

 

 

 

2.3 数据库连接池(了解)

2.3.1 概念

 

 

2.3.2 mybatis切换Druid(德鲁伊)连接池

 我没有配置成功

 2.3.3 总结

 

2.4 lombok

 

 

 添加依赖

    <dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency>

修改实体类User

package com.runa.pojo;import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;@Data
@NoArgsConstructor
@AllArgsConstructor
public class User {private Integer id;private String name;private Short age;private Short gender;private String phone;}

 

三 Mybatis的基础操作

3.1 准备工作

 

 

3.1.1 数据脚本在mybatis表执行脚本

-- 部门管理
create table dept(id int unsigned primary key auto_increment comment '主键ID',name varchar(10) 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());-- 员工管理
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 '密码',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());

3.1.2 创建一个springboot项目 

引入起步依赖mybatis、mysql驱动、lombok

3.1.3 application.properties配置

指定mybatis输出日志的位置。输出控制台

# 配置数据库连接
# 驱动类名称
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
# 连接数据库的url
spring.datasource.url=jdbc:mysql://localhost:3306/mybatis
#连接数据库用户名
spring.datasource.username=root
# 连接数据库密码
spring.datasource.password=runa#2050# 指定mybatis输出日志的位置。输出控制台
mybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl

3.1.4 创建对应实体类Emp

package com.runa.pojo;import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.time.LocalDate;
import java.time.LocalDateTime;@Data
@NoArgsConstructor
@AllArgsConstructor
public class Emp {private Integer id;private String username;private String password;private String name;private Short gender;private String image;private Short job;private LocalDate entrydate;private Integer deptId;private LocalDateTime createTime;private LocalDateTime updateTime;
}

 

3.1.5 准备Mapper接口EmpMapper

 

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

3.2 日志输出

3.2.1 性能高 

 

 

 3.2.2 更安全

 

 3.2.3 总结 使用#

 

 

3.3 删除

 

 3.3.1 EmpMapper接口添加 删除方法

package com.runa.mapper;import org.apache.ibatis.annotations.Delete;
import org.apache.ibatis.annotations.Mapper;@Mapper
public interface EmpMapper {// 根据id删除数据@Delete("delete from emp where id = #{id}")public void delete(Integer id);
}

3.3.2 新增测试方法

package com.runa;import com.runa.mapper.EmpMapper;
import com.runa.mapper.UserMapper;
import com.runa.pojo.User;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;import java.sql.*;
import java.util.ArrayList;
import java.util.List;@SpringBootTest
class SpringbootMybatisQuickstartApplicationTests {@Autowired //注入private EmpMapper empMapper;@Testpublic void testDelete(){empMapper.delete(17);}}

改造一下获取返回值

package com.runa.mapper;import org.apache.ibatis.annotations.Delete;
import org.apache.ibatis.annotations.Mapper;@Mapper
public interface EmpMapper {// 根据id删除数据
//    @Delete("delete from emp where id = #{id}")
//    public void delete(Integer id);// 根据id删除数据,并获取返回值@Delete("delete from emp where id = #{id}")public int delete(Integer id);
}
package com.runa;import com.runa.mapper.EmpMapper;
import com.runa.mapper.UserMapper;
import com.runa.pojo.User;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;import java.sql.*;
import java.util.ArrayList;
import java.util.List;@SpringBootTest
class SpringbootMybatisQuickstartApplicationTests {//    @Autowired  // 注入
//    private UserMapper userMapper;@Autowired //注入private EmpMapper empMapper;//    @Test
//    public void testListUser() {
//        List<User> userList = userMapper.list();
//        userList.stream().forEach(user -> {
//            System.out.println(user);
//        });
//    }//    @Test
//    public void testDelete(){
//        empMapper.delete(17);
//
//    }@Test  // 获取返回值public void testDelete(){int id = empMapper.delete(16);System.out.println(id);}}

 

 

 返回 1表示删除成功,0 是失败

 

3.4 新增

 

3.4.1 EmpMapper接口添加 新增方法

package com.runa.mapper;import com.runa.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);// 根据id删除数据,并获取返回值
//    @Delete("delete from emp where id = #{id}")
//    public int delete(Integer id);// 新增员工@Insert("insert into emp\n" +"(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.4.2 新增测试方法 

package com.runa;import com.runa.mapper.EmpMapper;
import com.runa.mapper.UserMapper;
import com.runa.pojo.Emp;
import com.runa.pojo.User;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;import java.sql.*;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;@SpringBootTest
class SpringbootMybatisQuickstartApplicationTests {//    @Autowired  // 注入
//    private UserMapper userMapper;@Autowired //注入private EmpMapper empMapper;//    @Test
//    public void testListUser() {
//        List<User> userList = userMapper.list();
//        userList.stream().forEach(user -> {
//            System.out.println(user);
//        });
//    }@Testpublic void testDelete(){empMapper.delete(17);}//    @Test  // 获取返回值
//    public void testDelete(){
//        int id = empMapper.delete(16);
//        System.out.println(id);
//    }@Testpublic void testInsert(){// 构造员工对象Emp emp = new Emp();emp.setUsername("Bocai");emp.setName("菠菜");emp.setImage("1.jpg");emp.setGender((short)1);emp.setJob((short)1);emp.setEntrydate(LocalDate.of(2023, 2,27));emp.setCreateTime(LocalDateTime.now());emp.setUpdateTime(LocalDateTime.now());emp.setDeptId(1);// 执行新增员工的信息操作empMapper.insert(emp);}}

 

 

3.4.3 主键返回

 

3.4.4 总结 

 

3.5 更新

 

3.5.1 EmpMapper接口添加 更新方法

package com.runa.mapper;import com.runa.pojo.Emp;
import org.apache.ibatis.annotations.*;@Mapper
public interface EmpMapper {// 根据id删除数据@Delete("delete from emp where id = #{id}")public void delete(Integer id);// 根据id删除数据,并获取返回值
//    @Delete("delete from emp where id = #{id}")
//    public int delete(Integer id);// 新增员工@Options(useGeneratedKeys = true, keyProperty = "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);// 更新员工信息@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.5.2 新增测试方法

 

package com.runa;import com.runa.mapper.EmpMapper;
import com.runa.mapper.UserMapper;
import com.runa.pojo.Emp;
import com.runa.pojo.User;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;import java.sql.*;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;@SpringBootTest
class SpringbootMybatisQuickstartApplicationTests {//    @Autowired  // 注入
//    private UserMapper userMapper;@Autowired //注入private EmpMapper empMapper;//    @Test
//    public void testListUser() {
//        List<User> userList = userMapper.list();
//        userList.stream().forEach(user -> {
//            System.out.println(user);
//        });
//    }@Testpublic void testDelete(){empMapper.delete(17);}//    @Test  // 获取返回值
//    public void testDelete(){
//        int id = empMapper.delete(16);
//        System.out.println(id);
//    }@Testpublic void testInsert(){// 构造员工对象Emp emp = new Emp();emp.setUsername("Bocai1");emp.setName("菠菜1");emp.setImage("1.jpg");emp.setGender((short)1);emp.setJob((short)1);emp.setEntrydate(LocalDate.of(2023, 2,27));emp.setCreateTime(LocalDateTime.now());emp.setUpdateTime(LocalDateTime.now());emp.setDeptId(1);// 执行新增员工的信息操作empMapper.insert(emp);System.out.println(emp.getId());}@Testpublic void testUpdate(){// 构造员工对象Emp emp = new Emp();emp.setId(19);emp.setUsername("Spring");emp.setName("春天的菠菜");emp.setImage("1.jpg");emp.setGender((short)1);emp.setJob((short)1);emp.setEntrydate(LocalDate.of(2023, 2,27));emp.setUpdateTime(LocalDateTime.now());emp.setDeptId(1);// 执行更新员工的信息操作empMapper.update(emp);}}

3.6 查询

 

3.6.1 EmpMapper接口添加 查询方法

package com.runa.mapper;import com.runa.pojo.Emp;
import org.apache.ibatis.annotations.*;@Mapper
public interface EmpMapper {// 根据id删除数据@Delete("delete from emp where id = #{id}")public void delete(Integer id);// 根据id删除数据,并获取返回值
//    @Delete("delete from emp where id = #{id}")
//    public int delete(Integer id);// 新增员工@Options(useGeneratedKeys = true, keyProperty = "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);// 更新员工信息@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);// 根据ID查询员工@Select("select * from emp where id = #{id}")public Emp getById(Integer id);}

3.6.2 新增测试方法

package com.runa;import com.runa.mapper.EmpMapper;
import com.runa.mapper.UserMapper;
import com.runa.pojo.Emp;
import com.runa.pojo.User;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;import java.sql.*;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;@SpringBootTest
class SpringbootMybatisQuickstartApplicationTests {//    @Autowired  // 注入
//    private UserMapper userMapper;@Autowired //注入private EmpMapper empMapper;//    @Test
//    public void testListUser() {
//        List<User> userList = userMapper.list();
//        userList.stream().forEach(user -> {
//            System.out.println(user);
//        });
//    }@Testpublic void testDelete(){empMapper.delete(17);}//    @Test  // 获取返回值
//    public void testDelete(){
//        int id = empMapper.delete(16);
//        System.out.println(id);
//    }// 测试新增@Testpublic void testInsert(){// 构造员工对象Emp emp = new Emp();emp.setUsername("Bocai1");emp.setName("菠菜1");emp.setImage("1.jpg");emp.setGender((short)1);emp.setJob((short)1);emp.setEntrydate(LocalDate.of(2023, 2,27));emp.setCreateTime(LocalDateTime.now());emp.setUpdateTime(LocalDateTime.now());emp.setDeptId(1);// 执行新增员工的信息操作empMapper.insert(emp);System.out.println(emp.getId());}// 测试更新@Testpublic void testUpdate(){// 构造员工对象Emp emp = new Emp();emp.setId(19);emp.setUsername("Spring");emp.setName("春天的菠菜");emp.setImage("1.jpg");emp.setGender((short)1);emp.setJob((short)1);emp.setEntrydate(LocalDate.of(2023, 2,27));emp.setUpdateTime(LocalDateTime.now());emp.setDeptId(1);// 执行更新员工的信息操作empMapper.update(emp);}// 根据员工ID查询员工@Testpublic void testGetById(){Emp emp = empMapper.getById(19);System.out.println(emp);}}

 

3.6.3 数据封装

 3.6.3.1 方案一 (不推荐):当数据库字段与实体类字段不一致时取别名

 修改Empmapper接口类

    // 根据ID查询员工
//    @Select("select * from emp where id = #{id}")
//    public Emp getById(Integer id);// 根据ID查询员工,取别名方案@Select("select id,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);

 

3.6.3.2 方案二(不推荐) :通过@Results, @Result注解手动映射封装

   // 根据ID查询员工
//    @Select("select * from emp where id = #{id}")
//    public Emp getById(Integer id);// 根据ID查询员工,方案一:取别名方案
//    @Select("select id,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);// 根据ID查询员工 方案二:通过@Results, @Result注解手动映射封装@Results({@Result(column = "dept_id", property = "deptId"),@Result(column = "create_time", property = "createTime"),@Result(column = "update_time", property = "updateTime")})@Select("select * from emp where id = #{id}")public Emp getById(Integer id);

 

 3.6.3.3 方案三(推荐):开启mybatis的驼峰命名自动映射开关

application.properties新增配置

# 配置数据库连接
# 驱动类名称
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
# 连接数据库的url
spring.datasource.url=jdbc:mysql://localhost:3306/mybatis
#连接数据库用户名
spring.datasource.username=root
# 连接数据库密码
spring.datasource.password=runa#2050# 指定mybatis输出日志的位置。输出控制台
mybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl# # 开启mybatis的驼峰命名自动映射开关
mybatis.configuration.map-underscore-to-camel-case=true

 

 

插曲:IDEA 的application.properties中文乱码,

配置前:

 修改后:

 

 

 

3.7 查询(条件查询)

 ​​​​​​​​​​​​​​

 

 

 

3.7.1 EmpMapper接口添加 条件查询方法

'%#{name}%' #{name}  不能出现在''里面所以改成$

package com.runa.mapper;import com.runa.pojo.Emp;
import org.apache.ibatis.annotations.*;import java.time.LocalDate;
import java.util.List;@Mapper
public interface EmpMapper {// 根据id删除数据@Delete("delete from emp where id = #{id}")public void delete(Integer id);// 根据id删除数据,并获取返回值
//    @Delete("delete from emp where id = #{id}")
//    public int delete(Integer id);// 新增员工@Options(useGeneratedKeys = true, keyProperty = "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);// 更新员工信息@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);// 根据ID查询员工@Select("select * from emp where id = #{id}")public Emp getById(Integer id);// 根据ID查询员工, (不推荐)方案一:取别名方案
//    @Select("select id,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);// 根据ID查询员工 (不推荐)方案二:通过@Results, @Result注解手动映射封装
//    @Results({
//            @Result(column = "dept_id", property = "deptId"),
//            @Result(column = "create_time", property = "createTime"),
//            @Result(column = "update_time", property = "updateTime")
//    })
//    @Select("select * from emp where id = #{id}")
//    public Emp getById(Integer id);// 条件查询员工  '%#{name}%' #{name}  不能出现在''里面所以改成$@Select("select * from emp where name like '%${name}%'and gender = #{gender} and entrydate between #{begin} and #{end} order by update_time desc ")public List<Emp> list(String name, Short gender, LocalDate begin, LocalDate end);}

3.7.2 新增测试方法

 

package com.runa;import com.runa.mapper.EmpMapper;
import com.runa.mapper.UserMapper;
import com.runa.pojo.Emp;
import com.runa.pojo.User;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;import java.sql.*;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;@SpringBootTest
class SpringbootMybatisQuickstartApplicationTests {//    @Autowired  // 注入
//    private UserMapper userMapper;@Autowired //注入private EmpMapper empMapper;//    @Test
//    public void testListUser() {
//        List<User> userList = userMapper.list();
//        userList.stream().forEach(user -> {
//            System.out.println(user);
//        });
//    }@Testpublic void testDelete(){empMapper.delete(17);}//    @Test  // 获取返回值
//    public void testDelete(){
//        int id = empMapper.delete(16);
//        System.out.println(id);
//    }// 测试新增@Testpublic void testInsert(){// 构造员工对象Emp emp = new Emp();emp.setUsername("Bocai1");emp.setName("菠菜1");emp.setImage("1.jpg");emp.setGender((short)1);emp.setJob((short)1);emp.setEntrydate(LocalDate.of(2023, 2,27));emp.setCreateTime(LocalDateTime.now());emp.setUpdateTime(LocalDateTime.now());emp.setDeptId(1);// 执行新增员工的信息操作empMapper.insert(emp);System.out.println(emp.getId());}// 测试更新@Testpublic void testUpdate(){// 构造员工对象Emp emp = new Emp();emp.setId(19);emp.setUsername("Spring");emp.setName("春天的菠菜");emp.setImage("1.jpg");emp.setGender((short)1);emp.setJob((short)1);emp.setEntrydate(LocalDate.of(2023, 2,27));emp.setUpdateTime(LocalDateTime.now());emp.setDeptId(1);// 执行更新员工的信息操作empMapper.update(emp);}// 根据员工ID查询员工@Testpublic void testGetById(){Emp emp = empMapper.getById(19);System.out.println(emp);}// 条件查询@Testpublic void testList(){List<Emp> listEmp = empMapper.list("张", (short) 1, LocalDate.of(2010, 1, 1), LocalDate.of(2020, 1, 1));System.out.println(listEmp);}}

 

 3.7.3 使用concat解决使用'%$name}%'问题

修改EmpMapper接口

package com.runa.mapper;import com.runa.pojo.Emp;
import org.apache.ibatis.annotations.*;import java.time.LocalDate;
import java.util.List;@Mapper
public interface EmpMapper {// 根据id删除数据@Delete("delete from emp where id = #{id}")public void delete(Integer id);// 根据id删除数据,并获取返回值
//    @Delete("delete from emp where id = #{id}")
//    public int delete(Integer id);// 新增员工@Options(useGeneratedKeys = true, keyProperty = "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);// 更新员工信息@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);// 根据ID查询员工@Select("select * from emp where id = #{id}")public Emp getById(Integer id);// 根据ID查询员工, (不推荐)方案一:取别名方案
//    @Select("select id,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);// 根据ID查询员工 (不推荐)方案二:通过@Results, @Result注解手动映射封装
//    @Results({
//            @Result(column = "dept_id", property = "deptId"),
//            @Result(column = "create_time", property = "createTime"),
//            @Result(column = "update_time", property = "updateTime")
//    })
//    @Select("select * from emp where id = #{id}")
//    public Emp getById(Integer id);// 条件查询员工  '%#{name}%' #{name}  不能出现在''里面所以改成$
//    @Select("select * from emp where name like '%${name}%'and gender = #{gender} and entrydate between #{begin} and #{end} order by update_time desc ")
//    public List<Emp> list(String name, Short gender, LocalDate begin, LocalDate end);// 条件查询员工 使用concat解决 '%${name}%'@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(String name, Short gender, LocalDate begin, LocalDate end);}

 以下图片可忽略

四 XML映射文件

4.1 XML映射规范

4.1.1 第一步: 

 

EmpMapper.xml文件如下: 

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper></mapper>

 4.1.2 第二步:

 

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.runa.mapper.EmpMapper"></mapper>

4.1.3 第三步

resultType : 表示单条记录所封装的类型

 

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.runa.mapper.EmpMapper"><!--id EmpMapper 方法名   resultType : 表示单条记录所封装的类型  --><select id="list2" resultType="com.runa.pojo.Emp">select * from emp where name like concat('%', #{name}, '%')and gender = #{gender} and entrydate between #{begin} and #{end} order by update_time desc</select></mapper>

4.1.4 验证

package com.runa;import com.runa.mapper.EmpMapper;
import com.runa.mapper.UserMapper;
import com.runa.pojo.Emp;
import com.runa.pojo.User;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;import java.sql.*;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;@SpringBootTest
class SpringbootMybatisQuickstartApplicationTests {//    @Autowired  // 注入
//    private UserMapper userMapper;@Autowired //注入private EmpMapper empMapper;//    @Test
//    public void testListUser() {
//        List<User> userList = userMapper.list();
//        userList.stream().forEach(user -> {
//            System.out.println(user);
//        });
//    }@Testpublic void testDelete(){empMapper.delete(17);}//    @Test  // 获取返回值
//    public void testDelete(){
//        int id = empMapper.delete(16);
//        System.out.println(id);
//    }// 测试新增@Testpublic void testInsert(){// 构造员工对象Emp emp = new Emp();emp.setUsername("Bocai1");emp.setName("菠菜1");emp.setImage("1.jpg");emp.setGender((short)1);emp.setJob((short)1);emp.setEntrydate(LocalDate.of(2023, 2,27));emp.setCreateTime(LocalDateTime.now());emp.setUpdateTime(LocalDateTime.now());emp.setDeptId(1);// 执行新增员工的信息操作empMapper.insert(emp);System.out.println(emp.getId());}// 测试更新@Testpublic void testUpdate(){// 构造员工对象Emp emp = new Emp();emp.setId(19);emp.setUsername("Spring");emp.setName("春天的菠菜");emp.setImage("1.jpg");emp.setGender((short)1);emp.setJob((short)1);emp.setEntrydate(LocalDate.of(2023, 2,27));emp.setUpdateTime(LocalDateTime.now());emp.setDeptId(1);// 执行更新员工的信息操作empMapper.update(emp);}// 根据员工ID查询员工@Testpublic void testGetById(){Emp emp = empMapper.getById(19);System.out.println(emp);}// 条件查询@Testpublic void testList(){List<Emp> listEmp = empMapper.list("张", (short) 1, LocalDate.of(2010, 1, 1), LocalDate.of(2020, 1, 1));System.out.println(listEmp);}// 条件查询 使用xml@Testpublic void testList2(){List<Emp> listEmp = empMapper.list2("张", (short) 1, LocalDate.of(2010, 1, 1), LocalDate.of(2020, 1, 1));System.out.println(listEmp);}}

 

 4.2 mybatisx插件

 快速定位

 

4.3 总结

 

 

五 Mybatis的动态SQL

5.1 <if>

5.1.1 优化EmpMapper.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.runa.mapper.EmpMapper"><!--id EmpMapper 方法名   resultType : 表示单条记录所封装的类型  --><select id="list2" resultType="com.runa.pojo.Emp">select *from emp<where><if test= "name != null">name like concat('%', #{name}, '%')</if><if test= "gender != null">and gender = #{gender}</if><if test= "begin != null and end != null">and entrydate between #{begin} and #{end}</if>order by update_time desc</where></select></mapper>

 

 

 

 注意:<where></where> 会针对多条件查询过滤一些特有的and

 5.1.2 案例

 

 

5.1.2.1 优化EmpMapper 新增一个方法update2

package com.runa.mapper;import com.runa.pojo.Emp;
import org.apache.ibatis.annotations.*;import java.time.LocalDate;
import java.util.List;@Mapper
public interface EmpMapper {// 根据id删除数据@Delete("delete from emp where id = #{id}")public void delete(Integer id);// 根据id删除数据,并获取返回值
//    @Delete("delete from emp where id = #{id}")
//    public int delete(Integer id);// 新增员工@Options(useGeneratedKeys = true, keyProperty = "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);// 更新员工信息@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);// 根据ID查询员工@Select("select * from emp where id = #{id}")public Emp getById(Integer id);// 根据ID查询员工, (不推荐)方案一:取别名方案
//    @Select("select id,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);// 根据ID查询员工 (不推荐)方案二:通过@Results, @Result注解手动映射封装
//    @Results({
//            @Result(column = "dept_id", property = "deptId"),
//            @Result(column = "create_time", property = "createTime"),
//            @Result(column = "update_time", property = "updateTime")
//    })
//    @Select("select * from emp where id = #{id}")
//    public Emp getById(Integer id);// 条件查询员工  '%#{name}%' #{name}  不能出现在''里面所以改成$
//    @Select("select * from emp where name like '%${name}%'and gender = #{gender} and entrydate between #{begin} and #{end} order by update_time desc ")
//    public List<Emp> list(String name, Short gender, LocalDate begin, LocalDate end);// 条件查询员工 使用concat解决 '%${name}%'@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(String name, Short gender, LocalDate begin, LocalDate end);// 条件查询员工使用xml方式public List<Emp> list2(String name, Short gender, LocalDate begin, LocalDate end);// 更新员工信息使用xml方式 使用<if>,使用动态sql方式public void update2(Emp emp);}

5.1.2.2 EmpMpapper.xml新增一个update2的sql 

这里也使用了<set></set>标签

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.runa.mapper.EmpMapper"><!--id EmpMapper 方法名   resultType : 表示单条记录所封装的类型  --><select id="list2" resultType="com.runa.pojo.Emp">select *from emp<where><if test="name != null">name like concat('%', #{name}, '%')</if><if test="gender != null">and gender = #{gender}</if><if test="begin != null and end != null">and entrydate between #{begin} and #{end}</if>order by update_time desc</where></select><!-- 动态更新员工--><update id="update2">update emp <set><if test="username != null">username = #{username},</if><if test="name != null">name= #{name},</if><if test="gender != null">gender = #{gender},</if><if test="image != null">image = #{image},</if><if test="job != null">job = #{job},</if><if test="entrydate != null">entrydate = #{entrydate},</if><if test="deptId != null">dept_id = #{deptId},</if><if test="updateTime != null">update_time = #{updateTime}</if></set>where id=#{id}</update></mapper>

5.1.2.3 新增测试方法testUpdate2测试

package com.runa;import com.runa.mapper.EmpMapper;
import com.runa.mapper.UserMapper;
import com.runa.pojo.Emp;
import com.runa.pojo.User;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;import java.sql.*;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;@SpringBootTest
class SpringbootMybatisQuickstartApplicationTests {//    @Autowired  // 注入
//    private UserMapper userMapper;@Autowired //注入private EmpMapper empMapper;//    @Test
//    public void testListUser() {
//        List<User> userList = userMapper.list();
//        userList.stream().forEach(user -> {
//            System.out.println(user);
//        });
//    }@Testpublic void testDelete(){empMapper.delete(17);}//    @Test  // 获取返回值
//    public void testDelete(){
//        int id = empMapper.delete(16);
//        System.out.println(id);
//    }// 测试新增@Testpublic void testInsert(){// 构造员工对象Emp emp = new Emp();emp.setUsername("Bocai1");emp.setName("菠菜1");emp.setImage("1.jpg");emp.setGender((short)1);emp.setJob((short)1);emp.setEntrydate(LocalDate.of(2023, 2,27));emp.setCreateTime(LocalDateTime.now());emp.setUpdateTime(LocalDateTime.now());emp.setDeptId(1);// 执行新增员工的信息操作empMapper.insert(emp);System.out.println(emp.getId());}// 测试更新@Testpublic void testUpdate(){// 构造员工对象Emp emp = new Emp();emp.setId(19);emp.setUsername("Spring");emp.setName("春天的菠菜");emp.setImage("1.jpg");emp.setGender((short)1);emp.setJob((short)1);emp.setEntrydate(LocalDate.of(2023, 2,27));emp.setUpdateTime(LocalDateTime.now());emp.setDeptId(1);// 执行更新员工的信息操作empMapper.update(emp);}// 根据员工ID查询员工@Testpublic void testGetById(){Emp emp = empMapper.getById(19);System.out.println(emp);}// 条件查询@Testpublic void testList(){List<Emp> listEmp = empMapper.list("张", (short) 1, LocalDate.of(2010, 1, 1), LocalDate.of(2020, 1, 1));System.out.println(listEmp);}// 条件查询 使用xml@Testpublic void testList2(){
//        List<Emp> listEmp = empMapper.list2("张", (short) 1, LocalDate.of(2010, 1, 1), LocalDate.of(2020, 1, 1));List<Emp> listEmp = empMapper.list2("张", (short) 1, null, null);System.out.println(listEmp);}// 测试更新,使用动态sql 更新id为18的员工username bocai2 更新为  name菠菜大哥 更新为 gender更新为 2@Testpublic void testUpdate2(){// 构造员工对象Emp emp = new Emp();emp.setId(18);emp.setUsername("bocai2");emp.setName("菠菜大哥");emp.setDeptId(2);emp.setUpdateTime(LocalDateTime.now());// 执行更新员工的信息操作empMapper.update2(emp);}}

5.1.3 总结

 

5.2 <foreach>

5.2.1 优化EmpMapper 新增一个方法deleteByIds

package com.runa.mapper;import com.runa.pojo.Emp;
import org.apache.ibatis.annotations.*;import java.time.LocalDate;
import java.util.List;@Mapper
public interface EmpMapper {// 根据id删除数据@Delete("delete from emp where id = #{id}")public void delete(Integer id);// 根据id删除数据,并获取返回值
//    @Delete("delete from emp where id = #{id}")
//    public int delete(Integer id);// 新增员工@Options(useGeneratedKeys = true, keyProperty = "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);// 更新员工信息@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);// 根据ID查询员工@Select("select * from emp where id = #{id}")public Emp getById(Integer id);// 批量删除员工public void deleteByIds(List<Integer> ids);// 根据ID查询员工, (不推荐)方案一:取别名方案
//    @Select("select id,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);// 根据ID查询员工 (不推荐)方案二:通过@Results, @Result注解手动映射封装
//    @Results({
//            @Result(column = "dept_id", property = "deptId"),
//            @Result(column = "create_time", property = "createTime"),
//            @Result(column = "update_time", property = "updateTime")
//    })
//    @Select("select * from emp where id = #{id}")
//    public Emp getById(Integer id);// 条件查询员工  '%#{name}%' #{name}  不能出现在''里面所以改成$
//    @Select("select * from emp where name like '%${name}%'and gender = #{gender} and entrydate between #{begin} and #{end} order by update_time desc ")
//    public List<Emp> list(String name, Short gender, LocalDate begin, LocalDate end);// 条件查询员工 使用concat解决 '%${name}%'@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(String name, Short gender, LocalDate begin, LocalDate end);// 条件查询员工使用xml方式public List<Emp> list2(String name, Short gender, LocalDate begin, LocalDate end);// 更新员工信息使用xml方式 使用<if>,使用动态sql方式public void update2(Emp emp);}

5.2.2 EmpMpapper.xml新增一个deleteByIds的sql 

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.runa.mapper.EmpMapper"><!--id EmpMapper 方法名   resultType : 表示单条记录所封装的类型  --><select id="list2" resultType="com.runa.pojo.Emp">select *from emp<where><if test="name != null">name like concat('%', #{name}, '%')</if><if test="gender != null">and gender = #{gender}</if><if test="begin != null and end != null">and entrydate between #{begin} and #{end}</if>order by update_time desc</where></select><!-- 动态更新员工--><update id="update2">update emp<set><if test="username != null">username = #{username},</if><if test="name != null">name= #{name},</if><if test="gender != null">gender = #{gender},</if><if test="image != null">image = #{image},</if><if test="job != null">job = #{job},</if><if test="entrydate != null">entrydate = #{entrydate},</if><if test="deptId != null">dept_id = #{deptId},</if><if test="updateTime != null">update_time = #{updateTime}</if></set>where id=#{id}</update><!--    批量删除员工 (18,19,20)--><!--collection : 要遍历的集合item : 遍历出来的元素separator : 分隔符open :遍历开始前拼接的sql片段close : 遍历结束后拼接的sql片段)--><delete id="deleteByIds">delete from emp where id in<foreach collection="ids" item="id" separator="," open="(" close=")">#{id}</foreach></delete>
</mapper>

5.2.3 新增测试方法testDeleteByids

 

package com.runa;import com.runa.mapper.EmpMapper;
import com.runa.mapper.UserMapper;
import com.runa.pojo.Emp;
import com.runa.pojo.User;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;import java.sql.*;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;@SpringBootTest
class SpringbootMybatisQuickstartApplicationTests {//    @Autowired  // 注入
//    private UserMapper userMapper;@Autowired //注入private EmpMapper empMapper;//    @Test
//    public void testListUser() {
//        List<User> userList = userMapper.list();
//        userList.stream().forEach(user -> {
//            System.out.println(user);
//        });
//    }@Testpublic void testDelete(){empMapper.delete(17);}//    @Test  // 获取返回值
//    public void testDelete(){
//        int id = empMapper.delete(16);
//        System.out.println(id);
//    }// 测试新增@Testpublic void testInsert(){// 构造员工对象Emp emp = new Emp();emp.setUsername("Bocai1");emp.setName("菠菜1");emp.setImage("1.jpg");emp.setGender((short)1);emp.setJob((short)1);emp.setEntrydate(LocalDate.of(2023, 2,27));emp.setCreateTime(LocalDateTime.now());emp.setUpdateTime(LocalDateTime.now());emp.setDeptId(1);// 执行新增员工的信息操作empMapper.insert(emp);System.out.println(emp.getId());}// 测试更新@Testpublic void testUpdate(){// 构造员工对象Emp emp = new Emp();emp.setId(19);emp.setUsername("Spring");emp.setName("春天的菠菜");emp.setImage("1.jpg");emp.setGender((short)1);emp.setJob((short)1);emp.setEntrydate(LocalDate.of(2023, 2,27));emp.setUpdateTime(LocalDateTime.now());emp.setDeptId(1);// 执行更新员工的信息操作empMapper.update(emp);}// 根据员工ID查询员工@Testpublic void testGetById(){Emp emp = empMapper.getById(19);System.out.println(emp);}// 条件查询@Testpublic void testList(){List<Emp> listEmp = empMapper.list("张", (short) 1, LocalDate.of(2010, 1, 1), LocalDate.of(2020, 1, 1));System.out.println(listEmp);}// 条件查询 使用xml@Testpublic void testList2(){
//        List<Emp> listEmp = empMapper.list2("张", (short) 1, LocalDate.of(2010, 1, 1), LocalDate.of(2020, 1, 1));List<Emp> listEmp = empMapper.list2("张", (short) 1, null, null);System.out.println(listEmp);}// 测试更新,使用动态sql 更新id为18的员工username bocai2 更新为  name菠菜大哥 更新为 gender更新为 2@Testpublic void testUpdate2(){// 构造员工对象Emp emp = new Emp();emp.setId(18);emp.setUsername("bocai2");emp.setName("菠菜大哥");emp.setDeptId(2);emp.setUpdateTime(LocalDateTime.now());// 执行更新员工的信息操作empMapper.update2(emp);}// 批量删除员工 13 、 14、  15@Testpublic void testDeleteByids(){List<Integer> ids = Arrays.asList(13, 14, 15);empMapper.deleteByIds(ids);}}

 

 

 

 5.2.4 总结

 

5.3 <sql><include>

存在大量重复的sql

解决方案

 

 

 5.3.1 EmpMpapper.xml新增sql 标签优化list2 include标签 

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.runa.mapper.EmpMapper"><sql id="commonSelect">select id,id, username, password, name, gender, image, job, entrydate, dept_id deptId, create_time createTime, update_time updateTime from emp</sql><!--id EmpMapper 方法名   resultType : 表示单条记录所封装的类型  --><select id="list2" resultType="com.runa.pojo.Emp"><include refid="commonSelect"></include><where><if test="name != null">name like concat('%', #{name}, '%')</if><if test="gender != null">and gender = #{gender}</if><if test="begin != null and end != null">and entrydate between #{begin} and #{end}</if>order by update_time desc</where></select><!-- 动态更新员工--><update id="update2">update emp<set><if test="username != null">username = #{username},</if><if test="name != null">name= #{name},</if><if test="gender != null">gender = #{gender},</if><if test="image != null">image = #{image},</if><if test="job != null">job = #{job},</if><if test="entrydate != null">entrydate = #{entrydate},</if><if test="deptId != null">dept_id = #{deptId},</if><if test="updateTime != null">update_time = #{updateTime}</if></set>where id=#{id}</update><!--    批量删除员工 (18,19,20)--><!--collection : 要遍历的集合item : 遍历出来的元素separator : 分隔符open :遍历开始前拼接的sql片段close : 遍历结束后拼接的sql片段)--><delete id="deleteByIds">delete from emp where id in<foreach collection="ids" item="id" separator="," open="(" close=")">#{id}</foreach></delete>
</mapper>

5.3.2 执行测试方法testList2

 

5.4 总结 

 


http://www.ppmy.cn/news/1053668.html

相关文章

MySQL 主从配置

环境 centos6.7 虚拟机两台 主&#xff1a;192.168.23.160 从&#xff1a;192.168.23.163 准备 在两台机器上分别安装mysql5.6.23&#xff0c;安装完成后利用临时密码登录mysql数据修改root的密码&#xff1b;将my.cnf配置文件放至/etc/my.cnf&#xff0c;重启mysql服务进…

【ARM64 常见汇编指令学习 20 -- ARM 指令 .include与 .asciz 详细介绍】

文章目录 .include 介绍.asciz 介绍 .include 介绍 在 ARM 汇编语言中&#xff0c;.include 命令用于插入另一个源文件的内容。它的作用类似于 C 语言中的 #include 预处理命令。这个命令通常在源文件的顶部使用&#xff0c;但也可以在任何地方使用。 语法如下&#xff1a; …

el-upload组件调用后端接口上传文件实践

要点说明&#xff1a; 使用:http-request覆盖默认的上传行为&#xff0c;可以添加除文件外的其他参数&#xff0c;注意此时仍需保留action属性&#xff0c;action可以传个空串给http-request属性绑定的函数&#xff0c;函数入参必须为param调用接口请求&#xff0c;注意 heade…

springboot日志文件名称为什么叫logback-spring.xml

如题&#xff0c;为什么springboot日志配置文件叫logback-spring.xml&#xff1f; 在整个项目中搜索 logback-spring.xml 并没有搜索到。 先看一下 org.springframework.boot.context.logging.LoggingApplicationListener#initialize protected void initialize(ConfigurableEn…

docker 报错

问题说明&#xff1a;我是服务器上面的docker拉到本地30卡想用的&#xff0c;但是失败&#xff0c;报错如下&#xff1a; 服务器上面显存驱动是450&#xff0c;本地30卡驱动是470 nvidia-docker run -it --name 20230821_3 --shm-size 16g -p 10029:22 --privileged 20230821_i…

linux安装 MySQL8 并配置开机自启动

目录 1.下载 mysql 安装包 2.上传并解压 mysql 3.修改 mysql 文件夹名 4.创建mysql 用户和用户组 5.数据目录 &#xff08;1&#xff09;创建目录 &#xff08;2&#xff09;赋予权限 6.初始化mysql &#xff08;1&#xff09;配置参数 &#xff08;2&#xff09;配置环…

LeetCode算法心得——k-avoiding 数组的最小总和(标记数组)

大家好&#xff0c;我是晴天学长&#xff0c;这是一个细节题和一部分的思维题哈&#xff01; 2) .算法思路 k-avoiding 数组的最小总和 1,填充一个1到n 的Boolean的数组 要n个数&#xff0c;但是数组大小不能确定。 所以建立1000的大小。 2.遍历筛选&#xff0c;如果数组中有这…

minikube安装

minikube也是需要docker环境的&#xff0c;首先看一下docker 下载docker.repo源到本地 通过repo里面查找最新的docker 开始安装docker 修改docker 下载加速地址&#xff0c; systemctl deamon-reload 下载minikube minikube start | minikube curl -LO https://storage.goog…

成功解决SQL 错误 [22000]: 第3 行附近出现错误: 试图修改自增列[ID](达梦数据库)

当我们使用工具来手动修改自增列的自增ID时&#xff0c;可能会报如下异常 SQL 错误 [22000]: 第3 行附近出现错误:试图修改自增列[ID] 解决办法&#xff1a; 可以使用SQL语句来修改 ALTER TABLE "fdw"."SYSTEM_DICT_TYPE" DROP IDENTITY; UPDATE "f…

安达发|APS生产排产软件的作用有哪些?

生产排产管理软件作用有哪些&#xff1f;很多生产型企业在生产计划排产环节&#xff0c;基本还靠手工方式在Excel中进行。而且还因参与制定和使用表格的人较多&#xff0c;表格制作水平参差不齐&#xff0c;极易造成生产计划及后续环节管理混乱。此时&#xff0c;就需借助专业的…

CMS数据库搭建

前置条件&#xff1a;在虚拟机中安装phpstudy。 1.将cms的压缩包通过远程桌面放到虚拟机&#xff0c;将压缩包解压&#xff0c;将解压后的cms文件夹放到phpstudy安装目录下的www文件夹中&#xff0c;路径如下&#xff08;安装时的路径可能不同&#xff09;&#xff1a; C:\ph…

vue2.x项目从0到1(七)之用户权限

此章节偏理论知识 对于小一点的项目 比如说角色都是平级的 那我们直接像之前 vue2.x项目从0到1&#xff08;二&#xff09;之后台管理侧边栏&#xff08;动态渲染路由以及高亮&#xff09;_vue动态渲染侧边栏_关忆北_的博客-CSDN博客这样渲染就行了 但是一旦项目大了 …

从零开始学习 Java:简单易懂的入门指南之爬虫(十六)

爬虫 1.1 本地数据爬取1.2 网络数据爬取1.3 爬取数据练习1.4 按要求爬取1.5 贪婪爬取和非贪婪爬取1.6 String的split方法中使用正则表达式1.7 String类的replaceAll方法中使用正则表达式1.8 正则表达式-分组括号( )1.9 分组练习1.10 忽略大小写的写法1.11 非捕获分组1.12 正则表…

用Cmake build OpenCV后,在VS中查看OpenCV源码的方法(环境VS2022+openCV4.8.0) Part I

用Cmake build OpenCV后&#xff0c;在VS中查看OpenCV源码的方法 Part I 本文打算分成两部分写&#xff1a; 第一部分力求用最简单的办法帮助大家直接在VS中查看OpenCV的源码。这种方法最大的优点就是不容易出错&#xff0c;且操作简单。如果只是需要查看OpenCV源码的同学&…

“沙班”类药物商业潜力持续释放

“沙班”类药物商业潜力持续释放 2019年11月&#xff0c;四川科伦药业股份有限公司仿制药阿哌沙班片获得国家药监局注册批件&#xff0c;科伦药业成为该产品继豪森药业、正大天晴后&#xff0c;第三家通过阿哌沙班仿制药质量和疗效一致性评价的企业。 “沙班”类药物市场增速较…

Apache Flume架构和原理

Apache Flume是一个开源的分布式、可靠的日志收集和聚合系统,旨在将大量的日志数据从不同的数据源(如应用程序、服务器、设备)收集到中心存储或数据湖中。Flume的架构设计允许用户在大规模数据流的情况下实现可靠的数据传输和处理。 Flume特性 Apache Flume是一个用于收集…

数据库

表 记录&#xff1a;行 字段&#xff08;属性&#xff09;: 列 以行列的形式就组成了表&#xff08;数据存储在表中&#xff09; 关系数据库的表由记录组成&#xff0c;记录由字段组成&#xff0c;字段由字符或数字组成。它可以供各种用户共享&#xff0c; 具有最小冗余度和较高…

(五)Docker 安装 redis镜像+启动redis容器(超详细)

输入&#xff1a;su root命令&#xff0c;切换到root 1、启动Docker 启动&#xff1a;sudo systemctl start docker 停止&#xff1a;systemctl stop docker 重启&#xff1a;systemctl restart docker 查看docker运行状态&#xff08;显示绿色代表正常启动&#xff09;&#x…

地道的英语单词句子大全,柯桥成人英语口语培训

1、硬座票 hard-seat   2、持续不断的中止工 prolonged suspension   3、水廊 corridor on water   4、主导权 the initiative   5、中国摄影家协会 Chinese Photographers Society   6、师姐 senior;   7、喧天 rend the air;   8、托盘天平 rocking level   …

【JS交互基础】几个特殊的对象 Global、Window、Arguments、this

一、Global对象 所有在全局作用域内定义的属性和方法&#xff0c;都是Global对象的属性。 Global对象不能直接使用&#xff0c;也不能用new运算符创建。 Global对象在JavaScript引擎被初始化时创建&#xff0c;并初始化其方法和属性。 浏览器把Global对象作为window对象的一…