void truncateTable();//接口
映射TRUNCATE TABLE 表名
resultMap -描述如何从数据库结果集加载对象 sql -可被其它语句引用的可重用语句块1.select配置属性
id 在命名空间中唯一的标识符,可以被用来引用这条语句。 parameterType 将会传入这条语句的参数的类全限定名或别名。这个属性是可选的,因为 MyBatis 可以通过类型处理器(TypeHandler)推断出具体传入语句的参数,默认值为未设置(unset)。 resultType 期望从这条语句中返回结果的类全限定名或别名。 注意,如果返回的是集合,那应该设置为集合包含的类型,而不是集合本身的类型。 resultType 和 resultMap 之间只能同时使用一个。 flushCache 将其设置为 true 后,只要语句被调用,都会导致本地缓存和二级缓存被清空,默认值:false。 useCache 将其设置为 true 后,将会导致本条语句的结果被二级缓存缓存起来,默认值:对 select 元素为 true。2.insert, update 和 delete
和上面类似 useGeneratedKeys (仅适用于 insert 和 update)这会令 MyBatis 使用 JDBC 的 getGeneratedKeys 方法来取出由数据库内部生成的主键(比如:像 MySQL 和 SQL Server 这样的关系型数据库管理系统的自动递增字段),默认值:false。 keyProperty (仅适用于 insert 和 update)指定能够唯一识别对象的属性,MyBatis 会使用 getGeneratedKeys 的返回值或 insert 语句的 selectKey 子元素设置它的值,默认值:未设置(unset)。如果生成列不止一个,可以用逗号分隔多个属性名称。 keyColumn (仅适用于 insert 和 update)设置生成键值在表中的列名,在某些数据库(像 PostgreSQL)中,当主键列不是表中的第一列的时候,是必须设置的。如果生成列不止一个,可以用逗号分隔多个属性名称。
3.字符串替换insert into Author (username, password, email, bio) values (#{item.username}, #{item.password}, #{item.email}, #{item.bio}) insert into users (id, username, password) values (#{id}, #{username}, #{password})
默认情况下,使用 #{} 参数语法时,MyBatis 会创建 PreparedStatement 参数占位符,并通过占位符安全地设置参数(就像使用 ? 一样)。 这样做更安全,更迅速,通常也是首选做法,不过有时你就是想直接在 SQL 语句中直接插入一个不转义的字符串。
${columnName}
当 SQL 语句中的元数据(如表名或列名)是动态生成的时候,字符串替换将会非常有用。
@Select("select * from user where ${column} = #{value}") User findByColumn(@Param("column") String column, @Param("value") String value);
其中 ${column} 会被直接替换,而 #{value} 会使用 ? 预处理。 这样,就能完成同样的任务:
4.resultMap结果映射然后在引用它的语句中设置 resultMap 属性就行了(注意我们去掉了 resultType 属性)。比如: select user_id, user_name, hashed_password from some_table where id = #{id}
我们有两个 select 查询语句:一个用来加载博客(Blog),另外一个用来加载作者(Author),而且博客的结果映射描述了应该使用 selectAuthor 语句加载它的 author 属性。
5.sql复用${alias}.id,${alias}.username,${alias}.password select , from some_table t1 cross join some_table t2
动态sql 1.ifname, sex, updateTime select id, from person where id =#{id};
SELECT * FROM BLOG WHERe state = 'ACTIVE' AND title like #{title}
这条语句提供了可选的查找文本功能。如果不传入 “title”,那么所有处于 “ACTIVE” 状态的 BLOG 都会返回;如果传入了 “title” 参数,那么就会对 “title” 一列进行模糊查找并返回对应的 BLOG 结果
如果希望通过 “title” 和 “author” 两个参数进行可选搜索该怎么办呢?首先,我想先将语句名称修改成更名副其实的名称;接下来,只需要加入另一个条件即可。
2.choose、when、otherwiseSELECT * FROM BLOG WHERe state = ‘ACTIVE’ AND title like #{title} AND author_name like #{author.name}
有时候,我们不想使用所有的条件,而只是想从多个条件中选择一个使用。针对这种情况,MyBatis 提供了 choose 元素,它有点像 Java 中的 switch 语句
3.trim、where、setSELECT * FROM BLOG WHERe state = ‘ACTIVE’ AND title like #{title} AND author_name like #{author.name} AND featured = 1
SELECT * FROM BLOG WHERe state = #{state} AND title like #{title} AND author_name like #{author.name}
如果没有匹配的条件会怎么样?最终这条 SQL 会变成这样:
SELECT * FROM BLOG WHERe
如果匹配的只是第二个条件又会怎样?这条 SQL 会是这样:
SELECt * FROM BLOG WHERe AND title like 'someTitle'
正确的方法:
SELECT * FROM BLOG state = #{state} AND title like #{title} AND author_name like #{author.name}
*where* 元素只会在子元素返回任何内容的情况下才插入 “WHERe” 子句。而且,若子句的开头为 “AND” 或 “OR”,*where* 元素也会将它们去除
如果 where 元素与你期望的不太一样,你也可以通过自定义 trim 元素来定制 where 元素的功能
... 把where前缀是and或者or的用where覆盖替换
prefixOverrides 属性会忽略通过管道符分隔的文本序列(注意此例中的空格是必要的)。上述例子会移除所有 prefixOverrides 属性中指定的内容,并且插入 prefix 属性中指定的内容。
用于动态更新语句的类似解决方案叫做 set。set 元素可以用于动态包含需要更新的列,忽略其它不更新的列。比如:
update Author where id=#{id} username=#{username}, password=#{password}, email=#{email}, bio=#{bio}
这个例子中,set 元素会动态地在行首插入 SET 关键字,并会删掉额外的逗号(这些逗号是在使用条件语句给列赋值时引入的)。
...
注意,我们覆盖了后缀值设置,并且自定义了前缀值。
4.foreachSELECT * FROM POST P WHERe ID in #{item}
你可以将任何可迭代对象(如 List、Set 等)、Map 对象或者数组对象作为集合参数传递给 foreach。当使用可迭代对象或者数组时,index 是当前迭代的序号,item 的值是本次迭代获取到的元素。当使用 Map 对象(或者 Map.Entry 对象的集合)时,index 是键,item 是值。
注意点:open="(" close=")" 只会使用一次,并且把集合整体包着
在( #{item})这里的括号是每次循环都会加上(),以分隔符分开
5.script要在带注解的映射器接口类中使用动态 SQL,可以使用 script 元素。比如:
@Update({""}) void updateAuthorValues(Author author);6.bind
bind 元素允许你在 OGNL 表达式以外创建一个变量,并将其绑定到当前的上下文。比如:
SELECT * FROM BLOG WHERe title LIKE #{pattern}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)