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的键值:
order:可以被设置为BEFORE或者AFTER。如果设置为BEFORE,那么它会首先选择主键,设置keyProperty然后执行插入语句。如果设置为AFTER,那么闲执行插入语句,然后是selectKey元素。<insert id="addUser" parameterType="user" > <selectKey keyProperty="id" order="BEFORE"> select UUID() </selectKey> insert into user(id,name) values(#{id},#{name}) </insert>
(3)keyColumn(仅对insert和update有用):通过生产的键值设置表中的列名,这个设置仅对某些数据库(如PostgreSQL)是必须的,当主键列不是表中的第一列时需要设置。如果希望得到多个生成的列,也可以是逗号分隔的属性名称列表。
resultMap:
用于映射当ResultType不能映射时的返回值,ResultType用于将查询结果映射为pojo对象,但是要求
pojo的属性和sql数据列名一致,如果不一致,就必须使用resultMap实现自定义的复杂结果映射。
例如:
结果映射失败,返回结果为null<select id="rsMap" resultType="com.domain.User"> select id num,name username from user where id=1 </select>
对于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:映射到的对象属性。