Mapper XML文件是MyBatis的核心所在,为程序的编写节省了很多的代码。
SQL映射文件有很少的几个顶级元素:
- cache 给定命名空间的缓存配置
- cache-ref 其他命名空间缓存配置的引用
- resultMap 最复杂最强大的元素,用来描述如何从数据库结果集中来加载对象
- sql SQL代码片段,可以被其他语句引用
- insert 映射插入语句
- update 映射更新语句
- select 映射选择语句
- delete 映射删除语句
select
1、用法
<select id="selectUserByID" parameterType="int" resultType="indi.latch.mybatis.pojo.UserPojo">
SELECT * FROM test.user WHERE id=#{id};
</select>
2、表示含义
上面的语句被称为“selectUserByID”,看到SQL语句表示根据ID来查询获取对应的用户信息,接受一个int类型的参数,并返回一个UserPojo类型的对象。
3、解释
3.1、属性
属性 | 描述 |
---|---|
id | 在当前的命名空间里,是唯一的标识符。可以用作来引入表示的SQL语句。 |
parameterType | 将会传入对应SQL语句中的参数的类型或别名。为可选,默认值为unset。 |
resultType | 对应SQL语句返回的单条结果表示的类型或别名(即,如果返回的结果是集合,则应该是集合包含的类型,而不是集合本身)。resultType和resultMap不能同时使用 |
3.2、参数
#{id}
表示的是parameterType所指定参数类型的对应的参数的值。另外,需要注意,如果parameterType所指定的是简单类型,如int、float等这些,那么#{}中的值(即id)可以表示为任何形式,你可以写成#{value}、#{name}等等这些都可以。但是如果parameterType所指定的类型是POJO类型,那么${}中的值则只能为POJO中对应的属性名。
4、其他说明
select映射除了以上的属性外,还可以配置更多的属性来决定每条语句的作用细节。如:
<select
id="selectPerson"
parameterType="int"
parameterMap="deprecated"
resultType="hashmap"
resultMap="personResultMap"
flushCache="false"
useCache="true"
timeout="10000"
fetchSize="256"
statementType="PREPARED"
resultSetType="FORWARD_ONLY">
各属性表示的含义为:
属性 | 描述 |
---|---|
resultMap | 外部resultMap的命名引用。接下来会有更详细的说明 |
flushCache | 将其设置为true时,任何时候只要语句被调用,都会导致本地缓存和二级缓存都会被清空,默认为false| |
useCache | 将其设置为true时,将会导致本条语句的结果被二级缓存,默认值为:对select元素为true |
timeout | 在抛出异常之前,驱动程序等待数据库返回请求结果的秒数。默认值为unset |
fetchSize | 设置驱动程序每次批量返回的结果行数和这个设置相等。默认值为unset,依赖于驱动 |
statementType | STATEMENT、PREPARED、CALLABLE的一个,分别让MyBatis使用Statement、PreparedStatement、CallableStatement。默认值为PREPARED。(需要更加深入的了解这三种在JDBC中的使用)| |
resultSetType | FORWARD_ONLY、SCROLL_SENSITIVE或SCROLL_INSENSITIVE中的一个,默认为unset |
databaseId | 如果配置了databaseIdProvider,MyBatis会加载所有的不带databaseId或匹配当前databaseId的语句;如果带或者不带的语句都有,则不带的会被忽略。(不明白)| |
resultOrdered | 这个是针对嵌套结果select语句的。如果设置为true,就是假设包含了嵌套结果集或是分组,这样当返回一个主结果行的时候,就不会发生对前面结果集的引用,不至于在获取嵌套结果集时出现内存不足的情况。默认为false。(不熟悉) |
resultSets | 这个设置仅对多结果集的情况适用,它将列出语句执行后返回的结果集并为每个结果集给一个名称,名称采用逗号分隔。 |
insert, update和delete
1、用法
SQL语句中,insert,update和delete的实现都是非常接近的,在MyBatis中也是如此。如:
<!--新增加用户-->
<insert id="insertUser" parameterType="indi.latch.mybatis.pojo.UserPojo">
INSERT INTO `test`.`user`
(
`name`,
`pass`,
`sex`,
`address`
)
VALUES
(
#{name},
#{pass},
#{sex},
#{address}
)
</insert>
<delete id="delUserByID" parameterType="int">
DELETE FROM test.user WHERE id = #{id};
</delete>
<update id="updateUserByID" parameterType="indi.latch.mybatis.pojo.UserPojo">
UPDATE test.user SET name = #{name}, pass = #{pass}, sex=#{sex}, address=#{address} WHERE id = #{id};
</update>
2、表示含义
2.1、insert表示向test数据库中的user表中插入新的用户,参数类型为UserPojo用户类,所以#{}中为POJO类的属性。
2.2、delete表示删除id指定的用户。参数类型为int,简单类型,所以#{}中可以用任何值表示。
2.3、update表示更新UserPojo中指定的用户信息。由于参数类型为UserPojo类,所以#{}中为POJO类的属性。
3、解释
此处省略,参见select。
4、其他说明
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">
各属性表示的含义为:
属性 | 描述 |
---|---|
id | 参见select |
parameterType | 参见select |
flushCache | 所表示的意思参见select。但是默认值相对于select会不同,对应于插入、删除和更新时默认值为true。 |
timeout | 参见select |
statementType | 参见select |
useGeneratedKeys | 此属性仅仅对insert和update有用,使MyBatis取出由数据库内部生成的主键,默认值为false。| |
keyProperty | 仅对insert和update有用,MyBatis会通过getGeneratedKeys的返回值或者insert语句的selectKey子元素设置它的键值。默认为unset。如果希望得到多个生成的列,也可以是逗号分隔的属性列表。 |
keyColumn | 仅对insert和update有用,通过生成的键值设置表中的列名,这个设置仅在某些数据库(PostgreSQL)是必须的,当主键列不是表中的第一列的时候需要设置。如果希望得到多个生成的列,也可以是逗号分隔的属性名称列表。 |
databaseId | 参见select |
5、插入语句返回主键
在insert、update和delete语句中,insert语句的配置规则更丰富,其可以配置一些其他的属性和子元素用来处理主键的生成,并且可以有多种方法。
5.1、自增主键的数据库
方法一 useGeneratedKeys
<!--新增加用户-->
<insert id="insertUser" parameterType="indi.latch.mybatis.pojo.UserPojo" useGeneratedKeys="true" keyProperty="id">
INSERT INTO `test`.`user`
(
`name`,
`pass`,
`sex`,
`address`
)
VALUES
(
#{name},
#{pass},
#{sex},
#{address}
)
</insert>
方法二 selectKey
<!--新增加用户-->
<insert id="insertUser" parameterType="indi.latch.mybatis.pojo.UserPojo">
<selectKey keyProperty="id" resultType="int" order="AFTER">
SELECT LAST_INSERT_ID()
</selectKey>
INSERT INTO `test`.`user`
(
`name`,
`pass`,
`sex`,
`address`
)
VALUES
(
#{name},
#{pass},
#{sex},
#{address}
)
</insert>
5.2、非自增主键的数据库
<!--新增加用户-->
<insert id="insertUser" parameterType="indi.latch.mybatis.pojo.UserPojo">
<selectKey keyProperty="id" resultType="int" order="BEFORE">
SELECT SEQ_TEST.NEXTVAL FROM DUAL
</selectKey>
INSERT INTO `test`.`user`
(
`name`,
`pass`,
`sex`,
`address`
)
VALUES
(
#{name},
#{pass},
#{sex},
#{address}
)
</insert>
5.3、属性说明
属性 | 描述 |
---|---|
keyProperty | selectKey语句结果应该被设置的目标属性。如果希望得到多个生成的列,可以是逗号分隔的属性名称列表。 |
keyColumn | 匹配属性的返回结果集中的列名称。如果希望得到多个生成的列,可以是逗号分隔的属性名称列表。 |
order | 可以设置为BEFORE或者AFTER。如果为BEFORE,则会首先选择主键,设置keyProperty然后执行插入语句。如果为AFTER,那么先执行插入语句,然后是selectKey元素。 |
sql
1、定义可重用的SQL代码段。如:
<sql id="userColumns"> id,name,pass </sql>
<select id="selectUsers" resultType="map">
select
<include refid="userColumns">
from test.user
</select>
2、属性值可以用于包含的refid属性或者包含的子句里面的属性值。如:
<sql id="sometable">
${prefix}Table
</sql>
<sql id="someinclude">
from
<include refid="${include_target}"/>
</sql>
<select id="select" resultType="map">
select
field1, field2, field3
<include refid="someinclude">
<property name="prefix" value="Some"/>
<property name="include_target" value="sometable"/>
</include>
</select>
参数
1、#{}
当参数类型为简单类型时,#{}
中的内容可以被设置为任何内容;而如果参数类型为复杂的对象,则只能为对应的属性名。
2、${}
当参数类型为简单类型时,${}
中的内容只能为value,即只能写成${value};而如果参数类型为复杂的对象,则需要写成对应的属性名。