GVKun编程网logo

mybatis中xml之trim属性说明(mybatis中的trim)

9

在这篇文章中,我们将带领您了解mybatis中xml之trim属性说明的全貌,包括mybatis中的trim的相关情况。同时,我们还将为您介绍有关4MyBatis动态SQL之trim元素|转、Java

在这篇文章中,我们将带领您了解mybatis中xml之trim属性说明的全貌,包括mybatis中的trim的相关情况。同时,我们还将为您介绍有关4 MyBatis动态SQL之trim元素|转、Java-MyBatis-MyBatis3-XML映射文件:select、Java-MyBatis-MyBatis3-XML映射文件:参数、Java的MyBatis框架中XML映射缓存的使用教程的知识,以帮助您更好地理解这个主题。

本文目录一览:

mybatis中xml之trim属性说明(mybatis中的trim)

mybatis中xml之trim属性说明(mybatis中的trim)

这篇文章主要介绍了mybatis中xml之trim属性说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

mybatis的xml中trim标签有四个属性

1.prefix 前缀增加的内容

2.suffix 后缀增加的内容

3.prefixOverrides 前缀需要覆盖的内容,一般是第一个判断条件前面的多余的结构,如:第一个判断条件前面多了 ‘and'

4.suffixOverrides 后缀需要覆盖的内容,一般是最后一个数据的后面符号,如:set值的时候,最后一个值的后面多一个逗号‘,'

举几个例子:

1.根据用户姓名和年龄查询用户,有什么值就根据什么条件(目的是说明几个属性用法,可能例子不适用于实际场景中)

select * from User where name='zhangsan' and age='20'; select * from User name = #{name} and age = #{age}

上面例子是很常规的一个写法,第一个条件前面没有任何符号,第二个条件要加上and,否则sql语句会报错。很理想的状态是第一个和第二个都有值,但是既然判断,说明也可能会没有值,当第一个name没有值的时候,这个时候sql语句就会是

select * from User where and age='',很明显这个sql语句语法存在问题。在这里标签属性prefixOverrides就起作用了,它会让前缀where覆盖掉第一个and。覆盖之后的是:select * from User where age='';

前缀加上where就不说,因为属性 prefix='where',这个where 也可以写在标签的外面,这样此处就无需用到属性prefix了。

现在有更方便的标签了,就是,用这个标签效果一样的,会忽略掉第一个符合条件前面的符号。

select * from User name = #{name} and age = #{age}

如果第一个name值是null,则age前面的and会被忽略掉。

再说说另两个属性,suffix和suffixOverrides。

如:更新用户的信息,哪些字段有值就更新哪些字段,sql语句如下:

update User name=#{name}, age=#{age},

本例中最后一个条件中的逗号“,”会被后缀覆盖掉,本例中的后缀是where id =‘1';

OK,纯属为了说明四个属性怎么使用的,具体里面的值会根据具体需求而定。希望举一反三~

trim标签的使用场景

使用trim标签去除多余的逗号

如果红框里面的条件没有匹配上,sql语句会变成如下:

INSERT INTO role(role_name,) VALUES(roleName,)

插入将会失败。

做如下修改:

其中最重要的属性是

suffixOverrides=","

表示去除sql语句结尾多余的逗号.

以上为个人经验,希望能给大家一个参考,也希望大家多多支持小编。

4 MyBatis动态SQL之trim元素|转

4 MyBatis动态SQL之trim元素|转

摘要:trim标签是一个格式化的标记,可以完成set或者是where标记的功能。

1 MyBatis动态SQL之if 语句
2 MyBatis动态sql之where标签|转
3 MyBatis动态SQL之set标签|转
4 MyBatis动态SQL之trim元素|转
5 MyBatis动态sql中foreach标签的使用
6 MyBatis动态SQL之choose(when、otherwise)语句
7 MyBatis动态SQL之bind标签|转

trim标签是一个格式化的标记,可以完成select,update,insert语句的格式化操作。trim元素主要有四个属性:
(1)prefix:在包含的内容前加上某些前缀;
(2)suffix:在包含的内容后加上某写后缀;
(3)prefixOverrides:把包含内容的首部的某些内容覆盖,即忽略where 和第一个查询条件之间的and或者是or;
(4)suffixOverrides:把包含内容的尾部的某些内容覆盖。

以下举例说明trim元素的应用场景。

案例1

select * from user 
<trim prefix="WHERE" prefixoverride="AND|OR">
  <if test="name != null and name.length()>0"> AND name=#{name}</if>
  <if test="gender != null and gender.length()>0"> AND gender=#{gender}</if>
</trim>

假如说name和gender的值都不为null,则执行sql时,控制台实际打印的sql为:

select * from user where name = 'xx' and gender = 'xx'

where和name之间不存在and,这是因为prefixOverrides="AND|OR"的意思是去掉第一个and或者or。

案例2

update user
<trim prefix="set" suffixoverride="," suffix=" where id = #{id} ">
  <if test="name != null and name.length()>0"> name=#{name},</if>
  <if test="gender != null and gender.length()>0"> gender=#{gender},</if>
</trim>

假如说name和gender的值都不为null,则实际打印的sql为:

update user set name='xx', gender='xx' where id='x'

在gender='xx'后面不存在逗号,而且自动加了一个set前缀和where后缀。

Reference

  • http://www.mybatis.cn/archives/53.html

Java-MyBatis-MyBatis3-XML映射文件:select

Java-MyBatis-MyBatis3-XML映射文件:select

ylbtech-Java-MyBatis-MyBatis3-XML映射文件:select

 

1.返回顶部
1、

select

查询语句是 MyBatis 中最常用的元素之一,光能把数据存到数据库中价值并不大,只有还能重新取出来才有用,多数应用也都是查询比修改要频繁。对每个插入、更新或删除操作,通常间隔多个查询操作。这是 MyBatis 的基本原则之一,也是将焦点和努力放在查询和结果映射的原因。简单查询的 select 元素是非常简单的。比如:

<select id="selectPerson" parameterType="int" resultType="hashmap">
  SELECT * FROM PERSON WHERE ID = #{id}
</select>

这个语句被称作 selectPerson,接受一个 int(或 Integer)类型的参数,并返回一个 HashMap 类型的对象,其中的键是列名,值便是结果行中的对应值。

注意参数符号:

#{id}

这就告诉 MyBatis 创建一个预处理语句(PreparedStatement)参数,在 JDBC 中,这样的一个参数在 SQL 中会由一个“?”来标识,并被传递到一个新的预处理语句中,就像这样:

// 近似的 JDBC 代码,非 MyBatis 代码...
String selectPerson = "SELECT * FROM PERSON WHERE ID=?";
PreparedStatement ps = conn.prepareStatement(selectPerson);
ps.setInt(1,id);

当然,使用 JDBC 意味着需要更多的代码来提取结果并将它们映射到对象实例中,而这就是 MyBatis 节省你时间的地方。参数和结果映射还有更深入的细节。这些细节会分别在后面单独的小节中呈现。

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

<select
  id="selectPerson"
  parameterType="int"
  parameterMap="deprecated"
  resultType="hashmap"
  resultMap="personResultMap"
  flushCache="false"
  useCache="true"
  timeout="10"
  fetchSize="256"
  statementType="PREPARED"
  resultSetType="FORWARD_ONLY">

 

Select &#x5143;&#x7d20;&#x7684;&#x5c5e;&#x6027;
属性 描述
id 在命名空间中唯一的标识符,可以被用来引用这条语句。
parameterType 将会传入这条语句的参数类完全限定名或别名。这个属性是可选的,因为 MyBatis 可以通过类型处理器(TypeHandler) 推断出具体传入语句的参数,默认值为未设置(unset)。
parameterMap 这是引用外部 parameterMap 的已经被废弃的方法。请使用内联参数映射和 parameterType 属性。
resultType 从这条语句中返回的期望类型的类的完全限定名或别名。 注意如果返回的是集合,那应该设置为集合包含的类型,而不是集合本身。可以使用 resultType 或 resultMap,但不能同时使用。
resultMap 外部 resultMap 的命名引用。结果集的映射是 MyBatis 最强大的特性,如果你对其理解透彻,许多复杂映射的情形都能迎刃而解。可以使用 resultMap 或 resultType,但不能同时使用。
flushCache 将其设置为 true 后,只要语句被调用,都会导致本地缓存和二级缓存被清空,默认值:false。
useCache 将其设置为 true 后,将会导致本条语句的结果被二级缓存缓存起来,默认值:对 select 元素为 true。
timeout 这个设置是在抛出异常之前,驱动程序等待数据库返回请求结果的秒数。默认值为未设置(unset)(依赖驱动)。
fetchSize 这是一个给驱动的提示,尝试让驱动程序每次批量返回的结果行数和这个设置值相等。 默认值为未设置(unset)(依赖驱动)。
statementType STATEMENT,PREPARED 或 CALLABLE 中的一个。这会让 MyBatis 分别使用 Statement,PreparedStatement 或 CallableStatement,默认值:PREPARED。
resultSetType FORWARD_ONLY,SCROLL_SENSITIVE, SCROLL_INSENSITIVE 或 DEFAULT(等价于 unset) 中的一个,默认值为 unset (依赖驱动)。
databaseId 如果配置了数据库厂商标识(databaseIdProvider),MyBatis 会加载所有的不带 databaseId 或匹配当前 databaseId 的语句;如果带或者不带的语句都有,则不带的会被忽略。
resultOrdered 这个设置仅针对嵌套结果 select 语句适用:如果为 true,就是假设包含了嵌套结果集或是分组,这样的话当返回一个主结果行的时候,就不会发生有对前面结果集的引用的情况。 这就使得在获取嵌套的结果集的时候不至于导致内存不够用。默认值:false。
resultSets 这个设置仅对多结果集的情况适用。它将列出语句执行后返回的结果集并给每个结果集一个名称,名称是逗号分隔的。
2、
2.返回顶部
 
3.返回顶部
 
4.返回顶部
 
5.返回顶部
1、
http://www.mybatis.org/mybatis-3/zh/sqlmap-xml.html#select
2、
 
6.返回顶部
 
warn 作者:ylbtech
出处:http://ylbtech.cnblogs.com/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

Java-MyBatis-MyBatis3-XML映射文件:参数

Java-MyBatis-MyBatis3-XML映射文件:参数

ylbtech-Java-MyBatis-MyBatis3-XML映射文件:参数

 

1.返回顶部
1、

参数

你之前见到的所有语句中,使用的都是简单参数。实际上参数是 MyBatis 非常强大的元素。对于简单的使用场景,大约 90% 的情况下你都不需要使用复杂的参数,比如:

<select id="selectUsers" resultType="User">
  select id, username, password
  from users
  where id = #{id}
</select>

上面的这个示例说明了一个非常简单的命名参数映射。参数类型被设置为 int,这样这个参数就可以被设置成任何内容。原始类型或简单数据类型(比如 Integer 和 String)因为没有相关属性,它会完全用参数值来替代。 然而,如果传入一个复杂的对象,行为就会有一点不同了。比如:

<insert id="insertUser" parameterType="User">
  insert into users (id, username, password)
  values (#{id}, #{username}, #{password})
</insert>

如果 User 类型的参数对象传递到了语句中,id、username 和 password 属性将会被查找,然后将它们的值传入预处理语句的参数中。

对向语句中传递参数来说,这真是既简单又有效。不过参数映射的功能远不止于此。

首先,像 MyBatis 的其他部分一样,参数也可以指定一个特殊的数据类型

#{property,javaType=int,jdbcType=NUMERIC}

像 MyBatis 的其它部分一样,javaType 几乎总是可以根据参数对象的类型确定下来,除非该对象是一个 HashMap。这个时候,你需要显式指定 javaType 来确保正确的类型处理器(TypeHandler)被使用。

提示 JDBC 要求,如果一个列允许 null 值,并且会传递值 null 的参数,就必须要指定 JDBC Type阅读 PreparedStatement.setNull()的 JavaDoc 文档来获取更多信息。

要更进一步地自定义类型处理方式,你也可以指定一个特殊的类型处理器类(或别名),比如:

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

尽管看起来配置变得越来越繁琐,但实际上,很少需要如此繁琐的配置。

对于数值类型,还有一个小数保留位数的设置,来指定小数点后保留的位数。

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

最后,mode 属性允许你指定 IN,OUT 或 INOUT 参数如果参数的 mode 为 OUT 或 INOUT,就像你在指定输出参数时所期望的行为那样,参数对象的属性实际值将会被改变。 如果 mode 为 OUT(或 INOUT),而且 jdbcType 为 CURSOR(也就是 Oracle 的 REFCURSOR),你必须指定一个 resultMap 引用来将结果集 ResultMap 映射到参数的类型上。要注意这里的 javaType 属性是可选的,如果留空并且 jdbcType 是 CURSOR,它会被自动地被设为 ResultMap。

#{department, mode=OUT, jdbcType=CURSOR, javaType=ResultSet, resultMap=departmentResultMap}

MyBatis 也支持很多高级的数据类型,比如结构体(structs)但是当使用 out 参数时,你必须显式设置类型的名称。比如(再次提示,在实际中要像这样不能换行):

#{middleInitial, mode=OUT, jdbcType=STRUCT, jdbcTypeName=MY_TYPE, resultMap=departmentResultMap}

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

#{firstName}
#{middleInitial,jdbcType=VARCHAR}
#{lastName}

字符串替换

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

ORDER BY ${columnName}

这里 MyBatis 不会修改或转义字符串

当 SQL 语句中的元数据(如表名或列名)是动态生成的时候,字符串替换将会非常有用。 举个例子,如果你想通过任何一列从表中 select 数据时,不需要像下面这样写:

@Select("select * from user where id = #{id}")
User findById(@Param("id") long id);

@Select("select * from user where name = #{name}")
User findByName(@Param("name") String name);

@Select("select * from user where email = #{email}")
User findByEmail(@Param("email") String email);

// and more "findByXxx" method
可以只写这样一个方法:
@Select("select * from user where ${column} = #{value}")
User findByColumn(@Param("column") String column, @Param("value") String value);
其中 ${column} 会被直接替换,而 #{value} 会被使用 ? 预处理。 因此你就可以像下面这样来达到上述功能:
User userOfId1 = userMapper.findByColumn("id", 1L);
User userOfNameKid = userMapper.findByColumn("name", "kid");
User userOfEmail = userMapper.findByColumn("email", "noone@nowhere.com");

 

这个想法也同样适用于用来替换表名的情况。

提示 用这种方式接受用户的输入,并将其用于语句中的参数是不安全的,会导致潜在的 SQL 注入攻击因此要么不允许用户输入这些字段,要么自行转义并检验

2、
2.返回顶部
 
3.返回顶部
 
4.返回顶部
 
5.返回顶部
1、
http://www.mybatis.org/mybatis-3/zh/sqlmap-xml.html#Parameters
2、
 
6.返回顶部
 
warn 作者:ylbtech
出处:http://ylbtech.cnblogs.com/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

Java的MyBatis框架中XML映射缓存的使用教程

Java的MyBatis框架中XML映射缓存的使用教程

MyBatis包含一个非常强大的查询缓存特性,它可以非常方便地配置和定制。默认情况下是没有开启缓存的,要开启二级缓存,你需要在你的SQL映射文件中添加一行:

<cache/>
登录后复制

字面上看就是这样。这个简单语句的效果如下:
1.映射语句文件中的所有select语句将会被缓存。
2.映射语句文件中的所有insert,update和delete语句会刷新缓存。
3.缓存会使用Least Recently Used(LRU,最近最少使用的)算法来收回。
4.根据时间表(比如 no Flush Interval,没有刷新间隔),缓存不会以任何时间顺序来刷新。
5.缓存会存储列表集合或对象(无论查询方法返回什么)的1024个引用。
6.缓存会被视为是 read/write(可读/可写)的缓存,意味着对象检索不是共享的,而且可以安全地被调用者修改,而不干扰其他调用者或线程所做的潜在修改。

所有的这些属性都可以通过缓存元素的属性来修改。比如:

<cache
 eviction="FIFO"
 flushInterval="60000"
 size="512"
 readOnly="true"/>
登录后复制

这个更高级的配置创建了一个FIFO缓存,并每隔60秒刷新,存储结果对象或列表的512个引用,而且返回的对象被认为是只读的,因此在不同线程中的调用者之间修改它们会导致冲突。
可用的收回策略(eviction)有:

LRU – 最近最少使用的:移除最长时间不被使用的对象。

FIFO – 先进先出:按对象进入缓存的顺序来移除它们。

SOFT – 软引用:移除基于垃圾回收器状态和软引用规则的对象。

WEAK – 弱引用:更积极地移除基于垃圾收集器状态和弱引用规则的对象。

默认的是 LRU。

flushInterval(刷新间隔)可以被设置为任意的正整数,而且它们代表一个合理的毫秒形式的时间段。默认情况是不设置,也就是没有刷新间隔,缓存仅仅调用语句时刷新。
size(引用数目)可以被设置为任意正整数,要记住你缓存的对象数目和你运行环境的可用内存资源数目。默认值1024。
readOnly(只读)属性可以被设置为 true 或 false。只读的缓存会给所有调用者返回缓存对象的相同实例。因此这些对象不能被修改。这提供了很重要的性能优势。可读写的缓存会返回缓存对象的拷贝(通过序列化)。这会慢一些,但是安全,因此默认是false。

使用自定义缓存
除了这些自定义缓存的方式,你也可以通过实现你自己的缓存或为其他第三方缓存方案创建适配器来完全覆盖缓存行为。

<cache type=”com.domain.something.MyCustomCache”/>
登录后复制

这个示例展示了如何使用一个自定义的缓存实现。type 属性指定的类必须实现org.mybatis.cache.Cache 接口。这个接口是 MyBatis 框架中很多复杂的接口之一,但是简单给定它做什么就行。

public interface Cache {
 String getId();
 int getSize();
 void putObject(Object key, Object value);
 Object getObject(Object key);
 boolean hasKey(Object key);
 Object removeObject(Object key);
 void clear();
 ReadWriteLock getReadWriteLock();
}
登录后复制

参照缓存
也许将来的某个时候,你会想在命名空间中共享相同的缓存配置和实例。在这样的情况下你可以使用 cache-ref 元素来引用另外一个缓存。

<cache-ref namespace=”com.someone.application.data.SomeMapper”/>
登录后复制

更多Java的MyBatis框架中XML映射缓存的使用教程相关文章请关注PHP中文网!

   


今天关于mybatis中xml之trim属性说明mybatis中的trim的介绍到此结束,谢谢您的阅读,有关4 MyBatis动态SQL之trim元素|转、Java-MyBatis-MyBatis3-XML映射文件:select、Java-MyBatis-MyBatis3-XML映射文件:参数、Java的MyBatis框架中XML映射缓存的使用教程等更多相关知识的信息可以在本站进行查询。

本文标签: