查詢結果: 項目結構:
全局配置文件中掃描包:
需求: 根據(jù)用戶的訂單,查詢出訂單信息和該訂單關聯(lián)的用戶信息(eg:用戶名和地址) 一對一查詢有兩種實現(xiàn): 建議:一般情況建議采用方式一,因為比較簡單,不需要自己定義resultMap,如果出現(xiàn)查詢出的列名與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;/** * 一對一查詢:(方式一) * * 需求: 根據(jù)用戶的訂單,查詢出訂單信息和該訂單關聯(lián)的用戶信息(eg:用戶名和地址) * * 設計原則:用mapper.xml中 用resultType接收時,在選pojobean的時候,盡可能的繼承包含結果多的Bean 這里 * 繼承的是OrdersModel的pojo * * @author Yves He * */public class OrdersViewBean extends OrdersModel { // 定義還需要的字段( 用戶名和地址),為了節(jié)省篇幅,省略了get,set方法 private String userName; private String userAddress;}ViewVoMapper.java內(nèi)容: 不過是方式一還是方式二的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) // 需求: 根據(jù)用戶的訂單,查詢出訂單信息和該訂單關聯(lián)的用戶信息(eg:用戶名和地址) List<OrdersViewBean> selectOdersAndUserInfo(int orderId);}ViewVoMapper.xml內(nèi)容:
<?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,如果出現(xiàn)查詢出的列名與java中的pojo類中的屬性名不對應,可以采用在查詢語句中用別名的方式來解決.在用到resultMap的時候,盡量在里面定義成引用的成員而不是基本的數(shù)據(jù)類型,這樣才可以最好的發(fā)揮resultMap的作用.設計數(shù)據(jù)的時候,可以將列名設置成user_id的格式,在自動生成pojo類的屬性的時候,會將java類的字段名生成userId.新聞熱點
疑難解答
圖片精選