一、基础知识
mybatis 规定 mapper.xml 中每一个 SQL 语句形式上只能有一个 @parameterType 和一个 @resultType
1)返回值是一个对象的集合,@resultType 中只能写该对象的类型,而不是写 List<T>
2)输入参数可以用 #{} 和 ${} 两种取值方法,两者区别与联系:
① 当传入类型为 JDBC 基本类型(8种java基本类型+String)时,#{} 里面可以写成任意值,${} 里面必须写 value
② 当传入类型为对象时,两种方式里面都应该写成类中属性名
③ #{} 方式传值会将传入的值当做一个字符串处理,会自动将其加入"",而 ${} 方式则不会
④ #{} 方式能够有效防止 SQL 注入,而 ${} 不会,因此能够用 #{} 就不要用 ${}
⑤ ${} 的适用场景是利用数据库中的字段动态排序等例如想要根据id排序
如果用 #{} 传入 id,SQL 语句会变成 order by "id" 这样的 SQL 语句不能排序,
因此只能用 ${} ,对应的 SQL 语句是 order by id 符合要求
二、输入映射 - parameterType、parameterMap(已废弃)
1)基本类型 - 当输入参数为JDBC基本类型,则可以直接用#{xxx}或者${value}取值
<select id="selectUserById" parameterType="int" resultType="com.sikiedu.beans.User"> SELECT * FROM user WHERE id = #{id} </select>
2)自定义对象 - 当输入参数为对象时,MyBatis使用ognl表达式解析对象字段的值,#{}或者${}括号中的值为pojo的属性名称
<insert id="insertUser" parameterType="com.sikiedu.beans.User"> INSERT INTO user VALUES(null,#{username},#{userpassword},#{balance},#{grgisterdate}) </insert> <update id="updateUser" parameterType="com.sikiedu.beans.User"> UPDATE user SET username = #{username} WHERE id = #{id} </update>
3)自定义包装类 - 开发中通过pojo传递查询条件,查询条件是综合的查询条件,不仅包括用户查询条件还包括其它的查询条件,这时可以使用包装对象传递输入参数。即一个pojo类的属性是另一个pojo类对象。
Vo包装类:
1 package com.sikiedu.beans; 2 3 import java.util.List; 4 5 public class UserVo extends User { 6 // 维护一个Role集合 7 private List<Role> roleList; 8 9 public List<Role> getRole() { 10 return roleList; 11 } 12 13 public void setRole(List<Role> roleList) { 14 this.roleList = roleList; 15 } 16 17 @Override 18 public String toString() { 19 return "UserVo [ID=" + getId() + "\t username=" + getUsername() + "\t Grgisterdate=" + getGrgisterdate() 20 + "\t role=" + roleList + "]"; 21 } 22 23 }