Mybatis实现增删改查的两种方式-配置文件/注解

环境准备

1.数据库表tb_brand

-- 删除tb_brand表
drop table if exists tb_brand;
-- 创建tb_brand表
create table tb_brand(-- id  主键id int primary key auto_increment,-- 品牌名称brand_name varchar(20),-- 企业名称company_name varchar(20),-- 排序字段ordered int,-- 描述信息description varchar(100),-- 状态:0:禁用 1:启用status int
);-- 添加数据insert into tb_brand(brand_name,company_name,ordered,description,status)
values('三只松鼠','三只松鼠股份有限公司',5,'好吃不上火',0),('华为','华为技术有限公司',100,'华为致力于把数字世界带入每个人、每个家庭、每个组织,构建万物互联的智能世界',1),('小米','小米科技有限公司',50,'are you ok',1);select * from tb_brand;

2.实体类Brand

public class Brand {/*** id int primary key auto_increment,* brand_name varchar(20),* company_name varchar(20),* ordered int,* description varchar(100),* status int*///id  主键private Integer id;//品牌名称private String brand_name;//企业名称private String company_name;//排序字段private Integer ordered;//描述信息private String description;//状态:0:禁用 1:启用private Integer status;public Brand() {}public Brand(Integer id, String brand_name, String company_name, Integer ordered, String description, Integer status) {this.id = id;this.brand_name = brand_name;this.company_name = company_name;this.ordered = ordered;this.description = description;this.status = status;}/*** 获取* @return id*/public Integer getId() {return id;}/*** 设置* @param id*/public void setId(Integer id) {this.id = id;}/*** 获取* @return brand_name*/public String getBrand_name() {return brand_name;}/*** 设置* @param brand_name*/public void setBrand_name(String brand_name) {this.brand_name = brand_name;}/*** 获取* @return company_name*/public String getCompany_name() {return company_name;}/*** 设置* @param company_name*/public void setCompany_name(String company_name) {this.company_name = company_name;}/*** 获取* @return ordered*/public Integer getOrdered() {return ordered;}/*** 设置* @param ordered*/public void setOrdered(Integer ordered) {this.ordered = ordered;}/*** 获取* @return description*/public String getDescription() {return description;}/*** 设置* @param description*/public void setDescription(String description) {this.description = description;}/*** 获取* @return status*/public Integer getStatus() {return status;}/*** 设置* @param status*/public void setStatus(Integer status) {this.status = status;}public String toString() {return "Brand{id = " + id + ", brand_name = " + brand_name + ", company_name = " + company_name + ", ordered = " + ordered + ", description = " + description + ", status = " + status + "}";}
}

3.测试用例

在test/java目录下新建测试用例MybatisTest
在这里插入图片描述

4.安装MyBatisX插件

和安装maven helper插件一样,如果在plugins里搜不到,可以去官网进行下载自己idea对应的版本
MyBatisX官网
看清楚自己idea的版本再进行下载,否则不可用,下载完的压缩包记得解压再查找对应的jar包进行加载,但我下载解压完之后再去plugins里搜索就搜到了,如果下载完还搜不到的可以点击plugins页面右边的设置进行手动导入

在这里插入图片描述

安装这个插件之后从映射文件转到mapper接口就好找多了,点击xml文件页面左侧的小蓝鸟就会去到对应的mapper接口的方法,再点击mapper接口方法左侧的小红鸟就能去到相对应的sql映射语句,超级方便哒
在这里插入图片描述

配置文件完成增删改查

编写数据库

-- 删除tb_brand表
drop table if exists tb_brand;
-- 创建tb_brand表
create table tb_brand(-- id  主键id int primary key auto_increment,-- 品牌名称brand_name varchar(20),-- 企业名称company_name varchar(20),-- 排序字段ordered int,-- 描述信息description varchar(100),-- 状态:0:禁用 1:启用status int
);-- 添加数据insert into tb_brand(brand_name,company_name,ordered,description,status)
values('三只松鼠','三只松鼠股份有限公司',5,'好吃不上火',0),('华为','华为技术有限公司',100,'华为致力于把数字世界带入每个人、每个家庭、每个组织,构建万物互联的智能世界',1),('小米','小米科技有限公司',50,'are you ok',1);select * from tb_brand;

编写Brand类

package com.svt.pojo;public class Brand {/*** id int primary key auto_increment,* brand_name varchar(20),* company_name varchar(20),* ordered int,* description varchar(100),* status int*///id  主键private Integer id;//品牌名称private String brand_name;//企业名称private String company_name;//排序字段private Integer ordered;//描述信息private String description;//状态:0:禁用 1:启用private Integer status;public Brand() {}public Brand(Integer id, String brand_name, String company_name, Integer ordered, String description, Integer status) {this.id = id;this.brand_name = brand_name;this.company_name = company_name;this.ordered = ordered;this.description = description;this.status = status;}/*** 获取* @return id*/public Integer getId() {return id;}/*** 设置* @param id*/public void setId(Integer id) {this.id = id;}/*** 获取* @return brand_name*/public String getBrand_name() {return brand_name;}/*** 设置* @param brand_name*/public void setBrand_name(String brand_name) {this.brand_name = brand_name;}/*** 获取* @return company_name*/public String getCompany_name() {return company_name;}/*** 设置* @param company_name*/public void setCompany_name(String company_name) {this.company_name = company_name;}/*** 获取* @return ordered*/public Integer getOrdered() {return ordered;}/*** 设置* @param ordered*/public void setOrdered(Integer ordered) {this.ordered = ordered;}/*** 获取* @return description*/public String getDescription() {return description;}/*** 设置* @param description*/public void setDescription(String description) {this.description = description;}/*** 获取* @return status*/public Integer getStatus() {return status;}/*** 设置* @param status*/public void setStatus(Integer status) {this.status = status;}public String toString() {return "Brand{id = " + id + ", brand_name = " + brand_name + ", company_name = " + company_name + ", ordered = " + ordered + ", description = " + description + ", status = " + status + "}";}
}

查询

①查询所有数据

1.定义Mapper接口
public interface BrandMapper {/*** 查询所有*/List<Brand> selectAll();
}
2.配置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:命名空间-->
<mapper namespace="com.svt.mapper.BrandMapper">
<!--定义查询语句--><select id="selectAll" resultType="brand">select * from tb_brand;</select>
</mapper>
3.在test文件夹下编写测试用例
@Testpublic void testSelectAll() throws IOException {//1.获取SqlSessionFactory//1.加载mybatis核心配置文件,获取 SqlSessionFactory 对象String resource = "mybatis-config.xml";InputStream inputStream = Resources.getResourceAsStream(resource);SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);//2.获取 SqlSession 对象,用它执行 SQL 语句SqlSession sqlSession = sqlSessionFactory.openSession();//3.获取Mapper接口的代理对象BrandMapper brandMapper = sqlSession.getMapper(BrandMapper.class);//4.执行方法List<Brand> brands = brandMapper.selectAll();//写这一行到时候System.out.println(brands);//5.释放资源sqlSession.close();}
4.数据显示和数据库内一致则表示查询成功

在这里插入图片描述

解决:实体类属性名和数据库表列名不一致,不能自动封装数据
  • 起别名:对不一样的列名起别名,让别名和实体类的属性名一样
    • 缺点:每次查询都要定义一次别名
      • sql片段
        • 缺点:不灵活
  • resultMap:
    • 1.定义标签
    • 2.在标签中,使用resultMap属性替换resultType属性

这里以resultMap为详细讲解
比如你数据库内列名是brand_name,写实体类的时候写成了brandName,又不想更改,那么就可以用下面这种方式用resultMap映射

        <!--id:唯一标识result:映射的类型,支持别名--><resultMap id="brandResultMap" type="brand"><!--id:完成主键字段的映射column:表的列名property:实体类的属性名result:完成一般字段的映射column:表的列名property:实体类的属性名--><result column="brand_name" property="brandName"/><result column="company_name" property="companyName"/><!--前面写数据库内名称 后面写自定义类中名称 如果两者名字不一样自动封装不了可以用--></resultMap><select id="selectAll" resultMap="brandResultMap">select * from tb_brand;</select>

②查看详情

1.定义Mapper接口
public interface UserMapper {List<User> selectAll();User selectById(int id);
}
2.配置xml
  • 参数占位符

    • 1.#{}:会将其替换为?,为了防止sql注入
    • 2.${}:会将其替换为1,拼sql,会存在sql注入的问题
    • 3.使用时机
      • 参数传递的时候:#{}
      • 表名或者列名不固定的情况下:${} 会存在sql注入的问题
  • 参数类型:parameterType设置参数类型:可以省略

    • 特殊字符处理:
      • 1.转义字符:比如<就写&lt;
      • 2.CDATA区:CD+回车 <![CDATA[ 内容 ]]>
	<select id="selectById" resultType="brand">select *from tb_brandwhere id=#{id};</select>
3.在test文件夹下编写测试用例
@Testpublic void testSelectById() throws IOException {//接收参数int id=1;//1.获取SqlSessionFactory//1.加载mybatis核心配置文件,获取 SqlSessionFactory 对象String resource = "mybatis-config.xml";InputStream inputStream = Resources.getResourceAsStream(resource);SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);//2.获取 SqlSession 对象,用它执行 SQL 语句SqlSession sqlSession = sqlSessionFactory.openSession();//3.获取Mapper接口的代理对象BrandMapper brandMapper = sqlSession.getMapper(BrandMapper.class);//4.执行方法Brand brand = brandMapper.selectById(id);System.out.println(brand);//5.释放资源sqlSession.close();}
4.数据显示和数据库内一致则表示查询成功

在这里插入图片描述

③多条件查询

散装参数:如果方法中有多个参数,需要使用@Param(“SQL参数占位符名称”)
1.定义Mapper接口
List<Brand> selectByCondition(@Param("status") int status,@Param("company_name") String company_name,@Param("brand_name") String brand_name);
}
2.配置xml
<!--条件查询--><select id="selectByCondition" resultType="brand">select * from tb_brandwhere status = #{status}and company_name like #{company_name}and brand_name like #{brand_name};</select>
3.在test文件夹下编写测试用例
@Testpublic void testSelectByCondition() throws IOException {//接收参数int status=1;String company_name="华为";String brand_name="华为";//处理参数company_name="%"+company_name+"%";brand_name="%"+brand_name+"%";//1.获取SqlSessionFactory//1.加载mybatis核心配置文件,获取 SqlSessionFactory 对象String resource = "mybatis-config.xml";InputStream inputStream = Resources.getResourceAsStream(resource);SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);//2.获取 SqlSession 对象,用它执行 SQL 语句SqlSession sqlSession = sqlSessionFactory.openSession();//3.获取Mapper接口的代理对象BrandMapper brandMapper = sqlSession.getMapper(BrandMapper.class);//4.执行方法List<Brand> brands = brandMapper.selectByCondition(status, company_name, brand_name);System.out.println(brands);//5.释放资源sqlSession.close();}
4.数据符合条件查询则表示查询成功

在这里插入图片描述

对象参数:对象的属性名称要和参数占位符名称一致
1.定义Mapper接口
List<Brand> selectByCondition(Brand brand);
2.配置xml

不需要更改,沿用散装参数的即可

3.在test文件夹下编写测试用例

添加一个封装对象

@Testpublic void testSelectByCondition() throws IOException {//接收参数int status=1;String company_name="华为";String brand_name="华为";//处理参数company_name="%"+company_name+"%";brand_name="%"+brand_name+"%";//封装对象Brand brand = new Brand();brand.setStatus(status);brand.setCompany_name(company_name);brand.setBrand_name(brand_name);//1.获取SqlSessionFactory//1.加载mybatis核心配置文件,获取 SqlSessionFactory 对象String resource = "mybatis-config.xml";InputStream inputStream = Resources.getResourceAsStream(resource);SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);//2.获取 SqlSession 对象,用它执行 SQL 语句SqlSession sqlSession = sqlSessionFactory.openSession();//3.获取Mapper接口的代理对象BrandMapper brandMapper = sqlSession.getMapper(BrandMapper.class);//4.执行方法List<Brand> brands = brandMapper.selectByCondition(brand);System.out.println(brands);//5.释放资源sqlSession.close();}
4.数据符合条件查询则表示查询成功

在这里插入图片描述

map集合参数
1.定义Mapper接口
List<Brand> selectByCondition(Map map);
2.配置xml

不需要更改,沿用散装参数的即可

3.在test文件夹下编写测试用例

将封装对象改为Map集合存放

@Testpublic void testSelectByCondition() throws IOException {//接收参数int status=1;String company_name="华为";String brand_name="华为";//处理参数company_name="%"+company_name+"%";brand_name="%"+brand_name+"%";Map map=new HashMap();map.put("status",status);map.put("company_name",company_name);map.put("brand_name",brand_name);//1.获取SqlSessionFactory//1.加载mybatis核心配置文件,获取 SqlSessionFactory 对象String resource = "mybatis-config.xml";InputStream inputStream = Resources.getResourceAsStream(resource);SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);//2.获取 SqlSession 对象,用它执行 SQL 语句SqlSession sqlSession = sqlSessionFactory.openSession();//3.获取Mapper接口的代理对象BrandMapper brandMapper = sqlSession.getMapper(BrandMapper.class);//4.执行方法List<Brand> brands = brandMapper.selectByCondition(map);System.out.println(brands);//5.释放资源sqlSession.close();}
4.数据符合条件查询则表示查询成功

在这里插入图片描述

④多条件动态查询

SQL语句会随着用户的输入或外部条件的变化而变化,我们称为动态SQL
用户输入查询的条件不一样,我们的sql语句也不一样,这时候我们修改一下xml文件内的sql语句即可

<!--动态条件查询--><select id="selectByCondition" resultType="brand">select * from tb_brandwhere<if test="status != null">status = #{status}</if><if test="company_name != null and company_name != '' ">and company_name like #{company_name}</if><if test="brand_name != null and brand_name != '' ">and brand_name like #{brand_name};</if></select>

修改过后再来注释掉一个查询条件进行尝试,成功则代表语句正确,失败了再逐字逐码查看一下
在这里插入图片描述
但是这样写会有一个问题,如果第一个条件不存在,直接查找第二个条件,第二个条件内有and开头,会造成语法错误,然后查询就会出错,我们可以用以下几种方式再继续完善上面的代码

1.恒等式:在where后面加一个恒等式,再在if判断内所有语句前加上and,这样就能执行成功,比如where 1=1 and…,语法就不会出错
<select id="selectByCondition" resultType="brand">select * from tb_brandwhere 1=1<if test="status != null">and status = #{status}</if><if test="company_name != null and company_name != '' ">and company_name like #{company_name}</if><if test="brand_name != null and brand_name != '' ">and brand_name like #{brand_name};</if></select>

这时候仅查询公司名称也不会出错啦
在这里插入图片描述

2.标签替换where关键字

mybatis自带的标签也能解决这个问题

<select id="selectByCondition" resultType="brand">select * from tb_brand/*where 1=1*/<where><if test="status != null">and status = #{status}</if><if test="company_name != null and company_name != '' ">and company_name like #{company_name}</if><if test="brand_name != null and brand_name != '' ">and brand_name like #{brand_name};</if></where></select>

呈现结果如下图
在这里插入图片描述

⑤单条件的动态查询

从多个条件中选择一个条件进行查询
就是一个下拉框,在里面有多个选项,用户只能选择一个进行查询

1.定义Mapper接口
List<Brand> selectByConditionSingle(Brand brand);
2.配置xml文件

如果写的时候choose会报错记得别写/* */这样的注释方式,要写<!-- -->这样的,会被当成sql语句一起进行编译的

  • sql语句一
    <!--单条件动态查询--><select id="selectByConditionSingle" resultType="brand">select * from tb_brandwhere<!-- 相当于switch --><choose><when test="status != null"><!-- 相当于case的查询条件-->status = #{status}</when><when test="company_name != null and company_name != ''"><!--相当于case的查询条件 -->company_name like #{company_name}</when><when test="brand_name != null and brand_name != '' "><!--相当于case的查询条件 -->brand_name like #{brand_name};</when><otherwise>1=1</otherwise></choose></select>
  • sql语句二
<select id="selectByConditionSingle" resultType="brand">select * from tb_brand<where><!-- 相当于switch--><choose><when test="status != null"><!-- 相当于case的查询条件-->status = #{status}</when><when test="company_name != null and company_name != ''"><!--相当于case的查询条件 -->company_name like #{company_name}</when><when test="brand_name != null and brand_name != '' "><!--相当于case的查询条件 -->brand_name like #{brand_name};</when></choose></where></select>
3.在test文件夹下编写测试用例
    @Testpublic void testSelectByConditionSingle() throws IOException {//接收参数int status=1;String company_name="华为";String brand_name="华为";//处理参数company_name="%"+company_name+"%";brand_name="%"+brand_name+"%";//封装对象Brand brand = new Brand();brand.setStatus(status);brand.setCompany_name(company_name);brand.setBrand_name(brand_name);//1.获取SqlSessionFactory//1.加载mybatis核心配置文件,获取 SqlSessionFactory 对象String resource = "mybatis-config.xml";InputStream inputStream = Resources.getResourceAsStream(resource);SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);//2.获取 SqlSession 对象,用它执行 SQL 语句SqlSession sqlSession = sqlSessionFactory.openSession();//3.获取Mapper接口的代理对象BrandMapper brandMapper = sqlSession.getMapper(BrandMapper.class);//4.执行方法List<Brand> brands = brandMapper.selectByConditionSingle(brand);System.out.println(brands);//5.释放资源sqlSession.close();}

添加

①添加数据

1.定义Mapper接口
    /*** 添加*/void add(Brand brand);
2.配置xml文件
    <!--添加--><insert id="add">insert into tb_brand (brand_name,company_name,ordered,description,status)values (#{brand_name},#{company_name},#{ordered},#{description},#{status});</insert>
3.在test文件夹下编写测试用例

这里要注意,jdbc的事务提交默认是false,所以说是需要我们自己手动提交事务的,有两种选择,一是默认开启事务,二是在最后手动提交事务,如果不这样做的话idea显示运行成功但是数据库里是没有数据的,因为没有提交事务,数据回滚了
在这里插入图片描述

    @Testpublic void testAdd() throws IOException {//接收参数int status=1;String company_name="菠萝手机";String brand_name="菠萝";String description="手机中的战斗机";int ordered=100;//封装对象Brand brand = new Brand();brand.setStatus(status);brand.setCompany_name(company_name);brand.setBrand_name(brand_name);brand.setDescription(description);brand.setOrdered(ordered);//1.获取SqlSessionFactory//1.加载mybatis核心配置文件,获取 SqlSessionFactory 对象String resource = "mybatis-config.xml";InputStream inputStream = Resources.getResourceAsStream(resource);SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);//2.获取 SqlSession 对象,用它执行 SQL 语句SqlSession sqlSession = sqlSessionFactory.openSession();//3.获取Mapper接口的代理对象BrandMapper brandMapper = sqlSession.getMapper(BrandMapper.class);//4.执行方法brandMapper.add(brand);//提交事务sqlSession.commit();//5.释放资源sqlSession.close();}

在这里插入图片描述

②主键返回

在数据添加成功后,需要获取插入数据库数据的主键的值
只有两个属性需要添加,useGeneratedKeys和keyProperty,添加上两个属性就能获得添加的主键了

1.配置xml文件
    <insert id="add" useGeneratedKeys="true" keyProperty="id">insert into tb_brand (brand_name,company_name,ordered,description,status)values (#{brand_name},#{company_name},#{ordered},#{description},#{status});</insert>
2.在test文件夹下编写测试用例
    @Testpublic void testAdd() throws IOException {//接收参数int status=1;String company_name="菠萝手机";String brand_name="菠萝";String description="手机中的战斗机";int ordered=100;//封装对象Brand brand = new Brand();brand.setStatus(status);brand.setCompany_name(company_name);brand.setBrand_name(brand_name);brand.setDescription(description);brand.setOrdered(ordered);//1.获取SqlSessionFactory//1.加载mybatis核心配置文件,获取 SqlSessionFactory 对象String resource = "mybatis-config.xml";InputStream inputStream = Resources.getResourceAsStream(resource);SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);//2.获取 SqlSession 对象,用它执行 SQL 语句SqlSession sqlSession = sqlSessionFactory.openSession();//3.获取Mapper接口的代理对象BrandMapper brandMapper = sqlSession.getMapper(BrandMapper.class);//4.执行方法brandMapper.add(brand);Integer id = brand.getId();System.out.println(id);//提交事务sqlSession.commit();//5.释放资源sqlSession.close();}

在这里插入图片描述

修改

①修改全部字段

1.定义Mapper接口
    /*** 修改*/int update(Brand brand);
2.配置xml文件
    <!--修改--><update id="update">update tb_brandsetbrand_name=#{brand_name},company_name=#{company_name},ordered=#{ordered},description=#{description},status=#{status}where id=#{id};</update>
3.在test文件夹下编写测试用例
    @Testpublic void testUpdate() throws IOException {//接收参数int status=1;String company_name="菠萝手机";String brand_name="菠萝";String description="菠萝手机,手机中的战斗机";int ordered=200;int id=5;//封装对象Brand brand = new Brand();brand.setStatus(status);brand.setCompany_name(company_name);brand.setBrand_name(brand_name);brand.setDescription(description);brand.setOrdered(ordered);brand.setId(id);//1.获取SqlSessionFactory//1.加载mybatis核心配置文件,获取 SqlSessionFactory 对象String resource = "mybatis-config.xml";InputStream inputStream = Resources.getResourceAsStream(resource);SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);//2.获取 SqlSession 对象,用它执行 SQL 语句SqlSession sqlSession = sqlSessionFactory.openSession();//3.获取Mapper接口的代理对象BrandMapper brandMapper = sqlSession.getMapper(BrandMapper.class);//4.执行方法int count = brandMapper.update(brand);System.out.println(count);//影响的行数//提交事务sqlSession.commit();//5.释放资源sqlSession.close();}

影响了一行数据
在这里插入图片描述

②修改动态字段

1.配置xml文件
    <update id="update">update tb_brand<set><if test="brand_name != null and brand_name != ''">brand_name=#{brand_name},</if><if test="company_name != null and company_name != ''">company_name=#{company_name},</if><if test="ordered != null">ordered=#{ordered},</if><if test="description != null and description != ''">description=#{description},</if><if test="status != null">status=#{status}</if></set>where id=#{id};</update>
2.在test文件夹下编写测试用例
@Testpublic void testUpdate() throws IOException {//接收参数int status=0;String company_name="菠萝手机";String brand_name="菠萝";String description="菠萝手机,手机中的战斗机";int ordered=200;int id=5;//封装对象Brand brand = new Brand();brand.setStatus(status);
//        brand.setCompany_name(company_name);
//        brand.setBrand_name(brand_name);
//        brand.setDescription(description);
//        brand.setOrdered(ordered);brand.setId(id);//1.获取SqlSessionFactory//1.加载mybatis核心配置文件,获取 SqlSessionFactory 对象String resource = "mybatis-config.xml";InputStream inputStream = Resources.getResourceAsStream(resource);SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);//2.获取 SqlSession 对象,用它执行 SQL 语句SqlSession sqlSession = sqlSessionFactory.openSession();//3.获取Mapper接口的代理对象BrandMapper brandMapper = sqlSession.getMapper(BrandMapper.class);//4.执行方法int count = brandMapper.update(brand);System.out.println(count);//影响的行数//提交事务sqlSession.commit();//5.释放资源sqlSession.close();}

在这里插入图片描述
在这里插入图片描述
可以看到数据库内的数据确实是只改变了status,说明我们的修改动态字段编写成功

删除

删除一个

删除一行数据

1.定义Mapper接口
    /*** 根据id删除*/void deleteById(int id);
2.配置xml文件
    <!--根据id修改--><delete id="deleteById">delete from tb_brand where id = #{id};</delete>
3.在test文件夹下编写测试用例
    @Testpublic void testDeleteById() throws IOException {//接收参数int id=6;//1.获取SqlSessionFactory//1.加载mybatis核心配置文件,获取 SqlSessionFactory 对象String resource = "mybatis-config.xml";InputStream inputStream = Resources.getResourceAsStream(resource);SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);//2.获取 SqlSession 对象,用它执行 SQL 语句SqlSession sqlSession = sqlSessionFactory.openSession();//3.获取Mapper接口的代理对象BrandMapper brandMapper = sqlSession.getMapper(BrandMapper.class);//4.执行方法brandMapper.deleteById(id);//提交事务sqlSession.commit();//5.释放资源sqlSession.close();}

在这里插入图片描述
在这里插入图片描述
运行成功,id为6的数据已经被删除

批量删除

1.定义Mapper接口
    /*** 根据id批量删除*/void deleteByIds(@Param("ids") int[] ids);
2.配置xml文件

mybatis会将数组参数,封装为一个Map集合,默认名是array,但我们可以使用@Param注解改变map集合的默认key的名称,这里我就用了注解

	<!--根据id批量删除--><!--mybatis会将数组参数,封装为一个Map集合默认:array=数组使用@Param注解改变map集合的默认key的名称separator:分隔符--><delete id="deleteByIds">delete from tb_brand where idin<foreach collection="ids" item="id" separator="," open="(" close=")">#{id}</foreach>;</delete>

如果不用注解,就要在collection集合名内写array

3.在test文件夹下编写测试用例
    @Testpublic void testDeleteByIds() throws IOException {//接收参数int[] ids={5,8,9};//1.获取SqlSessionFactory//1.加载mybatis核心配置文件,获取 SqlSessionFactory 对象String resource = "mybatis-config.xml";InputStream inputStream = Resources.getResourceAsStream(resource);SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);//2.获取 SqlSession 对象,用它执行 SQL 语句SqlSession sqlSession = sqlSessionFactory.openSession();//3.获取Mapper接口的代理对象BrandMapper brandMapper = sqlSession.getMapper(BrandMapper.class);//4.执行方法brandMapper.deleteByIds(ids);//提交事务sqlSession.commit();//5.释放资源sqlSession.close();}

在这里插入图片描述
在这里插入图片描述
成功删除了5,8,9号数据

注解完成增删改查

使用注解开发会比配置文件开发更加方便
注解完成简单功能
配置文件完成复杂功能

查询@Select

1.定义Mapper接口
public interface UserMapper {List<User> selectAll();@Select("select * from tb_user where id=#{id}")User selectById(int id);
}
2.在test文件夹下编写测试用例
    @Testpublic void testSelectById() throws IOException {//1.获取SqlSessionFactory//1.加载mybatis核心配置文件,获取 SqlSessionFactory 对象String resource = "mybatis-config.xml";InputStream inputStream = Resources.getResourceAsStream(resource);SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);//2.获取 SqlSession 对象,用它执行 SQL 语句SqlSession sqlSession = sqlSessionFactory.openSession();//3.获取Mapper接口的代理对象UserMapper userMapper = sqlSession.getMapper(UserMapper.class);//4.执行方法User user = userMapper.selectById(1);System.out.println(user);//5.释放资源sqlSession.close();}

在这里插入图片描述
在这里插入图片描述
查询出来的数据与数据库内数据1号一致,查询成功

添加@Insert

1.定义Mapper接口
@Insert("insert into tb_user (username,password,gender,addr) values (#{username},#{password},#{gender},#{addr});")void add(User user);
2.在test文件夹下编写测试用例
@Testpublic void testAdd1() throws IOException {//接收参数String username="赵六";String password="666";String gender="男";String addr="江苏";//封装对象User user = new User();user.setUsername(username);user.setPassword(password);user.setGender(gender);user.setAddr(addr);//1.获取SqlSessionFactory//1.加载mybatis核心配置文件,获取 SqlSessionFactory 对象String resource = "mybatis-config.xml";InputStream inputStream = Resources.getResourceAsStream(resource);SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);//2.获取 SqlSession 对象,用它执行 SQL 语句SqlSession sqlSession = sqlSessionFactory.openSession();//3.获取Mapper接口的代理对象UserMapper userMapper = sqlSession.getMapper(UserMapper.class);//4.执行方法userMapper.add(user);//提交事务sqlSession.commit();//5.释放资源sqlSession.close();}

修改@Update

1.定义Mapper接口
@Update("update tb_user " +"set username=#{username},password=#{password},gender=#{gender},addr=#{addr}" +" where id=#{id}")int update(User user);
2.在test文件夹下编写测试用例
    @Testpublic void testUpdate1() throws IOException {//接收参数String username="赵六";String password="6666";String gender="男";String addr="江苏";Integer id=4;//封装对象User user = new User();user.setUsername(username);user.setPassword(password);user.setGender(gender);user.setAddr(addr);user.setId(id);//1.获取SqlSessionFactory//1.加载mybatis核心配置文件,获取 SqlSessionFactory 对象String resource = "mybatis-config.xml";InputStream inputStream = Resources.getResourceAsStream(resource);SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);//2.获取 SqlSession 对象,用它执行 SQL 语句SqlSession sqlSession = sqlSessionFactory.openSession();//3.获取Mapper接口的代理对象UserMapper userMapper = sqlSession.getMapper(UserMapper.class);//4.执行方法int count = userMapper.update(user);System.out.println(count);//影响的行数//提交事务sqlSession.commit();//5.释放资源sqlSession.close();}

在这里插入图片描述
在这里插入图片描述
赵六的密码已从666变为了6666,修改成功

删除@Delete

1.定义Mapper接口
    @Delete("delete from tb_user where id = #{id}")void deleteById(int id);
2.在test文件夹下编写测试用例
@Testpublic void testDelete() throws IOException {//接收参数int id=4;//1.获取SqlSessionFactory//1.加载mybatis核心配置文件,获取 SqlSessionFactory 对象String resource = "mybatis-config.xml";InputStream inputStream = Resources.getResourceAsStream(resource);SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);//2.获取 SqlSession 对象,用它执行 SQL 语句SqlSession sqlSession = sqlSessionFactory.openSession();//3.获取Mapper接口的代理对象UserMapper userMapper = sqlSession.getMapper(UserMapper.class);//4.执行方法userMapper.deleteById(id);//提交事务sqlSession.commit();//5.释放资源sqlSession.close();}

在这里插入图片描述
在这里插入图片描述
已成功删除id为4的数据

以上就是注解开发的简单增删改查

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

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

相关文章

【SpringCloud Alibaba笔记】(2)Sentinel实现熔断与限流

Sentinel 概述 官网&#xff1a;https://github.com/alibaba/Sentinel 中文文档&#xff1a;https://sentinelguard.io/zh-cn/docs/introduction.html 类似Hystrix&#xff0c;以流量为切入点&#xff0c;从流量路由、流量控制、流量整形、熔断降级、系统自适应过载保护、热…

spdlog源码学习

前言 spdlog是一个跨平台c 的开源日志库 &#xff0c;可以head only 使用&#xff0c;包含部分modern c 语法&#xff0c; 更是兼容了c20 format&#xff0c;支持异步和格式化输出&#xff0c;通俗易懂&#xff0c;适合阅读。 源码下载 here 用法 直接贴上了 example.cpp …

四种方式实现[选择性注入SpringBoot接口的多实现类]

最近在项目中遇到两种情况&#xff0c;准备写个博客记录一下。 情况说明&#xff1a;Service层一个接口是否可以存在多个具体实现&#xff0c;此时应该如何调用Service&#xff08;的具体实现&#xff09;&#xff1f; 其实之前的项目中也遇到过这种情况&#xff0c;只不过我采…

嵌入式培训机构四个月实训课程笔记(完整版)-Linux系统编程第二天-Linux开发板外设开发(物联技术666)

更多配套资料CSDN地址:点赞+关注,功德无量。更多配套资料,欢迎私信。 物联技术666_嵌入式C语言开发,嵌入式硬件,嵌入式培训笔记-CSDN博客物联技术666擅长嵌入式C语言开发,嵌入式硬件,嵌入式培训笔记,等方面的知识,物联技术666关注机器学习,arm开发,物联网,嵌入式硬件,单片机…

操作系统课程设计——文件管理系统(C语言版)

操作系统系列文章 http://t.csdnimg.cn/7XAnU 文章目录 实验一、进程的创建与撤销&#xff1a;http://t.csdnimg.cn/po4V0 实验二、银行家算法&#xff1a;http://t.csdnimg.cn/O5zoF 目录 操作系统系列文章 文章目录 文件管理 一、目的 二、设计内容 三、 设计要求 …

Excel·VBA按指定顺序排序函数

与之前写过的《ExcelVBA数组冒泡排序函数》不同&#xff0c;不是按照数值大小的升序/降序对数组进行排序&#xff0c;而是按照指定数组的顺序&#xff0c;对另一个数组进行排序 以下代码调用了《ExcelVBA数组冒泡排序函数》bubble_sort_arr函数&#xff08;如需使用代码需复制…

如何在群晖7.2中运行WPS Office镜像容器并使用固定地址公网访问

文章目录 1. 拉取WPS Office镜像2. 运行WPS Office镜像容器3. 本地访问WPS Office4. 群晖安装Cpolar5. 配置WPS Office远程地址6. 远程访问WPS Office小结 7. 固定公网地址 wps-office是一个在Linux服务器上部署WPS Office的镜像。它基于WPS Office的Linux版本&#xff0c;通过…

LaTeX矩阵

在 LaTeX 中输入矩阵以及矩阵中增加公式。 LATEX 中 array 环境可以定义二维数组&#xff0c;具体需要定义列数&#xff0c;并用 \\ 换行&#xff0c;数组可作为一个公式块&#xff0c;在外套用 \left、\right 等定界符。 \mathbf{X} \left(\begin{array}{cccc}x_{11} &…

【AI】什么是大模型的偏见

目录 一、什么是大模型的偏见 二、偏见的危害 三、普通人可以做的一些偏见测试用例 1. 性别偏见测试&#xff1a; 2. 种族和民族偏见测试&#xff1a; 3. 职业偏见测试&#xff1a; 4. 年龄偏见测试&#xff1a; 5. 社会经济地位偏见测试&#xff1a; 6. 身体能力偏见…

Leetcode 3002. Maximum Size of a Set After Removals

Leetcode 3002. Maximum Size of a Set After Removals 1. 解题思路2. 代码实现3. 算法优化 题目链接&#xff1a;10037. Maximum Size of a Set After Removals 1. 解题思路 这一题的话我的思路就是分别以两个数组作为主数组&#xff0c;然后从中选择 n / 2 n/2 n/2个元素&…

接口限流方案

1.1 为什么要进行限流&#xff1f; 1.瞬时流量过高&#xff0c;服务被压垮&#xff1f; 2.恶意用户高频光顾&#xff0c;导致服务器宕机&#xff1f; 3.消息消费过快&#xff0c;导致数据库压力过大&#xff0c;性能下降甚至崩溃&#xff1f; 1.2 什么是限流 限流是对某一…

Zuul相关问题及到案(2024)

1、什么是Zuul&#xff1f;它在微服务架构中有什么作用&#xff1f; Zuul是Netflix开源的一种提供API网关服务的应用程序&#xff0c;它在微服务架构中扮演着流量的前门角色。主要功能包括以下几点&#xff1a; 路由转发&#xff1a;Zuul网关将外部请求转发到具体的微服务实例…

【Python常用函数】一文让你彻底掌握Python中的numpy.append函数

大数据时代的到来,使得很多工作都需要进行数据挖掘,从而发现更多有利的规律,或规避风险,或发现商业价值。而大数据分析的基础是学好编程语言。本文和你一起来探索Python中的append函数,让你以最短的时间明白这个函数的原理。也可以利用碎片化的时间巩固这个函数,让你在处…

高效管理文件方法:每4个文件前面加序号,4个文件后面又单独编号技巧

在日常工作中&#xff0c;文件管理是一项常见的任务。要更高效地管理文件&#xff0c;可以通过在每个文件前面加序号&#xff0c;并在每个序号对应的文件后面进行单独编号的方法来实现。这种方法有助于快速找到所需文件&#xff0c;也能提高工作效率。下面一起来看下云炫文件管…

2024出海潮,生态伙伴搭上华为HMS的“便车”?

作者 | 曾响铃 文 | 响铃说 回顾2023年&#xff0c;中国新能源车市场在加速内卷的同时&#xff0c;还诞生了一个 “超级物种”&#xff0c;那就是华为将车BU分拆。未来&#xff0c;华为智能汽车解决方案未来不仅会独立运营&#xff0c;还吸纳了庞大的盟友阵营&#xff0c;包括…

linux后台运行进程分类查看操作命令

例如需要查看所有运行的python程序进程&#xff1a; 执行的命令如下&#xff1a; ps -ef | grep python 解释&#xff1a; 在 UNIX 或类 UNIX 系统&#xff08;如 Linux&#xff09;中的作用是查找所有正在运行的与 Python 相关的进程。这个命令结合了两个常用的命令行工具…

R语言【base】——tempfile():返回一个字符串向量,这些字符串可以用作临时文件的名称

Package base version 4.2.0 Parameters tempfile(pattern "file", tmpdir tempdir(), fileext "") tempdir(check FALSE) 参数【pattern】&#xff1a;一个非空字符向量&#xff0c;给出名称的初始部分。 参数【tmpdir】&#xff1a;提供目录名称的…

修复HTTP动词篡改导致的认证旁路问题的方法

本文于2016年4月完成&#xff0c;发布在个人博客网站上。 诡异的问题 分析AppScan扫描报告的时候&#xff0c;发现报告里提示“HTTP动词篡改导致的认证旁路”&#xff0c;一个名字很长&#xff0c;很怪异的问题。咨询度娘没有获取到必要的信息&#xff0c;于是只好按照AppScan…

物理机与vm文件共享与传输的设置方法

今天跟各位小伙伴&#xff0c;分享一下物理机与vm虚拟机文件共享与传输的设置方法&#xff0c;以供大家参考&#xff01; 一、物理机与虚拟机文件共享设置方法 第一步&#xff1a;先关闭虚拟机&#xff08;客户机&#xff09; 第二步&#xff1a;选择编辑虚拟机设置 第三步&am…

Nacos和Eureka的全面对比

学习目标&#xff1a; 了解Nacos和Eureka的基本概念和特点。理解Nacos和Eureka在服务注册与发现、配置管理、服务路由、负载均衡等方面的区别。掌握Nacos和Eureka的部署和使用方法。比较Nacos和Eureka在性能、可靠性、扩展性等方面的优劣。理解Nacos和Eureka在微服务架构中的应…