MyBatis的Mapper XML映射文件配置解析

1.一般配置Mapper XML映射文件可按如下方式:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.mapper.UserMapper">
	<select id="getUserById" parameterType="int" resultType="com.domain.User">
		select * from user where id = #{id}
	</select>
	<select id="getAllUser" resultType="user" parameterType="string">
		select * from user where name like '${value}%'
	</select>
	<select id="getUser" resultType="com.domain.User" parameterType="hashmap">
		select * from user where name=#{name}		
	</select>
	<insert id="addUser" parameterType="com.domain.User" useGeneratedKeys="true" keyProperty="id">
		insert into user(name) values(#{name})
	</insert>
	<update id="updateUser" parameterType="com.domain.User">
		update user set name=#{name} where id=#{id}
	</update>
	<delete id="deleteUser" parameterType="int">
		delete from user where id=#{id}
	</delete>
	<select id="rsMap" resultMap="userResultMap">
		select id num,name username from user where id=1
	</select>
	<resultMap type="com.domain.User" id="userResultMap">
		<id column="num" property="id"/>
		<result column="username" property="name"/>
	</resultMap>
</mapper>

2.映射文件中#,$的解释:

#{参数名}:表示的是占位符,可以避免sql注入攻击,如果是基本数据类型,那么参数可以任意定义,但如果参数名是对象类型,那么参数名必须是属性名。

${参数名}:表示的是拼接符,不能避免sql注入攻击,如果参数是基本数据类型,那么参数名必须是value,但如果参数名是对象类型,那么参数名必须是属性名。

开发中使用#{}较多,但是某些地方使用${}较好,比如:模糊查询(like)

定义语句:select * from user where name like ‘${value}%’  --->参数传值  张

执行语句:select * from user where name like ‘张%’

定义语句:select * from user where name like ‘#{value}%’  --->参数传值  张

执行语句:select * from user where name like ‘‘%(错误语句)

除非:定义语句select * from user where name like #{value}  ---> 传值需要传 张%

3.映射文件常用元素如下:

select:映射查询语句。

insert:映射插入语句。

update:映射更新语句。

delete:映射删除语句。

sql:可被其他语句引用的可重用语句块。

cache:给定命名空间的缓存配置。

cache-ref:其他命名空间缓存配置的引用。

resultMap:用来描述如何从数据库结果集中加载对象。

4.常用元素的属性的描述如下:

select:

(1)id:在命名空间中唯一的标识,可以被用来引用这条语句,一般对应DAO的方法名(与方法名一致)。

(2)parameterType:将会传入这条语句的参数类的完全限定名或别名。这个属性为可选属性,因为MyBatis可以通过TypeHandler推断出具体传入语句的参数,默认值为unset。

如果在传值时传入的是包装对象:可以在映射文件中使用:属性.属性的方式,可参考如下方式:

<select id="getUserById" parameterType="pople" resultType="com.mapper.User">
	select * from user where name=#{user.name}
</select>

(3)resultType:从这条语句中返回的期望类型的类的完全限定名或别名。将查询结果映射为pojo对象,但是要求pojo的属性和sql数据列名一致,如果不一致,就必须使用ResultMap实现自定义的复杂结果映射。

注意:如果返回的单个结果,就必须保证sql语句执行获取的结果是单个数据。如果是集合情形,那应该是集合可以包含的类型,而不能是集合本身。不能与resultMap同时使用。


insert、update、delete:

(1)useGeneratedKeys(仅对insert和update有用):这会使得MyBatis使用JDBC的,getGeneratedKeys方法来获取由数据库内部生产的主,键默认为false。

(2)keyProperty(仅对insert和update有用):唯一标记一个属性,MyBatis会通过getGeneratedKeys的返回值或者通过insert语句的selectKey子元素设置它的键值,默认为unset。如果希望得到多个生成的列,也可以是逗号分隔的属性名称列表。

例如:

通过getGeneratedKeys的返回值设置keyProperty的键值:

	<insert id="addUser" parameterType="user" useGeneratedKeys="true" keyProperty="id">
		insert into user(name) values(#{name})
	</insert>

通过selectKey设置keyProperty的键值:

	<insert id="addUser" parameterType="user" >
		<selectKey keyProperty="id" order="BEFORE">
		 select UUID()
		</selectKey>
		insert into user(id,name) values(#{id},#{name})
	</insert>
order:可以被设置为BEFORE或者AFTER。如果设置为BEFORE,那么它会首先选择主键,设置keyProperty然后执行插入语句。如果设置为AFTER,那么闲执行插入语句,然后是selectKey元素。

(3)keyColumn(仅对insert和update有用):通过生产的键值设置表中的列名,这个设置仅对某些数据库(如PostgreSQL)是必须的,当主键列不是表中的第一列时需要设置。如果希望得到多个生成的列,也可以是逗号分隔的属性名称列表。


resultMap:

用于映射当ResultType不能映射时的返回值,ResultType用于将查询结果映射为pojo对象,但是要求

pojo的属性和sql数据列名一致,如果不一致,就必须使用resultMap实现自定义的复杂结果映射。

例如:

<select id="rsMap" resultType="com.domain.User">
	select id num,name username from user where id=1
</select>
结果映射失败,返回结果为null

对于sql数据列和pojo属性不一致的结果处理:

<select id="rsMap" resultMap="userResultMap">
	select id num,name username from user where id=1
</select>
<resultMap type="com.domain.User" id="userResultMap">
	<id column="num" property="id"/>
	<result column="username" property="name"/>
</resultMap>

<id/>:表示查询结果的唯一标识映射,如果是复合主键那么就有多个<id/>。

<result/>:普通结果映射。

column:sql查询结果的列名。

property:映射到的对象属性。







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值