栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

《Mybatis框架》第二章 Mapper映射文件

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

《Mybatis框架》第二章 Mapper映射文件

# 一、基础使用

0.XML模板






1.顶级元素

MyBatis 的真正强大在于它的语句映射,这是它的魔力所在。由于它的异常强大,映射器的 XML 文件就显得相对简单。

SQL 映射文件只有很少的几个顶级元素

  • cache – 该命名空间的缓存配置。
  • cache-ref – 引用其它命名空间的缓存配置。
  • resultMap – 描述如何从数据库结果集中加载对象,是最复杂也是最强大的元素。
  • sql – 可被其它语句引用的可重用语句块。
  • insert – 映射插入语句。
  • update – 映射更新语句。
  • delete – 映射删除语句。
  • select – 映射查询语句。
2.select

select 元素允许你配置很多属性来配置每条语句的行为细节。


属性描述
id唯一标识符
parameterType参数的类全限定名或别名
resultType结果的类全限定名或别名
resultMap对外部 resultMap 的命名引用
flushCache将其设置为 true 后,只要语句被调用,都会导致本地缓存和二级缓存被清空,默认值:false。
useCache将其设置为 true 后,将会导致本条语句的结果被二级缓存缓存起来,默认值:对 select 元素为 true。
timeout这个设置是在抛出异常之前,驱动程序等待数据库返回请求结果的秒数。默认值为未设置(unset)(依赖数据库驱动)。
fetchSize这是一个给驱动的建议值,尝试让驱动程序每次批量返回的结果行数等于这个设置值。 默认值为未设置(unset)(依赖驱动)。
statementType可选 STATEMENT,PREPARED 或 CALLABLE。这会让 MyBatis 分别使用 Statement,PreparedStatement 或 CallableStatement,默认值:PREPARED。
resultSetTypeFORWARD_ONLY,SCROLL_SENSITIVE, SCROLL_INSENSITIVE 或 DEFAULT(等价于 unset) 中的一个,默认值为 unset (依赖数据库驱动)。
databaseId如果配置了数据库厂商标识(databaseIdProvider),MyBatis 会加载所有不带 databaseId 或匹配当前 databaseId 的语句;如果带和不带的语句都有,则不带的会被忽略。
3.insert, update 和 delete 1.基础使用





属性描述
id唯一标识符。
parameterType参数的类全限定名或别名
flushCache将其设置为 true 后,只要语句被调用,都会导致本地缓存和二级缓存被清空,默认值:(对 insert、update 和 delete 语句)true。
timeout这个设置是在抛出异常之前,驱动程序等待数据库返回请求结果的秒数。默认值为未设置(unset)(依赖数据库驱动)。
statementType可选 STATEMENT,PREPARED 或 CALLABLE。这会让 MyBatis 分别使用 Statement,PreparedStatement 或 CallableStatement,默认值:PREPARED。
useGeneratedKeys(仅适用于 insert 和 update)是否返回自动生成的主键,默认值:false。
keyProperty(仅适用于 insert 和 update)指定能够唯一识别对象的属性,MyBatis 会使用 getGeneratedKeys 的返回值或 insert 语句的 selectKey 子元素设置它的值,默认值:未设置(unset)。
keyColumn(仅适用于 insert 和 update)设置生成键值在表中的列名,在某些数据库(像 PostgreSQL)中,当主键列不是表中的第一列的时候,是必须设置的。如果生成列不止一个,可以用逗号分隔多个属性名称。
databaseId如果配置了数据库厂商标识(databaseIdProvider),MyBatis 会加载所有不带 databaseId 或匹配当前 databaseId 的语句;如果带和不带的语句都有,则不带的会被忽略。
2.返回生成主键

注意: 通过这种方式返回生成主键的时候,传递参数不能使用@Param注解


    INSERT INTO `user`(`name`) VALUES(#{name})

对于不支持自动生成主键列的数据库和可能不支持自动生成主键的 JDBC 驱动,MyBatis 有另外一种方法来生成主键。


  
    select CAST(RANDOM()*1000000 as INTEGER) a from SYSIBM.SYSDUMMY1
  
  insert into Author
    (id, username, password, email,bio, favourite_section)
  values
    (#{id}, #{username}, #{password}, #{email}, #{bio}, #{favouriteSection,jdbcType=VARCHAR})

在上面的示例中,首先会运行 selectKey 元素中的语句,并设置 Author 的 id,然后才会调用插入语句。

属性描述
keyPropertyselectKey 语句结果应该被设置到的目标属性。如果生成列不止一个,可以用逗号分隔多个属性名称。
keyColumn返回结果集中生成列属性的列名。如果生成列不止一个,可以用逗号分隔多个属性名称。
resultType结果的类型。通常 MyBatis 可以推断出来,但是为了更加准确,写上也不会有什么问题。MyBatis 允许将任何简单类型用作主键的类型,包括字符串。如果生成列不止一个,则可以使用包含期望属性的 Object 或 Map。
order可以设置为 BEFORE 或 AFTER。如果设置为 BEFORE,那么它首先会生成主键,设置 keyProperty 再执行插入语句。如果设置为 AFTER,那么先执行插入语句,然后是 selectKey 中的语句 - 这和 Oracle 数据库的行为相似,在插入语句内部可能有嵌入索引调用。
statementType和前面一样,MyBatis 支持 STATEMENT,PREPARED 和 CALLABLE 类型的映射语句,分别代表 Statement, PreparedStatement 和 CallableStatement 类型。
4.参数传递 1.单个参数

    INSERT INTO `user`(`name`) VALUES(#{name})

2.多个参数

会自动封装成Map传入,Map的key时param1,param2…


    INSERT INTO `user`(`name`) VALUES(#{param1},#{param2})

3.命名参数

通过@Param注解,并且设置参数名

// 传递POJO 在里面使用需要user.xxx这样来使用
// 传递普通类型 直接使用
int add(@Param("user") User user,@Param("age") Integer age);
4.POJO
// 我们直接传递POJO,在mapper文件里面直接使用字段
int add(User user);

    INSERT INTO `user`(`name`) VALUES(#{name})

5.Map

可以封装多个参数为map,直接传递

int insert2(@Param("map")HashMap map);
6.参数处理

参数也可以指定一个特殊的数据类型

#{age,javaType=string,jdbcType=int}

要更进一步地自定义类型处理方式,可以指定一个特殊的类型处理器类

#{age,javaType=int,jdbcType=NUMERIC,typeHandler=MyTypeHandler}

对于数值类型,还可以设置 numericScale指定小数点后保留的位数

#{height,javaType=double,jdbcType=NUMERIC,numericScale=2}

尽管上面这些选项很强大,但大多时候,你只须简单指定属性名,顶多要为可能为空的列指定 jdbcType,其他的事情交给 MyBatis 自己去推断就行了。

5.字符串替换 #{ } 和 ${ }

默认情况下,使用 #{} 参数语法时,MyBatis 会创建 PreparedStatement 参数占位符,并通过占位符安全地设置参数,这样做更安全,更迅速,通常也是首选做法,不过有时你就是想直接在 SQL 语句中直接插入一个不转义的字符串。比如 ORDER BY 子句,这时候你可以:

ORDER BY ${columnname}

#{ } 和 ${ } 的区别

#{ } 获取参数的值,预编译到SQL中,安全。

${ } 获取参数的值,拼接到SQL中,有SQL注入问题

二、结果映射 resultMap 1.使用示例

  
    
  
  
  
    
    
    
    
    
    
  
  
    
    
    
    
      
    
    
      
    
    
      
    
  

2.概念试图(resultMap)
  • constructor - 用于在实例化类时,注入结果到构造方法中
    • idArg - ID 参数;标记出作为 ID 的结果可以帮助提高整体性能
    • arg - 将被注入到构造方法的一个普通结果
  • id – 一个 ID 结果;标记出作为 ID 的结果可以帮助提高整体性能
  • result – 注入到字段或 JavaBean 属性的普通结果
  • association – 一个复杂类型的关联;许多结果将包装成这种类型
  • 嵌套结果映射 – 关联可以是 resultMap 元素,或是对其它结果映射的引用
  • collection – 一个复杂类型的集合
    • 嵌套结果映射 – 集合可以是 resultMap 元素,或是对其它结果映射的引用
  • discriminator – 使用结果值来决定使用哪个resultMap
    • case – 基于某些值的结果映射
      • 嵌套结果映射 – case 也是一个结果映射,因此具有相同的结构和元素;或者引用其它的结果映射
3.ResultMap 的属性列表
属性描述
id唯一标识
type类的完全限定名或者别名
4.Id 和 Result 的属性
属性描述
property映射到列结果的字段或属性。如果 JavaBean 有这个名字的属性(property),会先使用该属性。
column数据库中的列名,或者是列的别名。
javaType一个 Java 类的全限定名或别名
jdbcTypeJDBC 类型
typeHandler类型处理器
select用于加载复杂类型属性的映射语句的 ID,它会从 column 属性中指定的列检索数据,作为参数传递给此 select 语句。
5.构造方法

我们在获取结果的时候,默认会调用类的无参构造来创建对象,构造方法注入允许你在初始化时为类设置属性的值,而不用暴露出公有方法。

public class User {
   // 有参构造方法
   public User(Integer id, String username, int age) {
     //...
  }
}

设置使用的构造方法


   
   
   

属性描述
column数据库中的列名,或者是列的别名。
javaType一个 Java 类的完全限定名,或一个类型别名
jdbcTypeJDBC 类型
typeHandler类型处理器
select用于加载复杂类型属性的映射语句的 ID,它会从 column 属性中指定的列检索数据,作为参数传递给此 select 语句。
resultMap结果映射的 ID
name构造方法形参的名字
6.一对一关联association
	// 方式一:直接配置映射的结果
	
        
        
        
            
            
        
    
// 方式二:通过select调用单独的查询映射结果

  // 通过单独的select查询对象
  // column可以作为参数传入,如果为多个,可以通过map封装
  



    SELECT * FROM AUTHOR WHERe ID = #{id}

// 方式三:单独配置一个resultMap来获取结果

  
  
  // 可以通过resultMap单独配置结果映射
  



  
  
  
  
  

属性列表

属性描述
property映射到列结果的字段或属性。
column用于加载复杂类型属性的映射语句的 ID,它会从 column 属性中指定的列检索数据,作为参数传递给此 select 语句,可以为多个
javaType一个 Java 类的完全限定名,或一个类型别名
jdbcTypeJDBC 类型
typeHandler类型处理器
select用于加载复杂类型属性的映射语句的 ID
resultMap调用单独的映射集
7.一对多关联collection
    // 方式一:直接映射一对多结果
    
        
        
        
            
            
        
     
// 方式二:调用单独的查询集

  



  SELECT * FROM POST WHERe BLOG_ID = #{id}

// 方式三:通过resultMap来单独映射结果

  
  
  



  
  
  

8.鉴别器

一个数据库查询可能会返回多个不同的结果集, 鉴别器(discriminator)元素就是被设计来应对这种情况的,它很像 Java 语言中的 switch 语句。


  
  
  
  
  
  
  
    
    
    
    
  

向上面部分我们需要定义多个resultMap,同时我们也可以使用简洁的映射风格,都代表相同的意义


  
  
  
  
  
  
  
    
      
    
    
      
      
    
    
      
    
    
      
    
  

三、动态SQL

动态 SQL 是 MyBatis 的强大特性之一。

1.if

    AND author_name like #{author.name}

2.choose、when、otherwise
 
    
      AND title like #{title}
    
    
      AND author_name like #{author.name}
    
    
      AND featured = 1
    
  
3.where

    SELECT * FROM `car`

3.sql标签的flushCache属性,增删改默认flushCache=true。sql执行后,会同时清空一级和二级缓存。查询默认的flushCache=false




4.sqlSession.clearCache()用来清除一级缓存

5.当在某一个作用域进行了C/U/D操作后,默认该作用域下所有select中的缓存将被clear

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/341178.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号