Mybatis参数深入:
parameterType 配置参数
- 使用标签的 parameterType 属性来设定。该属性的取值可以是基本类型,引用类型(例如:String 类型),还可以是实体类类型(POJO 类)。同时也可以使用实体类的包装类
- 基 本 类 型 和 String 我 们 可 以 直 接 写 类 型 名 称 , 也 可 以 使 用 包 名 . 类 名 的 方 式 , 例 如 : java.lang.String
- 实体类类型,目前我们只能使用全限定类名。究其原因,是 mybaits 在加载时已经把常用的数据类型注册了别名,从而我们在使用时可以不写包名,而我们的是实体类并没有注册别名,所以必须写全限定类名。
参数绑定
-
当DAO接口方法中只存在一个参数,并且类型为基本类型及其包装类或者String类型时,则变量名称与mapper中#{}中的名字没有任何关系
public interface IUserMapper{ public User queryUserById(int id); }
<select id="queryUserById" parameterType="int" resultType="com.mg.entity.User"> select * from user where id=#{uid} </select>
-
mapper文件中可通过下标来写,下标起始为0 (可读性差)
public interface IUserMapper{ public User query(String name,String password); }
<select id="query" resultType="com.mg.entity.User"> select * from user where name=#{0} and password=#{1} </select>
-
注解方式
public interface IUserMapper{ public User query(@Param("name")String name,@Param("pwd")String password); }
<select id="query" resultType="com.mg.entity.User"> <!--#{}里面的内容要和注解里的一致--> select * from user where name=#{name} and password=#{pwd} </select>
-
使用Map
public interface IUserMapper{ public User query(Map<String,String> params); }
实际使用中对map进行赋值
params.put("name","aa"); params.put("pwd","123");
<select id="query" parameterType="map" resultType="com.mg.entity.User"> <!--#{}里面的内容要和map里的一致--> select * from user where name=#{name} and password=#{pwd} </select>
-
传递POJO包装类对象
查询条件是综合的,比如查询时的信息不仅包含用户信息还包含购买商品的信息。这时就可以通过POJO类传递查询条件。
新建QueryVo类
public class QueryVo{ private User user; ………其他属性,比如商品的……… get/set方法 }
持久层接口中
List<User> findUserByVo(QueryVo vo);
映射配置文件中
<select id="findUserByVo" parameterType="com.mg.QueryVo" resultType="com.mg.entity.User"> select * from user where username like #{user.username} </select>
细节:
#{user.username}要先写QueryVo的属性,再写user的属性
Mybatis输出结果封装:
resultType配置结果集
- resultType 属性可以指定结果集的类型,它支持基本类型和实体类类型。
- 和 parameterType 一样,如果注册过类型别名的,可以直接使用别名。没有注册过的必须使用全限定类名。
- 当是实体类名称是,实体类中的属性名称必须和查询语句中的列名保持一致,否则无法实现封装。 当不一致时需要以下解决方案
解决实体类中的属性名称和查询语句中的列名不一致问题
例如:实体类中属性为userId,userName,userAddress
数据库表中列名为id,username,address
-
通过as起别名(执行效率高,如果查询很多书写起来很麻烦)
<select id="findAll" resultType="com.mg.entity.User" > <!--username不做别名也可以,因为mysql 在 windows 系统中不区分大小写!--> select id as userId,username as userName,address as userAddress from user </select>
-
通过resultMap(因为要多解析一段xml执行效率要比起别名慢,但是开发效率高,只需要写一遍以后直接饮用即可)
<!-- 建立 User 实体和数据库表的对应关系 type 属性:指定实体类的全限定类名 id 属性:给定一个唯一标识,是给查询 select 标签引用用的。 --> <resultMap type="com.mg.entity.User" id="userMap"> <id column="id" property="userId"/> <result column="username" property="userName"/> <result column="address" property="userAddress"/> </resultMap> id 标签:用于指定主键字段 result 标签:用于指定非主键字段 column 属性:用于指定数据库列名 property 属性:用于指定实体类属性名称 <!-- 配置查询所有操作,此时直接引用定义的resultMap就可以了 --> <select id="findAll" resultMap="userMap"> select * from user </select>