JavaWeb-Mysql 3-5 Mybatis案例3 添加&修改、删除功能

1、添加

在这里插入图片描述
在这里插入图片描述
如上图是我们平时在添加数据时展示的页面,而我们在该页面输入想要的数据后添加 提交 按钮,就会将这些数据添加到数
据库中。接下来我们就来实现添加数据的操作。

1.1 编写接口方法

在这里插入图片描述
参数:除了id之外的所有的数据。id对应的是表中主键值,而主键我们是 自动增长 生成的。

1.2 编写SQL语句

    <insert id="add">
        insert  into tb_brand (brand_name,company_name,ordered,description,status)
        values (#{brandName},#{companyName},#{ordered},#{description},#{status});
    </insert>

在这里插入图片描述

1.3 编写测试方法并执行

@Test
    public void add() throws Exception {

        // 0.传参数
        int status = 1;
        String companyName = "波波手机";
        String brandName = "波波";
        String description = "手机中的战斗机";
        int ordered = 100;


        // 封装brand对象
        Brand brand = new Brand();
        brand.setStatus(status);
        brand.setCompanyName(companyName);
        brand.setDescription(description);
        brand.setBrandName(brandName);
        brand.setOrdered(ordered);
        //1、加载mybatis的核心配置文件,获取SqlSessionFactory
        String resource = "mybatis-config.xml";//相对路径,基于resources
        InputStream inputStream = Resources.getResourceAsStream(resource);
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

        //2.有了工厂对象,就要获取SqlSession对象,执行SQL语句。
        SqlSession sqlSession = sqlSessionFactory.openSession();
         //SqlSession sqlSession = sqlSessionFactory.openSession(true); //设置自动提交事务,这种情况不需要手动提交事务了


        //3.执行sql获取UserMapper接口的代理对象
        BrandMapper brandMapper = sqlSession.getMapper(BrandMapper.class);

        // 添加数据
        brandMapper.add(brand);

        // 提交事务
        sqlSession.commit();


        //5.释放资源
        sqlSession.close();
    }

注意:记得最后提交事务。sqlSession.commit();
执行结果如下:
在这里插入图片描述

2、添加-主键返回

在数据添加成功后,有时候需要获取插入数据库数据的主键(主键是自增长)。
比如:添加订单和订单项,如下图就是京东上的订单
在这里插入图片描述
订单数据存储在订单表中,订单项存储在订单项表中。

  • 添加订单数据
    在这里插入图片描述
    明白了什么时候 主键返回 。接下来我们简单模拟一下,在添加完数据后打印id属性值,能打印出来说明已经获取到了。
    我们将上面添加品牌数据的案例中映射配置文件里 statement 进行修改,如下
    在这里插入图片描述

insert 标签上添加如下属性:
**useGeneratedKeys:**是够获取自动增长的主键值。true表示获取
keyProperty :指定将获取到的主键值封装到哪儿个属性

比如上面我们把 主键 封装到PoJo类的属性 id中去。就可以通过Java语句获取属性id
在这里插入图片描述

3、修改数据

在这里插入图片描述
如图所示是修改页面,用户在该页面书写需要修改的数据,点击 提交 按钮,就会将数据库中对应的数据进行修改。注意一
点,如果哪儿个输入框没有输入内容,我们是将表中数据对应字段值替换为空白还是保留字段之前的值?答案肯定是保留之
前的数据。这就要用到SQL中的if语句来判断输入的内容是否为空

3.1 编写接口方法

BrandMapper 接口中定义修改方法。

/**
 * 修改
 */
void update(Brand brand);

上述方法参数 Brand 就是封装了需要修改的数据,而id肯定是有数据的,这也是和添加方法的区别。

3.2 编写SQL语句

BrandMapper.xml 映射配置文件中编写修改数据的 statement

 <update id="update">
        update tb_brand
        <set>
            <if test = "brandName != null and brandName !=''">
                brand_name = #{brandName},
            </if>
            <if test="companyName!=null and companyName !=''">
                companyName = #{companyName},
            </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>

set 标签可以用于动态包含需要更新的列,忽略其它不更新的列。

3.3 编写测试方法

在 test/java 下的 com.itheima.mapper 包下的 MybatisTest类中 定义测试方法

    @Test
    public void update() throws Exception {

        // 0.传参数
        int status = 0;
        String companyName = "波波手机";
        String brandName = "波波";
        String description = "手机中的战斗机";
        int ordered = 200;


        // 封装brand对象
        Brand brand = new Brand();
        brand.setStatus(status);
//        brand.setCompanyName(companyName);
//        brand.setDescription(description);
//        brand.setBrandName(brandName);
        brand.setOrdered(ordered);
        brand.setId(7); //修改主键为7的数据
        //1、加载mybatis的核心配置文件,获取SqlSessionFactory
        String resource = "mybatis-config.xml";//相对路径,基于resources
        InputStream inputStream = Resources.getResourceAsStream(resource);
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

        //2.有了工厂对象,就要获取SqlSession对象,执行SQL语句。
        SqlSession sqlSession = sqlSessionFactory.openSession();


        //3.执行sql获取UserMapper接口的代理对象
        BrandMapper brandMapper = sqlSession.getMapper(BrandMapper.class);

        // 修改数据
        brandMapper.update(brand);

        // 提交事务
        sqlSession.commit();

        //5.释放资源
        sqlSession.close();
    }

执行测试方法结果如下:
在这里插入图片描述
从结果中SQL语句可以看出,修改了 status 和ordered 字段值,因为我们给的数据中只给Brand实体对象的 status 和ordered属性设置值了。这就是== set== 标签的作用。

4、删除一行数据

在这里插入图片描述
如上图所示,每行数据后面都有一个 删除 按钮,当用户点击了该按钮,就会将改行数据删除掉。那我们就需要思考,这种
删除是根据什么进行删除呢?是通过主键id删除,因为id是表中数据的唯一标识

4.1 编写接口方法

在这里插入图片描述

4.1 编写测试方法

    @Test
    public void deleteByid() throws Exception {

        // 0.传参数
        int id =7;

        //1、加载mybatis的核心配置文件,获取SqlSessionFactory
        String resource = "mybatis-config.xml";//相对路径,基于resources
        InputStream inputStream = Resources.getResourceAsStream(resource);
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

        //2.有了工厂对象,就要获取SqlSession对象,执行SQL语句。
        SqlSession sqlSession = sqlSessionFactory.openSession();


        //3.执行sql获取UserMapper接口的代理对象
        BrandMapper brandMapper = sqlSession.getMapper(BrandMapper.class);

        // 修改数据
        brandMapper.deleteById(id);

        // 提交事务
        sqlSession.commit();

        //5.释放资源
        sqlSession.close();
    }

运行过程只要没报错,直接到数据库查询数据是否还存在。

5、批量删除数据

在这里插入图片描述
如上图所示,用户可以选择多条数据,然后点击上面的 删除 按钮,就会删除数据库中对应的多行数据

5.1 编写接口方法

在 BrandMapper 接口中定义删除多行数据的方法

    // 批量删除
    void deleteByIds( int[] ids);

参数是一个数组,数组中存储的是多条数据的id

5.2 编写sql语句

在 BrandMapper.xml 映射配置文件中编写删除多条数据的 statement
编写SQL时需要遍历数组来拼接SQL语句。Mybatis 提供了 foreach 标签供我们使用

foreach 标签
用来迭代任何可迭代的对象(如数组,集合)。
collection 属性:
mybatis会将数组参数,封装为一个Map集合。
默认:array = 数组
使用@Param注解改变map集合的默认key的名称
item 属性:本次迭代获取到的元素。
separator 属性:集合项迭代之间的分隔符。 foreach 标签不会错误地添加多余的分隔符。也就是最后一次迭代不会加
分隔符。
open 属性:该属性值是在拼接SQL语句之前拼接的语句,只会拼接一次
close 属性:该属性值是在拼接SQL语句拼接后拼接的语句,只会拼接一次

<delete id="deleteByIds">
 delete from tb_brand where id
 in
  <foreach collection="array" item="id" separator="," open="(" close=")">
   #{id}
  </foreach>
 ;
</delete>

假如数组中的id数据是{1,2,3},那么拼接后的sql语句就是:
delete from tb_brand where id in (1,2,3);

我们如果不想使用array
在这里插入图片描述
我们可以使用注解

在接口方法中使用param
在这里插入图片描述
并修改xml映射文件中的名字
在这里插入图片描述
注解的作用就是将map中默认的键 array修改成你想要的。这里我们修改成ids,那么对应的sql映射文件的值也要修改成ids

5.3 编写测试方法

    // 批量删除数据
    @Test
    public void deleteByids() throws Exception {

        // 0.传参数
        int[] ids ={3,6};

        //1、加载mybatis的核心配置文件,获取SqlSessionFactory
        String resource = "mybatis-config.xml";//相对路径,基于resources
        InputStream inputStream = Resources.getResourceAsStream(resource);
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

        //2.有了工厂对象,就要获取SqlSession对象,执行SQL语句。
        SqlSession sqlSession = sqlSessionFactory.openSession();


        //3.执行sql获取UserMapper接口的代理对象
        BrandMapper brandMapper = sqlSession.getMapper(BrandMapper.class);

        // 批量删除数据
        brandMapper.deleteByIds(ids);

        // 提交事务
        sqlSession.commit();

        //5.释放资源
        sqlSession.close();
    }

结果:id 为3和6的数据没了。
在这里插入图片描述

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值