MyBatis(3)Mapper XML文件

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,依赖于驱动
statementTypeSTATEMENT、PREPARED、CALLABLE的一个,分别让MyBatis使用Statement、PreparedStatement、CallableStatement。默认值为PREPARED。(需要更加深入的了解这三种在JDBC中的使用)|
resultSetTypeFORWARD_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、属性说明

属性描述
keyPropertyselectKey语句结果应该被设置的目标属性。如果希望得到多个生成的列,可以是逗号分隔的属性名称列表。
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};而如果参数类型为复杂的对象,则需要写成对应的属性名。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值