《JavaWeb篇》04.Mybatis看这一篇就够了(三)

简介: 《JavaWeb篇》04.Mybatis看这一篇就够了(三)

1.7 修改


image.png

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


接下来我们就具体来实现


1.7.1 编写接口方法

在 BrandMapper 接口中定义修改方法。


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

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


1.7.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 != ''">
            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 标签可以用于动态包含需要更新的列,忽略其它不更新的列。


1.7.3 编写测试方法

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

@Test
public void testUpdate() throws IOException {
    //接收参数
    int status = 0;
    String companyName = "波导手机";
    String brandName = "波导";
    String description = "波导手机,手机中的战斗机";
    int ordered = 200;
    int id = 6;
    //封装对象
    Brand brand = new Brand();
    brand.setStatus(status);
    //        brand.setCompanyName(companyName);
    //        brand.setBrandName(brandName);
    //        brand.setDescription(description);
    //        brand.setOrdered(ordered);
    brand.setId(id);
    //1. 获取SqlSessionFactory
    String resource = "mybatis-config.xml";
    InputStream inputStream = Resources.getResourceAsStream(resource);
    SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
    //2. 获取SqlSession对象
    SqlSession sqlSession = sqlSessionFactory.openSession();
    //SqlSession sqlSession = sqlSessionFactory.openSession(true);
    //3. 获取Mapper接口的代理对象
    BrandMapper brandMapper = sqlSession.getMapper(BrandMapper.class);
    //4. 执行方法
    int count = brandMapper.update(brand);
    System.out.println(count);
    //提交事务
    sqlSession.commit();
    //5. 释放资源
    sqlSession.close();
}

执行测试方法结果如下:


image.png


从结果中SQL语句可以看出,只修改了 status 字段值,因为我们给的数据中只给Brand实体对象的 status 属性设置值了。这就是 set 标签的作用。


1.8 删除一行数据


image.png

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


接下来就来实现该功能。

/**
  * 根据id删除
  */
void deleteById(int id);

1.8.1 编写接口方法

在 BrandMapper 接口中定义根据id删除方法。


1.8.2 编写SQL语句

在 BrandMapper.xml 映射配置文件中编写删除一行数据的 statement


delete from tb_brand where id = #{id};

1.8.3 编写测试方法

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


@Test
public void testDeleteById() throws IOException {
    //接收参数
    int id = 6;
    //1. 获取SqlSessionFactory
    String resource = "mybatis-config.xml";
    InputStream inputStream = Resources.getResourceAsStream(resource);
    SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
    //2. 获取SqlSession对象
    SqlSession sqlSession = sqlSessionFactory.openSession();
    //SqlSession sqlSession = sqlSessionFactory.openSession(true);
    //3. 获取Mapper接口的代理对象
    BrandMapper brandMapper = sqlSession.getMapper(BrandMapper.class);
    //4. 执行方法
    brandMapper.deleteById(id);
    //提交事务
    sqlSession.commit();
    //5. 释放资源
    sqlSession.close();
}

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


1.9 批量删除


image.png

如上图所示,用户可以选择多条数据,然后点击上面的 删除 按钮,就会删除数据库中对应的多行数据。


1.9.1 编写接口方法

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

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

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


1.9.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 from tb_brand where id
    in
        #{id}
    ;

假如数组中的id数据是{1,2,3},那么拼接后的sql语句就是:

delete from tb_brand where id in (1,2,3);

1.9.3 编写测试方法

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


@Test
public void testDeleteByIds() throws IOException {
    //接收参数
    int[] ids = {5,7,8};
    //1. 获取SqlSessionFactory
    String resource = "mybatis-config.xml";
    InputStream inputStream = Resources.getResourceAsStream(resource);
    SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
    //2. 获取SqlSession对象
    SqlSession sqlSession = sqlSessionFactory.openSession();
    //SqlSession sqlSession = sqlSessionFactory.openSession(true);
    //3. 获取Mapper接口的代理对象
    BrandMapper brandMapper = sqlSession.getMapper(BrandMapper.class);
    //4. 执行方法
    brandMapper.deleteByIds(ids);
    //提交事务
    sqlSession.commit();
    //5. 释放资源
    sqlSession.close();
}


1.10 Mybatis参数传递

Mybatis 接口方法中可以接收各种各样的参数,如下:


多个参数

单个参数:单个参数又可以是如下类型

POJO 类型

Map 集合类型

Collection 集合类型

List 集合类型

Array 类型

其他类型

1.10.1 多个参数

如下面的代码,就是接收两个参数,而接收多个参数需要使用 @Param 注解,那么为什么要加该注解呢?这个问题要弄明白就必须来研究Mybatis 底层对于这些参数是如何处理的。


User select(@Param("username") String username,@Param("password") String password);
  select *    from tb_user    where       username=#{username}      and password=#{password}

我们在接口方法中定义多个参数,Mybatis 会将这些参数封装成 Map 集合对象,值就是参数值,而键在没有使用 @Param 注解时有以下命名规则:


以 arg 开头 :第一个参数就叫 arg0,第二个参数就叫 arg1,以此类推。如:


map.put(“arg0”,参数值1);


map.put(“arg1”,参数值2);


以 param 开头 : 第一个参数就叫 param1,第二个参数就叫 param2,依次类推。如:


map.put(“param1”,参数值1);


map.put(“param2”,参数值2);


代码验证:


在 UserMapper 接口中定义如下方法


User select(String username,String password);

在 UserMapper.xml 映射配置文件中定义SQL


select *    from tb_user    where       username=#{arg0}      and password=#{arg1}

或者


select *    from tb_user    where       username=#{param1}      and password=#{param2}

运行代码结果如下


image.png


在映射配合文件的SQL语句中使用用 arg 开头的和 param 书写,代码的可读性会变的特别差,此时可以使用 @Param 注解。


在接口方法参数上使用 @Param 注解,Mybatis 会将 arg 开头的键名替换为对应注解的属性值。


代码验证:


在 UserMapper 接口中定义如下方法,在 username 参数前加上 @Param 注解


User select(@Param("username") String username, String password);


Mybatis 在封装 Map 集合时,键名就会变成如下:
map.put(“username”,参数值1);
map.put(“arg1”,参数值2);
map.put(“param1”,参数值1);
map.put(“param2”,参数值2);
在 UserMapper.xml 映射配置文件中定义SQL
  select *    from tb_user    where       username=#{username}      and password=#{param2}

运行程序结果没有报错。而如果将 #{} 中的 username 还是写成 arg0


select *    from tb_user    where       username=#{arg0}      and password=#{param2}

运行程序则可以看到错误


image.png


结论:以后接口参数是多个时,在每个参数上都使用 @Param 注解。这样代码的可读性更高。


1.10.2 单个参数

POJO 类型


直接使用。要求 属性名 和 参数占位符名称 一致


Map 集合类型


直接使用。要求 map集合的键名 和 参数占位符名称 一致


Collection 集合类型


Mybatis 会将集合封装到 map 集合中,如下:


map.put(“arg0”,collection集合);


map.put(“collection”,collection集合;


可以使用 @Param 注解替换map集合中默认的 arg 键名。


List 集合类型


Mybatis 会将集合封装到 map 集合中,如下:


map.put(“arg0”,list集合);


map.put(“collection”,list集合);


map.put(“list”,list集合);


可以使用 @Param 注解替换map集合中默认的 arg 键名。


Array 类型


Mybatis 会将集合封装到 map 集合中,如下:


map.put(“arg0”,数组);


map.put(“array”,数组);


可以使用 @Param 注解替换map集合中默认的 arg 键名。


其他类型


比如int类型,参数占位符名称 叫什么都可以。尽量做到见名知意


2,注解实现CRUD

使用注解开发会比配置文件开发更加方便。如下就是使用注解进行开发

@Select(value = "select * from tb_user where id = #{id}")
public User select(int id);

注意:


注解是用来替换映射配置文件方式配置的,所以使用了注解,就不需要再映射配置文件中书写对应的 statement

Mybatis 针对 CURD 操作都提供了对应的注解,已经做到见名知意。如下:


查询 :@Select

添加 :@Insert

修改 :@Update

删除 :@Delete

接下来我们做一个案例来使用 Mybatis 的注解开发


代码实现:


将之前案例中 UserMapper.xml 中的 根据id查询数据 的 statement 注释掉


image.png


在 UserMapper 接口的 selectById 方法上添加注解


image.png


运行测试程序也能正常查询到数据


我们课程上只演示这一个查询的注解开发,其他的同学们下来可以自己实现,都是比较简单。


==注意:==在官方文档中 入门 中有这样的一段话:


image.png


所以,注解完成简单功能,配置文件完成复杂功能。


而我们之前写的动态 SQL 就是复杂的功能,如果用注解使用的话,就需要使用到 Mybatis 提供的SQL构建器来完成,而对应的代码如下:


image.png

相关文章
|
10天前
|
XML Java 数据库连接
Javaweb之Mybatis的XML配置文件的详细解析
Javaweb之Mybatis的XML配置文件的详细解析
13 0
|
10天前
|
SQL Java 数据库连接
Javaweb之Mybatis的基础操作之查询操作的详细解析
Javaweb之Mybatis的基础操作之查询操作的详细解析
20 0
|
10天前
|
SQL Java 数据库连接
Javaweb之Mybatis的基础操作之新增和更新操作的详细解析
Javaweb之Mybatis的基础操作之新增和更新操作的详细解析
10 0
|
10天前
|
SQL 安全 Java
Javaweb之Mybatis的基础操作之删除的详细解析
Javaweb之Mybatis的基础操作之删除的详细解析
7 0
|
10天前
|
Java 关系型数据库 MySQL
Javaweb之Mybatis的基础操作的详细解析
Javaweb之Mybatis的基础操作的详细解析
11 0
|
4月前
|
存储 前端开发 Java
JavaWeb:servlet+jsp+mybatis商品管理增删改查
商品管理通常包括增加(添加)、删除、修改和查询商品信息
57 1
JavaWeb:servlet+jsp+mybatis商品管理增删改查
|
4月前
|
SQL Java 数据库连接
javaweb实训第六天下午——Mybatis基础(3)
6.4.2.方式二: 1.通过mysql函数获取到刚插入记录的自增主键:LAST_INSERT_ID(),但是是在insert之后调用此函数。
53 0
|
4月前
|
SQL Java 数据库连接
|
4月前
|
SQL Java 数据库连接
javaweb实训第六天下午——Mybatis基础(1)
1.课程介绍 为什么需要Mybatis; (了解) 初识Mybatis; (了解) Mybatis入门; (掌握) Mybatis工具类; (掌握) Mapper映射器; (掌握) Mybatis使用细节; (掌握) SSM框架: Spring +springmvc + mybatis[配置]—笔记 dao层代码一个变化:讲道理:重点
63 0
|
6月前
|
SQL Java 数据库连接
Java:MyBatis讲解
MyBatis是一个开源的Java持久化框架,它提供了一个简化数据库访问的方法。MyBatis的主要目标是减少编写SQL代码的工作量,并提供了将数据库操作与Java对象的映射功能。
37 1
Java:MyBatis讲解