SQL映射⽂件详解SQL 映射⽂件只有很少的⼏个顶级元素(按照应被定义的顺序列出):
cache – 该命名空间的缓存配置。
cache-ref – 引⽤其它命名空间的缓存配置。
resultMap – 描述如何从数据库结果集中加载对象,是最复杂也是最强⼤的元素。
sql – 可被其它语句引⽤的可重⽤语句块。
批量更新sql语句insert – 映射插⼊语句。
update – 映射更新语句。
delete – 映射删除语句。
select – 映射查询语句。
select
<select
id="selectPerson"
parameterType="int"
resultType="hashmap"
resultMap="personResultMap"
flushCache="false"
useCache="true"
timeout="10"
fetchSize="256"
statementType="PREPARED"
resultSetType="FORWARD_ONLY">
select元素的属性详解:
属性描述
id在命名空间中唯⼀的标识符,可以被⽤来引⽤这条语句。
parameterType 将会传⼊这条语句的参数的类全限定名或别名。这个属性是可选的,因为 MyBatis 可以通过类型处理器(TypeHandler)推断出具体传⼊语句的参数,默认值为未设置(unset)。
resultType 期望从这条语句中返回结果的类全限定名或别名。如果返回的是集合,那应该设置为集合包含的类型,⽽不是集合本⾝的类型。 resultType 和 resultMap 之间只能同时使⽤⼀个。
resultMap对外部 resultMap 的命名引⽤。 resultType 和 resultMap 之间只能同时使⽤⼀个。
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 (依赖数据库驱动)。
resultOrdered 这个设置仅针对嵌套结果 select 语句:如果为 true,将会假设包含了嵌套结果集或是分组,当返回⼀个主结果⾏时,就不会产⽣对前⾯结果集的引⽤。这就使得在获取嵌套结果集的时候不⾄于内存不够⽤。默认值:false。
resultSets 这个设置仅适⽤于多结果集的情况。它将列出语句执⾏后返回的结果集并赋予每个结果集⼀个名称,多个名称之间以逗号分隔。
insert, update 和 delete
数据变更语句 insert,update 和 delete 的实现⾮常接近:<insert
id="insertAuthor"
parameterType="domain.blog.Author"
flushCache="true"
statementType="PREPARED"
keyProperty=""
keyColumn=""
useGeneratedKeys=""
timeout="20">
<update
id="updateAuthor"
parameterType="domain.blog.Author"
flushCache="true"
statementType="PREPARED"
timeout="20">
<delete
id="deleteAuthor"
parameterType="domain.blog.Author"
flushCache="true"
statementType="PREPARED"
timeout="20">
Insert, Update, Delete 元素的属性详解:
属性描述
id在命名空间中唯⼀的标识符,可以被⽤来引⽤这条语句。parameterType将会传⼊这条语句的参数的类全限定名或别名。
flushCache 将其设置为 true 后,只要语句被调⽤,都会导致本地缓存和⼆级缓存被清空,默认值:(对 insert、update 和 delete 语句)true。
timeout这个设置是在抛出异常之前,驱动程序等待数据库返回请求结果的秒数。默认值为未设置(unset)(依赖数据库驱动)。
statementType 可选 STATEMENT,PREPARED 或 CALLABLE。这会让 MyBatis 分别使⽤ Statement,PreparedStatement 或CallableStatement,默认值:PREPARED。
useGeneratedKeys (仅适⽤于 insert 和 update)这会令 MyBatis 使⽤ JDBC 的 getGeneratedKeys ⽅法来取出由数据库内部⽣成的主键(⽐如:像 MySQL 和 SQL Server 这样的关系型数据库管理系统的⾃动递增字段),默认值:false。
keyProperty (仅适⽤于 insert 和 update)指定能够唯⼀识别对象的属性,MyBatis 会使⽤ getGeneratedKeys 的返回值或 insert 语句的 selectKey ⼦元素设置它的值,默认值:未设置(unset)。如果⽣成列不⽌⼀个,可以⽤逗号分隔多个属性名称。
keyColumn (仅适⽤于 insert 和 update)设置⽣成键值在表中的列名,在某些数据库(像 PostgreSQL)中,当主键列不是表中的第⼀列的时候,是必须设置的。如果⽣成列不⽌⼀个,可以⽤逗号分隔多个属性名称。
主键返回<selectKey>
插⼊⼀条新数据时,有两种⽅法确定最新的主键值:
UUID(⾮⾃增主键返回)
在执⾏插⼊语句前获取最新的主键值
<!-- mysql的uuid⽣成主键 -->
<mapper namespace="mybatis_test.ManMapper">
<insert id="insertUser" parameterType="mybatis_test.Man">
<selectKey keyProperty="id" order="BEFORE" resultType="string">
<!--去除'-'和空格-->
select replace(uuid(), '-', '')
</selectKey>
insert into man(id,name) value(#{id},#{name})
</insert>
</mapper>
LAST_INSERT_ID()(⾃增主键返回)
通过LAST_INSERT_ID()获取刚插⼊记录的⾃增主键值,在insert语句执⾏后,执⾏select LAST_INSERT_ID()就可以获取⾃增主键;SQL执⾏语句返回的是影响的⾏数,为1或者0,主键id已经存到了man对象的“id”字段中,所以应该从对象中获取
<insert id="insertUser" parameterType="mybatis_test.Man">
insert into man(name) value(#{name})
<selectKey keyProperty="id" order="AFTER" resultType="java.lang.Integer">
select LAST_INSERT_ID()
</selectKey>
</insert>
代码
//这⾥返回的是影像的⾏数,为1或者0
manMapper.insertUser(man);
sqlSessionmit();
//主键id已经存到了man对象的“id”字段中,所以应该从对象中获取
System.out.Id());
selectKey 标签属性
属性描述
keyProperty selectKey 语句结果应该被设置的⽬标属性。如果希望得到多个⽣成的列,也可以是逗号分隔的属性名称列表。keyColumn匹配属性的返回结果集中的列名称。如果希望得到多个⽣成的列,也可以是逗号分隔的属性名称列表。
resultType 结果的类型。MyBatis 允许任何简单类型⽤作主键的类型,包括字符串。如果希望作⽤于多个⽣成的列,则可以使⽤⼀个包含期望属性的 Object 或⼀个 Map。
order 可选值BEFORE和AFTER,设置为BEFORE会先执⾏selectKey语句,再执⾏insert语句;设置为AFTER会先执⾏insert语句再执⾏selectKey语句
属性描述
SQL⽚段
⽤来定义可重⽤的 SQL 代码⽚段,以便在其它语句中使⽤。参数可以静态地(在加载的时候)确定下来,并且可以在不同的 include 元素中定义不同的参数值。
定义
<sql id="userColumns"> ... </sql>
在增删查改的语句中使⽤ include标签使⽤SQL⽚段
参数(占位符)
传⼊简单参数,如 int ,String等,不⽤写参数类型(parameterType),如果传⼊的是对象,就需要写
在Mybatis中,有两种占位符
#{} 解析传递进来的参数数据
${} 对传递进来的参数原样拼接在SQL中
结果映射<resultMap>
简单映射
显⽰配置resultMap
<resultMap type="mybatis_test.Student" id="citiesMap">...</resultMap>
<select id="findById" parameterType="int" resultMap="citiesMap">...</select>
select标签的resultMap属性=显⽰配置的resultMap标签的id属性
不配置resultMap
resultType属性为类的全限定名(需要保证表字段和类属性相同,如果不同,可以在select语句中设置别名select user_city as
或者显⽰配置resultMap做字段和属性的对应关系)
<select id="findById" parameterType="int" resultType="mybatis_test.Student">...</select>
resultType属性为类的别名
<!-- l 中 -->
<typeAlias type="mybatis_test.Studentr" alias="Studentr"/>
<!-- SQL 映射 XML 中 -->
<select id="selectUsers" resultType="Studentr">...</select>
⾼级结果映射
需要显⽰配置resultMap
resultMap的属性
属性描述
id当前命名空间中的⼀个唯⼀标识,⽤于标识⼀个结果映射。
type类的完全限定名, 或者⼀个类型别名。
autoMapping 如果设置这个属性,MyBatis 将会为本结果映射开启或者关闭⾃动映射。这个属性会覆盖全局的属性 autoMappingBehavior。默认值:未设置(unset)。
resultMap的⼦标签
constructor - ⽤于在实例化类时,注⼊结果到构造⽅法中
idArg - ID 参数;标记出作为 ID 的结果可以帮助提⾼整体性能
arg - 将被注⼊到构造⽅法的⼀个普通结果
id – ⼀个 ID 结果;标记出作为 ID 的结果可以帮助提⾼整体性能
result – 注⼊到字段或 JavaBean 属性的普通结果
association – ⼀个复杂类型的关联;许多结果将包装成这种类型
嵌套结果映射 – 关联可以是 resultMap 元素,或是对其它结果映射的引⽤
collection – ⼀个复杂类型的集合
嵌套结果映射 – 集合可以是 resultMap 元素,或是对其它结果映射的引⽤
discriminator – 使⽤结果值来决定使⽤哪个 resultMap
case – 基于某些值的结果映射
嵌套结果映射 – case 也是⼀个结果映射,因此具有相同的结构和元素;或者引⽤其它的结果映射id和result的属性
属性描述
property 映射到列结果的字段或属性。如果 JavaBean 有这个名字的属性(property),会先使⽤该属性。否则 MyBatis 将会寻给定名称的字段(field)。⽆论是哪⼀种情形,你都可以使⽤常见的点式分隔形式进⾏复杂属性导航。⽐如,你可以这样映射⼀些简单的东西:“username”,或者映射到⼀些复杂的东西上:“address.street.number”。
column数据库中的列名,或者是列的别名。⼀般情况下,这和传递给String(columnName)⽅法的参数⼀样。
javaType ⼀个 Java 类的全限定名,或⼀个类型别名(关于内置的类型别名,可以参考上⾯的表格)。如果你映射到⼀个JavaBean,MyBatis 通常可以推断类型。然⽽,如果你映射到的是 HashMap,那么你应该明确地指定 javaType 来保证⾏为与期望的相⼀致。
jdbcType JDBC 类型,所⽀持的 JDBC 类型参见这个表格之后的“⽀持的 JDBC 类型”。只需要在可能执⾏插⼊、更新和删除的且允许空值的列上指定 JDBC 类型。这是 JDBC 的要求⽽⾮ MyBatis 的要求。如果你直接⾯向 JDBC 编程,你需要对可以为空值的列指定这个类型。
typeHandler 我们在前⾯讨论过默认的类型处理器。使⽤这个属性,你可以覆盖默认的类型处理器。这个属性值是⼀个类型处理器实现类的全限定名,或者是类型别名。
constructor 的属性
属性描述
column数据库中的列名,或者是列的别名。⼀般情况下,这和传递给String(columnName)⽅法的参数⼀样。
javaType ⼀个 Java 类的完全限定名,或⼀个类型别名(关于内置的类型别名,可以参考上⾯的表格)。如果你映射到⼀个JavaBean,MyBatis 通常可以推断类型。然⽽,如果你映射到的是 HashMap,那么你应该明确地指定 javaType 来保证⾏为与期望的相⼀致。
jdbcType JDBC 类型,所⽀持的 JDBC 类型参见这个表格之前的“⽀持的 JDBC 类型”。只需要在可能执⾏插⼊、更新和删除的且允许空值的列上指定 JDBC 类型。这是 JDBC 的要求⽽⾮ MyBatis 的要求。如果你直接⾯向 JDBC 编程,你需要对可能存在空值的列指定这个类型。
typeHandler 我们在前⾯讨论过默认的类型处理器。使⽤这个属性,你可以覆盖默认的类型处理器。这个属性值是⼀个类型处理器实现类的完全限定名,或者是类型别名。
select ⽤于加载复杂类型属性的映射语句的 ID,它会从 column 属性中指定的列检索数据,作为参数传递给此 select 语句。具体请参考关联元素。
resultMap 结果映射的 ID,可以将嵌套的结果集映射到⼀个合适的对象树中。它可以作为使⽤额外 select 语句的替代⽅案。它可以将多表连接操作的结果映射成⼀个单⼀的ResultSet。这样的ResultSet将会将包含重复或部分数据重复的结果集。为了将结果集正确地映射到嵌套的对象树中,MyBatis 允许你 “串联”结果映射,以便解决嵌套结果集的问题。想了解更多内容,请参考下⾯的关联元素。
name构造⽅法形参的名字。从 3.4.3 版本开始,通过指定具体的参数名,你可以以任意顺序写⼊ arg 元素。参看上⾯的解释。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。