ResultMap手动映射
在使用ResultType时,我们需要pojo类中的字段与数据表一一对应,如果不一样我们需要手动映射
使用方法:
<!--
id:ResultMap标识,标签语句中 resultMap的值必须和该id一致
type:指定你要映射哪一个JavaBean
如果字段名和成员名一样,则可以不用指定映射关系,需要开启autoMapping
-->
<resultMap id="resultMap1" type="com.wzx.pojo.Order">
<!--在这里要指定数据库表字段和JavaBean成员变量之前的映射关系-->
<!--先指定主键字段和成员之间的映射关系-->
<id column="id" property="id"></id>
<!--先指定非主键字段和成员之间的映射关系
column:字段名
property:成员变量名
-->
<result column="user_id" property="userId"></result>
<result column="number" property="number"></result>
<result column="createtime" property="createtime"></result>
<result column="note" property="note"></result>
</resultMap>
<select id="queryAllOrders" resultMap="resultMap1">
SELECT id,user_id,number,createtime,note FROM orderx
</select>
多表查询
如果使用ResultType,我们需要每次都要新建一个多表对应的pojo类,这里我们使用ResultMap来实现。
ResultMap使用笔记:
问题:mybatis一对多查询时有查询到多条记录但是集合中只有一条数据:
解决方法:User表和Oder表中有重复的列名,此时需要在select语句中给重复的列起别名
mybatis的ofType和javaType使用情境
一对一中使用association标签来的时候javatype用来指定连接的令一个表所对应的pojo类
一对多中使用collection标签,用oftype来指定集合中的元素类型
使用范例:
一对一
resultMap与association 配置映射:订单与用户属于一对一的关系
- 在需要使用实现多表查询的pojo类中添加另外一个pojo类
接口
public interface OrderDao {
List<Order> findOrder();
}
使用
</select>
<!-- 一对一关系,一个订单对应的用户数据-->
<resultMap id="order_user" type="com.glc.bean.Order">
<!--先指定Order类中User类属性和字段之间的映射关系
property:表示Order类中User类对象的名字
javaType:表示Order类中包含的User类的全路径名
autoMapping:表示如果字段名和属性名一致,则自动映射
-->
<id property="id" column="id"></id>
<association property="user" javaType="com.glc.bean.user" autoMapping="true">
<id property="id" column="id"></id>
</association>
</resultMap>
<select id="findOrder" resultMap="order_user">
select * from `order` left join user on user.id=`order`.user_id
</select>
测试类
@org.junit.Test
public void TestFindOrder(){
//获得session对象
SqlSession sqlsessio = MySessionUtils.getSession();
OrderDao mapper = sqlsessio.getMapper(OrderDao.class);
List<Order> orderList= mapper.findOrder();
System.out.println(orderList);
//调用getMapper
sqlsessio.commit();
sqlsessio.close();
//查询订单
//关闭连接
}
一对多
resultMap与collection配置映射:通过用户id查找到所有的用户订单
pojo类
public class user {
private int id;
private String username;
private Date birthday;
private int sex;
private String address;
private List<Order> orders;
接口
public interface UserDao {
user findUserOrder(int user_id);
}
配置文件
<resultMap id="UserOrder" type="com.glc.bean.user" autoMapping="true">
<id property="id" column="id" ></id>
<collection property="orders" ofType="com.glc.bean.Order" autoMapping="true">
<id property="id" column="`order`.id"></id>
<result column="user_id" property="userid"></result>
</collection>
</resultMap>
<select id="findUserOrder" resultMap="UserOrder">
select * from user left join `order` on user.id=`order`.user_id where user.id =#{user_id}
</select>
测试类
public void TestFindUserOrder(){
//获得session对象
SqlSession sqlsessio = MySessionUtils.getSession();
UserDao mapper = sqlsessio.getMapper(UserDao.class);
user user= mapper.findUserOrder(1);
System.out.println(user);
//调用getMapper
sqlsessio.commit();
sqlsessio.close();
//查询订单
//关闭连接
}