第四章 映射文件基础标签

时间:2021-6-4 作者:qvyue

target

掌握 select 标签的使用
掌握 insert 标签的使用
掌握 update 标签的使用
掌握 delete 标签的使用
掌握 sql 标签的使用

1.

在 SQL 映射文件中 元素用于映射 SQL 的 select 语句,其示例代码如下:



  select * from user where uid = #{uid}

在上述示例代码中,id 的值是唯一标识符,它接收一个 Integer 类型的参数,返回一个 User 类型的对象,结果集自动映射到 User 属性。

元素除了有上述示例代码中的几个属性以外,还有一些常用的属性,如表所示。

属性名称 描 述
id 它和 Mapper 的命名空间组合起来使用,是唯一标识符,供 MyBatis 调用
parameterType 表示传入 SQL 语句的参数类型的全限定名或别名。它是一个可选属性,MyBatis 能推断出具体传入语句的参数
resultType SQL 语句执行后返回的类型(全限定名或者别名)。如果是集合类型,返回的是集合元素的类型,返回时可以使用 resultType 或 resultMap 之一
resultMap 它是映射集的引用,与 元素一起使用,返回时可以使用 resultType 或 resultMap 之一
flushCache 用于设置在调用 SQL 语句后是否要求 MyBatis 清空之前查询的本地缓存和二级缓存,默认值为 false,如果设置为 true,则任何时候只要 SQL 语句被调用都将清空本地缓存和二级缓存
useCache 启动二级缓存的开关,默认值为 true,表示将査询结果存入二级缓存中
timeout 用于设置超时参数,单位是秒(s),超时将抛出异常
fetchSize 获取记录的总条数设定
statementType 告诉 MyBatis 使用哪个 JDBC 的 Statement 工作,取值为 STATEMENT(Statement)、 PREPARED(PreparedStatement)、CALLABLE(CallableStatement)
resultSetType 这是针对 JDBC 的 ResultSet 接口而言,其值可设置为 FORWARD_ONLY(只允许向前访问)、SCROLL_SENSITIVE(双向滚动,但不及时更新)、SCROLLJNSENSITIVE(双向滚动,及时更新)

2.

元素用于映射插入语句,MyBatis 执行完一条插入语句后将返回一个整数表示其影响的行数。它的属性与 元素的属性大部分相同,在本节讲解它的几个特有属性。

  • keyProperty:该属性的作用是将插入或更新操作时的返回值赋给 PO 类的某个属性,通常会设置为主键对应的属性。如果是联合主键,可以将多个值用逗号隔开。
  • keyColumn:该属性用于设置第几列是主键,当主键列不是表中的第 1 列时需要设置。如果是联合主键,可以将多个值用逗号隔开。
  • useGeneratedKeys:该属性将使 MyBatis 使用 JDBC 的 getGeneratedKeys()方法获取由数据库内部产生的主键,例如 MySQL、SQL Server 等自动递增的字段,其默认值为 false。

1)主键(自动递增)回填

MySQL、SQL Server 等数据库的表格可以采用自动递增的字段作为主键,有时可能需要使用这个刚刚产生的主键,用于关联其他业务。

首先为 com.mybatis 包中的 SQL 映射文件 UserMapper.xml 中 id 为 addUser 的 元素添加 keyProperty 和 useGeneratedKeys 属性,具体代码如下:



    insert into user (uname,usex) values(#{uname},#{usex})

然后在 com.mybaits.test 包的 MybatisTest 类中进行调用,具体代码如下:

@Test
public void testAdd() {
  UserMapper userMapper = session.getMapper(UserMapper.class);
  User user = new User(null,"李四","男");
  // 添加一个用户
  int add = userMapper.addUser(user );
  System.out.println("添加了" + add + "条数据!");
  System.out.println("添加记录的主键是" + user.getUid());
  // 提交事务
  session.commit();
}

useGeneratedKeys设置为true,当添加成功时,会把自增的主键值带回来赋值给keyProperty的uid,所以程序可以获取到uid的值。

2)自定义主键

如果在实际工程中使用的数据库不支持主键自动递增(例如 Oracle),或者取消了主键自动递增的规则,可以使用 MyBatis 的 元素来自定义生成主键。

  • keyProperty 属性指定了新生主键值返回给 PO 类(com.po.User)的哪个属性。

  • order 属性可以设置为 BEFORE 或 AFTER。

    • BEFORE 表示先执行 元素然后执行插入语句。
    • AFTER 表示先执行插入语句再执行 元素。

① 方法一:



     select if(max(uid) is null,1,max(uid)+1) as newUid from user
    
    insert into user (uid,uname,usex) values(#{uid},#{uname},#{usex})

在执行上述示例代码时, 元素首先被执行,该元素通过自定义的语句设置数据表的主键,然后执行插入语句。

② 方法二:

使用Oracle的序列:user_seq.nextval


     select user_seq.nextval from dual
    
    insert into user (uid,uname,usex) values(#{uid},#{uname},#{usex})

在执行上述示例代码时, 元素首先被执行,该元素通过自定义的语句设置数据表的主键,然后执行插入语句。

③ 方法三:(不推荐)

使用Oracle的序列:user_seq.currval


     select user_seq.currval from dual
    
    insert into user (uid,uname,usex) values(user_seq.nextval,#{uname},#{usex})

在执行上述示例代码时,先执行插入语句, 元素随后被执行。

3. 与元素

元素比较简单,它们的属性和 元素、 元素的属性差不多,执行后也返回一个整数,表示影响了数据库的记录行数。配置示例代码如下:



    update user set uname = #{uname},usex = #{usex} where uid = #{uid}

    delete from user where uid = #{uid}

4. 元素

元素的作用在于可以定义 SQL 语句的一部分(代码片段),以方便后面的 SQL 语句引用它,例如反复使用的列名。

在 MyBatis 中只需使用 元素编写一次便能在其他元素中引用它。配置示例代码如下:

id,uname,usex
    select  from user

在上述代码中使用 元素的 refid 属性引用了自定义的代码片段。

声明:本文内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:qvyue@qq.com 进行举报,并提供相关证据,工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。