MyBatis 真正的力量是在映射语句中。这里是奇迹发生的地方。 对于所有的力量, SQL
映射的 XML 文件是相当的简单。当然如果你将它们和对等功能的 JDBC 代码来比较,你会
发现映射文件节省了大约 95%的代码量。 MyBatis 的构建就是聚焦于 SQL 的,使其远离于
普通的方式。

SQL 映射文件有很少的几个顶级元素(按照它们应该被定义的顺序):
 cache - 配置给定命名空间的缓存。
 cache-ref – 从其他命名空间引用缓存配置。
 resultMap – 最复杂,也是最有力量的元素,用来描述如何从数据库结果集中来加载你的对象。
 sql – 可以重用的 SQL 块,也可以被其他语句引用。
 insert – 映射插入语句
 update – 映射更新语句
 delete – 映射删除语句
 select – 映射查询语句
 
select
<select id=”selectPerson” parameterType=”int” resultType=”hashmap”>
SELECT * FROM PERSON WHERE ID = #{id}
</select>
这个语句被称作 selectPerson,使用一个 int (或 Integer)类型的参数,并返回一个 HashMap类型的对象,其中的键是列名,值是列对应的值
----------------------select 元素:----------------
<select
id=”selectPerson” <!--在命名空间中唯一的标识符,可以被用来引用这条语句。-->
parameterType=”int” <!--将会传入这条语句的参数类的完全限定名或别名。-->
parameterMap=”deprecated”
resultType=”hashmap” <!--返回的期望类型的类的完全限定名或别名。注意集合情形,那应该是集合可以包含的类型,而不能是集
合本身。使用 resultType 或 resultMap,但不能同时使用>
resultMap=”personResultMap” <!--命名引用外部的 resultMap。返回 map 是 MyBatis 最具力量的特性,对其有一个很好的理解的话,许
多复杂映射的情形就能被解决了。使用 resultMap 或 resultType,但不能同时使用。-->
flushCache=”false” <!--将其设置为 true, 无论语句什么时候被调用,都会导致缓存被清空。默认值: false。-->
useCache=”true” <!--将其设置为 true,将会导致本条语句的结果被缓存。默认值: true。>
timeout=”10000” <!--这个设置驱动程序等待数据库返回请求结果,并抛出异常时间的最大等待值。
默认不设置(驱动自行处理)。-->
fetchSize=”256” <!--这是暗示驱动程序每次批量返回的结果行数。默认不设置(驱动自行处理)。-->
statementType=”PREPARED” <!--STATEMENT,PREPARED 或 CALLABLE 的一种。这会让 MyBatis使用选择使用 Statement,
PreparedStatement 或 CallableStatement。默认值: PREPARED。-->
resultSetType=”FORWARD_ONLY” <!--FORWARD_ONLY|SCROLL_SENSITIVE|SCROLL_INSENSITIVE中的一种。
默认是不设置(驱动自行处理)。-->
>
insert, update, delete
数据修改语句 insert, update 和 delete 在它们的实现中非常相似:

<insert   id="insertAuthor"  parameterType="domain.blog.Author"   flushCache="true"
statementType="PREPARED" keyProperty="" useGeneratedKeys="" timeout="20000">
支持自动生成主键的数据库可以使用这个
<insert id="insertAuthor" parameterType="domain.blog.Author"     useGeneratedKeys=”true” keyProperty=”id”>
insert into Author (username,password,email,bio)
values (#{username},#{password},#{email},#{bio})
</insert>
不支持的可以使用这个
<insert id="insertAuthor" parameterType="domain.blog.Author">
<selectKey keyProperty="id" resultType="int" order="BEFORE">
      select CAST(RANDOM()*1000000 as INTEGER) a from SYSIBM.SYSDUMMY1
</selectKey>
insert into Author(id, username, password, email,bio, favourite_section)
values(#{id}, #{username}, #{password}, #{email}, #{bio},#{favouriteSection,jdbcType=VARCHAR})
</insert>
属性描述:
keyProperty:selectKey 语句结果应该被设置的目标属性
resultType    :结果的类型。 MyBatis 通常可以算出来,但是写上也没有问题。MyBatis 允许任何简单类型用作主键的类型,包括字符串。
order    :这可以被设置为 BEFORE 或 AFTER。如果设置为 BEFORE,那么它会首先选择主键,设置 keyProperty 然后执行插入语句。如果

设置为 AFTER,那么先执行插入语句,然后是 selectKey 元素-这和如 Oracle 数据库相似,可以在插入语句中嵌入序列调用。

statementType  :  MyBatis 支持 STATEMENT, PREPARED 和CALLABLE 语句的映射类型,
                分别代表 PreparedStatement 和CallableStatement 类型。
sql
这个元素可以被用来定义可重用的 SQL 代码段,可以包含在其他语句中。比如:

<sql id=”userColumns”> id,username,password </sql>

这个 SQL 片段可以被包含在其他语句中,例如:

<select id=”selectUsers” parameterType=”int” resultType=”hashmap”>
select <include refid=”userColumns”/>from some_table where id = #{id}
</select>
字符串替换
默认情况下,使用#{}格式的语法会导致 MyBatis 创建预处理语句属性并以它为背景设
置安全的值(比如?)。这样做很安全,很迅速, 也是首选的做法,有时你只是想直接在 SQL
语句中插入一个不改变的字符串。比如,像 ORDER BY,你可以这样来使用:
ORDER BY ${columnName}
这里 MyBatis 不会修改或转义字符串。
重要: 接受从用户输出的内容并提供给语句中不变的字符串,这样做是不安全的。这会
         导致潜在的 SQL 注入攻击,因此你不应该允许用户输入这些字段,或者通常自行转义并检查。
resultMap
----------------------------------将返回的结果映射到Map
<select id=”selectUsers” parameterType=”int” resultType=”hashmap”>
    select id, username, hashedPassword from some_table where id = #{id}
</select>
----------------------------------将返回的结果映射到Bean
<select id=”selectUsers” parameterType=”int”   resultType=”com.someapp.model.User”>
select id, username, hashedPasswordfrom some_tablewhere id = #{id}
</select>
这个可以输入类的别名,而不用输入类的全路径
<!-- 在XML配置文件中-->
<typeAlias type=”com.someapp.model.User” alias=”User”/>
<!-- 在SQL映射的XML文件中-->
<select id=”selectUsers” parameterType=”int” resultType=”User”>
select id, username, hashedPassword from some_table where id = #{id}
</select>
 
如果列名没有精确匹配,你可以在列名上使用 select 字句的别名(一个
标准的 SQL 特性)来匹配标签
<select id=”selectUsers” parameterType=”int” resultType=” User”>
select user_id as “id”, user_name as “userName”, hashed_password as “hashedPassword”
from some_table where id = #{id}
</select>
》》》解决列名不匹配的另外一种方式
<resultMap id="userResultMap" type="User">
<id property="id" column="user_id" />
<result property="username" column="user_name"/>
<result property="password" column="hashed_password"/>
</resultMap>

引用它的语句使用 resultMap 属性就行了(注意我们去掉了 resultType 属性)。比如:

<select id=”selectUsers” parameterType=”int”    resultMap=”userResultMap”>
select user_id, user_name, hashed_password from some_table where id = #{id}
</select>

SQL 映射的 XML 文件的更多相关文章

  1. 五、SQL映射的XML文件

    MyBatis真正的力量是在映射语句中.这里是奇迹发生的地方.对于所有的力量,SQL映射的XML文件是相当的简单.当然如果你将它们和对等功能的JDBC代码来比较,你会发现映射文件节省了大约95%的代码 ...

  2. MyBatis学习(四)XML配置文件之SQL映射的XML文件

    SQL映射文件常用的元素: 1.select 查询语句是MyBatis最常用的语句之一. 执行简单查询的select元素是非常简单的: <select id="selectUser&q ...

  3. SpringBoot项目里,让TKmybatis支持可以手写sql的Mapper.xml文件

    SpringBoot项目通常配合TKMybatis或MyBatis-Plus来做数据的持久化. 对于单表的增删改查,TKMybatis优雅简洁,无需像传统mybatis那样在mapper.xml文件里 ...

  4. IDEA Mybatis 找不到映射器xml文件

    用IDEA新建了一个测试MyBatis工程,工程目录如下 其中config是MyBatis的配置文件,内容如下 <?xml version="1.0" encoding=&q ...

  5. mybatis 找不到映射器xml文件 (idea)

    原因是: idea不会编译src的java目录的xml文件 所以解决思路就是:将IDEA maven项目中src源代码下的xml等资源文件编译进classes文件夹 具体操作方法就是:配置maven的 ...

  6. Could not find resource——mybatis 找不到映射器xml文件

    今天用IDEA写Mybatis的时候,测试报了如图所示的错,恶心死我了,后来解决了,总结一下,防止下回跳坑,当然,也是做一个分享,如果有朋友遇到这个错,希望有所帮助 Error parsing SQL ...

  7. ms sql server读取xml文件存储过程-sp_xml_preparedocument

    最近要在存储过程中读取xml中节点的值,然后进行sql操作: 要使用到的系统存储过程如下:sp_xml_preparedocument create procedure [dbo].[pro_Test ...

  8. 【转】Mybatis 3.1中 Mapper XML 文件 的学习详解

    MyBatis 真正的力量是在映射语句中.这里是奇迹发生的地方.对于所有的力量,SQL 映射的 XML 文件是相当的简单.当然如果你将它们和对等功能的 JDBC 代码来比较,你会发现映射文件节省了大约 ...

  9. Mybatis 3.1中 Mapper XML 文件 的学习详解(转载)

    MyBatis 真正的力量是在映射语句中.这里是奇迹发生的地方.对于所有的力量,SQL 映射的 XML 文件是相当的简单.当然如果你将它们和对等功能的 JDBC 代码来比较,你会发现映射文件节省了大约 ...

随机推荐

  1. 一种map容器遍历的方法

    遍历算法是一种很常见而且非常重要的算法,我们用map容器的时候可能用的比较多的是查找,我今天才第一次要用到遍历.下面举个例子就知道了. map<string,string> mp; str ...

  2. ubuntu安装android开发环境

    1.安装oracle-jdk 打开终端,使用下面的命令: java -version 如果你看到像下面的输出,这就意味着你并没有安装过Java: The program ‘java’ can be f ...

  3. Longest Common Subsequence

    Given two strings, find the longest common subsequence (LCS). Your code should return the length of  ...

  4. 160809228_符瑞艺_C语言程序设计实验3 循环结构程序设计

      #include <stdio.h> int main(){ //使用for循环完成1+2+......+100 ; ;i<=;i++) sum +=i; //sum = sum ...

  5. 寻找下一款Prisma APP:深度学习在图像处理中的应用探讨(阅读小结)

    原文链接:https://yq.aliyun.com/articles/61941?spm=5176.100239.bloglist.64.UPL8ec 某会议中的一篇演讲,主要讲述深度学习在图像领域 ...

  6. 2 DelayInterval延时间隔类——Live555源码阅读(一)基本组件类

    这是Live555源码阅读的第一部分,包括了时间类,延时队列类,处理程序描述类,哈希表类这四个大类. 这里是时间相关类的第二个部分. 本文由乌合之众 lym瞎编,欢迎转载 http://www.cnb ...

  7. 给dos命令“.bat”文件换图标

    最近客户有个需求:给企业建立一个FTP服务器,并且给不同的部门分配不同的目录和管理权限. 这个好实现!直接安装serv-u,进行一番设置,搞定! 不过客户嫌登陆FTP操作麻烦,输入ip,输入账号什么的 ...

  8. exit()和_exit()

    进程就好比人一样有其生命,我们通过fork()函数来创建一个进程,那么我们又是如何来中止进程呢. 进程退出 1.在Linux中任何让一个进程退出 进程退出表示进程即将结束.在Linux中进程退出分为了 ...

  9. 分布式架构 Hadoop 2.7.X 安装和配置

    一.安装环境 硬件:虚拟机 操作系统:Ubuntu 14 32位 IP:59.77.132.28主机名:admin安装用户:root 二.安装JDK 安装JDK1.7或者以上版本.这里安装jdk1.7 ...

  10. Android 手势水平监听判断

    package com.zihao.ui; import com.zihao.R; import android.os.Bundle; import android.app.Activity; imp ...