首页 > 其他分享 >Mybatis学习笔记(四)——mapper常见标签

Mybatis学习笔记(四)——mapper常见标签

时间:2022-09-04 23:35:50浏览次数:56  
标签:语句 mapper name url 标签 参数 Mybatis 主键

1.select标签

1.1 简介

在 MyBatis 中,select 标签是最常用也是功能最强大的 SQL 语言,用于执行查询操作。
select 示例语句如下。

<select id="selectAllWebsite" resultType="net.biancheng.po.Website" parameterType="string">
    SELECT id,NAME,url FROM website WHERE NAME LIKE CONCAT ('%',#{name},'%')
</select>

以上是一个 id 为 selectAllWebsite 的映射语句,参数类型为 string,返回结果类型为 Website。
执行 SQL 语句时可以定义参数,参数可以是一个简单的参数类型,例如 int、float、String;也可以是一个复杂的参数类型,例如 JavaBean、Map 等。MyBatis 提供了强大的映射规则,执行 SQL 后,MyBatis 会将结果集自动映射到 JavaBean 中。

为了使数据库的查询结果和返回值类型中的属性能够自动匹配,通常会对 MySQL 数据库和 JavaBean 采用同一套命名规则,即 Java 命名驼峰规则,这样就不需要再做映射了(数据库表字段名和属性名不一致时需要手动映射)。

参数的传递使用#{参数名},相当于告诉 MyBatis 生成 PreparedStatement 参数。对于 JDBC,该参数会被标识为“?”。以上 SQL 语句可以使用 JDBC 实现,实现代码如下。

String sql = "SELECT id,NAME,url FROM website WHERE NAME LIKE CONCAT ('%',?,'%')";
PreparedStatement ps = conn.prepareStatement(sql);
ps.setString(1,userName);

1.2 select标签常用属性

下面介绍 select 标签中常用的属性。

 

 

 1.3 传递多个参数

现在需要根据 id 和 name 来模糊查询网站信息,显然这涉及到了两个参数。给映射器传递多个参数分为以下三种方法。

  1. 使用Map传递参数
  2. 使用注解传递参数
  3. 使用JavaBean传递参数

下面分别讲解这 3 种方法的具体实现。

1.3.1 使用Map传递参数

使用 MyBatis 提供的 Map 接口作为参数实现,如下所示。

<!-- 根据name和url模糊查询网站信息 -->
<select id="selectWebsiteByMap" resultType="net.biancheng.po.Website" parameterType="map">
    SELECT id,NAME,url FROM website
    WHERE name LIKE CONCAT ('%',#{name},'%')
    AND url LIKE CONCAT ('%',#{url},'%')
</select>

在 WebsiteMapper 接口中,方法如下。

public List<Website> selectWebsiteByMap(Map<String, String> params);

测试代码如下。

Map<String,String> paramsMap = new HashMap<String,String>();
paramsMap.put("name","编程");
paramsMap.put("url","biancheng");
websiteMapper.selectWebsiteByMap(paramsMap);

使用 Map 传递参数虽然简单易用,但是由于这样设置参数需要键值对应,业务关联性不强,开发人员需要深入到程序中看代码,造成可读性下降。

1.3.2 使用注解传递参数

使用 MyBatis 的注解 @Param() 传递参数,如下所示。

<!-- 根据name和url模糊查询网站信息 -->
<select id="selectWebsiteByAn" resultType="net.biancheng.po.Website">
    SELECT id,NAME,url FROM website
    WHERE name LIKE CONCAT ('%',#{name},'%')
    AND url LIKE CONCAT ('%',#{url},'%')
</select>

WebsiteMapper 接口中方法如下。

public List<Website> selectWebsiteByAn(@Param("name") String name, @Param("url") String url);

当我们把参数传递给后台时,MyBatis 通过 @Param 提供的名称就会知道 #{name} 代表 name 参数,提高了参数可读性。但是如果这条 SQL 拥有 10 个参数的查询,就会造成可读性下降,增强了代码复杂性。

1.3.3 使用JavaBean传递参数

 在参数过多的情况下,MyBatis 允许组织一个 JavaBean,通过简单的 setter 和 getter 方法设置参数,提高可读性。如下所示。
<!-- 根据name和url模糊查询网站信息 -->
<select id="selectWebsiteByAn" resultType="net.biancheng.po.Website">
    SELECT id,NAME,url FROM website
    WHERE name LIKE CONCAT ('%',#{name},'%')
    AND url LIKE CONCAT ('%',#{url},'%')
</select>

WebsiteMapper 接口中方法如下。

public List<Website> selectWebsiteByAn(Website website);

这就是通过 JavaBean 传递多个参数的方式。

1.4 区别

以上 3 种方式的区别如下。

  • 使用 Map 传递参数会导致业务可读性的丧失,继而导致后续扩展和维护的困难,所以在实际应用中我们应该果断废弃该方式。
  • 使用 @Param 注解传递参数会受到参数个数的影响。当 n≤5 时,它是最佳的传参方式,因为它更加直观;当 n>5 时,多个参数将给调用带来困难。
  • 当参数个数大于 5 个时,建议使用 JavaBean 方式。

2.insert标签

2.1 简介

MyBatis insert 标签用来定义插入语句,执行插入操作。当 MyBatis 执行完一条插入语句后,就会返回其影响数据库的行数。
下面通过一个示例演示 insert 标签的具体用法。
1. 修改 WebsiteMapper.xml,增加插入语句,代码如下。

<!-- 增加网站信息 -->
<insert id="addWebsite" parameterType="string">
    insert into website(name)
    values(#{name})
</insert>

2. 在 WebsiteMapper 接口中定义一个 add() 方法,代码如下。

public int addWebsite(String name);

参数为 Sting 类型的字符串;返回值为 int 类型,即执行 SQL 后,插入记录的行数。
3. 测试代码如下。

//插入 name 为编程帮4 的记录
String name = "编程帮4";
int i = websiteMapper.addWebsite(name);
System.out.println("共插入了 " + i + " 条记录")

4. 执行测试代码,控制台输出如下。

共插入了 1 条记录

2.2 insert 标签常用属性

 

注意:insert 标签中没有 resultType 属性,只有查询操作才需要对返回结果类型进行相应的指定。

2.3 传递多个参数(同上)

在上面的示例中,我们在插入语句中只使用了一个 String 类型的参数,而在实际的开发过程中,我们的插入语句往往需要使用多个参数,Mybatis 为我们提供以下 3 种方式,来实现给映射器传递多个参数:

  • 使用 Map 传递参数
  • 使用注解传递参数
  • 使用 JavaBean 传递参数

2.4 主键(自动递增)回填

 我们知道,MySQL、SQL Server 等数据库表可以采用自动递增的字段作为其主键,当向这样的数据库表插入数据时,即使不指定自增主键的值,数据库也会根据自增规则自动生成主键并插入到表中。
一些特殊情况下,我们可能需要将这个刚刚生成的主键回填到请求对象(原本不包含主键信息的请求对象)中,供其他业务使用。此时,我们就可以通过在 insert 标签中添加  keyProperty 和 useGeneratedKeys 属性,来实现该功能。
下面我们通过一个示例,来演示主键(自动递增)回填功能。
1. 为 WebsiteMapper.xml 中 id 为 addWebsite 的 insert 标签添加 keyProperty 和 useGeneratedKeys 属性,具体代码如下:

注:useGeneratedKeys 设置为true表示允许回传自增主键,keyProperty 表示回传到bean的哪个属性上。

<!--添加一个网站信息,成功后将主键值返回填给id(po的属性)-->
<insert id="addWebsite" parameterType="net.biancheng.po.Website" keyProperty="id" useGeneratedKeys="true">
    insert into Website (name,url) values(#{name},#{url})
</insert>

2. 测试代码如下:

// 添加一个网站信息
Website addsite = new Website();
//插入的对象中不包含主键 id 
addsite.setName("编程帮");
addsite.setUrl("https://www.biancheng.net/");
//执行插入
int num = websiteMapper.addWebsite(addsite);
System.out.println("添加了 " + num + " 条记录");
//获取回填的主键
System.out.println("添加记录的主键是:" + addsite.getId());

3. 执行测试代码,控制台输出如下。

添加了 1 条记录
添加记录的主键是:3

2.5 自定义主键

如果在实际项目中,若数据库不支持主键自动递增(例如 Oracle),或者取消了主键自动递增的规则,我们可以使用 MyBatis 的 <selectKey> 标签自定义生成主键,具体配置代码如下。

<!-- 添加一个网站,#{name}为 net.biancheng.po.Website 的属性值 -->
<insert id="insertWebsite" parameterType="net.biancheng.po.Website">
    <!-- 先使用selectKey标签定义主键,然后再定义SQL语句 -->
    <selectKey keyProperty="id" resultType="Integer" order="BEFORE">
        select if(max(id) is null,1,max(id)+1) as newId from Website
    </selectKey>
    insert into Website (id,name,url) values(#{id},#{name},#{url})
</insert>

<selectKey> 标签中属性说明如下:

  • keyProperty:用于指定主键值对应的 PO 类的属性。
  • order:该属性取值可以为 BEFORE 或 AFTER。BEFORE 表示先执行 <selectKey> 标签内的语句,再执行插入语句;AFTER 表示先执行插入语句再执行 <selectKey> 标签内的语句。

3.update标签 

3.1 简介

MyBatis update 标签用于定义更新语句,执行更新操作。当 MyBatis 执行完一条更新语句后,会返回一个整数,表示受影响的数据库记录的行数。
下面我们通过一个示例演示 update 标签的用法。
1. 在 WebsiteMapper.xml 中添加以下更新语句,代码如下。

<!--update 标签-->
<update id="updateWebsite" parameterType="string">
    update website set name = #{name}
</update>

2. 在 WebsiteMapper 接口中增加一个 updateWebsite() 方法,代码如下。

int updateWebsite(String name);

参数为 String 类型的字符串;返回值为 int 类型,表示执行 sql 语句后受影响的记录的行数。
3. 测试代码如下。

int i = websiteMapper.updateWebsite("C语言中文网");
System.out.println("共更新了 " + i + " 条记录");

4.执行测试代码,控制台输出如下。

共更新了 9 条记录

3.2 update常用属性

注意:update 标签中没有 resultType 属性,只有查询操作才需要对返回结果类型进行相应的指定。 

3.3 传递多个参数

在上面的示例中,我们在更新语句中只使用了一个 String 类型的参数,而在实际的开发过程中,大多数时候,我们的更新语句都需要使用多个参数,Mybatis 为我们提供以下 3 种方式,来实现给映射器传递多个参数:

  • 使用 Map 传递参数
  • 使用注解传递参数
  • 使用 JavaBean 传递参数

4. delete标签

内容大差不差

 

标签:语句,mapper,name,url,标签,参数,Mybatis,主键
From: https://www.cnblogs.com/worthmove/p/16656516.html

相关文章

  • mybatis 一对多 出现 Expected one result (or null) to be returned by selectOne()
    报错信息展示报错时的mapper.xml修改后的mapper.xml踩坑原因分析resultmap在映射的时候是会把多张表中相同的字段名当成同一个对象来看待比如上文中的c.id和u.id......
  • MyBatis的注解实现复杂映射开发
    xml配置方式实现复杂映射回顾​实现复杂映射我们之前可以在映射文件中通过配置来实现,使用注解开发后,我们可以通过@Results注解,@Result注解,@One注解和@Many注解组......
  • MyBatis 五 ---查看详情&&条件查询
    查看详情1、编写接口方法:Mapper接口参数:id返回结果:Brand   2、编写SQL语句:SQL映射文件;参数占位......
  • Mybatis学习笔记(三)——Mybatis执行sql的两种方式
    这部分内容前边简单提过了,之前写第一个Mybatis示例时用的就是第一种方式。本节主要介绍MyBatis执行SQL语句的两种方式和它们的区别。MyBatis有两种执行SQL语句的方......
  • mybatis之MetaObject
    MetaObject元数据对象,底层肯定是反射,通过反射来进行设置值。这个可以来操作对象中的属性,哪怕是组合方式,无论有多少层,这个都可以来进行操作。举例如下所示:publicclass......
  • Mybatis学习笔记(二)——Mybatis核心对象
    1.Mybatis核心对象MyBatis有三个基本要素:核心接口和类MyBatis核心配置文件(mybatis-config.xml)SQL映射文件(mapper.xml)1.1核心接口和类每个MyBatis应用程序都以......
  • Mybatis学习笔记(一)——简介
     1.Mybatis是什么MyBatis是一个开源、轻量级的数据持久化框架,是JDBC和Hibernate的替代方案。MyBatis内部封装了JDBC,简化了加载驱动、创建连接、创建statement......
  • MyBatis 三
    设置别名    安装MyBatisx插件可以很方便的管理 ......
  • MyBatis 二
    Mapper代理:1、可以简化后期执行SQL2、解决原生方式中的硬编码  开发步骤:1、定义与SQL映射文件同名的Mapper接口,并且将Mapper接口与Sql映射文件放置在......
  • Mybatis Plus公共字段自动填充
    MybatisPlus公共字段自动填充,也就是在插入或者更新的时候为指定字段赋予指定的值,使用它的好处就是可以统一对这些字段进行处理,避免了重复代码。 实现步骤:1、在实体类......