结果集如何映射
ResultType方式
ResultType方式适用于数据库结果集可以直接映射成一个Java类的情况
Java实体类:
@Getter //这三个注解需要依赖 lombok jia包
@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.lanou3g.bean.User">
select * from user
</select>
解决数据库列名与Java类中属性名不一致的映射问题
用 column 属性 与 sql 语句查询出来的 字段名相对性
如果是在数据库字段名只用的是以下划线分割的字符串,而jopo使用的是驼峰的命名规则,则可以在 mybatis的配置文件中 开启 小驼峰映射。
ResultMap方式
ResultMap方式适用于复杂的结果集映射,比如数据库返回的结果集中的列名和JavaBean无法一一对应,或者对象间存在一对一、一对多关联映射时。
<settings>
<setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>
<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>
其实,如果遇到单纯字段名和属性名不对应的情况,使用别名的方式更简单
对象与容器映射问题
上述的resultMap的示例只是说明映射对象为全是基础的属性。
下面解决属性为对象以及容器类型。
前提
所需类
//类一 Author
@Setter
@Getter
@ToString
public class Author {
private Integer id;
private String name;
private BookCom magnumOpus;
private List<Book> book;
}
//类二
@Setter
@Getter
@ToString
public class BookCom {
private Integer cid;
private Integer bcid;
private String bookComName;
}
//类三
@Setter
@Getter
@ToString
public class Book {
private Integer uid;
private Integer bid;
private String bookName;
}
所需接口
public interface BookMapper {
//进行下面1对1映射
public Author selectOneBook(Integer id);
//进行下面一对多映射
public List<Author> findAllAuthor();
}
Bookmapper.xml配置
<resultMap id="authorMap" type="com.sen.mybatis.Bean.Author">
<id column="id" property="id"/>
<result column="name" property="name"/>
<association property="magnumOpus" javaType="com.sen.mybatis.Bean.BookCom" resultMap="BookComMap" />
<collection property="book" ofType="com.sen.mybatis.Bean.Book" resultMap="BookMap"/>
</resultMap>
解决一对一映射查询问题
<resultMap id="BookComMap" type="com.sen.mybatis.Bean.BookCom">
<id column="bcid" property="cid"/>
<result column="id" property="bcid"/>
<result column="bookComName" property="bookComName"/>
</resultMap>
<select id="selectOneBook" resultMap="authorMap">
SELECT
a.id,
a.`name` `name`,
b.id uid,
b.`name` bookName,
bc.id bcid,
bc.`name` bookComName
FROM
author a
LEFT JOIN bookcom bc ON a.id = bc.u_id
LEFT JOIN book b ON b.u_id = a.id
WHERE a.id = 1;
</select>
解决一对多映射查询问题
<resultMap id="BookMap" type="com.sen.mybatis.Bean.Book">
<id column="uid" property="uid"/>
<result column="id" property="bid"/>
<result column="bookName" property="bookName"/>
</resultMap>
<select id="findAllAuthor" resultMap="authorMap">
SELECT
a.id,
a.`name` `name`,
b.id uid,
b.`name` bookName,
bc.id bcid,
bc.`name` bookComName
FROM
author a
LEFT JOIN bookcom bc ON a.id = bc.u_id
LEFT JOIN book b ON b.u_id = a.id;
</select>