查询结果: 项目结构: 全局配置文件中扫描包:
需求: 根据用户的订单,查询出订单信息和该订单关联的用户信息(eg:用户名和地址) 一对一查询有两种实现: 建议:一般情况建议采用方式一,因为比较简单,不需要自己定义resultMap,如果出现查询出的列名与java中的pojo类中的属性名不对应,可以采用在查询语句中用别名的方式来解决.
方式一: 采用resultType方式二:采用resultMap用到的pojo类:
OrdersModel.java类package cn.com.yves.model;import java.util.Date;public class OrdersModel {//省篇幅,省略get,set方法 PRivate Integer id; private Integer userId; private String number; private Date createtime; private String note; }OrdersViewBean.java:package cn.com.yves.logic.model;import cn.com.yves.model.OrdersModel;/** * 一对一查询:(方式一) * * 需求: 根据用户的订单,查询出订单信息和该订单关联的用户信息(eg:用户名和地址) * * 设计原则:用mapper.xml中 用resultType接收时,在选pojobean的时候,尽可能的继承包含结果多的Bean 这里 * 继承的是OrdersModel的pojo * * @author Yves He * */public class OrdersViewBean extends OrdersModel { // 定义还需要的字段( 用户名和地址),为了节省篇幅,省略了get,set方法 private String userName; private String userAddress;}ViewVoMapper.java内容: 不过是方式一还是方式二的mapper.java接口方法定义不变.
package cn.com.yves.logic.mapper;import java.util.List;import cn.com.yves.logic.model.OrdersViewBean;//高级查询public interface ViewVoMapper { // 一对一查询:(mapper.xml中有两种写法 : resultType和resultMap) // 需求: 根据用户的订单,查询出订单信息和该订单关联的用户信息(eg:用户名和地址) List<OrdersViewBean> selectOdersAndUserInfo(int orderId);}ViewVoMapper.xml内容:
<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" ><mapper namespace="cn.com.yves.logic.mapper.ViewVoMapper"> <resultMap type="cn.com.yves.logic.model.OrdersViewBean" id="OrdersViewBeanResultMap"> <id column="id" property="id" /> <result column="user_id" property="userId" /> <result column="number" property="number" /> <result column="createtime" property="createtime" /> <result column="note" property="note" /> <!-- 注意: 如果在查询语句中没有指定列的别名,这里的列名要和pojo类中的属性名对应 --> <result column="username" property="userName" /> <result column="address" property="userAddress" /> </resultMap> <!-- 一对一查询: 方法一:用resultType --> <!-- 按需求定义查询: userName和userAddress采用别名来映射到OrdersViewBean的字段中 --> <select id="selectOdersAndUserInfo" resultType="cn.com.yves.logic.model.OrdersViewBean" parameterType="int"> SELECT orders.*,`user`.username userName,`user`.address userAddress FROM orders,`user` WHERE orders.id = `user`.id and orders.id = #{value} </select> <!-- 一对一查询: 方法二:用resultMap --> <!-- <select id="selectOdersAndUserInfo" resultMap="OrdersViewBeanResultMap" --> <!-- parameterType="int"> --> <!-- SELECT orders.*,`user`.username,`user`.address FROM --> <!-- orders,`user` WHERE --> <!-- orders.id = `user`.id and orders.id = #{value} --> <!-- </select> --></mapper>测试类ViewVoMapperTest.java:
package cn.com.yves.mapper;import java.io.InputStream;import org.apache.ibatis.io.Resources;import org.apache.ibatis.session.SqlSession;import org.apache.ibatis.session.SqlSessionFactory;import org.apache.ibatis.session.SqlSessionFactoryBuilder;import org.junit.Before;import org.junit.Test;import cn.com.yves.logic.mapper.ViewVoMapper;public class ViewVoMapperTest { private SqlSessionFactory sqlSessionFactory; @Before public void setUp() throws Exception { String mybatisConfigPath = "SqlMapConfig.xml"; InputStream inputStream = Resources .getResourceAsStream(mybatisConfigPath); sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); } @Test public void testSelectOdersAndUserInfo() { SqlSession session = sqlSessionFactory.openSession(); ViewVoMapper mapper = session.getMapper(ViewVoMapper.class); mapper.selectOdersAndUserInfo(4); }}心得:
一般情况建议采用方式一,因为比较简单,不需要自己定义resultMap,如果出现查询出的列名与java中的pojo类中的属性名不对应,可以采用在查询语句中用别名的方式来解决.在用到resultMap的时候,尽量在里面定义成引用的成员而不是基本的数据类型,这样才可以最好的发挥resultMap的作用.设计数据的时候,可以将列名设置成user_id的格式,在自动生成pojo类的属性的时候,会将java类的字段名生成userId.新闻热点
疑难解答