Mybatis框架篇章十一

举报
兰舟千帆 发表于 2022/07/21 18:15:24 2022/07/21
【摘要】 添加数据并返回主键添加数据就是常规操作了。我们需要返回主键的用途举个例子就是当用户提交订单的时候,我们需要返回一个订单号。(订单号作为主键) void add(Brand brand);然后映射文件 <insert id="add" useGeneratedKeys="true" keyProperty="id"> insert into tb_brand (br...

添加数据并返回主键

添加数据就是常规操作了。我们需要返回主键的用途举个例子就是当用户提交订单的时候,我们需要返回一个订单号。(订单号作为主键)

     void add(Brand brand);

然后映射文件

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

==对于支持自动生成记录主键的数据库,如:MySQL,SQL Server,此时设置useGeneratedKeys参数值为true,在执行添加记录之后可以获取到数据库自动生成的主键ID==
测试代码

 public static void testAdd() throws IOException {
        int status = 1;
        String companyName = "波导手机";
        String brandName = "波导";
        String description = "手机中的战斗机";
        int orderd = 100;
        Brand brand = new Brand();
        brand.setStatus(status);
//        brand.setCompanyName(companyName);
//        brand.setDescription(description);
//        brand.setOrdered(orderd);
//        brand.setBrandName(brandName);
        String resource = "mybatis-config.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        SqlSession sqlSession = sqlSessionFactory.openSession();
//        SqlSession sqlSession1 = sqlSessionFactory.openSession(true);这样也可以设置为事务自动提交
        BrandMapper brandMapper = sqlSession.getMapper(BrandMapper.class);
        brandMapper.add(brand);
        Integer id = brand.getId();
        System.out.println(id);

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


    }

修改数据

之前我们主要是在查询方面做相关得操作。现在我们进行一个添加数据的操作。

先在接口中写一个方法

  //       完成一个修改的功能
       int update(Brand brand);

然后再映射文件中编写具体的sql语句

  <update id="update">
        update tb_brand
        <set>
            <if test="brandName != null and brandName != ''">
                brand_name = #{brandName},
            </if>
            <if test="companyName != null and companyName !=''">
                company_name = #{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标签
==当在 update 语句中使用if标签时,如果前面的if没有执行,则或导致逗号多余错误。使用set标签可以将动态的配置 SET 关键字,并剔除追加到条件末尾的任何不相关的逗号。使用 if+set 标签修改后,如果某项为 null 则不进行更新,而是保持数据库原值==

然后测试代码

   public static void testupdate() throws IOException {
        int status = 1;
        String companyName = "波导手机";
        String brandName = "波导";
        String description = "波导手机手机中的战斗机";
        int orderd = 200;
        int id = 5;
        Brand brand = new Brand();
        brand.setStatus(status);
        brand.setCompanyName(companyName);
        brand.setDescription(description);
        brand.setOrdered(orderd);
        brand.setBrandName(brandName);
        brand.setId(id);
        String resource = "mybatis-config.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        SqlSession sqlSession = sqlSessionFactory.openSession();
//        SqlSession sqlSession1 = sqlSessionFactory.openSession(true);这样也可以设置为事务自动提交
        BrandMapper brandMapper = sqlSession.getMapper(BrandMapper.class);
//        brandMapper.add(brand);
        int count = brandMapper.update(brand);
        //获取到影响的行数
//        Integer id = brand.getId();
//        System.out.println(id);

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

如果我们不手动设置事务提交的话,那么是添加不成功的,默认的话,mybatis会默认为手动提交方式,如果不手动提交,mybatis会回滚事务。

根据id删除数据

首先我们在接口中定义一个这样的方法

     void deleteById(int id);

然后在sql映射文件操作sql语句

<!--    根据id删除-->
    <delete id="deleteById">
        delete  from tb_brand where id = #{id};
    </delete>

然后在测试方法当中

public static void  testDeleteByID() throws IOException {

        int id = 7;
//        封装对象
        String resource = "mybatis-config.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);
        SqlSessionFactory build = new SqlSessionFactoryBuilder().build(inputStream);
        SqlSession sqlSession = build.openSession(true);
        BrandMapper mapper = sqlSession.getMapper(BrandMapper.class);
        mapper.deleteById(id);
        sqlSession.close();

    }

批量删除数据

如果我们要一次性删除多个,动态批量删除数据怎么做呢?

还是在接口中先定义这个方法

      void deleteByIds(@Param("ids") int[] ids);

我们传入一个id的数组

然后在映射文件当中的sql语句

<!--    批量删除-->
<!--    mybatis会将数组参数,封装为一个集合-->
<!--    默认:array=数组-->
<!--    可以使用Param注解来改变map集合当中的默认key的名称-->
<!--    separator代表指定分割符-->
    <delete id="deleteByIds">
       delete from tb_brand where id
        in
# open和close代表包围foreach的前后符号
           <foreach collection="ids" item="id" separator="," open="(" close=")">
                    #{id}
#             这个会根据集合中的id数动态生成多个id,id之间得1分割符为,</foreach>
            ;
    </delete>

然后在测试类

public static  void testDeleteByIds() throws IOException {
        //接收参数
        int[] ids = {5,7,8};//删除的集合
        String resources = "mybatis-config.xml";
        InputStream resourceAsStream = Resources.getResourceAsStream(resources);
        SqlSessionFactory build = new SqlSessionFactoryBuilder().build(resourceAsStream);
        SqlSession sqlSession = build.openSession();
        BrandMapper mapper = sqlSession.getMapper(BrandMapper.class);
        mapper.deleteByIds(ids);
        sqlSession.commit();
        sqlSession.close();
    }
【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。