1深入Mybatis映射配置文件
1.1查询语句
接口中
List<User> queryAllUser();
User queryUserById(Integer id);
xml配置文件中
<select id="queryAllUser" resultType="user">
select * from user
</select>
<select id="queryUserById" resultType="user">
select * from user where id = #{id}
</select>
1.2插入语句
接口中
int insertUser(User user);
xml配置文件中
<insert id="insertUser">
insert into user (username,nick_name,email)
values (#{username},#{nickName},#{email})
</insert>
1.3删除语句
接口中
void deleteUserById(Integer id);
XML配置中
<delete id="deleteUserById">
delete from user where id = #{id}
</delete>
1.4更新语句
接口中
void updateUser(User user);
XML配置中
<update id="updateUser">
update user set password = #{password} where id = #{id}
</update>
1.5当接口中参数和XML配置取值时名称不一样时
在接口中的参数前加注解
User queryUserById(@Param("id") Integer xxxxxxxId);
在XML中取值时用注解指定的名称
<select id="queryUserById" resultType="user">
select * from user where id = #{id}
</select>
2.#{}与${}的区别
* 它俩都可以获取接口调用中传递过来的参数
* #{}会将参数作为占位符,使用预编译语句(PreparedStatement)执行
* ${}会直接用实际参数替换${}, 参数可以作为SQL的一部分。
在某些特殊场合下只能用${},不能用#{}。例如:在使用排序时ORDER BY ${id},如果使用#{id},则会被解析成ORDER BY “id”,这显然是一种错误的写法。
3.结果集如何映射
3.1ResultType方式
ResultType方式适用于数据库结果集可以直接映射成一个Java类的情况
Java实体类:
@Getter
@Setter
@ToString
public class User {
private Integer id;
private String username;
private String nickName;
private String password;
private String email;
private Timestamp lastLoginTime;
}
使用方法:
<select id="queryAllUser" resultType="com.mybatis.bean.User">
select * from user
</select>
3.2ResultMap方式
ResultMap方式适用于复杂的结果集映射,比如数据库返回的结果集中的列名和JavaBean无法一一对应,或者对象间存在一对一、一对多关联映射时。
解决数据库列名与Java类中属性名不一致的映射问题
<mapper>
...
<resultMap id="userMap" type="user">
<id property="id" column="id" />
<result property="username" column="username" />
<result property="lastLoginttime" column="last_login_time" />
<result property="email" column="email" />
<result property="nickName" column="nick_name" />
</resultMap>
...
</mapper>
在查询语句中将resultType换成resultMap
<select id="queryAllUser" resultMap="userMap">
select * from user
</select>
解决一对一映射查询问题
实体类
@Getter
@Setter
@ToString
public class King {
private Integer id;
private String name;
private Queen queen; //一个对象中的属性引用了另一个对象
}
@Getter
@Setter
@ToString
public class Queen {
private Integer id;
private Integer kId;
private String name;
}
映射文件
<resultMap id="kingMap" type="king">
<id column="kid" property="id" />
<result column="kname" property="name" />
<!-- 一对一映射关系 -->
<association property="queen" javaType="queen" resultMap="queenMap" columnPrefix="queen_"/>
</resultMap>
<resultMap id="queenMap" type="queen">
<id column="id" property="id" />
<result column="name" property="name" />
<result column="king_id" property="kId" />
</resultMap>
<select id="findKingById" resultMap="kingMap" useCache="true">
SELECT
k.id kid,
k.`name` kname,
q.id queen_id,
q.`name` queen_name,
k.id queen_king_id
FROM
king k
LEFT JOIN queen q ON k.id = q.k_id
WHERE
k.id = 27
</select>
解决一对多映射查询问题
实体类
@Getter
@Setter
@ToString
public class King {
private Integer id;
private String name;
private List<Girl> girls; // 一个对象的属性引用了若干个其他类型的对象
}
@Getter
@Setter
@ToString
public class Girl {
private Integer id;
private Integer kId;
private String name;
}
映射文件
<resultMap id="kingMap" type="king">
<id column="kid" property="id" />
<result column="kname" property="name" />
<!-- 一对多映射关系 -->
<collection property="girls" ofType="girl" resultMap="girlMap" columnPrefix="girl_" />
</resultMap>
<resultMap id="girlMap" type="girl">
<id column="id" property="id" />
<result column="name" property="name" />
<result column="king_id" property="kId" />
</resultMap>
<select id="findKingById" resultMap="kingMap" useCache="true">
SELECT
k.id kid,
k.`name` kname,
g.id girl_id,
g.`name` girl_name,
k.id girl_king_id
FROM
king k
LEFT JOIN girl g ON g.k_id = k.id
WHERE
k.id = 27
</select>