1.4使用resultMap映射结果集
我们在前面学习了自动映射,但是在某些时候,我们需要处理更为复杂的映射,resultMap为我们提供了这样的模式,我们需要在映射器中定义resultMap
例如:
<resultMap id="roleResultMap" type="com.Role">
<id property="id" column="id" />
<result property="roleName" column="role_name" />
<result property="note" column="note" />
</resultMap>
<select parameterType="Long" id="getRole" resultMap="roleResultMap">
select id, role_name, note from t_role where id= #{id}
</select>
下面我们学习上面的resultMap的配置:
1)定义了一个唯一标识为roleResultMap的resultMap,用type属性去定义它对应的是那个javaBean。
2)其中的通过id元素定义roleResultMap,这个对象代表着使用哪个属性作为其主键。
3)result元素定义不同列的映射关系,例如把SQL结果返回的列role_name和type属性定义javaBean的属性roleName等做一一对应。
4)这样select语句就不再需要使用自动映射的规则,直接用resultMap属性指定roleResultMap即可,这样MyBatis就会使用我们的自定义映射规则。
resultMap其实很复杂,上面的只能算是简单的了解,深入学习还需我们努力学习。
2.insert元素
insert元素相对于select元素而言要简单许多。MyBatis会在执行插入之后返回一个整数,以表示你进行操作后插入的记录数。
<insert parameterType="role" id="insertRole">
insert into t_role(role_name,note) values(#{roleName},#{note})
</insert>
2.1主键回填和自定义
1.例如,主键自增字段,MySQL里面的主键需要根据一些特殊的规则去生成,再插入后我们往往需要获得这个主键,以便于未来的操作,二MyBatis提供了实现的方法。
1)首先我们可以使用keyProperty属性指定哪个是主键字段,同时useGeneratedKeys属性告诉MyBatis这个主键是否使用数据库内置策略生成。
例子:
<insert id="insertRole" parameterType="role" useGeneratedKeys="true" keyProperty="id">
insert into t_role(role_name,note) values (#{roleName},#{note})
</insert>
上面的id列为自增字段,这样我们传入的role对象就无需设置id的值,MyBatis会用数据库的设置进行处理。这样做的好处是在MyBatis插入的时候他会回填JavaBean的id值。
2.假设我们取消表t_role的id自增的规则,我们的要求是:如果表t_role没有记录,则我们需要设置id=1,否则我们就取最大id加2,来设置新的主键,对于一些特殊要求,MyBatis也会提供了对应方法。
这时我们可以使用selectKey元素进行处理
<insert id="insertRole" parameterType="role" useGeneratedKeys="true" keyProperty="id">
<selectKey keyProperty="id" resultType="int" order="BEFORE">
select if(max(id) is null,1,max(id)+2) as newId from t_role
</selectKey>
insert into t_role(id,role_name,note) values (#{id},#{roleName}.#{note})
</insert>
这样我们就能定义自己的规则来生成主键了。
3.update元素和delete元素
和insert元素一样,MyBatis执行完update元素和delete元素后返回一个整数,标出执行后影响的条数记录。
配置例子如下:
<update parameterType="role" id="updateRole">
update t_role set role_name= # {roleName},note =#{note} Where id= #{id}
</update>
<delete id="delete" parameterType="long">
delete from t_role where id =# {id}
</delete>
插入和删除执行完成MyBatis会返回一个整数显示更新或删除了几条记录。